Міграція з dockershim
Цей розділ містить інформацію, яку вам потрібно знати при міграції з dockershim на інші оточення виконання контейнерів.
Після оголошення про застарівання dockershim в Kubernetes 1.20, виникли питання, як це вплине на різні робочі навантаження та розгортання самого Kubernetes. Наш Dockershim Removal FAQ допоможе вам краще зрозуміти проблему.
Dockershim був видалений з Kubernetes з випуском v1.24. Якщо ви використовуєте Docker Engine через dockershim як своє оточення виконання контейнерів і хочете оновитись до v1.24, рекомендується або мігрувати на інше оточення виконання, або знайти альтернативний спосіб отримання підтримки Docker Engine. Ознайомтеся з розділом оточення виконання контейнерів, щоб дізнатися про ваші варіанти.
Версія Kubernetes з dockershim (1.23) вийшла з стану підтримки, а v1.24 скоро вийде зі стану підтримки. Переконайтеся, що повідомляєте про проблеми з міграцією, щоб проблеми могли бути вчасно виправлені, і ваш кластер був готовий до видалення dockershim. Після виходу v1.24 зі стану підтримки вам доведеться звертатися до вашого постачальника Kubernetes за підтримкою або оновлювати кілька версій одночасно, якщо є критичні проблеми, які впливають на ваш кластер.
Ваш кластер може мати більше одного типу вузлів, хоча це не є загальною конфігурацією.
Ці завдання допоможуть вам здійснити міграцію:
Що далі
1 - Заміна середовища виконання контейнерів на вузлі з Docker Engine на containerd
Це завдання визначає кроки, необхідні для оновлення вашого середовища виконання контейнерів на containerd з Docker. Воно буде корисним для операторів кластерів, які працюють з Kubernetes 1.23 або старішими версіями. Воно також охоплює приклад сценарію міграції з dockershim на containerd. З цієї сторінки можна вибрати альтернативні середовища виконання контейнерів.
Перш ніж ви розпочнете
Примітка: Цей розділ містить посилання на проєкти сторонніх розробників, які надають функціонал, необхідний для Kubernetes. Автори проєкту Kubernetes не несуть відповідальності за ці проєкти. Проєкти вказано в алфавітному порядку. Щоб додати проєкт до цього списку, ознайомтеся з
посібником з контенту перед надсиланням змін.
Докладніше. Встановіть containerd. Для отримання додаткової інформації дивіться документацію з встановлення containerd і для конкретних передумов виконуйте кроки описані в посібнику containerd.
Виведення вузла з експлуатації
kubectl drain <node-to-drain> --ignore-daemonsets
Замініть <node-to-drain>
на імʼя вузла, який ви збираєтеся виводити з експлуатації.
Зупиніть службу Docker
systemctl stop kubelet
systemctl disable docker.service --now
Встановлення Containerd
Дотримуйтесь настанов посібника для отримання детальних кроків з встановлення containerd.
Встановіть пакунок containerd.io
з офіційних репозиторіїв Docker. Інструкції щодо налаштування репозиторію Docker для вашого конкретного дистрибутиву Linux і встановлення пакунка containerd.io
можна знайти у Починаючи з containerd.
Налаштуйте containerd:
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
Перезапустіть containerd:
sudo systemctl restart containerd
Розпочніть сеанс PowerShell, встановіть значення $Version
на бажану версію (наприклад, $Version="1.4.3"
), а потім виконайте наступні команди:
Завантажте containerd:
curl.exe -L https://github.com/containerd/containerd/releases/download/v$Version/containerd-$Version-windows-amd64.tar.gz -o containerd-windows-amd64.tar.gz
tar.exe xvf .\containerd-windows-amd64.tar.gz
Розпакуйте та налаштуйте:
Copy-Item -Path ".\bin\" -Destination "$Env:ProgramFiles\containerd" -Recurse -Force
cd $Env:ProgramFiles\containerd\
.\containerd.exe config default | Out-File config.toml -Encoding ascii
# Перегляньте конфігурацію. Залежно від налаштувань можливо, ви захочете внести корективи:
# - образ sandbox_image (образ pause Kubernetes)
# - розташування cni bin_dir та conf_dir
Get-Content config.toml
# (Необовʼязково, але дуже рекомендується) Виключіть containerd зі сканування Windows Defender
Add-MpPreference -ExclusionProcess "$Env:ProgramFiles\containerd\containerd.exe"
Запустіть containerd:
.\containerd.exe --register-service
Start-Service containerd
Відредагуйте файл /var/lib/kubelet/kubeadm-flags.env
та додайте середовище виконання контейнерів до прапорців; --container-runtime-endpoint=unix:///run/containerd/containerd.sock
.
Користувачі, які використовують kubeadm, повинні знати, що інструмент kubeadm
зберігає сокет CRI для кожного хосту як анотацію в обʼєкті Node для цього хосту. Щоб змінити його, ви можете виконати наступну команду на машині, на якій є файл kubeadm
/etc/kubernetes/admin.conf
.
kubectl edit no <імʼя-вузла>
Це запустить текстовий редактор, де ви можете редагувати обʼєкт Node. Для вибору текстового редактора ви можете встановити змінну середовища KUBE_EDITOR
.
Змініть значення kubeadm.alpha.kubernetes.io/cri-socket
з /var/run/dockershim.sock
на шлях сокета CRI за вашим вибором (наприклад, unix:///run/containerd/containerd.sock
).
Зауважте, що нові шляхи сокета CRI в ідеалі повині мати префікс unix://
.
Збережіть зміни в текстовому редакторі, що оновить обʼєкт Node.
Перезапустіть kubelet
Перевірте, що вузол справний
Запустіть kubectl get nodes -o wide
, і containerd зʼявиться як середовище виконання для вузла, який ми щойно змінили.
Видаліть Docker Engine
Примітка: Цей розділ містить посилання на проєкти сторонніх розробників, які надають функціонал, необхідний для Kubernetes. Автори проєкту Kubernetes не несуть відповідальності за ці проєкти. Проєкти вказано в алфавітному порядку. Щоб додати проєкт до цього списку, ознайомтеся з
посібником з контенту перед надсиланням змін.
Докладніше. Якщо вузол виглядає справним, видаліть Docker.
sudo yum remove docker-ce docker-ce-cli
sudo apt-get purge docker-ce docker-ce-cli
sudo dnf remove docker-ce docker-ce-cli
sudo apt-get purge docker-ce docker-ce-cli
Попередні команди не видаляють образи, контейнери, томи або налаштовані файли конфігурації на вашому хості. Щоб їх видалити, слідуйте інструкціям Docker щодо Видалення Docker Engine.
Увага:
Інструкції Docker щодо видалення Docker Engine створюють ризик видалення containerd. Будьте обережні при виконанні команд.Введення вузла в експлуатацію
kubectl uncordon <node-to-uncordon>
Замініть <node-to-uncordon>
на імʼя вузла, який ви раніше вивели з експлуатації.
2 - Міграція вузлів Docker Engine з dockershim на cri-dockerd
Примітка: Цей розділ містить посилання на проєкти сторонніх розробників, які надають функціонал, необхідний для Kubernetes. Автори проєкту Kubernetes не несуть відповідальності за ці проєкти. Проєкти вказано в алфавітному порядку. Щоб додати проєкт до цього списку, ознайомтеся з
посібником з контенту перед надсиланням змін.
Докладніше. Ця сторінка показує вам, як перевести ваші вузли з Docker Engine на використання cri-dockerd
замість dockershim. Ви повинні дотримуватися цих кроків у таких сценаріях:
- Ви хочете перейти від dockershim і все ще використовувати Docker Engine для запуску контейнерів у Kubernetes.
- Ви хочете оновити до Kubernetes v1.32 і ваш наявний кластер покладається на dockershim, у такому випадку вам необхідно перейти з dockershim, де
cri-dockerd
є одним з варіантів.
Щоб дізнатися більше про видалення dockershim, прочитайте сторінку ЧаПи.
Що таке cri-dockerd?
У Kubernetes 1.23 та раніше ви могли використовувати Docker Engine з Kubernetes, покладаючись на вбудований компонент Kubernetes, що називався dockershim. Компонент dockershim було вилучено у випуску Kubernetes 1.24; проте доступний сторонній замінник, cri-dockerd
. Адаптер cri-dockerd
дозволяє використовувати Docker Engine через інтерфейс середовища виконання контейнерів.
Якщо ви хочете мігрувати на cri-dockerd
, щоб продовжувати використовувати Docker Engine як своє середовище виконання контейнерів, вам слід виконати наступне для кожного вузла:
- Встановіть
cri-dockerd
. - Відключіть та вимкніть вузол.
- Налаштуйте kubelet для використання
cri-dockerd
. - Перезапустіть kubelet.
- Перевірте, що вузол справний.
Спочатку протестуйте міграцію на не критичних вузлах.
Ви повинні виконати наступні кроки для кожного вузла, який ви хочете перевести на cri-dockerd
.
Перш ніж ви розпочнете
Відключіть та вимкніть вузол
Відключіть вузол, щоб зупинити нові запуски капсул на ньому:
kubectl cordon <NODE_NAME>
Замініть <NODE_NAME>
на імʼя вузла.
Вимкніть вузол, щоб безпечно виселити працюючі Podʼи:
kubectl drain <NODE_NAME> \
--ignore-daemonsets
Ці кроки застосовуються до кластерів, створених за допомогою інструменту kubeadm. Якщо ви використовуєте інший інструмент, вам слід модифікувати kubelet, використовуючи інструкції з налаштування для цього інструменту.
- Відкрийте
/var/lib/kubelet/kubeadm-flags.env
на кожному ураженому вузлі. - Змініть прапорець
--container-runtime-endpoint
на unix:///var/run/cri-dockerd.sock
. - Змініть прапорець
--container-runtime
на remote
(недоступно в Kubernetes v1.27 та пізніше).
Інструмент kubeadm зберігає сокет вузла як анотацію обʼєкта Node
в панелі управління. Щоб змінити цей сокет для кожного ураженого вузла:
Відредагуйте YAML-представлення обʼєкта Node
:
KUBECONFIG=/шлях/до/admin.conf kubectl edit no <NODE_NAME>
Замініть наступне:
/шлях/до/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
systemctl restart kubelet
Перевірте, що вузол справний
Щоб перевірити, чи використовує вузол точку доступу cri-dockerd
, слідувати інструкціям Дізнайтеся, яке середовище виконання контейнерів використовується. Прапорець --container-runtime-endpoint
для kubelet повинен бути unix:///var/run/cri-dockerd.sock
.
Введення вузла в експлуатацію
Введіть вузол в експлуатацію, щоб Podʼи могли запускатися на ньому:
kubectl uncordon <NODE_NAME>
Що далі
3 - Перевірте, яке середовище виконання контейнерів використовується на вузлі
На цій сторінці наведено кроки для визначення того, яке середовище виконання контейнерів використовують вузли у вашому кластері.
Залежно від того, як ви запускаєте свій кластер, середовище виконання контейнерів для вузлів може бути попередньо налаштованим або вам потрібно його налаштувати. Якщо ви використовуєте сервіс Kubernetes, що надається вам постачальником послуг, можуть існувати специфічні для нього способи перевірки того, яке середовище виконання контейнерів налаштоване для вузлів. Метод, описаний на цій сторінці, повинен працювати завжди, коли дозволяється виконання kubectl
.
Перш ніж ви розпочнете
Встановіть та налаштуйте kubectl
. Див. розділ Встановлення інструментів для отримання деталей.
Визначте середовище виконання контейнерів, яке використовується на вузлі
Використовуйте kubectl
, щоб отримати та показати інформацію про вузли:
kubectl get nodes -o wide
Вивід подібний до такого. Стовпець CONTAINER-RUNTIME
виводить інформацію про середовище та його версію.
Для Docker Engine вивід схожий на цей:
NAME STATUS VERSION CONTAINER-RUNTIME
node-1 Ready v1.16.15 docker://19.3.1
node-2 Ready v1.16.15 docker://19.3.1
node-3 Ready v1.16.15 docker://19.3.1
Якщо ваше середовище показується як Docker Engine, це все одно не означає, що вас точно торкнеться видалення dockershim у Kubernetes v1.24. Перевірте точку доступу середовища, щоб побачити, чи використовуєте ви dockershim. Якщо ви не використовуєте dockershim, вас це не стосується.
Для containerd вивід схожий на цей:
NAME STATUS VERSION CONTAINER-RUNTIME
node-1 Ready v1.19.6 containerd://1.4.1
node-2 Ready v1.19.6 containerd://1.4.1
node-3 Ready v1.19.6 containerd://1.4.1
Дізнайтеся більше інформації про середовища виконання контейнерів на сторінці Середовища виконання контейнерів.
Дізнайтеся, яку точку доступу середовища виконання контейнерів ви використовуєте
Середовище виконання контейнерів спілкується з kubelet через Unix-сокет, використовуючи протокол CRI, який базується на фреймворку gRPC. Kubelet діє як клієнт, а середовище — як сервер. У деяких випадках може бути корисно знати, який сокет використовується на ваших вузлах. Наприклад, з видаленням dockershim у Kubernetes v1.24 і пізніше ви, можливо, захочете знати, чи використовуєте ви Docker Engine з dockershim.
Примітка:
Якщо ви зараз використовуєте Docker Engine на своїх вузлах з cri-dockerd
, вас не торкнетеся видалення dockershim.Ви можете перевірити, який сокет ви використовуєте, перевіривши конфігурацію kubelet на своїх вузлах.
Прочитайте початкові команди для процесу kubelet:
tr \\0 ' ' < /proc/"$(pgrep kubelet)"/cmdline
Якщо у вас немає tr
або pgrep
, перевірте командний рядок для процесу kubelet вручну.
У виведенні шукайте прапорець --container-runtime
та прапорець --container-runtime-endpoint
.
- Якщо ваші вузли використовують Kubernetes v1.23 та старіший, і ці прапори відсутні або прапорець
--container-runtime
не є remote
, ви використовуєте сокет dockershim з Docker Engine. Параметр командного рядка --container-runtime
не доступний у Kubernetes v1.27 та пізніше. - Якщо прапорець
--container-runtime-endpoint
присутній, перевірте імʼя сокета, щоб дізнатися, яке середовище ви використовуєте. Наприклад, unix:///run/containerd/containerd.sock
— це точка доступу containerd.
Якщо ви хочете змінити середовище виконання контейнерів на вузлі з Docker Engine на containerd, ви можете дізнатися більше інформації про міграцію з Docker Engine на containerd, або, якщо ви хочете продовжити використовувати Docker Engine у Kubernetes v1.24 та пізніше, мігруйте на сумісний з CRI адаптер, наприклад cri-dockerd
.
4 - Виправлення помилок, повʼязаних з втулками CNI
Щоб уникнути помилок, повʼязаних з втулками CNI, переконайтеся, що ви використовуєте або оновлюєте середовище виконання контейнерів, яке було протестовано й працює коректно з вашою версією Kubernetes.
Про помилки "Incompatible CNI versions" та "Failed to destroy network for sandbox"
Проблеми з Service існують для налаштування та демонтажу мережі CNI для Pod в containerd v1.6.0-v1.6.3, коли втулки CNI не були оновлені та/або версія конфігурації CNI не вказана в файлах конфігурації CNI. Команда containerd повідомляє, що "ці проблеми вирішені в containerd v1.6.4."
З containerd v1.6.0-v1.6.3, якщо ви не оновите втулки CNI та/або не вкажете версію конфігурації CNI, ви можете стикнутися з наступними умовами помилок "Incompatible CNI versions" або "Failed to destroy network for sandbox".
Помилка "Incompatible CNI versions"
Якщо версія вашого втулка CNI не відповідає версії втулка в конфігурації, тому що версія конфігурації є новішою, ніж версія втулка, лог containerd, швидше за все, покаже повідомлення про помилку при запуску Pod подібнe до:
incompatible CNI versions; config is \"1.0.0\", plugin supports [\"0.1.0\" \"0.2.0\" \"0.3.0\" \"0.3.1\" \"0.4.0\"]"
Щоб виправити цю проблему, оновіть свої втулки CNI та файли конфігурації CNI.
Помилка "Failed to destroy network for sandbox"
Якщо версія втулка відсутня в конфігурації втулка CNI, Pod може запускатися. Однак припинення Podʼа призводить до помилки, подібної до:
ERROR[2022-04-26T00:43:24.518165483Z] StopPodSandbox for "b" failed
error="failed to destroy network for sandbox \"bbc85f891eaf060c5a879e27bba9b6b06450210161dfdecfbb2732959fb6500a\": invalid version \"\": the version is empty"
Ця помилка залишає Pod у стані "not-ready" з приєднаним простором імен мережі. Щоб відновити роботу після цієї проблеми, відредагуйте файл конфігурації CNI, щоб додати відсутню інформацію про версію. Наступна спроба зупинити Pod повинна бути успішною.
Оновлення ваших втулків CNI та файлів конфігурації CNI
Якщо ви використовуєте containerd v1.6.0-v1.6.3 та зіткнулися з помилками "Incompatible CNI versions" або "Failed to destroy network for sandbox", розгляньте можливість оновлення ваших втулків CNI та редагування файлів конфігурації CNI.
Ось огляд типових кроків для кожного вузла:
Безпечно виведіть та введіть вузол в експлуатацію.
Після зупинки ваших служб середовища виконання контейнерів та kubelet виконайте наступні операції оновлення:
- Якщо ви використовуєте втулки CNI, оновіть їх до останньої версії.
- Якщо ви використовуєте не-CNI втулки, замініть їх втулками CNI. Використовуйте останню версію втулків.
- Оновіть файл конфігурації втулка, щоб вказати або відповідати версії специфікації CNI, яку підтримує втулок, як показано у наступному розділі "Приклад файлу конфігурації containerd".
- Для
containerd
переконайтеся, що ви встановили останню версію (v1.0.0 або пізніше) втулка CNI loopback. - Оновіть компоненти вузла (наприклад, kubelet) до Kubernetes v1.24.
- Оновіть або встановіть найновішу версію середовища виконання контейнерів.
Поверніть вузол у ваш кластер, перезапустивши ваше середовище виконання контейнерів та kubelet. Увімкніть вузол (kubectl uncordon <імʼя_вузла>
).
Приклад файлу конфігурації containerd
Наведений нижче приклад показує конфігурацію для середовища виконання контейнерів containerd
версії v1.6.x, яке підтримує останню версію специфікації CNI (v1.0.0).
Будь ласка, перегляньте документацію від вашого постачальника втулків та мереж для подальших інструкцій з налаштування вашої системи.
У Kubernetes, середовище виконання контейнерів containerd додає типовий інтерфейс loopback, lo
, до Podʼів. Середовище виконання контейнерів containerd
налаштовує інтерфейс loopback через втулок CNI, loopback
. Втулок loopback
розповсюджується як частина пакунків релізу containerd
, які мають позначення cni
. containerd
v1.6.0 та пізніше включає сумісний з CNI v1.0.0 втулок loopback, а також інші типові втулки CNI. Налаштування втулка loopback виконується внутрішньо за допомогою контейнерного середовища containerd
і встановлюється для використання CNI v1.0.0. Це також означає, що версія втулка loopback
повинна бути v1.0.0 або пізніше при запуску цієї новішої версії containerd
.
Наступна команда bash генерує приклад конфігурації CNI. Тут значення 1.0.0 для версії конфігурації призначено для поля cniVersion
для використання при запуску containerd
втулком bridge CNI.
cat << EOF | tee /etc/cni/net.d/10-containerd-net.conflist
{
"cniVersion": "1.0.0",
"name": "containerd-net",
"plugins": [
{
"type": "bridge",
"bridge": "cni0",
"isGateway": true,
"ipMasq": true,
"promiscMode": true,
"ipam": {
"type": "host-local",
"ranges": [
[{
"subnet": "10.88.0.0/16"
}],
[{
"subnet": "2001:db8:4860::/64"
}]
],
"routes": [
{ "dst": "0.0.0.0/0" },
{ "dst": "::/0" }
]
}
},
{
"type": "portmap",
"capabilities": {"portMappings": true},
"externalSetMarkChain": "KUBE-MARK-MASQ"
}
]
}
EOF
Оновіть діапазони IP-адрес у прикладі відповідно до вашого випадку використання та плану адресації мережі.
5 - Перевірка впливу видалення dockershim на ваш кластер
Компонент dockershim
Kubernetes дозволяє використовувати Docker як середовище виконання контейнерів Kubernetes. Вбудований компонент dockershim
Kubernetes був видалений у випуску v1.24.
Ця сторінка пояснює, як ваш кластер може використовувати Docker як середовище виконання контейнерів, надає деталі щодо ролі, яку відіграє dockershim
при використанні, і показує кроки, які можна виконати, щоб перевірити, чи може видалення dockershim
впливати на робочі навантаження.
Пошук залежностей вашого застосунку від Docker
Якщо ви використовуєте Docker для побудови контейнерів вашого застосунку, ви все ще можете запускати ці контейнери на будь-якому середовищі виконання контейнерів. Це використання Docker не вважається залежністю від Docker як середовища виконання контейнерів.
Коли використовується альтернативне середовище виконання контейнерів, виконання команд Docker може або не працювати, або призводити до неочікуваного виводу. Ось як ви можете зʼясувати, чи є у вас залежність від Docker:
- Переконайтеся, що привілейовані Podʼи не виконують команди Docker (наприклад,
docker ps
), перезапускають службу Docker (команди типу systemctl restart docker.service
) або змінюють файли Docker, такі як /etc/docker/daemon.json
. - Перевірте наявність приватних реєстрів або налаштувань дзеркал образів у файлі конфігурації Docker (наприклад,
/etc/docker/daemon.json
). Зазвичай їх потрібно повторно налаштувати для іншого середовища виконання контейнерів. - Перевірте, що скрипти та застосунки, які працюють на вузлах поза вашою інфраструктурою Kubernetes, не виконують команди Docker. Це може бути:
- SSH на вузли для усунення несправностей;
- Сценарії запуску вузлів;
- Встановлені безпосередньо на вузлах агенти безпеки та моніторингу.
- Інструменти сторонніх розробників, які виконують вищезгадані привілейовані операції. Див. Міграція телеметрії та агентів безпеки з dockershim для отримання додаткової інформації.
- Переконайтеся, що немає непрямих залежностей від поведінки dockershim. Це крайній випадок і ймовірно не вплине на ваш застосунок. Деякі інструменти можуть бути налаштовані реагувати на специфічну поведінку Docker, наприклад, видаляти сповіщення про певні метрики або шукати певне повідомлення у лозі як частину інструкцій щодо усунення несправностей. Якщо у вас налаштовано такі інструменти, перевірте поведінку на тестовому кластері перед міграцією.
Пояснення залежності від Docker
Середовище виконання контейнерів — це програмне забезпечення, яке може виконувати контейнери, які складаються з Podʼів Kubernetes. Kubernetes відповідає за оркестрування та планування Podʼів; на кожному вузлі kubelet використовує інтерфейс середовища виконання контейнерів як абстракцію, щоб ви могли використовувати будь-яке сумісне середовище виконання контейнерів.
У своїх перших випусках Kubernetes пропонував сумісність з одним середовищем виконання контейнерів — Docker. Пізніше, в історії проєкту Kubernetes, оператори кластерів хотіли б використовувати додаткові середовища виконання контейнерів. CRI було розроблено для того, щоб дозволити такий вид гнучкості — і kubelet почав підтримувати CRI. Однак, оскільки Docker існував до того, як була винайдена специфікація CRI, проєкт Kubernetes створив адаптер dockershim
. Адаптер dockershim дозволяє kubelet взаємодіяти з Docker так, ніби Docker був середовищем виконання контейнерів, сумісним з CRI.
Ви можете прочитати про це в блозі Інтеграція Kubernetes Containerd стає загально доступною.
Перехід до Containerd як середовища виконання контейнерів прибирає посередника. Всі ті самі контейнери можуть бути запущені середовищем виконання контейнерів, такими як Containerd, як і раніше. Але тепер, оскільки контейнери розміщуються безпосередньо з середовищем виконання контейнерів, вони не є видимими для Docker. Отже, будь-який інструментарій Docker або стильний інтерфейс користувача, який ви могли використовувати раніше для перевірки цих контейнерів, більше не доступний.
Ви не можете отримати інформацію про контейнери за допомогою команд docker ps
або docker inspect
. Оскільки ви не можете отримувати перелік контейнерів, ви не можете отримати логи, зупинити контейнери або виконати щось всередині контейнера за допомогою docker exec
.
Примітка:
Якщо ви запускаєте робочі навантаження через Kubernetes, найкращий спосіб зупинити контейнер — це через API Kubernetes, а не безпосередньо через середовище виконання контейнерів (ця порада стосується всіх розширень контейнерів, не тільки Docker).Ви все ще можете отримувати образи або будувати їх за допомогою команди docker build
. Але образи, побудовані або отримані Docker, не будуть видимі для середовища виконання контейнерів та Kubernetes. Їх потрібно буде розмістити у якомусь реєстрі, щоб їх можна було використовувати в Kubernetes.
Відомі проблеми
Точка доступу Kubelet /metrics/cadvisor
надає метрики Prometheus, як описано в Метрики для системних компонентів Kubernetes. Якщо ви встановите збирач метрик, який залежить від цієї точки доступу, ви можете побачити такі проблеми:
Формат метрик на вузлі Docker - це k8s_<container-name>_<pod-name>_<namespace>_<pod-uid>_<restart-count>
, але формат у іншому середовищі відрізняється. Наприклад, на вузлі containerd він має вигляд <container-id>
.
Деякі метрики файлової системи відсутні, як описано нижче:
container_fs_inodes_free
container_fs_inodes_total
container_fs_io_current
container_fs_io_time_seconds_total
container_fs_io_time_weighted_seconds_total
container_fs_limit_bytes
container_fs_read_seconds_total
container_fs_reads_merged_total
container_fs_sector_reads_total
container_fs_sector_writes_total
container_fs_usage_bytes
container_fs_write_seconds_total
container_fs_writes_merged_total
Обхідний шлях
Ви можете помʼякшити цю проблему, використовуючи cAdvisor як автономний DaemonSet.
- Знайдіть останній реліз cAdvisor із шаблоном імені
vX.Y.Z-containerd-cri
(наприклад, v0.42.0-containerd-cri
). - Дотримуйтесь кроків у DaemonSet Kubernetes cAdvisor, щоб створити DaemonSet.
- Drf;Вкажіть збирачу метрик використовувати точку доступу
/metrics
cAdvisor, яка надає повний набір метрик контейнера в форматі Prometheus.
Альтернативи:
- Використовуйте альтернативне рішення для збору метрик сторонніх розробників.
- Збирайте метрики з Kubelet summary API, який доступний через
/stats/summary
.
Що далі
6 - Міграція агентів телеметрії та безпеки з dockershim
Примітка: Цей розділ містить посилання на проєкти сторонніх розробників, які надають функціонал, необхідний для Kubernetes. Автори проєкту Kubernetes не несуть відповідальності за ці проєкти. Проєкти вказано в алфавітному порядку. Щоб додати проєкт до цього списку, ознайомтеся з
посібником з контенту перед надсиланням змін.
Докладніше. Підтримка Kubernetes прямої інтеграції з Docker Engine є застарілою та була видалена. Більшість застосунків не мають прямої залежності від середовища виконання контейнерів. Однак, є ще багато агентів телеметрії та моніторингу, які мають залежність від Docker для збору метаданих, логів та метрик контейнерів. Цей документ збирає інформацію про те, як виявити ці залежності, а також посилання на те, як перенести ці агенти для використання загальних інструментів або альтернативних середовищ виконання.
Агенти телеметрії та безпеки
У кластері Kubernetes є кілька різних способів запуску агентів телеметрії чи безпеки. Деякі агенти мають пряму залежність від Docker Engine, коли вони працюють як DaemonSets або безпосередньо на вузлах.
Чому деякі агенти телеметрії взаємодіють з Docker Engine?
Історично Kubernetes був спеціально створений для роботи з Docker Engine. Kubernetes займався мережею та плануванням, покладаючись на Docker Engine для запуску та виконання контейнерів (у Podʼах) на вузлі. Деяка інформація, яка стосується телеметрії, наприклад, імʼя Podʼа, доступна лише з компонентів Kubernetes. Інші дані, такі як метрики контейнерів, не є обовʼязком середовища виконання контейнера. Ранні агенти телеметрії мали потребу у запиті середовища виконання контейнера та Kubernetes для передачі точної картини. З часом Kubernetes набув можливості підтримки кількох середовищ виконання контейнерів, і зараз підтримує будь-яке середовище виконання, яке сумісне з інтерфейсом середовища виконання контейнерів.
Деякі агенти телеметрії покладаються тільки на інструменти Docker Engine. Наприклад, агент може виконувати команду, таку як docker ps
чи docker top
для отримання переліку контейнерів та процесів або docker logs
для отримання поточних логів. Якщо вузли у вашому проточному кластері використовують Docker Engine, і ви переходите на інше середовище виконання контейнерів, ці команди більше не працюватимуть.
Виявлення DaemonSets, що залежать від Docker Engine
Якщо Pod хоче викликати dockerd
, що працює на вузлі, він повинен або:
- змонтувати файлову систему, що містить привілейований сокет Docker, як том; або
- безпосередньо змонтувати конкретний шлях привілейованого сокета Docker, також як том.
Наприклад: на образах COS Docker відкриває свій Unix сокет у /var/run/docker.sock
. Це означає, що специфікація Pod буде містити монтування тому hostPath
з /var/run/docker.sock
.
Нижче наведено приклад сценарію оболонки для пошуку Podʼів, які мають монтування, які безпосередньо зіставляються з сокетом Docker. Цей сценарій виводить простір імен та імʼя Podʼа. Ви можете видалити grep '/var/run/docker.sock'
, щоб переглянути інші монтування.
kubectl get pods --all-namespaces \
-o=jsonpath='{range .items[*]}{"\n"}{.metadata.namespace}{":\t"}{.metadata.name}{":\t"}{range .spec.volumes[*]}{.hostPath.path}{", "}{end}{end}' \
| sort \
| grep '/var/run/docker.sock'
Примітка:
Є альтернативні способи для Pod мати доступ до Docker на вузлі. Наприклад, батьківська тека
/var/run
може бути змонтована замість повного шляху (як у
цьому прикладі). Представлений вище сценарій виявляє лише найпоширеніші використання.
Виявлення залежності від Docker агентів вузлів
Якщо вузли кластера налаштовані та встановлюють додаткові заходи безпеки та агенти телеметрії на вузлі, перевірте у вендора агента, чи має він будь-які залежності від Docker.
Вендори агентів телеметрії та безпеки
Цей розділ призначений для збирання інформації про різноманітних агентів телеметрії та безпеки, які можуть мати залежність від середовищ виконання контейнерів.
Ми зберігаємо робочу версію інструкцій щодо перенесення для різних вендорів агентів телеметрії та безпеки у документі Google. Будь ласка, звʼяжіться з вендором, щоб отримати актуальні інструкції щодо міграції з dockershim.
Міграція з dockershim
Ніяких змін не потрібно: все має працювати без перешкод при перемиканні середовища виконання.
Як перенести: Застарівання Docker у Kubernetes Pod, який має доступ до Docker Engine, може мати назву, яка містить будь-що з:
datadog-agent
datadog
dd-agent
Як перенести: Міграція з Docker до загальних метрик контейнера в Dynatrace
Оголошення підтримки Containerd: Автоматична повна видимість у стеку в середовищах Kubernetes на основі containerd
Оголошення підтримки CRI-O: Автоматична повна видимість у ваших контейнерах Kubernetes з CRI-O (бета)
Pod, який має доступ до Docker, може мати назву, яка містить:
Як перенести: Міграція Falco з dockershim. Falco підтримує будь-яке середовище виконання, сумісне з CRI (стандартно використовується containerd); документація пояснює всі деталі. Pod, який має доступ до Docker, може мати назву, яка містить:
Перевірте документацію для Prisma Cloud, в розділі "Встановлення Prisma Cloud в кластер CRI (не Docker)". Pod, який має доступ до Docker, може мати назву, подібну до:
Смарт-агент SignalFx (застарілий) використовує кілька різних моніторів для Kubernetes, включаючи kubernetes-cluster
, kubelet-stats/kubelet-metrics
та docker-container-stats
. Монітор kubelet-stats
раніше був застарілим вендором на користь kubelet-metrics
. Монітор docker-container-stats
є одним з тих, що стосуються видалення dockershim. Не використовуйте монітор docker-container-stats
з середовищами виконання контейнерів, відмінними від Docker Engine.
Як перейти з агента, залежного від dockershim:
- Видаліть
docker-container-stats
зі списку налаштованих моніторів. Зверніть увагу, що залишення цього монітора увімкненим з не-dockershim середовищем виконання призведе до неправильних метрик при встановленні docker на вузлі та відсутності метрик, коли docker не встановлено. - Увімкніть та налаштуйте монітор
kubelet-metrics
.
Примітка:
Набір зібраних метрик зміниться. Перегляньте ваші правила сповіщень та інфопанелі.Pod, який має доступ до Docker, може мати назву, подібну до:
Yahoo Kubectl Flame
Flame не підтримує середовищ виконання контейнера, відмінні від Docker. Див. https://github.com/yahoo/kubectl-flame/issues/51