#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
. Недостатком является то, что вы не можете контролировать количество графических процессоров для каждой службы, но я могу с этим смириться.