Mirantis cri-dockerd — это адаптер, созданный для обеспечения шим для Docker Engine для управления Docker Engine через Kubernetes Интерфейс выполнения контейнеров. Я знаю, что большинство из вас уже в курсе, что Kubernetes отменила Docker в качестве среды выполнения контейнеров после версии 1.20. Это произошло в результате решения разработчиков Kubernetes отказаться от Docker в качестве базовой среды выполнения в пользу сред, использующих Container Runtime Interface (CRI) , созданный для Kubernetes. Однако образы, созданные Docker, будут продолжать работать в вашем кластере Kubernetes со всеми режимами выполнения, как это было всегда. Любой контейнерный движок, совместимый с CRI, может работать в Kubernetes без дополнительных усилий.

Но это не конец света, и вам не нужно паниковать. Достаточно сменить среду выполнения контейнеров с Docker на другую поддерживаемую среду выполнения контейнеров. Mirantis и Docker пришли на помощь, договорившись о партнерстве в поддержке автономный код shim. Этот код поддерживается вне Kubernetes, как соответствующий CRI интерфейс для API Docker Engine. Сайт cri-dockerd делает Docker Engine совместимым с CRI, и вы можете продолжать использовать его в своих Kubernetes, просто переключившись со встроенного dockershim на внешний.

Установка cri-dockerd в качестве шима Docker Engine для Kubernetes

Мы начнем с установки cri-dockerd и продемонстрировать, как можно использовать его в Kubernetes. A «shim» используется для трансляции между компонентом Docker Engine и соответствующим интерфейсом Kubernetes, в данном случае Container Runtime Interface (CRI). Если вам нужен движок, совместимый с CRI, вы можете легко перейти на Containerd и избавиться от необходимости использовать интерфейс cri-dockerd.

Стоит отметить, что все образы, которые вы создаете с помощью docker build, соответствуют базовому стандарту CRI. Образы контейнеров по-прежнему будут хорошо работать с Kubernetes. Мы сосредоточились на замене устаревшего dockershim, чтобы сделать Docker Engine совместимым с CRI.

Установка cri-dockerd в Linux

Вы можете установить cri-dockerd в Linux из исходных текстов с помощью Go или путем загрузки готовых двоичных файлов. Мы рассмотрим эти два варианта.

Необходимым условием для установки является наличие Docker-Engine. Вы можете обратиться к нашему руководству ниже, чтобы установить последнюю версию Docker Engine на вашу Linux-машину:

  • Как установить Docker CE на Linux-системы

Прежде чем приступить к установке, убедитесь, что служба Docker запущена:

$ systemctl status docker
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2024-07-31 19:56:30 UTC; 10s ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 2596 (dockerd)
      Tasks: 9
     Memory: 27.5M
        CPU: 484ms
     CGroup: /system.slice/docker.service
             └─2596 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Jul 31 19:56:29 jammy systemd[1]: Starting Docker Application Container Engine...
Jul 31 19:56:29 jammy systemd[1]: Started Docker Application Container Engine.

Установите cri-dockerd с помощью готового бинарного файла (рекомендуется)

Установить wget и curl инструменты командной строки.

### Debian based systems ###
sudo apt update
sudo apt install git wget curl

### RHEL based systems ###
sudo yum -y install git wget curl

### SUSE based Linux ###
sudo zypper install git wget curl

### Arch based Linux ###
sudo pacman -Syy
sudo pacman -S git wget curl

Когда инструменты установлены, используйте их для загрузки последнего бинарного пакета cri-dockerd. Но сначала давайте получим последнюю версию релиза:

VER=$(curl -s https://api.github.com/repos/Mirantis/cri-dockerd/releases/latest|grep tag_name | cut -d '"' -f 4|sed 's/v//g')
echo $VER

Затем мы можем загрузить архивный файл по адресу Github cri-dockerd releases страница.

### For Intel 64-bit CPU ###
wget https://github.com/Mirantis/cri-dockerd/releases/download/v${VER}/cri-dockerd-${VER}.amd64.tgz
tar xvf cri-dockerd-${VER}.amd64.tgz

### For ARM 64-bit CPU ###
wget https://github.com/Mirantis/cri-dockerd/releases/download/v${VER}/cri-dockerd-${VER}.arm64.tgz
cri-dockerd-${VER}.arm64.tgz

Переместить cri-dockerd бинарный пакет в /usr/local/bin каталог

sudo mv cri-dockerd/cri-dockerd /usr/local/bin/

Убедитесь в успешной установке, выполнив приведенные ниже команды:

$ cri-dockerd --version
cri-dockerd 0.3.14 (683f70f)

Настройте модули systemd для cri-dockerd:

wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.service
wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.socket
sudo mv cri-docker.socket cri-docker.service /etc/systemd/system/
sudo sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service

Запустите и включите службы

sudo systemctl daemon-reload
sudo systemctl enable cri-docker.service
sudo systemctl enable --now cri-docker.socket

Убедитесь, что служба запущена:

$ systemctl status cri-docker.socket
 cri-docker.socket - CRI Docker Socket for the API
   Loaded: loaded (/etc/systemd/system/cri-docker.socket; enabled; vendor preset: disabled)
   Active: active (listening) since Wed 2024-07-31 19:56:35 UTC; 50s ago
   Listen: /run/cri-dockerd.sock (Stream)
    Tasks: 0 (limit: 23036)
   Memory: 4.0K
   CGroup: /system.slice/cri-docker.socket

Jul 31 19:56:35 jammy systemd[1]: Starting cri-docker.socket - CRI Docker Socket for the API...
Jul 31 19:56:35 jammy systemd[1]:  Listening on cri-docker.socket - CRI Docker Socket for the API.

Установите cri-dockerd из исходного кода (альтернативный способ)

Вы также можете решить построить cri-dockerd из источника.

Установите Golang на свою систему

wget https://storage.googleapis.com/golang/getgo/installer_linux
chmod +x ./installer_linux
./installer_linux
source ~/.bash_profile

Подтвердите установку, проверив версию Go.

$ go version
go version go1.20.5 linux/amd64

Клонируйте код проекта из репозитория Github

git clone https://github.com/Mirantis/cri-dockerd.git

Выполните приведенные ниже команды для сборки этого кода (в среде POSIX):

cd cri-dockerd
mkdir bin
cd src && go get && go build -o ../bin/cri-dockerd
cd ..

Наконец, установите cri-dockerd в системе Linux. Это предполагает, что в вашей системе используется systemd и установлен Docker Engine.

sudo mkdir -p /usr/local/bin
sudo install -o root -g root -m 0755 bin/cri-dockerd /usr/local/bin/cri-dockerd
sudo cp -a packaging/systemd/* /etc/systemd/system

Запустите и включите cri-docker сервис

sudo sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service
sudo systemctl daemon-reload
sudo systemctl enable cri-docker.service
sudo systemctl enable --now cri-docker.socket

Проверка состояния службы:

$ systemctl status cri-docker.socket
 cri-docker.socket - CRI Docker Socket for the API
   Loaded: loaded (/etc/systemd/system/cri-docker.socket; enabled; vendor preset: disabled)
   Active: active (listening) since Fri 2023-03-10 10:02:13 UTC; 2min 9s ago
   Listen: /run/cri-dockerd.sock (Stream)
    Tasks: 0 (limit: 23036)
   Memory: 4.0K
   CGroup: /system.slice/cri-docker.socket

Mar 10 10:02:13 rocky8.mylab.io systemd[1]: Starting CRI Docker Socket for the API.
Mar 10 10:02:13 rocky8.mylab.io systemd[1]: Listening on CRI Docker Socket for the API.

Из полученного результата мы можем узнать путь к сокету CRI.

Listen: /run/cri-dockerd.sock

Для cri-dockerd, гнездо CRI /run/cri-dockerd.sock по умолчанию.

Настройка кублета на использование cri-dockerd

Вы должны установить kubelet, прежде чем сможете настроить его на использование cri-dockerd. Описанные шаги применимы к кластерам, созданным с помощью kubeadm.

Использование cri-dockerd на новом кластере Kubernetes

Убедитесь, что движок Docker Engine установлен и запущен:

systemctl status docker

Также должны быть установлены компоненты kubeadm и kubelet. После установки компонентов мы можем протестировать извлечение образов контейнеров для Kubernetes.

$ sudo kubeadm config images pull --cri-socket /run/cri-dockerd.sock 
[config/images] Pulled registry.k8s.io/kube-apiserver:v1.26.2
[config/images] Pulled registry.k8s.io/kube-controller-manager:v1.26.2
[config/images] Pulled registry.k8s.io/kube-scheduler:v1.26.2
[config/images] Pulled registry.k8s.io/kube-proxy:v1.26.2
[config/images] Pulled registry.k8s.io/pause:3.9
[config/images] Pulled registry.k8s.io/etcd:3.5.6-0
[config/images] Pulled registry.k8s.io/coredns/coredns:v1.9.3

Плоскость управления Bootstrap (это для одноузлового контроллера)

sudo kubeadm init \
  --pod-network-cidr=10.244.0.0/16 \
  --cri-socket /run/cri-dockerd.sock

Инициализация должна пройти успешно.

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Конечная точка выполнения контейнера настраивается в /var/lib/kubelet/kubeadm-flags.env.

$ sudo cat /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=/run/cri-dockerd.sock --pod-infra-container-image=k8s.gcr.io/pause:3.6"

Перенос существующих узлов с dockershim на cri-dockerd

Закрепите узел. Не забудьте заменить <NODE_NAME> на имя узла.

kubectl cordon <NODE_NAME>

Слив узла для безопасного удаления запущенных бодов:

kubectl drain <NODE_NAME> --ignore-daemonsets

Открыть /var/lib/kubelet/kubeadm-flags.env на каждом затронутом узле.

sudo vim /var/lib/kubelet/kubeadm-flags.env

Измените --container-runtime-endpoint флаг на unix:///var/run/cri-dockerd.sock.

Инструмент kubeadm сохраняет сокет узла в виде аннотации на Node объекте в плоскости управления. Чтобы изменить этот сокет для каждого затронутого узла:

Отредактируйте YAML-представление Node объекта:

KUBECONFIG=/path/to/admin.conf kubectl edit no <NODE_NAME>

Замените следующее:

  • /path/to/admin.conf: путь к конфигурационному файлу kubectl, admin.conf.
  • <NODE_NAME>: имя узла, который вы хотите изменить.

Изменить kubeadm.alpha.kubernetes.io/cri-socket с сайта /var/run/dockershim.sock на unix:///var/run/cri-dockerd.sock.

Сохраните изменения. Node обновляется при сохранении и перезапуске kubelet

sudo systemctl restart kubelet

Разблокируйте узел, чтобы позволить бодам планировать на нем:

kubectl uncordon <NODE_NAME>