Запуск докера внутри Кубернетеса с контейнером

Начиная с K8S v1.11 среда выполнения была изменена с dockerd на containerd. Я использую Jenkins поверх kubernetes для создания образов Docker, используя Docker вне Docker (dood).

Когда я попытался переключиться на использование файла сокета из conatinerd (containerd/containerd.sock был сопоставлен с /var/run/docker.sock) с обычным клиентом Docker, я получил следующую ошибку Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/containers/json: net/http: HTTP/1.x transport connection broken: malformed HTTP response "\x00\x00\x00\x04\x00\x00\x00\x00\x00".

Можно ли использовать докер-клиент с containerd?

1 ответ

Отказ от ответственности: на момент написания containerd не заменял Docker, вы можете установить containerd отдельно от Docker, и вы можете указать CRI Kubernetes для непосредственного общения с контейнерным сокетом.

Итак, когда вы устанавливаете Docker, он устанавливается вместе с containerd, и демон Docker общается с ним. Вы увидите такой процесс:

docker-containerd --config /var/run/docker/containerd/containerd.toml

Тем не менее, клиент Docker по-прежнему общается с демоном Docker, поэтому, когда вы запускаете клиент Docker в своем контейнере, вам все равно нужно напрямую общаться с демоном Docker (/var/run/docker.sock), так что вы можете вернуться к /var/run/docker.sock и я верю, что это должно сработать.

По крайней мере, с Kubernetes 1.18 на Ubuntu 20.04 я обнаружил, что исправление этой проблемы заключалось в явной установке Docker вместе с Kubernetes.

Вот пример использования MicroK8s в качестве дистрибутива Kubernetes сmicrok8s уже установлено:

# If already installed, shut down microk8s
sudo snap disable microk8s

# Assuming no docker installed yet - this fixes the case  
# where Kubernetes results in this path being a directory 
rm -rf /var/run/docker.sock

sudo apt install docker.io

ls -l /var/run/docker.sock
# Output should show socket not directory:
#    srw-rw---- 1 root docker 0 Aug  6 11:50 /var/run/docker.sock

# (See https://docs.docker.com/engine/install/linux-postinstall/ for usermod + newgrp commands at this point) 

# Restart microk8s 
sudo snap enable microk8s

В других дистрибутивах Kubernetes будет другой способ более выборочного завершения процессов.

journalctl -xe Здесь полезно увидеть любые ошибки Docker или Kubernetes.

В манифестах Kubernetes обязательно используйте /var/run/docker.sock в качестве пути к хосту при монтировании docker.sock.

Связанные вопросы:

Действия после установки Docker в Linux

Другие вопросы по тегам