Запуск докера внутри Кубернетеса с контейнером
Начиная с 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.
Связанные вопросы: