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>