Служба Docker не начинается с «на узле отсутствуют сетевые вложения, ip-адреса могут быть исчерпаны» с помощью —generic-resource

#docker #networking #docker-swarm #docker-networking #nvidia-docker

#docker #сеть #docker-swarm #docker-networking #nvidia-docker

Вопрос:

У меня есть docker swarm из двух узлов — управляющего узла (экземпляр aws) и рабочего узла (установка с несколькими графическими процессорами на столе рядом со мной), как на Ubuntu 18.04, так и Docker.io 19.03.6, сборка 369ce74a3c. На рабочем узле я настроил среду выполнения nvidia-docker и протестировал ее (она работает). На узле менеджера я настроил оверлейную сеть, и теперь я пытаюсь запустить службу с доступом к gpu и подключить ее к моей оверлейной сети, но не повезло — служба не запускается assigned node no longer meets constraints . Как я запускаю службу:

 docker service create --name=hw --constraint=node.id==xyriecy63n8995enp2mro0nvx --network=d9gqsljvmpy7 --generic-resource "gpu=1" busybox:latest sh -c "while true; do echo Hello; sleep 2; done"
  

И какой у него статус:

 ID                          NAME                IMAGE                                                                                    NODE                DESIRED STATE       CURRENT STATE                     ERROR                                                                  PORTS
ur0uut7xq8qyjafejwt3xlbv4   hw.1         busybox:latest@sha256:d366a4665ab44f0648d7a00ae3fae139d55e32f9712c67accd604bb55df9d05a   node-4             Ready               Rejected less than a second ago   "assigned node no longer meets constraints"
w83690e7dzcc56ahysp8s5xi9    _ hw.1     busybox:latest@sha256:d366a4665ab44f0648d7a00ae3fae139d55e32f9712c67accd604bb55df9d05a   node-4             Shutdown            Rejected less than a second ago   "node is missing network attachments, ip addresses may be exhausted"
  

Сведения о задаче:

 docker inspect ur0uut7xq8qyjafejwt3xlbv4
[
    {
        "ID": "ur0uut7xq8qyjafejwt3xlbv4",
        "Version": {
            "Index": 156466
        },
        "CreatedAt": "2020-10-13T06:53:54.822993602Z",
        "UpdatedAt": "2020-10-13T06:54:00.063967596Z",
        "Labels": {},
        "Spec": {
            "ContainerSpec": {
                "Image": "busybox:latest@sha256:d366a4665ab44f0648d7a00ae3fae139d55e32f9712c67accd604bb55df9d05a",
                "Args": [
                    "sh",
                    "-c",
                    "while true; do echo Hello; sleep 2; done"
                ],
                "Init": false,
                "DNSConfig": {},
                "Isolation": "default"
            },
            "Resources": {
                "Limits": {},
                "Reservations": {
                    "GenericResources": [
                        {
                            "DiscreteResourceSpec": {
                                "Kind": "gpu",
                                "Value": 1
                            }
                        }
                    ]
                }
            },
            "Placement": {
                "Constraints": [
                    "node.id==xyriecy63n8995enp2mro0nvx"
                ],
                "Platforms": [
                    {
                        "Architecture": "amd64",
                        "OS": "linux"
                    },
                    {
                        "OS": "linux"
                    },
                    {
                        "OS": "linux"
                    },
                    {
                        "OS": "linux"
                    },
                    {
                        "Architecture": "arm64",
                        "OS": "linux"
                    },
                    {
                        "Architecture": "386",
                        "OS": "linux"
                    },
                    {
                        "Architecture": "mips64le",
                        "OS": "linux"
                    },
                    {
                        "Architecture": "ppc64le",
                        "OS": "linux"
                    },
                    {
                        "Architecture": "s390x",
                        "OS": "linux"
                    }
                ]
            },
            "Networks": [
                {
                    "Target": "d9gqsljvmpy7wjrxa5q09bgtb"
                }
            ],
            "ForceUpdate": 0
        },
        "ServiceID": "mef68axo6ztmu7ojkiwcxxj0a",
        "Slot": 1,
        "NodeID": "xyriecy63n8995enp2mro0nvx",
        "Status": {
            "Timestamp": "2020-10-13T06:53:59.979035656Z",
            "State": "rejected",
            "Message": "preparing",
            "Err": "node is missing network attachments, ip addresses may be exhausted",
            "ContainerStatus": {
                "ContainerID": "",
                "PID": 0,
                "ExitCode": 0
            },
            "PortStatus": {}
        },
        "DesiredState": "shutdown",
        "NetworksAttachments": [
            {
                "Network": {
                    "ID": "d9gqsljvmpy7wjrxa5q09bgtb",
                    "Version": {
                        "Index": 32157
                    },
                    "CreatedAt": "2020-10-12T13:39:55.061260869Z",
                    "UpdatedAt": "2020-10-12T13:39:55.062498427Z",
                    "Spec": {
                        "Name": "testnet",
                        "Labels": {},
                        "DriverConfiguration": {
                            "Name": "overlay"
                        },
                        "Attachable": true,
                        "IPAMOptions": {
                            "Driver": {
                                "Name": "default"
                            },
                            "Configs": [
                                {
                                    "Subnet": "172.25.0.0/16",
                                    "Gateway": "172.25.0.1"
                                }
                            ]
                        },
                        "Scope": "swarm"
                    },
                    "DriverState": {
                        "Name": "overlay",
                        "Options": {
                            "com.docker.network.driver.overlay.vxlanid_list": "4097"
                        }
                    },
                    "IPAMOptions": {
                        "Driver": {
                            "Name": "default"
                        },
                        "Configs": [
                            {
                                "Subnet": "172.25.0.0/16",
                                "Gateway": "172.25.0.1"
                            }
                        ]
                    }
                },
                "Addresses": [
                    "172.25.96.221/16"
                ]
            }
        ],
        "GenericResources": [
            {
                "NamedResourceSpec": {
                    "Kind": "gpu",
                    "Value": "GPU-50fd60c4"
                }
            }
        ]
    }
]
  

Моя оверлейная сеть:

 docker inspect d9gqsljvmpy7
[
    {
        "Name": "testnet",
        "Id": "d9gqsljvmpy7wjrxa5q09bgtb",
        "Created": "2020-10-12T13:39:55.061260869Z",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.25.0.0/16",
                    "Gateway": "172.25.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": null,
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "4097"
        },
        "Labels": null
    }
]
  

Служба запускается обычно без ether --network или --generic-resource . Запуск без --network и подключение после запуска также не работает.

Я включил журналы отладки на обоих узлах, но не увидел ничего подозрительного, кроме того же сообщения об ошибке:

 Oct 12 13:40:45 node-4 dockerd[1166]: time="2020-10-12T13:40:45.975574449Z" level=error msg="fatal task error" error="node is missing network attachments, ip addresses may be exhausted" module=node/agent/taskmanager node.id=xyriecy63n8995enp2mro0nvx service.id=mef68axo6ztmu7ojkiwcxxj0a task.id=twcbj9emeopm2qfq0i7lwftbe
  

Также я проверил исчерпание сети docker run -it --rm -v /var/run/docker.sock:/var/run/docker.sock docker/ip-util-check и, очевидно, ничего не нашел:

 Overlay IP Utilization Report
----
Network testnet/d9gqsljvmpy7 has an IP address capacity of 65533 and uses 0 addresses spanning over 0 nodes
        Network OK: network will have 49149 available IPs before passing the 75% subnet use
  

Итак, как можно запустить службу, привязанную к графическому процессору, и подключить ее к оверлейной сети?

Ответ №1:

По-видимому, --generic-resource в моем случае нет необходимости указывать. Без этого служба имеет доступ ко всем графическим процессорам, перечисленным в docker via --node-generic-resource gpu=xxx . Недостатком является то, что вы не можете контролировать количество графических процессоров для каждой службы, но я могу с этим смириться.