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

У меня есть рой докеров из двух узлов — узел менеджера (экземпляр aws) и рабочий узел (установка с несколькими GPU на столе рядом со мной), как на Ubuntu 18.04, так и на Docker.io 19.03.6, сборка 369ce74a3c. На рабочем узле я установил среду выполнения nvidia-docker и протестировал ее (работает). На узле менеджера я настроил оверлейную сеть и теперь пытаюсь запустить службу с доступом к графическому процессору и подключить ее к своей оверлейной сети, но безуспешно — служба не запускается с 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
    }
]

Сервис запускается нормально без эфира --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

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


person Kirill    schedule 13.10.2020    source источник


Ответы (1)


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

person Kirill    schedule 16.10.2020