Це багатосторінковий друкований вигляд цього розділу. Натисність щоб друкувати.
Запуск кластерів з kubeadm
- 1: Встановлення kubeadm
- 2: Розвʼязання проблем kubeadm
- 3: Створення кластера за допомогою kubeadm
- 4: Налаштування компонентів за допомогою kubeadm API
- 5: Варіанти топології високої доступності (HA)
- 6: Створення високодоступних кластерів за допомогою kubeadm
- 7: Налаштування високодоступного кластера etcd за допомогою kubeadm
- 8: Налаштування кожного kubelet у кластері за допомогою kubeadm
- 9: Підтримка подвійного стека за допомогою kubeadm
1 - Встановлення kubeadm
Ця сторінка показує, як встановити інструменти kubeadm
. Для отримання інформації щодо того, як створити кластер за допомогою kubeadm після виконання цього процесу встановлення, див. сторінку Створення кластера за допомогою kubeadm.
Інструкція з встановлення стосується Kubernetes v1.31. Якщо ви хочете використовувати іншу версію Kubernetes, перегляньте натомість такі сторінки:
Перш ніж ви розпочнете
- У вас має бути сумісний хост на основі Linux. Проєкт Kubernetes надає загальні інструкції для дистрибутивів Linux, зокрема на базі Debian та Red Hat, а також для дистрибутивів без менеджера пакетів.
- 2 ГБ або більше оперативної памʼяті на кожній машині (менше може залишити мало місця для ваших застосунків).
- 2 процесори або більше для машин панелі управління.
- Повноцінне мережеве зʼєднання між усіма машинами в кластері (публічна чи приватна мережа підходить).
- Унікальні імена хостів, MAC-адреси та product_uuid для кожного вузла. Див. тут для отримання докладнішої інформації.
- Відкриті певні порти на ваших машинах. Див. тут для отримання докладнішої інформації.
Примітка:
Встановлення за допомогоюkubeadm
виконується за допомогою бінарних файлів, які використовують динамічне звʼязування та передбачають, що ваша цільова система надає бібліотеку glibc
. Це припущення стосується багатьох дистрибутивів Linux (включаючи Debian, Ubuntu, Fedora, CentOS і т. д.), але не завжди відповідає дійсності у випадку власних та легких дистрибутивів, які типово не включають glibc
, наприклад, Alpine Linux. Очікується, що дистрибутив включає або шар сумісності, який забезпечує необхідні символи, або glibc
.Перевірка унікальності MAC-адрес та product_uuid для кожного вузла
- Ви можете отримати MAC-адресу мережевих інтерфейсів за допомогою команди
ip link
абоifconfig -a
. - product_uuid можна перевірити за допомогою команди
sudo cat /sys/class/dmi/id/product_uuid
.
Ймовірно, що апаратні пристрої матимуть унікальні адреси, хоча деякі віртуальні машини можуть мати ідентичні значення. Kubernetes використовує ці значення для унікальної ідентифікації вузлів в кластері. Якщо ці значення не є унікальними для кожного вузла, процес встановлення може завершитися невдачею.
Перевірка мережевих адаптерів
Якщо у вас є більше одного мережевого адаптера і компоненти Kubernetes недоступні за стандартним маршрутом, ми рекомендуємо додати IP-маршрут(и), щоб адреси кластера Kubernetes відповідали конкретному адаптеру.
Перевірка необхідних портів
Ці необхідні порти повинні бути відкриті для взаємодії компонентів Kubernetes між собою. Ви можете використовувати інструменти, такі як netcat, щоб перевірити, чи відкритий порт. Наприклад:
nc 127.0.0.1 6443 -v
Мережевий втулок Podʼа, який ви використовуєте, також може вимагати, щоб певні порти були відкриті. Оскільки це відрізняється для кожного мережевого втулка, будь ласка, перегляньте їх документацію про те, які порти їм потрібні.
Конфігурація swap
Стандартно kubelet не запускається, якщо на вузлі виявлено swap-памʼять. Це означає, що swap слід або вимкнути, або дозволити його використання kubelet.
- Щоб дозволити swap, додайте
failSwapOn: false
до конфігурації kubelet або як аргумент командного рядка. Примітка: навіть якщо вказаноfailSwapOn: false
, робочі навантаження не матимуть стандартно доступу до swap. Це можна змінити, встановивши параметрswapBehavior
, знову ж таки в конфігураційному файлі kubelet. Для використання swap, встановіть значенняswapBehavior
інше ніж стандартне налаштуванняNoSwap
. Докладніше дивіться у розділі Управління памʼяттю swap. - Щоб вимкнути swap, можна використовувати команду
sudo swapoff -a
для тимчасового відключення swap. Щоб зробити цю зміну постійною після перезавантаження, переконайтеся, що swap вимкнено у конфігураційних файлах, таких як/etc/fstab
,systemd.swap
, залежно від того, як це налаштовано у вашій системі.
Встановлення середовища виконання контейнерів
Для запуску контейнерів у Pod, Kubernetes використовує середовище виконання контейнерів.
Стандартно Kubernetes використовує Container Runtime Interface (CRI), щоб взаємодіяти з обраним середовищем.
Якщо ви не вказуєте середовище виконання, kubeadm
автоматично намагається виявити встановлене середовище виконання контейнерів, скануючи список відомих точок доступу.
Якщо виявлено кілька або жодного середовища виконання контейнерів, kubeadm
повідомить про помилку та запросить вас вказати, яке середовище ви хочете використовувати.
Дивіться середовища виконання контейнерів для отримання додаткової інформації.
Примітка:
Рушій Docker не має реалізації CRI, що є вимогою для роботи контейнерного середовища в Kubernetes. З цього приводу слід встановити додатковий сервіс cri-dockerd.cri-dockerd
— це проєкт, побудований на основі колишньої вбудованої підтримки Docker Engine, яка була вилучена з kubelet у версії 1.24.Наведені нижче таблиці містять відомі точки доступу для підтримуваних операційних систем:
Середовище виконання | Шлях до Unix socket |
---|---|
containerd | unix:///var/run/containerd/containerd.sock |
CRI-O | unix:///var/run/crio/crio.sock |
Docker Engine (з cri-dockerd) | unix:///var/run/cri-dockerd.sock |
Середовище виконання | Шлях до іменованого pipe Windows |
---|---|
containerd | npipe:////./pipe/containerd-containerd |
Docker Engine (з cri-dockerd) | npipe:////./pipe/cri-dockerd |
Встановлення kubeadm, kubelet та kubectl
Ви повинні встановити ці пакунки на всіх своїх машинах:
kubeadm
: команда для ініціалізації кластера.kubelet
: компонент, який працює на всіх машинах у вашому кластері та виконує такі дії, як запуск підсистем та контейнерів.kubectl
: утиліта командного рядка для взаємодії з вашим кластером.
kubeadm не буде встановлювати або керувати kubelet
або kubectl
за вас, тому вам потрібно забезпечити відповідність їх версії панелі управління Kubernetes, яку ви хочете, щоб kubeadm
встановив для вас. Якщо цього не зробити, існує ризик змішування версій, що може призвести до непередбачуваної та неправильної роботи. Однак одина невелика розбіжність між kubelet
та панеллю управління підтримується, але версія kubelet
ніколи не повинна перевищувати версію API сервера. Наприклад, kubelet
версії 1.7.0 буде повністю сумісний з API-сервером версії 1.8.0, але не навпаки.
Щодо інформації про встановлення kubectl
, див. Встановлення та налаштування kubectl.
Попередження:
Ці інструкції виключають усі пакунки Kubernetes з будь-яких оновлень системи. Це через те, щоkubeadm
та Kubernetes вимагають спеціальної уваги під час оновлення.Докладніше про відмінності версій:
apt.kubernetes.io
та yum.kubernetes.io
) визнані
застарілими та заморожені станом на 13 вересня 2023.
Використання нових репозиторіїв пакунків, розміщених за адресою pkgs.k8s.io`,
настійно рекомендується і є обовʼязковим для встановлення версій Kubernetes, випущених після 13 вересня 2023 року.
Застарілі репозиторії та їхні вміст можуть бути видалені у будь-який момент у майбутньому і без попереднього повідомлення.
Нові репозиторії пакунків надають можливість завантаження версій Kubernetes, починаючи з v1.24.0.Примітка:
Є окремий репозиторій пакунків для кожної мінорної версії Kubernetes. Якщо ви хочете встановити іншу мінорну версію, крім v1.31, див. посібник з встановлення для бажаної мінорної версії.Ці інструкції для Kubernetes v1.31.
Оновіть індекс пакунків
apt
та встановіть пакунки, необхідні для використання репозитарію Kubernetesapt
:sudo apt-get update # apt-transport-https може бути фіктивним пакунком; якщо це так, ви можете пропустити цей крок sudo apt-get install -y apt-transport-https ca-certificates curl gpg
Завантажте публічний ключ підпису для репозиторіїв пакунків Kubernetes. Той самий ключ підпису використовується для всіх репозитаріїв, тому ви можете ігнорувати версію в URL:
# Якщо каталог `/etc/apt/keyrings` не існує, його слід створити до команди curl, прочитайте нижче наведене примітку. # sudo mkdir -p -m 755 /etc/apt/keyrings curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
Примітка:
У випусках старших за Debian 12 та Ubuntu 22.04 теки/etc/apt/keyrings
типово не існує, її слід створити до команди curl.Додайте відповідний репозиторій Kubernetes
apt
. Зверніть увагу, що цей репозиторій містить пакунки лише для Kubernetes 1.31; для інших мінорних версій Kubernetes вам потрібно змінити мінорну версію Kubernetes в URL так, щоб вона відповідала вашій бажаній мінорній версії (також перевірте, чи ви ознайомились з документацією для версії Kubernetes, яку ви плануєте встановити).# Це перезаписує будь-яку наявну конфігурацію в /etc/apt/sources.list.d/kubernetes.list echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
Оновіть індекс пакунків
apt
, встановіть kubelet, kubeadm та kubectl, та зафіксуйте їх версію:sudo apt-get update sudo apt-get install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl
(Опціонально) Увімкніть kublet перед запуском kubeadm:
sudo systemctl enable --now kubelet
Встановіть SELinux у режим
permissive
:Ці інструкції для Kubernetes 1.31.
# Встановити SELinux у режим `permissive` (фактично відключити його) sudo setenforce 0 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
Увага:
- Встановлення SELinux у режим
permissive
за допомогою виконанняsetenforce 0
таsed ...
фактично його вимикає. Це необхідно для того, щоб дозволити контейнерам отримувати доступ до файлової системи хосту, наприклад, деякі мережеві застосунки кластера вимагають цього. Ви повинні зробити це до тих пір, поки підтримка SELinux не буде покращена в kubelet. - Ви можете залишити увімкненим SELinux, якщо ви знаєте, як його налаштувати, але це може вимагати налаштувань, які не підтримуються kubeadm.
Додайте репозиторій Kubernetes
yum
. Параметрexclude
в визначенні репозиторію забезпечує, що пакунки, повʼязані з Kubernetes, не оновлюються при виконанніyum update
, оскільки є спеціальна процедура, якої слід дотримуватися для оновлення Kubernetes. Зверніть увагу, що цей репозиторій має пакунки лише для Kubernetes v1.31; для інших мінорних версій Kubernetes вам потрібно змінити мінорну версію Kubernetes в URL так, щоб вона відповідала вашій бажаній мінорній версії (також перевірте, чи ви ознайомились з документацією для версії Kubernetes, яку ви плануєте встановити).# Це перезаписує будь-яку існуючу конфігурацію в /etc/yum.repos.d/kubernetes.repo cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/ enabled=1 gpgcheck=1 gpgkey=<https://pkgs.k8s.io/core:/stable:/v1.31/rpm/repodata/repomd.xml.key exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni EOF
Встановіть kubelet, kubeadm та kubectl, та активуйте kubelet:
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
(Опціонально) Увімкніть kubelet перед запуском kubeadm:
sudo systemctl enable --now kubelet
Встановіть втулки CNI (необхідно для більшості мережевих підсистем):
CNI_PLUGINS_VERSION="v1.3.0"
ARCH="amd64"
DEST="/opt/cni/bin"
sudo mkdir -p "$DEST"
curl -L "https://github.com/containernetworking/plugins/releases/download/${CNI_PLUGINS_VERSION}/cni-plugins-linux-${ARCH}-${CNI_PLUGINS_VERSION}.tgz" | sudo tar -C "$DEST" -xz
Визначте теку для завантаження файлів команд:
Примітка:
ЗміннаDOWNLOAD_DIR
повинна бути встановлена на теку з правами на запис. Якщо ви використовуєте Flatcar Container Linux, встановіть DOWNLOAD_DIR="/opt/bin"
.DOWNLOAD_DIR="/usr/local/bin"
sudo mkdir -p "$DOWNLOAD_DIR"
Встановіть crictl (необхідно для взаємодії з Container Runtime Interface (CRI), необовʼязково для kubeadm):
CRICTL_VERSION="v1.31.0"
ARCH="amd64"
curl -L "https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-${ARCH}.tar.gz" | sudo tar -C $DOWNLOAD_DIR -xz
Встановіть kubeadm
, kubelet
та додайте службу kubelet
systemd:
RELEASE="$(curl -sSL https://dl.k8s.io/release/stable.txt)"
ARCH="amd64"
cd $DOWNLOAD_DIR
sudo curl -L --remote-name-all https://dl.k8s.io/release/${RELEASE}/bin/linux/${ARCH}/{kubeadm,kubelet}
sudo chmod +x {kubeadm,kubelet}
RELEASE_VERSION="v0.16.2"
curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/krel/templates/latest/kubelet/kubelet.service" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /usr/lib/systemd/system/kubelet.service
sudo mkdir -p /usr/lib/systemd/system/kubelet.service.d
curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/krel/templates/latest/kubeadm/10-kubeadm.conf" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
Примітка:
Звіртесь з примітками в розділі Перш ніж ви розпочнете для дистрибутивів Linux, які типово не містятьglibc
.Встановіть kubectl
, відповідно до інструкцій на сторінці Встановлення інструментів.
Опціонально, увімкніть службу kubelet
перед запуском kubeadm
:
sudo systemctl enable --now kubelet
Примітка:
Дистрибутив Flatcar Container Linux монтує теку/usr
як файлову систему тільки для читання. Перед ініціалізацією кластера вам потрібно виконати додаткові кроки для налаштування теки для запису. Див. Посібник з усунення несправностей kubeadm, щоб дізнатися, як налаштувати теку для запису.Kubelet тепер перезавантажується кожні кілька секунд, чекаючи в циклі crashloop на вказівки від kubeadm.
Налаштування драйвера cgroup
Як середовище виконання контейнерів, так і kubelet мають властивість, відому як "cgroup driver", яка є важливою для управління cgroup на машинах з операційною системою Linux.
Попередження:
Обовʼязково встановлюйте спільний драйвер cgroup для середовища виконання контейнерів та kubelet, інакше процес kubelet завершиться із помилкою.
Докладніше дивіться в розділі Налаштування драйвера cgroup.
Розвʼязання проблем
Якщо у вас виникають труднощі з kubeadm, будь ласка, звертайтеся до наших документів щодо розвʼязання проблем.
Що далі
2 - Розвʼязання проблем kubeadm
Так само як і з будь-якою іншою технологією, ви можете зіткнутися з проблемами під час встановлення або використання kubeadm. Цей документ містить список найпоширеніших проблем та їх рішень, пропонуючи вам кроки, які допоможуть зʼясувати та розвʼязати проблеми.
Якщо вашої проблеми немає в переліку нижче, будь ласка, скористайтесь настпуним:
Ви вважаєте, що це помилка в kubeadm:
- Відвідайте github.com/kubernetes/kubeadm, пошукайте в списку наявних повідомлень.
- Якщо ви не знайшли свою проблему, створіть нове повідомлення про проблему використовуючи готовий шаблон.
Ви не впевнені, що це проблема в роботі kubeadm, ви можете запитати в Slack в каналі
#kubeadm
, або поставити питання на Stack Overflow. Будь ласка, додайте теґи#kubeadm
та#kubernetes
.
Неможливо приєднати вузол v1.18 до кластера v1.17 через відсутність RBAC
У версії v1.18 kubeadm додав запобігання приєднання вузла до кластера, якщо вузол з таким самим імʼям вже існує. Це вимагало додавання RBAC для користувача bootstrap-token для можливості виконання операції GET обʼєкта Node.
Однак це викликає проблему, коли kubeadm join
з v1.18 не може приєднатися до кластера, створеного за допомогою kubeadm v1.17.
Для того, щоб оминути цю проблему у вас є два варіанти:
Виконайте kubeadm init phase bootstrap-token
на вузлі панелі управління за допомогою kubeadm v1.18. Зауважте, що це дозволяє інші дозволи bootstrap-token.
або
Застосуйте наступний RBAC вручну за допомогою kubectl apply -f ...
:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: kubeadm:get-nodes
rules:
- apiGroups:
- ""
resources:
- nodes
verbs:
- get
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubeadm:get-nodes
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: kubeadm:get-nodes
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: system:bootstrappers:kubeadm:default-node-token
ebtables
або подібний виконавчий файл не знайдений під час встановлення
Якщо ви бачите наступні попередження під час виконання kubeadm init
:
[preflight] WARNING: ebtables not found in system path
[preflight] WARNING: ethtool not found in system path
Тоді вам може бракувати ebtables
, ethtool
або подібного виконавчого файлу на вашому вузлі. Ви можете встановити їх за допомогою наступних команд:
- Для користувачів Ubuntu/Debian виконайте
apt install ebtables ethtool
. - Для користувачів CentOS/Fedora виконайте
yum install ebtables ethtool
.
kubeadm
блокується під час очікування на панель управління під час встановлення
Якщо ви помічаєте, що kubeadm init
зупиняється після виведення наступного рядка:
[apiclient] Created API client, waiting for the control plane to become ready
Це може бути спричинено кількома проблемами. Найбільш поширеними є:
- проблеми з мережевим підключенням. Перш ніж продовжувати, перевірте, чи ваша машина має повне підключення до мережі.
- драйвер cgroup контейнера відрізняється від драйвера kubelet cgroup. Щоб зрозуміти, як правильно налаштувати це, див. Налаштування драйвера cgroup.
- контейнери панелі управління впадають в цикл або зупиняються. Ви можете перевірити це, використовуючи
docker ps
та вивчаючи кожен контейнер за допомогоюdocker logs
. Для інших середовищ виконання контейнерів, див. Налагодження вузлів Kubernetes за допомогою crictl.
kubeadm
блокується під час видалення керованих контейнерів
Наступне може трапитися, якщо середовище виконання контейнерів зупиняється і не видаляє жодних керованих контейнерів Kubernetes:
sudo kubeadm reset
[preflight] Running pre-flight checks
[reset] Stopping the kubelet service
[reset] Unmounting mounted directories in "/var/lib/kubelet"
[reset] Removing kubernetes-managed containers
(block)
Можливий варіант вирішення — перезапустити середовище виконання контейнерів, а потім знову запустити kubeadm reset
. Ви також можете використовувати crictl
для налагодження стану середовища виконання контейнерів. Див. Налагодження вузлів Kubernetes за допомогою crictl.
Podʼи у стані RunContainerError
, CrashLoopBackOff
або Error
Відразу після виконання kubeadm init
не повинно бути жодних контейнерів у таких станах.
- Якщо є контейнери в одному з цих станів відразу після
kubeadm init
, будь ласка, створіть тікет в репозиторії kubeadm.coredns
(абоkube-dns
) повинен перебувати у станіPending
до моменту розгортання додатка для мережі. - Якщо ви бачите контейнери у стані
RunContainerError
,CrashLoopBackOff
абоError
після розгортання додатка для мережі та нічого не відбувається зcoredns
(абоkube-dns
), дуже ймовірно, що додаток Pod Network, який ви встановили, є пошкодженим. Можливо, вам потрібно надати йому більше привілеїв RBAC або використовувати новішу версію. Будь ласка, створіть тікет в системі відстеження проблем постачальника Pod Network та очікуйте розвʼязання проблеми там.
coredns
застрягає у стані Pending
Це очікувано і є частиною дизайну. kubeadm є агностичним до мережі, тому адміністратор повинен встановити вибраний додаток для мережі за власним вибором. Вам потрібно встановити Pod Network, перш ніж coredns
може бути повністю розгорнутим. Таким чином, стан Pending
перед налаштуванням мережі є нормальним.
Сервіси HostPort
не працюють
Функціональність HostPort
та HostIP
доступна залежно від вашого провайдера Pod Network. Будь ласка, звʼяжіться з автором додатка Pod Network, щоб дізнатися, чи
функціональність HostPort
та HostIP
доступна.
Перевірено, що Calico, Canal та Flannel CNI підтримують HostPort.
Для отримання додаткової інформації перегляньте документацію CNI portmap.
Якщо ваш постачальник мережі не підтримує втулок CNI portmap, можливо, вам доведеться використовувати функцію NodePort для сервісів або використовуйте HostNetwork=true
.
До Podʼів неможливо отримати доступ за їх Service IP
Багато додатків для мережі ще не увімкнули режим hairpin, який дозволяє Podʼам звертатися до себе за їх Service IP. Це повʼязано з CNI. Будь ласка, звʼяжіться з постачальником додатка для мережі, щоб дізнатися про останній статус підтримки режиму hairpin.
Якщо ви використовуєте VirtualBox (безпосередньо, або через Vagrant), вам слід переконатися, що
hostname -i
повертає маршрутизовану IP-адресу. Типово перший інтерфейс підключений до немаршрутизованої мережі тільки для хосту. Як тимчасовий варіант, ви можете змінити/etc/hosts
, подивіться цей Vagrantfile для прикладу.
Помилки сертифіката TLS
Наступна помилка вказує на можливу несумісність сертифікатів.
# kubectl get pods
Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")
Перевірте, що файл
$HOME/.kube/config
містить дійсний сертифікат, та перегенеруйте сертифікат за необхідності. Сертифікати у файлі конфігурації kubeconfig закодовані у форматі base64. Командаbase64 --decode
може бути використана для декодування сертифіката, аopenssl x509 -text -noout
може бути використано для перегляду інформації про сертифікат.Скасуйте змінну середовища
KUBECONFIG
за допомогою:unset KUBECONFIG
Або встановіть його в типове розташування
KUBECONFIG
:export KUBECONFIG=/etc/kubernetes/admin.conf
Іншим обхідним методом є перезапис наявного
kubeconfig
для користувача "admin":mv $HOME/.kube $HOME/.kube.bak mkdir $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
Помилка ротації сертифіката клієнта Kubelet
Стандартно kubeadm
налаштовує kubelet
на автоматичну ротацію сертифікатів клієнта за допомогою символічного посилання /var/lib/kubelet/pki/kubelet-client-current.pem
, вказаного в /etc/kubernetes/kubelet.conf
. Якщо цей процес ротації завершиться невдачею, ви можете побачити помилки, такі як x509: certificate has expired or is not yet valid
в журналах kube-apiserver
. Щоб виправити цю проблему, слід виконати наступні кроки:
Зробіть резервну копію та видаліть файли
/etc/kubernetes/kubelet.conf
та/var/lib/kubelet/pki/kubelet-client*
з несправного вузла.З робочого вузла контрольної площини кластера, де є
/etc/kubernetes/pki/ca.key
, виконайтеkubeadm kubeconfig user --org system:nodes --client-name system:node:$NODE > kubelet.conf
.$NODE
повинно бути встановлено на імʼя наявного несправного вузла в кластері. Вручну змініть отриманийkubelet.conf
, щоб відкоригувати імʼя та endpoint сервера, або передайтеkubeconfig user --config
(див. see Створення файлів kubeconfig для додаткових користувачів). Якщо в у вашому кластері немаєca.key
, ви повинні вручну підписати вбудовані сертифікати вkubelet.conf
.Скопіюйте цей отриманий
kubelet.conf
в/etc/kubernetes/kubelet.conf
на несправному вузлі.Перезапустіть
kubelet
(systemctl restart kubelet
) на несправному вузлі та зачекайте, доки/var/lib/kubelet/pki/kubelet-client-current.pem
буде відновлено.Вручну відредагуйте
kubelet.conf
, щоб вказати на обертані сертифікати клієнтаkubelet
, замінившиclient-certificate-data
таclient-key-data
на:client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem client-key: /var/lib/kubelet/pki/kubelet-client-current.pem
Перезапустіть
kubelet
.Переконайтеся, що вузол стає
Ready
.
Типовий мережевий інтерфейс NIC при використанні Flannel як мережі для Podʼів у Vagrant
Наступна помилка може свідчити про те, що щось пішло не так у мережі Podʼів:
Error from server (NotFound): the server could not find the requested resource
Якщо ви використовуєте Flannel як мережу для Podʼів у Vagrant, тоді вам доведеться вказати типове імʼя інтерфейсу для Flannel.
Зазвичай Vagrant призначає два інтерфейси всім віртуальним машинам. Перший, для якого всі хости мають IP-адресу
10.0.2.15
, призначено для зовнішнього трафіку, який проходить через NAT.Це може призвести до проблем із Flannel, яка стандартно він обирає перший інтерфейс на хості. Це призводить до того, що всі хости вважають, що у них однакова публічна IP-адреса. Щоб цього уникнути, передайте прапорець
--iface eth1
для Flannel, щоб обрати другий інтерфейс.
Непублічні IP-адреси для контейнерів
У деяких ситуаціях команди kubectl logs
та kubectl run
можуть повертати помилки на функціональному кластері:
Error from server: Get https://10.19.0.41:10250/containerLogs/default/mysql-ddc65b868-glc5m/mysql: dial tcp 10.19.0.41:10250: getsockopt: no route to host
Це може бути викликано використанням Kubernetes IP-адреси, яка не може взаємодіяти з іншими IP-адресами на одній підмережі, можливо, через політику провайдера машин.
DigitalOcean призначає публічний IP для
eth0
, а також приватний IP для внутрішнього використання як анкера для їхньої функції змінного IP. Однак,kubelet
вибере останній якInternalIP
вузла замість першого.Використовуйте
ip addr show
для перевірки цього сценарію, а неifconfig
, оскількиifconfig
не показує обрану адресу IP для аліаса. Альтернативно, API-точка, специфічна для DigitalOcean, дозволяє запитувати анкер IP-адресу з машини:curl http://169.254.169.254/metadata/v1/interfaces/public/0/anchor_ipv4/address
Обхідним рішенням є повідомлення
kubelet
, яку IP використовувати за допомогою--node-ip
. Коли використовується DigitalOcean, це може бути публічний IP (призначенийeth0
) або приватний IP (призначенийeth1
), якщо ви хочете використовувати додаткову приватну мережу. РозділkubeletExtraArgs
структури kubeadmNodeRegistrationOptions
може бути використаний для цього.Потім перезапустіть
kubelet
:systemctl daemon-reload systemctl restart kubelet
Podʼи coredns
перебувають у стані CrashLoopBackOff
або Error
Якщо у вас є вузли, які працюють із SELinux та старішою версією Docker, ви можете стикнутися зі сценарієм, де Podʼи coredns
не запускаються. Щоб вирішити це, ви можете спробувати один з наступних варіантів:
Оновіться до новішої версії Docker.
Змініть розгортання
coredns
, встановившиallowPrivilegeEscalation
вtrue
:
kubectl -n kube-system get deployment coredns -o yaml | \
sed 's/allowPrivilegeEscalation: false/allowPrivilegeEscalation: true/g' | \
kubectl apply -f -
Іншою причиною того, що CoreDNS має CrashLoopBackOff
, є те, що Pod CoreDNS, розгорнутий в Kubernetes, виявляє цикл. Існують різні обхідні варіанти, щоб уникнути спроб перезапуску Podʼа CoreDNS кожного разу, коли CoreDNS виявляє цикл та виходить.
Попередження:
Вимкнення SELinux або встановленняallowPrivilegeEscalation
в true
може піддавати ризику безпеку вашого кластера.Podʼі etcd постійно перезапускаються
Якщо ви стикаєтеся з такою помилкою:
rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:247: starting container process caused "process_linux.go:110: decoding init error from pipe caused \"read parent: connection reset by peer\""
Ця проблема виникає, якщо ви використовуєте CentOS 7 з Docker 1.13.1.84. Ця версія Docker може завадити kubelet виконуватися в контейнері etcd.
Для усунення цієї проблеми виберіть один з наступних варіантів:
Поверніться до попередньої версії Docker, наприклад, 1.13.1-75
yum downgrade docker-1.13.1-75.git8633870.el7.centos.x86_64 docker-client-1.13.1-75.git8633870.el7.centos.x86_64 docker-common-1.13.1-75.git8633870.el7.centos.x86_64
Встановіть одну з новіших рекомендованих версій, наприклад 18.06:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install docker-ce-18.06.1.ce-3.el7.x86_64
Неможливо передати розділений комою список значень аргументів під прапорцем --component-extra-args
Прапорці kubeadm init
, такі як --component-extra-args
, дозволяють передавати власні аргументи компоненту панелі управління, наприклад, kube-apiserver. Однак цей механізм обмежений через тип, який використовується для розбору значень (mapStringString
).
Якщо ви вирішите передати аргумент, який підтримує кілька значень, розділених комами, такий як --apiserver-extra-args "enable-admission-plugins=LimitRanger,NamespaceExists"
, цей прапорець видасть помилку flag: malformed pair, expect string=string
. Це відбувається через те, що список аргументів для --apiserver-extra-args
очікує пари key=value
, і в цьому випадку NamespacesExists
розглядається як ключ, якому не вистачає значення.
У іншому випадку ви можете спробувати розділити пари key=value
так: --apiserver-extra-args "enable-admission-plugins=LimitRanger,enable-admission-plugins=NamespaceExists"
, але це призведе до того, що ключ enable-admission-plugins
матиме лише значення NamespaceExists
.
Відомий обхід цього — використання файлу конфігурації kubeadm.
kube-proxy плануєтья до того, як вузол ініціалізовано cloud-controller-manager
У сценаріях хмарних провайдерів kube-proxy може виявитися запланованим на нових робочих вузлах до того, як cloud-controller-manager ініціалізує адреси вузла. Це призводить до того, що kube-proxy не може належним чином отримати IP-адресу вузла, і це має негативний вплив на функцію проксі, що керує балансуванням навантаження.
У kube-proxy Pods можна побачити наступну помилку:
server.go:610] Failed to retrieve node IP: host IP unknown; known addresses: []
proxier.go:340] invalid nodeIP, initializing kube-proxy with 127.0.0.1 as nodeIP
Відомий варіант рішення — виправлення DaemonSet kube-proxy, щоб дозволити його планування на вузлах панелі управління незалежно від їхніх умов, утримуючи його подальше від інших вузлів, доки їхні початкові умови зберігаються:
kubectl -n kube-system patch ds kube-proxy -p='{
"spec": {
"template": {
"spec": {
"tolerations": [
{
"key": "CriticalAddonsOnly",
"operator": "Exists"
},
{
"effect": "NoSchedule",
"key": "node-role.kubernetes.io/control-plane"
}
]
}
}
}
}'
Тікет, що відстежує цю проблему, розташовано тут.
/usr
монтується тільки для читання на вузлах
У дистрибутивах Linux, таких як Fedora CoreOS або Flatcar Container Linux, тека /usr
монтується як файлова система тільки для читання. Для підтримки flex-volume компоненти Kubernetes, такі як kubelet і kube-controller-manager, використовують типовий шлях /usr/libexec/kubernetes/kubelet-plugins/volume/exec/
, проте тека flex-volume має бути доступною для запису, щоб ця функція працювала.
Примітка:
У випуску Kubernetes v1.23 функцію FlexVolume було визнано застарілою.Для усунення цієї проблеми ви можете налаштувати теку flex-volume, використовуючи файл конфігурації kubeadm.
На основному вузлі панелі управління (створеному за допомогою kubeadm init
) передайте наступний файл, використовуючи параметр --config
:
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
nodeRegistration:
kubeletExtraArgs:
- name: "volume-plugin-dir"
value: "/opt/libexec/kubernetes/kubelet-plugins/volume/exec/"
---
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
controllerManager:
extraArgs:
- name: "flex-volume-plugin-dir"
value: "/opt/libexec/kubernetes/kubelet-plugins/volume/exec/"
При долученні вузлів:
apiVersion: kubeadm.k8s.io/v1beta4
kind: JoinConfiguration
nodeRegistration:
kubeletExtraArgs:
- name: "volume-plugin-dir"
value: "/opt/libexec/kubernetes/kubelet-plugins/volume/exec/"
Альтернативно ви можете змінити файл /etc/fstab
, щоб зробити монтування /usr
доступним для запису, проте будьте обізнані, що це змінює принцип дизайну дистрибутиву Linux.
kubeadm upgrade plan
виводить повідомлення про помилку context deadline exceeded
Це повідомлення про помилку виводиться при оновленні кластера Kubernetes за допомогою kubeadm
у випадку використання зовнішнього etcd. Це не критична помилка і виникає через те, що старі версії kubeadm
виконують перевірку версії зовнішнього кластера etcd. Ви можете продовжити з kubeadm upgrade apply ...
.
Цю проблему виправлено у версії 1.19.
kubeadm reset
відмонтовує /var/lib/kubelet
Якщо /var/lib/kubelet
має точку монтування, виконання kubeadm reset
фактично відмонтує його.
Для уникнення цієї проблеми повторно замонтуйте каталог /var/lib/kubelet
після виконання операції kubeadm reset
.
Це вдосконалення було введено в kubeadm 1.15. Проблема виправлена в 1.20.
Неможливо безпечно використовувати metrics-server в кластері kubeadm
У кластері kubeadm metrics-server може бути використаний в небезпечний спосіб, передаючи йому параметр --kubelet-insecure-tls
. Це не рекомендується для промислових кластерів.
Якщо ви хочете використовувати TLS між metrics-server та kubelet, виникає проблема, оскільки kubeadm розгортає самопідписний службовий сертифікат для kubelet. Це може призвести до наступних помилок з боку metrics-server:
x509: certificate signed by unknown authority
x509: certificate is valid for IP-foo not IP-bar
Дивіться Увімкнення підписаних службових сертифікатів kubelet, щоб зрозуміти, як налаштувати kubelet в кластері kubeadm для отримання належно підписаних службових сертифікатів.
Також перегляньте Як запустити metrics-server безпечно.
Оновлення не вдається через незмінність хешу etcd
Це стосується лише оновлення вузла панелі управління за допомогою бінарного файлу kubeadm v1.28.3 або пізніше, при умові, що вузол в цей час керується версіями kubeadm v1.28.0, v1.28.1 або v1.28.2.
Ось повідомлення про помилку, яке може виникнути:
[upgrade/etcd] Failed to upgrade etcd: couldn't upgrade control plane. kubeadm has tried to recover everything into the earlier state. Errors faced: static Pod hash for component etcd on Node kinder-upgrade-control-plane-1 did not change after 5m0s: timed out waiting for the condition
[upgrade/etcd] Waiting for previous etcd to become available
I0907 10:10:09.109104 3704 etcd.go:588] [etcd] attempting to see if all cluster endpoints ([https://172.17.0.6:2379/ https://172.17.0.4:2379/ https://172.17.0.3:2379/]) are available 1/10
[upgrade/etcd] Etcd was rolled back and is now available
static Pod hash for component etcd on Node kinder-upgrade-control-plane-1 did not change after 5m0s: timed out waiting for the condition
couldn't upgrade control plane. kubeadm has tried to recover everything into the earlier state. Errors faced
k8s.io/kubernetes/cmd/kubeadm/app/phases/upgrade.rollbackOldManifests
cmd/kubeadm/app/phases/upgrade/staticpods.go:525
k8s.io/kubernetes/cmd/kubeadm/app/phases/upgrade.upgradeComponent
cmd/kubeadm/app/phases/upgrade/staticpods.go:254
k8s.io/kubernetes/cmd/kubeadm/app/phases/upgrade.performEtcdStaticPodUpgrade
cmd/kubeadm/app/phases/upgrade/staticpods.go:338
...
Причина цієї помилки полягає в тому, що пошкоджені версії генерують файл маніфесту etcd із небажаними стандартними в PodSpec. Це призводить до різниці в порівнянні маніфестів, і kubeadm буде очікувати зміни хешу в Pod, але kubelet ніколи не оновить хеш.
Є два способи обійти цю проблему, якщо ви бачите її у своєму кластері:
Оновлення etcd може бути пропущено між пошкодженими версіями та v1.28.3 (або пізніше) за допомогою:
kubeadm upgrade {apply|node} [version] --etcd-upgrade=false
Це не рекомендується у випадку, якщо пізніше патч-версії v1.28 вводять нову версію etcd.
Перед оновленням виправте маніфест для статичного Pod etcd, щоб видалити стандартні проблемні атрибути:
diff --git a/etc/kubernetes/manifests/etcd_defaults.yaml b/etc/kubernetes/manifests/etcd_origin.yaml index d807ccbe0aa..46b35f00e15 100644 --- a/etc/kubernetes/manifests/etcd_defaults.yaml +++ b/etc/kubernetes/manifests/etcd_origin.yaml @@ -43,7 +43,6 @@ spec: scheme: HTTP initialDelaySeconds: 10 periodSeconds: 10 - successThreshold: 1 timeoutSeconds: 15 name: etcd resources: @@ -59,26 +58,18 @@ spec: scheme: HTTP initialDelaySeconds: 10 periodSeconds: 10 - successThreshold: 1 timeoutSeconds: 15 - terminationMessagePath: /dev/termination-log - terminationMessagePolicy: File volumeMounts: - mountPath: /var/lib/etcd name: etcd-data - mountPath: /etc/kubernetes/pki/etcd name: etcd-certs - dnsPolicy: ClusterFirst - enableServiceLinks: true hostNetwork: true priority: 2000001000 priorityClassName: system-node-critical - restartPolicy: Always - schedulerName: default-scheduler securityContext: seccompProfile: type: RuntimeDefault - terminationGracePeriodSeconds: 30 volumes: - hostPath: path: /etc/kubernetes/pki/etcd
Більше інформації можна знайти в тікеті для цієї помилки.
3 - Створення кластера за допомогою kubeadm
За допомогою kubeadm
ви можете створити мінімальний кластер Kubernetes, який відповідає найкращим практикам. Фактично, ви можете використовувати kubeadm
для налаштування кластерf, який успішно пройде тести відповідності Kubernetes. kubeadm
також підтримує інші функції життєвого циклу кластера, такі як bootstrap-токени nf оновлення кластера.
Інструмент kubeadm
корисний у випадках, коли вам потрібен:
- Простий спосіб спробувати Kubernetes, можливо, вперше.
- Спосіб для поточних користувачів автоматизувати налаштування кластера та протестувати свій застосунок.
- Компонент в інших екосистемах та/або інсталяторах із більшим функціоналом.
Ви можете встановлювати та використовувати kubeadm
на різних машинах: на вашому ноутбуці, хмарних серверах, Raspberry Pi та інших. Незалежно від того, чи ви розгортаєте у хмарі, чи на власних серверах, ви можете інтегрувати kubeadm
у системи постачання, такі як Ansible або Terraform.
Перш ніж ви розпочнете
Для виконання цього керівництва вам потрібно мати:
- Одну чи кілька машин з операційною системою, сумісною з deb/rpm, наприклад: Ubuntu чи CentOS.
- 2 ГБ або більше оперативної памʼяті на кожній машині — менше може призвести до обмежень для вашого застосунку.
- Принаймні 2 процесори на машині, яку ви використовуєте як вузол панелі управління.
- Повну мережеву доступність між усіма машинами в кластері. Ви можете використовувати як публічні, так і приватні мережі.
Також вам потрібно використовувати версію kubeadm
, яка може розгортати ту версію
Kubernetes, яку ви хочете використовувати у своєму новому кластері.
Політика підтримки версій та їх розбіжностей в Kubernetes розповсюджується на kubeadm
так само як і на Kubernetes в цілому. Перевірте цю політику, щоб дізнатися, які версії Kubernetes та kubeadm
підтримуються. Ця сторінка написана для Kubernetes v1.31.
Загальний стан функцій інструменту kubeadm
— Загальна Доступність (GA). Деякі підфункції ще перебувають на стадії активної розробки. Реалізація створення кластера може трохи змінитися, в міру розвитку інструменту, але загальна реалізація повинна бути досить стабільною.
Примітка:
Будь-які команди підkubeadm alpha
за визначенням підтримуються на рівні альфа-версії.Мета
- Встановити Kubernetes з одною панеллю управління
- Встановити мережу для Podʼів в кластері, так щоб вони могли спілкуватися один з одним
Інструкції
Підготовка хостів
Встановлення компонентів
Встановіть середовище виконання контейнерів та kubeadm
на всіх хостах. За докладними інструкціями та іншими вимогами звертайтесь до Встановлення kubeadm.
Примітка:
Якщо ви вже встановили kubeadm
, перегляньте перші два кроки документації
Оновлення вузлів Linux для отримання інструкцій щодо оновлення kubeadm
.
Під час оновлення kubelet
перезапускається кожні кілька секунд, очікуючи в crashloop на команди від kubeadm
. Цей цикл аварійного перезавантаження є очікуваним і нормальним. Після ініціалізації панелі управління kubelet
працює в нормальному режимі.
Налаштування мережі
kubeadm
, подібно до інших компонентів Kubernetes, намагається знайти доступну IP-адресу на мережевих інтерфейсах, повʼязаних із вказаним типовим шлюзом на хості.
Ця IP-адреса використовується для оголошення та/або прослуховування, яке виконується компонентом.
Щоб дізнатися, яка це IP-адреса на Linux-хості, ви можете використовувати:
ip route show # Перегляньте рядок, який починається з "default via"
Примітка:
Якщо на хості присутні два або більше стандартних шлюзи, компонент Kubernetes буде намагатися використовувати перший, який зустрічається із відповідною глобальною унікальною IP-адресою. При здійсненні цього вибору точний порядок шлюзів може відрізнятися між різними операційними системами та версіями ядра.Компоненти Kubernetes не приймають мережевий інтерфейс як параметр, тому потрібно передавати власну IP-адресу як прапорець для всіх екземплярів компонентів, які потребують такої конфігурації.
Примітка:
Якщо на хості відсутній стандартний шлюз і якщо не передано власну IP-адресу компоненту Kubernetes, робота компонента може завершитися з помилкою.Для налаштування IP-адреси оголошення API-сервера для вузлів панелі управління, створених із init
та join
, можна використовувати прапорець --apiserver-advertise-address
. Переважно, варто встановлювати цю опцію в API-інтерфейсі kubeadm
як InitConfiguration.localAPIEndpoint
та JoinConfiguration.controlPlane.localAPIEndpoint
.
Для kubelet на всіх вузлах опцію --node-ip
можна передати в .nodeRegistration.kubeletExtraArgs
всередині конфігураційного файлу kubeadm (InitConfiguration
або JoinConfiguration
).
Для роботи з двома стеками дивіться Підтримка двох стеків із kubeadm.
IP-адреси, які ви призначаєте компонентам панелі управління, стають частиною полів імені альтернативного підлеглого X.509 сертифікату. Зміна цих IP-адрес може вимагати підписання нових сертифікатів і перезапуску відповідних компонентів, щоб задіяти зміни у файлах сертифікатів. Дивіться Ручне поновлення сертифікатів для отримання докладнішої інформації з цього питання.
Попередження:
Проєкт Kubernetes не рекомендує використовувати цей підхід (налаштування всіх екземплярів компонентів власними IP-адресами). Замість цього рекомендується встановити мережу хосту так, щоб IP-адреса стандартного шлюзу була тією, яку компоненти Kubernetes автоматично визначають і використовують. На Linux-вузлах ви можете використовувати команди, такі якip route
для налаштування мережі; ваша операційна система може також надавати засоби управління мережею вищого рівня. Якщо стандартний шлюз вашого вузла має публічну IP-адресу, слід налаштувати фільтрацію пакетів чи інші заходи безпеки, що захищають вузли та ваш кластер.Підготовка необхідних образів контейнерів
Цей крок є необовʼязковим і застосовується тільки у випадку, якщо ви бажаєте, щоб kubeadm init
та kubeadm join
не завантажували типові образи контейнерів, які розміщені на registry.k8s.io
.
Kubeadm має команди, які можуть допомогти вам попередньо витягти необхідні образи при створенні кластера без Інтернет-зʼєднання на його вузлах. Дивіться Запуск kubeadm без Інтернет-зʼєднання для отримання докладнішої інформації.
Kubeadm дозволяє вам використовувати власний репозиторій образів для необхідних образів. Дивіться Використання власних образів для отримання більше інформації.
Ініціалізація вузла панелі управління
Вузол панелі управління — це машина, де працюють компоненти панелі управління, включаючи etcd (база даних кластера) та API Server (з яким взаємодіє інструмент командного рядка kubectl).
- (Рекомендовано) Якщо у вас є плани оновлення цього кластера з одною панеллю управління за допомогою
kubeadm
до рівня високої доступності, ви повинні вказати--control-plane-endpoint
, щоб встановити загальний endpoint для всіх вузлів панелі управління. Такий endpoint може бути іменем DNS або IP-адресою балансувальника навантаження. - Виберіть надбудову мережі Pod та перевірте, чи для його налаштування потрібно передати будь-які аргументи в
kubeadm init
. Залежно від того, якого постачальника вибрано, вам може бути потрібно встановити значення--pod-network-cidr
в значення, специфічне для постачальника. Дивіться Встановлення надбудови мережі Podʼів. - (Необовʼязково)
kubeadm
намагається визначити середовище виконання контейнерів, використовуючи список відомих точок входу. Щоб використовувати інше середовище виконання контейнерів або якщо встановлено більше одного на наданому вузлі, вкажіть аргумент--cri-socket
дляkubeadm
. Дивіться Встановлення середовища виконання.
Щоб ініціалізувати вузол панелі управління, виконайте:
kubeadm init <args>
Міркування щодо apiserver-advertise-address та ControlPlaneEndpoint
Хоча --apiserver-advertise-address
може бути використано для встановлення оголошення адреси для API-сервера цього конкретного вузла панелі управління, --control-plane-endpoint
може бути використано для встановлення загальної endpoint для всіх вузлів управління.
--control-plane-endpoint
дозволяє використовувати як IP-адреси, так і DNS-імена, які можуть транслюватись у IP-адреси. Будь ласка, зверніться до вашого адміністратора мережі, щоб оцінити можливі рішення щодо такого перетворення.
Ось приклад:
192.168.0.102 cluster-endpoint
Де 192.168.0.102
— це IP-адреса цього вузла, а cluster-endpoint
— це власне DNS-імʼя, яке повʼязується з цим IP. Це дозволить вам передавати --control-plane-endpoint=cluster-endpoint
у kubeadm init
і передавати те ж саме DNS-імʼя до kubeadm join
. Пізніше ви можете змінити cluster-endpoint
, щоб вказати адресу вашого балансувальника навантаження в сценарії високої доступності.
Перетворення кластера з одною панеллю управлінням, створеного без --control-plane-endpoint
, у високодоступний кластер не підтримується kubeadm.
Додаткова інформація
Для отримання додаткової інформації щодо аргументів kubeadm init
, див. посібник kubeadm.
Щоб налаштувати kubeadm init
за допомогою файлу конфігурації, див. Використання kubeadm init з файлом конфігурації.
Для налаштування компонентів панелі управління, включаючи необовʼязкове призначення IPv6 для перевірки наявності для компонентів панелі управління та сервера etcd, надайте додаткові аргументи кожному компоненту, як описано на сторінці про додаткові аргументи.
Щоб переналаштувати кластер, який вже був створений, див. Переконфігурування кластера kubeadm.
Щоб знову виконати kubeadm init
, спершу вам потрібно розібрати кластер.
Якщо ви приєднуєте вузол з іншою архітектурою до вашого кластера, переконайтеся, що ваші розгорнуті DaemonSets мають підтримку образів контейнерів для цієї архітектури.
kubeadm init
спочатку виконує серію попередніх перевірок, щоб забезпечити готовність машини до запуску Kubernetes. Ці попередні перевірки виводять попередження та виходять при помилках. Потім kubeadm init
завантажує та встановлює компоненти управління кластером. Це може зайняти кілька хвилин. Після завершення ви повинні побачити:
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
You should now deploy a Pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
/docs/concepts/cluster-administration/addons/
You can now join any number of machines by running the following on each node
as root:
kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
Щоб кubectl працював для вашого користувача без прав root, виконайте ці команди, які є також частиною виводу kubeadm init
:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Або, якщо ви є користувачем root
, ви можете виконати:
export KUBECONFIG=/etc/kubernetes/admin.conf
Попередження:
Файл конфігурації kubeconfig admin.conf
, який створює kubeadm init
, містить сертифікат із Subject: O = kubeadm:cluster-admins, CN = kubernetes-admin
. Група kubeadm:cluster-admins
привʼязана до вбудованої ролі кластера cluster-admin
.
Не діліться файлом admin.conf
будь з ким.
kubeadm init
генерує інший файл kubeconfig super-admin.conf
, який містить сертифікат із Subject: O = system:masters, CN = kubernetes-super-admin
.
system:masters
— це суперкористувацька група, яка обходить рівень авторизації (наприклад, RBAC). Не діліться файлом super-admin.conf
будь з ким. Рекомендується перемістити файл в безпечне місце.
Див. Генерація файлів kubeconfig для додаткових користувачів щодо того, як використовувати kubeadm kubeconfig user
для генерації файлів kubeconfig для додаткових користувачів.
Запишіть команду kubeadm join
, яку виводить kubeadm init
. Вам потрібна ця команда для приєднання вузлів до вашого кластера.
Токен використовується для взаємної автентифікації між вузлом панелі управління та приєднуваними вузлами. Токен, який включено тут, є секретним. Зберігайте його у безпеці, оскільки будь-хто з цим токеном може додавати автентифіковані вузли до вашого кластера. Ці токени можна подивитись, створити та видалити за допомогою команди kubeadm token
. Див. посібник посилань для kubeadm.
Встановлення надбудови для мережі Pod
Увага:
Цей розділ містить важливу інформацію щодо налаштування мережі та порядку розгортання. Уважно прочитайте всі ці поради перед продовженням.
Вам потрібно розгорнути надбудову мережі Pod на основі Container Network Interface (CNI), щоб ваші Podʼи могли взаємодіяти один з одним. Кластерний DNS (CoreDNS) не буде запущений, доки не буде встановлена мережа.
Пильнуйте, щоб мережа ваших Podʼів не перетиналася з будь-якою з мереж хосту. Якщо ви знаходите колізію між вашою пропонованою мережею Podʼів та деякими мережами вашого хосту, вам слід обрати відповідний блок CIDR для використання його під час виконання
kubeadm init
з--pod-network-cidr
та як заміну у вашому файлі налаштувань мережевого втулка YAML.Типово
kubeadm
налаштовує ваш кластер на використання та забезпечення використання RBAC (контроль доступу на основі ролей). Переконайтеся, що ваш мережевий втулок для Pod підтримує RBAC, так само як і будь-які маніфести, які ви використовуєте для її розгортання.Якщо ви хочете використовувати IPv6 — як подвійний стек, так і лише одновимірну IPv6-мережу — для вашого кластера, переконайтеся, що ваш мережевий втулок для Podʼів підтримує IPv6. Підтримку IPv6 було додано до CNI у v0.6.0.
Примітка:
Kubeadm повинен бути агностичним до CNI, а перевірка постачальників CNI виходить за рамки наших поточних e2e-тестів. Якщо ви знайшли проблему, повʼязану з втулком CNI, вам слід створити тікет у відповідному репозиторії втулка CNI, а не у репо kubeadm чи Kubernetes.Кілька зовнішніх проєктів надають мережі Pod Kubernetes за допомогою CNI, деякі з яких також підтримують Network Policy.
Див. список надбудов, які реалізують Модель мережі Kubernetes.
Будь ласка, звертайтеся до сторінки Встановлення надбудов для списку мережевих надбудов (може бути неповним), які підтримуються в Kubernetes. Ви можете встановити надбудову мережі Pod за допомогою наступної команди на вузлі панелі управління або вузлі, на якому є облікові дані kubeconfig:
kubectl apply -f <add-on.yaml>
Примітка:
Лише кілька втулків CNI підтримують Windows. Більше деталей та інструкцій щодо налаштування можна знайти в розділі Додавання Windows worker вузлів.Ви можете встановити лише одну мережу Pod на кластер.
Як тільки мережу Pod буде створено, ви можете підтвердити, що вона працює, перевіривши, що Pod CoreDNS у стані Running
у виводі kubectl get pods --all-namespaces
. І як тільки Pod CoreDNS запущено і він працює, ви можете продовжити приєднувати ваші вузли.
Якщо ваша мережа не працює або CoreDNS не перебуває у стані Running
, перегляньте
посібник з усунення несправностей для kubeadm
.
Керовані мітки вузлів
Типово kubeadm вмикає контролер доступу NodeRestriction, що обмежує, які мітки можуть бути самостійно застосовані kubelet під час реєстрації вузла. Документація контролера доступу описує, які мітки можна використовувати з параметром kubelet --node-labels
. Мітка node-role.kubernetes.io/control-plane
є такою обмеженою міткою, і kubeadm вручну застосовує її, використовуючи привілейований клієнт після створення вузла. Щоб зробити це вручну, ви можете використовувати kubectl label
та переконатися, що використовується привілейований kubeconfig, такий як керований kubeadm /etc/kubernetes/admin.conf
.
Ізоляція вузла панелі управління
Типово у вашому кластері не буде планувати розміщення Podʼів на вузлі панелі управління з міркувань безпеки. Якщо ви хочете мати можливість планувати Podʼи на вузлах панелі управління, наприклад, для кластера Kubernetes на одній машині, виконайте команду:
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
Вивід буде схожим на:
node "test-01" untainted
...
Це видалить позначку node-role.kubernetes.io/control-plane:NoSchedule
з будь-яких вузлів, які мають її, включаючи вузли панелі управління, що означає, що планувальник зможе розміщувати Podʼи всюди.
Додатково ви можете виконати наступну команду, щоб видалити мітку node.kubernetes.io/exclude-from-external-load-balancers
з вузла панелі управління, що виключає його зі списку бекенд-серверів:
kubectl label nodes --all node.kubernetes.io/exclude-from-external-load-balancers-
Додавання додаткових вузлів панелі управління
Дивіться Створення кластерів з високою доступністю за допомогою kubeadm для інструкцій щодо створення кластеру з високою доступністю за допомогою kubeadm шляхом додавання додаткових вузлів панелі управління.
Додавання робочих вузлів
Робочі вузли — це місце, де запускаються ваші робочі навантаження.
Наступні сторінки показують, як додати Linux та Windows робочі вузли до кластеру за допомогою команди kubeadm join
:
(Необовʼязково) Керування кластером з інших машин, крім вузла панелі управління
Щоб отримати доступ до кластера з іншого компʼютера (наприклад, з ноутбука), вам потрібно скопіювати файл kubeconfig з вузла панелі управління на ваш робочий компʼютер так:
scp root@<control-plane-host>:/etc/kubernetes/admin.conf .
kubectl --kubeconfig ./admin.conf get nodes
Примітка:
У даному прикладі вважається, що доступ SSH увімкнено для користувача root. Якщо цього не відбувається, ви можете скопіювати файл admin.conf
так, щоб його можна було отримати через обліковий запис іншого користувача, і використовувати цього користувача для scp
.
Файл admin.conf
надає користувачеві привілеї superuser у кластері. Його слід використовувати обережно. Для звичайних користувачів рекомендується генерувати унікальні облікові дані, до яких ви надаєте привілеї. Це можна зробити за допомогою команди kubeadm kubeconfig user --client-name <CN>
. Ця команда виведе файл KubeConfig у STDOUT, який вам слід зберегти в файл та розповсюджувати поміж користувачів. Після цього надайте привілеї за допомогою kubectl create (cluster)rolebinding
.
(Необовʼязково) Проксі-доступ до API Server на localhost
Якщо ви хочете підʼєднатися до API Server ззовні кластера, ви можете використовувати kubectl proxy
:
scp root@<control-plane-host>:/etc/kubernetes/admin.conf .
kubectl --kubeconfig ./admin.conf proxy
Тепер ви можете отримати доступ до API Server локально за адресою http://localhost:8001/api/v1
.
Очищення
Якщо ви використовували тимчасові сервери для свого кластера для тестування, ви можете вимкнути їх і не проводити додаткового очищення. Ви можете використовувати kubectl config delete-cluster
, щоб видалити ваші локальні посилання на кластер.
Однак, якщо ви хочете розібрати ваш кластер відповіднішим чином, вам слід спочатку перевести вузол в режим обслуговування і переконатися, що на вузлі немає ресурсів, а потім зняти конфігурацію з вузла.
Видалення вузла
Зверніться до вузла панелі управління використовуючи відповідний обліковий запис та виконайте:
kubectl drain <імʼя вузла> --delete-emptydir-data --force --ignore-daemonsets
Перед видаленням вузла скиньте стан, встановлений за допомогою kubeadm
:
kubeadm reset
Процес скидання не відновлює або не очищає правила iptables чи таблиці IPVS. Якщо ви хочете скинути iptables, вам слід це зробити вручну:
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
Якщо ви хочете скинути таблиці IPVS, вам слід виконати наступну команду:
ipvsadm -C
Тепер видаліть вузол:
kubectl delete node <імʼя вузла>
Якщо ви хочете почати спочатку, запустіть kubeadm init
або kubeadm join
з відповідними аргументами.
Очищення панелі управління
Ви можете використовувати kubeadm reset
на хості панелі управління для виконання очищення.
Дивіться довідкову документацію для kubeadm reset
для отримання додаткової інформації щодо цієї підкоманди та її параметрів.
Політика розбіжності версій
Хоча kubeadm дозволяє розбіжність версій для деяких компонентів, якими він керує, рекомендується вирівнювати версію kubeadm із версіями компонентів панелі управління, kube-proxy та kubelet.
Відхилення версії kubeadm від версії Kubernetes
kubeadm можна використовувати із компонентами Kubernetes, які мають таку саму версію, як і kubeadm, або на одну версію застаріше. Версію Kubernetes можна вказати для kubeadm, використовуючи прапорець --kubernetes-version
команди kubeadm init
або поле ClusterConfiguration.kubernetesVersion
при використанні --config
. Ця опція буде контролювати версії kube-apiserver, kube-controller-manager, kube-scheduler та kube-proxy.
Приклад:
- kubeadm має версію 1.31
kubernetesVersion
повинна бути 1.31 або 1.30
Відхилення версії kubeadm від версії kubelet
Аналогічно до версії Kubernetes, kubeadm можна використовувати з версією kubelet, яка є такою ж самою версією, що й kubeadm, або на три версії старішою.
Приклад:
- kubeadm має версію 1.31
- kubelet на хості повинен мати версію 1.31, 1.30, 1.29 або 1.28
Відхилення версії kubeadm від kubeadm
Є певні обмеження на те, як можна використовувати команди kubeadm на існуючих вузлах або цілих кластерах, під керуванням kubeadm.
Якщо до кластера приєднуються нові вузли, використована для kubeadm join
бінарна версія kubeadm повинна відповідати останній версії kubeadm, що використовувалася або для створення кластера за допомогою kubeadm init
, або для оновлення того самого вузла за допомогою kubeadm upgrade
. Подібні правила застосовуються до інших команд kubeadm з винятком kubeadm upgrade
.
Приклад для kubeadm join
:
- версія kubeadm 1.31 використовувалася для створення кластера за допомогою
kubeadm init
- Приєднувані вузли повинні використовувати бінарний файл kubeadm версії 1.31
Вузли, які оновлюються, повинні використовувати версію kubeadm, яка є тією ж самою MINOR версією або на одну MINOR версію новішою, ніж версія kubeadm, яка використовувалася для управління вузлом.
Приклад для kubeadm upgrade
:
- версія kubeadm 1.30 використовувалася для створення або оновлення вузла
- Версія kubeadm, використана для оновлення вузла, повинна бути на 1.30 або 1.31
Щоб дізнатися більше про різницю версій між різними компонентами Kubernetes, див. Політику відхилень версій.
Обмеження
Витривалість кластера
Створений тут кластер має один вузол для панелі управління з однією базою даних etcd, яка працює на ньому. Це означає, що якщо вузол для панелі управління вийде з ладу, ваш кластер може втратити дані і може деведеться його перестворювати з нуля.
Обхідні шляхи:
Регулярно робіть резервні копії etcd. Тека даних etcd, налаштована за допомогою kubeadm, розташована за адресою
/var/lib/etcd
на вузлі панелі управління.Використовуйте кілька вузлів для панелі управління. Ви можете прочитати про Варіанти високодоступної топології, щоб вибрати топологію кластера, яка забезпечує високу доступність.
Платформна сумісність
Пакунки та бінарники kubeadm для deb/rpm будуються для amd64, arm (32-біт), arm64, ppc64le та s390x, відповідабть пропозиції щодо багатоплатформовості.
Багатоплатформові образи контейнерів для вузла панелі управління та надбудов також підтримуються з версії 1.12.
Тільки деякі постачальники мережі пропонують рішення для всіх платформ. Зверніться до списку постачальників мережі вище або до документації кожного постачальника, щоб визначити, чи підтримує постачальник вашу платформу.
Усунення несправностей
Якщо ви стикаєтеся з труднощами у роботі з kubeadm, будь ласка, звертайтеся до наших документів із усунення несправностей.
Що далі
- Перевірте, що ваш кластер працює належним чином за допомогою Sonobuoy.
- Дивіться Оновлення кластерів за допомогою kubeadm для отримання деталей щодо оновлення кластеру з використанням
kubeadm
. - Дізнайтесь про розширене використання
kubeadm
у довідковій документації кubeadm. - Дізнайтеся більше про концепції Kubernetes тут та
kubectl
. - Дивіться сторінку мережі кластера для отримання великого списку додаткових надбудов Pod network.
- Дивіться список надбудов для вивчення інших надбудов, включаючи інструменти для ведення логів, моніторингу, мережевої політики, візуалізації та управління вашим кластером Kubernetes.
- Налаштуйте спосіб обробки вашим кластером логів подій кластера та застосунків, які працюють у Pod. Дивіться Архітектура ведення логів для отримання огляду того, що включено в цей процес.
Зворотній звʼязок
- Для ознайомлення з повідомленями про помилки відвідайте трекер проблем kubeadm на GitHub
- Для отримання підтримки відвідайте канал Slack #kubeadm
- Загальний канал розробки SIG Cluster Lifecycle на Slack: #sig-cluster-lifecycle
- Інформація про SIG Cluster Lifecycle
- Розсилка SIG Cluster Lifecycle: kubernetes-sig-cluster-lifecycle
4 - Налаштування компонентів за допомогою kubeadm API
Ця сторінка охоплює способи налаштування компонентів, які розгортаються за допомогою kubeadm. Для компонентів панелі управління можна використовувати прапорці у структурі ClusterConfiguration
або патчі на рівні вузла. Для kubelet і kube-proxy ви можете використовувати KubeletConfiguration
та KubeProxyConfiguration
, відповідно.
Всі ці опції можливі за допомогою конфігураційного API kubeadm. Докладніше про кожне поле в конфігурації ви можете дізнатися на наших довідкових сторінках API.
Примітка:
На жаль, наразі не підтримується налаштування розгортання CoreDNS за допомогою kubeadm. Вам слід вручну патчити ConfigMapkube-system/coredns
та перестворити Pods CoreDNS після цього. Альтернативно, ви можете пропустити типове розгортання CoreDNS та розгорнути свій варіант. Докладніше про це читайте у Використання фаз ініціалізації з kubeadm.Примітка:
Щоб переконфігурувати кластер, який вже був створений, дивіться Переконфігурація кластера з kubeadm.Налаштовування панелі управління за допомогою прапорців у ClusterConfiguration
Обʼєкт конфігурації панелі управління kubeadm надає можливість користувачам перевизначати типові прапорці, що передаються компонентам панелі управління, таким як APIServer, ControllerManager, Scheduler та Etcd. Компоненти визначаються за допомогою наступних структур:
apiServer
controllerManager
scheduler
etcd
Ці структури містять спільне поле extraArgs
, яке складається з пар name
/ value
. Щоб перевизначити прапорець для компонента панелі управління:
- Додайте відповідні
extraArgs
до вашої конфігурації. - Додайте прапорці до поля
extraArgs
. - Запустіть
kubeadm init
з--config <ВАШ КОНФІГ YAML>
.
Примітка:
Ви можете згенерувати обʼєктClusterConfiguration
з типовими значеннями, використовуючи kubeadm config print init-defaults
і зберігши вивід у файл на ваш вибір.Примітка:
ОбʼєктClusterConfiguration
наразі є глобальним у кластерах kubeadm. Це означає, що будь-які прапорці, які ви додаєте, будуть застосовуватися до всіх екземплярів того самого компонента на різних вузлах. Щоб застосовувати індивідуальну конфігурацію для кожного компонента на різних вузлах, ви можете використовувати патчі.Примітка:
Дублювання прапорців (ключів) або передача одного й того ж прапорця--foo
кілька разів наразі не підтримується. Для обходу цього обмеження слід використовувати патчі.Прапорці APIServer
Докладну інформацію див. у довідковій документації для kube-apiserver.
Приклад використання:
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: v1.16.0
apiServer:
extraArgs:
- name: "enable-admission-plugins"
value: "AlwaysPullImages,DefaultStorageClass"
- name: "audit-log-path"
value: "/home/johndoe/audit.log"
Прапорці ControllerManager
Докладну інформацію див. у довідковій документації для kube-controller-manager.
Приклад використання:
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: v1.16.0
controllerManager:
extraArgs:
- name: "cluster-signing-key-file"
value: "/home/johndoe/keys/ca.key"
- name: "deployment-controller-sync-period"
value: "50"
Прапорці планувальника
Докладну інформацію див. у довідковій документації для kube-scheduler.
Приклад використання:
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: v1.16.0
scheduler:
extraArgs:
- name: "config"
value: "/etc/kubernetes/scheduler-config.yaml"
extraVolumes:
- name: schedulerconfig
hostPath: /home/johndoe/schedconfig.yaml
mountPath: /etc/kubernetes/scheduler-config.yaml
readOnly: true
pathType: "File"
Прапорці etcd
Докладну інформацію див. у документації сервера etcd.
Приклад використання:
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
etcd:
local:
extraArgs:
- name: "election-timeout"
value: 1000
Налаштування за допомогою патчів
Kubernetes v1.22 [beta]
Kubeadm дозволяє передавати теку з файлами патчів в InitConfiguration
та JoinConfiguration
на окремих вузлах. Ці патчі можна використовувати як останній крок налаштування перед записом конфігурації компонента на диск.
Ви можете передати цей файл в kubeadm init
за допомогою --config <ВАШ КОНФІГ YAML>
:
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
patches:
directory: /home/user/somedir
Примітка:
Дляkubeadm init
ви можете передати файл, який містить як ClusterConfiguration
, так і InitConfiguration
розділені ---
.Ви можете передати цей файл в kubeadm join
за допомогою --config <ВАШ КОНФІГ YAML>
:
apiVersion: kubeadm.k8s.io/v1beta4
kind: JoinConfiguration
patches:
directory: /home/user/somedir
Тека має містити файли з назвами target[suffix][+patchtype].extension
.
Наприклад, kube-apiserver0+merge.yaml
або просто etcd.json
.
target
може бути одним ізkube-apiserver
,kube-controller-manager
,kube-scheduler
,etcd
таkubeletconfiguration
.suffix
— це необовʼязковий рядок, який можна використовувати для визначення порядку застосування патчів за алфавітною послідовністю.patchtype
може бути одним ізstrategic
,merge
абоjson
і вони повинні відповідати форматам патчів, підтримуваним kubectl. Типовоpatchtype
—strategic
.extension
повинен бути абоjson
, абоyaml
.
Примітка:
Якщо ви використовуєтеkubeadm upgrade
для оновлення ваших вузлів kubeadm, вам слід знову надати ті самі патчі, щоб налаштування залишалося після оновлення. Для цього ви можете використовувати прапорець --patches
, який повинен вказувати на той самий каталог. kubeadm upgrade
зараз не підтримує структуру конфігурації API,
яка може бути використана для того самого.Налаштування kubelet
Щоб налаштувати kubelet, ви можете додати KubeletConfiguration
поруч із ClusterConfiguration
або InitConfiguration
, розділеними ---
у тому самому файлі конфігурації. Цей файл потім можна передати до kubeadm init
, і kubeadm застосує ту ж саму базову KubeletConfiguration
для всіх вузлів у кластері.
Для застосування конфігурації, специфічної для екземпляра, понад базовою KubeletConfiguration
, ви можете використовувати ціль патчу kubeletconfiguration
.
Також ви можете використовувати прапорці kubelet як перевизначення, передаючи їх у поле nodeRegistration.kubeletExtraArgs
, яке підтримується як InitConfiguration
, так і JoinConfiguration
. Деякі прапорці kubelet є застарілими, тому перевірте їх статус у довідковій документації kubelet, перш ніж їх використовувати.
Додаткові деталі дивіться в розділі Налаштування кожного kubelet у вашому кластері за допомогою kubeadm
Налаштування kube-proxy
Щоб налаштувати kube-proxy, ви можете передати KubeProxyConfiguration
поруч з ClusterConfiguration
або InitConfiguration
до kubeadm init
, розділені ---
.
Для отримання докладнішої інформації ви можете перейти на наші сторінки API-посилань.
Примітка:
kubeadm розгортає kube-proxy як DaemonSet, що означає, щоKubeProxyConfiguration
буде застосовуватися до всіх екземплярів kube-proxy в кластері.5 - Варіанти топології високої доступності (HA)
Ця сторінка пояснює два варіанти конфігурації топології ваших високо доступних (HA) кластерів Kubernetes.
Ви можете налаштувати стійкий кластер:
- З вузлами панелі управління, де вузли etcd розташовані разом із вузлами панелі управління.
- З зовнішніми вузлами etcd, де etcd працює на окремих вузлах від вузлів панелі управління.
Перед налаштуванням стійкого кластера слід ретельно розглянути переваги та недоліки кожної топології.
Примітка:
kubeadm статично розгортає кластер etcd. Ознайомтесь з Керівництвом з кластеризації.Топологія etcd зі спільним розміщенням
Високодоступний кластер зі спільним розміщенням — це топологія, де розподілений кластер зберігання даних, який забезпечує etcd, розміщується поверх кластера, сформованого вузлами, керованими kubeadm, які запускають компоненти панелі управління.
Кожен вузол панелі управління запускає екземпляр kube-apiserver
, kube-scheduler
та kube-controller-manager
. kube-apiserver
доступний для робочих вузлів за допомогою балансувальника навантаження.
Кожен вузол панелі управління створює локального члена etcd, і цей член etcd спілкується лише з kube-apiserver
цього вузла. Те ж саме стосується локальних екземплярів kube-controller-manager
та kube-scheduler
.
Ця топологія зʼєднує вузли панелі управління з членами etcd на тих самих вузлах. Вона є простішою для налаштування, ніж кластер зі зовнішніми вузлами etcd, і простішою для управління реплікацією.
Проте такий кластер має ризик втрати зʼєднання. Якщо один вузол вийде з ладу, втратиться як член etcd, так і екземпляр панелі управління, і резервні можливості будуть скомпрометовані. Цей ризик можна зменшити, додавши більше вузлів панелі управління.
Отже, слід запускати мінімум три вузли панелі управління зі стековим розміщенням для високодоступного кластера.
Це типова топологія в kubeadm. Локальний член etcd створюється автоматично
на вузлах панелі управління при використанні kubeadm init
та kubeadm join --control-plane
.
Топологія зовнішнього розміщення etcd
Стійкий кластер із зовнішньою etcd — це топологія, де розподілений кластер зберігання даних, наданий etcd, є зовнішнім щодо кластера, сформованого вузлами, які запускають компоненти панелі управління.
Подібно до топології зі стековими etcd, кожен вузол панелі управління в топології зі зовнішньою etcd запускає екземпляр kube-apiserver
, kube-scheduler
та kube-controller-manager
. І kube-apiserver
доступний для робочих вузлів за допомогою балансувальника навантаження. Однак члени etcd працюють на окремих хостах, і кожен хост etcd спілкується з kube-apiserver
кожного вузла панелі управління.
Ця топологія відокремлює вузли панелі управління та членів etcd. Таким чином, вона забезпечує стійке налаштування, де втрата екземпляра панелі управління або члена etcd має менший вплив і не впливає на резервування кластера так сильно, як топологія стекового HA.
Однак для цієї топології потрібно удвічі більше хостів, ніж для топології зі стековим etcd. Мінімум три хости для вузлів панелі управління та три хости для вузлів etcd необхідні для стійкого кластера з цією топологією.
Що далі
6 - Створення високодоступних кластерів за допомогою kubeadm
На цій сторінці пояснюється два різних підходи до налаштування високодоступного кластера Kubernetes з використанням інструменту kubeadm:
- Зі стековими вузлами панелі управління. Цей підхід вимагає менше інфраструктури. Члени etcd та вузли панелі управління розташовані разом.
- Зовнішній кластер etcd. Цей підхід вимагає більше інфраструктури. Вузли панелі управління та члени etcd розділені.
Перед тим як продовжити, вам слід ретельно розглянути, який підхід найкраще відповідає потребам ваших застосунків та оточенню. Варіанти топології високої доступності наводять переваги та недоліки кожного з них.
У випадку виникнення проблем з налаштуванням HA-кластера, будь ласка, повідомте про це в системі відстеження проблем kubeadm.
Також дивіться документацію з оновлення.
Увага:
Ця сторінка не стосується запуску вашого кластера на платформі хмарного провайдера. У хмарному середовищі жоден із документованих тут підходів не працює з обʼєктами служб типу LoadBalancer або з динамічними PersistentVolumes.Перш ніж ви розпочнете
Передумови залежать від топології, яку ви обрали для панелі управління кластера:
Вам потрібно:
- Три або більше машин, які відповідають мінімальним вимогам kubeadm для вузлів панелі управління. Наявність непарної кількості вузлів панелі управління може бути корисною при виборі лідера в разі відмови машини чи зони,
- включаючи середовище виконання контейнерів, яке вже налаштоване та працює.
- Три або більше машин, які відповідають мінімальним вимогам kubeadm для робочих вузлів,
- включаючи середовище виконання контейнерів, яке вже налаштоване та працює.
- Повноцінне мережеве зʼєднання між усіма машинами в кластері (публічна чи приватна мережа).
- Привілеї суперкористувача на всіх машинах за допомогою
sudo
.- Ви можете використовувати інший інструмент; цей посібник використовує
sudo
у прикладах.
- Ви можете використовувати інший інструмент; цей посібник використовує
- SSH-доступ з одного пристрою до всіх вузлів системи.
kubeadm
таkubelet
вже встановлені на всіх машинах.
Дивіться Топологія стекового etcd для контексту.
Вам потрібно:
- Три або більше машин, які відповідають мінімальним вимогам kubeadm для вузлів панелі управління. Наявність непарної кількості вузлів панелі управління може бути корисною при виборі лідера в разі відмови машини чи зони,
- включаючи робоче середовище виконання контейнерів, яке вже налаштоване та працює
- Три або більше машин, які відповідають мінімальним вимогам kubeadm для робочих вузлів,
- включаючи середовище виконання контейнерів контейнера, яке вже налаштоване та працює.
- Повноцінне мережеве зʼєднання між усіма машинами в кластері (публічна чи приватна мережа).
- Привілеї суперкористувача на всіх машинах за допомогою
sudo
.- Ви можете використовувати інший інструмент; цей посібник використовує
sudo
у прикладах.
- Ви можете використовувати інший інструмент; цей посібник використовує
- SSH-доступ з одного пристрою до всіх вузлів системи.
kubeadm
таkubelet
вже встановлені на всіх машинах.
І вам також потрібно:
- Три або більше додаткових машин, які стануть членами кластера etcd. Наявність непарної кількості членів у кластері etcd — це вимога для досягнення оптимального кворуму під час голосування.
- Ці машини також повинні мати встановлені
kubeadm
таkubelet
. - На цих машинах також потрібно мати середовище виконання контейнерів, яке вже налаштоване та працює.
- Ці машини також повинні мати встановлені
Дивіться Топологія зовнішнього etcd для контексту.
Образи контейнерів
Кожен хост повинен мати доступ для отримання та завантаження образів з реєстру контейнерів Kubernetes, registry.k8s.io
. Якщо ви хочете розгорнути високодоступний кластер, де хостам не можна здійснювати доступ до образів, це можливо. Вам слід забезпечити, що правильні образи контейнерів вже доступні на відповідних хостах за допомогою інших засобів.
Інтерфейс командного рядка
Для управління Kubernetes після налаштування кластера, вам слід
встановити kubectl на вашому компʼютері. Також корисно
встановити інструмент kubectl
на кожному вузлі панелі управління, оскільки це може бути корисним для усунення несправностей.
Перші кроки для обох методів
Створення балансувальника навантаження для kube-apiserver
Примітка:
Існує багато конфігурацій для балансувальників навантаження. Наведений нижче приклад — лише один із варіантів. Ваші вимоги до кластера можуть вимагати іншої конфігурації.Створіть балансувальник навантаження kube-apiserver з імʼям, яке розпізнається DNS.
У хмарному середовищі ви повинні розмістити вузли панелі управління за TCP балансувальником навантаження, який виконує переспрямовування трафіку. Цей балансувальник розподіляє трафік до всіх справних вузлів панелі управління у своєму списку цілей. Перевірка доступності apiserver — це перевірка TCP порту, на якому слухає kube-apiserver (типове значення порту
:6443
).Не рекомендується використовувати IP-адресу безпосередньо у хмарному середовищі.
Балансувальник навантаження повинен мати можливість взаємодіяти з усіма вузлами панелі управління на порті apiserver. Також він повинен дозволяти вхідний трафік на його порту прослуховування.
Переконайтеся, що адреса балансувальника завжди відповідає адресі
ControlPlaneEndpoint
kubeadm.Прочитайте Параметри для програмного балансування навантаження для отримання додаткових відомостей.
Додайте перший вузол панелі управління до балансувальника та перевірте зʼєднання:
nc -v <LOAD_BALANCER_IP> <PORT>
Помилка "connection refused" є очікуваною, оскільки API-сервер ще не запущено. Проте тайм-аут означає, що балансувальник не може взаємодіяти з вузлом панелі управління. Якщо виникає тайм-аут, повторно налаштуйте балансувальник для взаємодії з вузлом панелі управління.
Додайте решту вузлів панелі управління до цільової групи балансувальника.
Панель управління та вузли etcd зі стековою архітектурою
Кроки для першого вузла панелі управління
Ініціалізуйте панель управління:
sudo kubeadm init --control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" --upload-certs
Ви можете використовувати прапорець
--kubernetes-version
, щоб встановити версію Kubernetes, яку слід використовувати. Рекомендується, щоб версії kubeadm, kubelet, kubectl та Kubernetes відповідали одна одній.Прапорець
--control-plane-endpoint
повинен бути встановлений на адресу або DNS та порт балансувальника.Прапорець
--upload-certs
використовується для завантаження сертифікатів, які слід використовувати на всіх екземплярах панелі управління. Якщо натомість ви віддаєте перевагу копіюванню сертифікатів між вузлами панелі управління вручну або за допомогою засобів автоматизації, видаліть цей прапорець та зверніться до розділу Розподіл сертифікатів вручну нижче.
Примітка:
Прапорціkubeadm init
--config
та--certificate-key
не можна змішувати, тому якщо ви хочете використовувати конфігурацію kubeadm вам слід додати полеcertificateKey
у відповідні місця конфігурації (підInitConfiguration
таJoinConfiguration: controlPlane
).Примітка:
Деякі мережеві втулки CNI вимагають додаткової конфігурації, наприклад вказівки IP для Podʼа в форматі CIDR, тоді як інші — ні. Див. документацію мережі CNI. Щоб додати CIDR Podʼу, скористайтесь прапорцем--pod-network-cidr
, або якщо ви використовуєте файл конфігурації kubeadm встановіть полеpodSubnet
в обʼєктіnetworking
конфігураціїClusterConfiguration
.Вивід виглядатиме десь так:
... You can now join any number of control-plane node by running the following command on each as a root: kubeadm join 192.168.0.200:6443 --token 9vr73a.a8uxyaju799qwdjv --discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866 --control-plane --certificate-key f8902e114ef118304e561c3ecd4d0b543adc226b7a07f675f56564185ffe0c07 Please note that the certificate-key gives access to cluster sensitive data, keep it secret! As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use kubeadm init phase upload-certs to reload certs afterward. Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.0.200:6443 --token 9vr73a.a8uxyaju799qwdjv --discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866
Скопіюйте цей вивід у текстовий файл. Ви будете потребувати його пізніше для приєднання вузлів панелі управління та робочих вузлів до кластера.
Коли використовується
--upload-certs
зkubeadm init
, сертифікати основної панелі управління шифруються та завантажуються уkubeadm-certs
Secret.Щоб знову завантажити сертифікати та згенерувати новий ключ розшифрування, використовуйте наступну команду на вузлі панелі управління який вже приєднаний до кластера:
sudo kubeadm init phase upload-certs --upload-certs
Ви також можете вказати власний
--certificate-key
під часinit
, який пізніше може бути використаний зjoin
. Щоб згенерувати такий ключ, використовуйте наступну команду:kubeadm certs certificate-key
Ключ сертифіката — це рядок, закодований у шістнадцятковій формі, який є ключем AES розміром 32 байти.
Примітка:
Секретkubeadm-certs
та ключ розшифрування діють впродовж двох годин.Увага:
Як зазначено у виводі команди, ключ сертифіката надає доступ до чутливих даних кластера, тримайте його в таємниці!Застосуйте обраний вами мережеву втулок CNI: Дотримуйтеся цих інструкцій для встановлення постачальника CNI. Переконайтеся, що конфігурація відповідає CIDR IP для Podʼа, вказаному в файлі конфігурації kubeadm (якщо застосовується).
Примітка:
Вам слід вибрати мережевий втулок, який відповідає вашому випадку використання та встановити його, перш ніж перейти до наступного кроку. Якщо ви цього не зробите, вам не вдасться належним чином запустити свій кластер.Введіть наступну команду та спостерігайте, як запускаються екземпляри компонентів панелі управління:
kubectl get pod -n kube-system -w
Кроки для інших вузлів панелі управління
Для кожного додаткового вузла панелі управління:
Виконайте команду приєднання, яка вам була надана раніше виводом
kubeadm init
на першому вузлі. Вона повинна виглядати приблизно так:sudo kubeadm join 192.168.0.200:6443 --token 9vr73a.a8uxyaju799qwdjv --discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866 --control-plane --certificate-key f8902e114ef118304e561c3ecd4d0b543adc226b7a07f675f56564185ffe0c07
- Прапорець
--control-plane
повідомляєkubeadm join
створити новий вузол панелі управління. - Прапорець
--certificate-key ...
призведе до того, що сертифікати вузлів панелі управління будуть завантажені з секретуkubeadm-certs
в кластері та розшифровані за допомогою вказаного ключа.
- Прапорець
Ви можете приєднувати кілька вузлів панелі управління паралельно.
Зовнішні вузли etcd
Налаштування кластера з зовнішніми вузлами etcd подібно до процедури, використовуваної для стекових вузлів etcd, з винятком того, що ви повинні налаштувати etcd спочатку, і ви повинні передавати інформацію про etcd у конфігураційному файлі kubeadm.
Налаштуйте кластер etcd
Слідуйте цим інструкціям для налаштування кластера etcd.
Налаштуйте SSH, як описано тут.
Скопіюйте наступні файли з будь-якого вузла etcd в кластері на перший вузол панелі управління:
export CONTROL_PLANE="ubuntu@10.0.0.7" scp /etc/kubernetes/pki/etcd/ca.crt "${CONTROL_PLANE}": scp /etc/kubernetes/pki/apiserver-etcd-client.crt "${CONTROL_PLANE}": scp /etc/kubernetes/pki/apiserver-etcd-client.key "${CONTROL_PLANE}":
- Замініть значення
CONTROL_PLANE
наuser@host
першого вузла панелі управління.
- Замініть значення
Налаштуйте перший вузол панелі управління
Створіть файл із назвою
kubeadm-config.yaml
із наступним змістом:--- apiVersion: kubeadm.k8s.io/v1beta4 kind: ClusterConfiguration kubernetesVersion: stable controlPlaneEndpoint: "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" # змініть це (див. нижче) etcd: external: endpoints: - https://ETCD_0_IP:2379 # змініть ETCD_0_IP відповідно - https://ETCD_1_IP:2379 # змініть ETCD_1_IP відповідно - https://ETCD_2_IP:2379 # змініть ETCD_2_IP відповідно caFile: /etc/kubernetes/pki/etcd/ca.crt certFile: /etc/kubernetes/pki/apiserver-etcd-client.crt keyFile: /etc/kubernetes/pki/apiserver-etcd-client.key
Примітка:
Різниця між stacked etcd та external etcd полягає в тому, що налаштування external etcd потребує конфігураційного файлу з endpointʼами etcd в обʼєктіexternal
дляetcd
. У випадку топології stacked etcd це вирішується автоматично.Замініть наступні змінні в шаблоні конфігурації на відповідні значення для вашого кластера:
LOAD_BALANCER_DNS
LOAD_BALANCER_PORT
ETCD_0_IP
ETCD_1_IP
ETCD_2_IP
Наступні кроки схожі на налаштування stacked etcd:
Виконайте команду
sudo kubeadm init --config kubeadm-config.yaml --upload-certs
на цьому вузлі.Запишіть вихідні команди для приєднання, які повертаються, у текстовий файл для подальшого використання.
Застосуйте обраний вами втулок CNI.
Примітка:
Ви повинні вибрати мережевий втулок, який відповідає вашому випадку використання та розгорнути його, перш ніж перейдете до наступного кроку. Якщо цього не зробити, ви не зможете належним чином запустити ваш кластер.
Кроки для інших вузлів панелі управління
Кроки аналогічні налаштуванню для stacked etcd:
- Переконайтеся, що перший вузол панелі управління повністю ініціалізований.
- Приєднайте кожен вузол панелі управління за допомогою команди приєднання, яку ви зберегли в текстовий файл. Рекомендується приєднувати вузли панелі управління по одному.
- Не забудьте, що ключ розшифрування з параметром
--certificate-key
діє дві години.
Загальні завдання після налаштування панелі управління
Встановлення робочих вузлів
Робочі вузли можна приєднати до кластера за допомогою команди, яку ви зберегли раніше як вивід з команди kubeadm init
:
sudo kubeadm join 192.168.0.200:6443 --token 9vr73a.a8uxyaju799qwdjv --discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866
Ручне поширення сертифікатів
Якщо ви вирішили не використовувати kubeadm init
з параметром --upload-certs
, це означає, що вам доведеться вручну скопіювати сертифікати з первинного вузла панелі управління до приєднуваних вузлів панелі.
Є багато способів це зробити. У наступному прикладі використовуються ssh
та scp
:
SSH потрібен, якщо ви хочете керувати всіма вузлами з одного пристрою.
Активуйте ssh-agent на своєму основному пристрої, який має доступ до всіх інших вузлів в системі:
eval $(ssh-agent)
Додайте свій SSH-ідентифікатор до сеансу:
ssh-add ~/.ssh/path_to_private_key
Перемикайтесь між вузлами, щоб перевірити, чи зʼєднання правильно працює.
Коли ви входите в будь-який вузол через SSH, додайте прапорець
-A
. Цей прапорець дозволяє вузлу, на який ви увійшли за допомогою SSH, отримувати доступ до агента SSH на вашому ПК. Розгляньте альтернативні методи, якщо ви не повністю довіряєте безпеці вашої сесії користувача на вузлі.ssh -A 10.0.0.7
Коли використовуєте sudo на будь-якому вузлі, обовʼязково зберігайте середовище, щоб SSH forwarding працював:
sudo -E -s
Після налаштування SSH на всіх вузлах ви повинні запустити наступний скрипт на першому вузлі панелі управління після запуску
kubeadm init
. Цей скрипт скопіює сертифікати з першого вузла панелі управління на інші вузли панелі:У наступному прикладі замініть
CONTROL_PLANE_IPS
на IP-адреси інших вузлів панелі управління.USER=ubuntu # налаштовується CONTROL_PLANE_IPS="10.0.0.7 10.0.0.8" for host in ${CONTROL_PLANE_IPS}; do scp /etc/kubernetes/pki/ca.crt "${USER}"@$host: scp /etc/kubernetes/pki/ca.key "${USER}"@$host: scp /etc/kubernetes/pki/sa.key "${USER}"@$host: scp /etc/kubernetes/pki/sa.pub "${USER}"@$host: scp /etc/kubernetes/pki/front-proxy-ca.crt "${USER}"@$host: scp /etc/kubernetes/pki/front-proxy-ca.key "${USER}"@$host: scp /etc/kubernetes/pki/etcd/ca.crt "${USER}"@$host:etcd-ca.crt # Пропустіть наступний рядок, якщо використовуєте зовнішній etcd scp /etc/kubernetes/pki/etcd/ca.key "${USER}"@$host:etcd-ca.key done
Увага:
Копіюйте лише сертифікати в переліку вище. kubeadm буде опікуватись генеруванням решти сертифікатів з необхідними SAN для приєднання екземплярів панелі управління. Якщо ви помилитесь при копіюванні всіх сертифікатів, створення додаткових вузлів може зазнати невдачі через відсутність необхідних SAN.Потім на кожному приєднуваному вузлі панелі управління вам слід виконати наступний скрипт перед виконанням
kubeadm join
. Цей скрипт перемістить раніше скопійовані сертифікати з домашньої теки в/etc/kubernetes/pki
:USER=ubuntu # налаштовується mkdir -p /etc/kubernetes/pki/etcd mv /home/${USER}/ca.crt /etc/kubernetes/pki/ mv /home/${USER}/ca.key /etc/kubernetes/pki/ mv /home/${USER}/sa.pub /etc/kubernetes/pki/ mv /home/${USER}/sa.key /etc/kubernetes/pki/ mv /home/${USER}/front-proxy-ca.crt /etc/kubernetes/pki/ mv /home/${USER}/front-proxy-ca.key /etc/kubernetes/pki/ mv /home/${USER}/etcd-ca.crt /etc/kubernetes/pki/etcd/ca.crt # Пропустіть наступний рядок, якщо використовуєте зовнішній etcd mv /home/${USER}/etcd-ca.key /etc/kubernetes/pki/etcd/ca.key
7 - Налаштування високодоступного кластера etcd за допомогою kubeadm
Типово kubeadm запускає локальний екземпляр etcd на кожному вузлі панелі управління Також можливо розглядати кластер etcd як зовнішній та розгортати екземпляри etcd на окремих хостах. Відмінності між цими підходами описано на сторінці Варіанти топології високої доступності.
Це завдання веде через процес створення кластера високої доступності з зовнішньою базою etcd із трьох членів, який може використовувати kubeadm під час створення кластера.
Перш ніж ви розпочнете
- Три хости, які можуть взаємодіяти між собою через TCP-порти 2379 та 2380. Цей документ вважає, що це стандартні порти. Однак їх можна налаштувати через файл конфігурації kubeadm.
- На кожному хості повинен бути встановлений systemd та сумісна з bash оболонка.
- На кожному хості повинно бути встановлене середовище виконання контейнерів, kubelet та kubeadm.
- Кожен хост повинен мати доступ до реєстру образів контейнерів Kubernetes (
registry.k8s.io
) або ви можете отримати перелік та/або витягти необхідний образ etcd, використовуючиkubeadm config images list/pull
. У цьому посібнику екземпляри etcd налаштовані як статичні Podʼи, керовані kubelet. - Є якась інфраструктура для копіювання файлів між хостами. Наприклад,
ssh
таscp
можуть відповідати цьому вимогу.
Налаштування кластера
Загальний підхід — генерувати всі сертифікати на одному вузлі та розповсюджувати лише необхідні файли на інші вузли.
Примітка:
kubeadm містить усі необхідні криптографічні механізми для генерації описаних нижче сертифікатів; для цього прикладу не потрібні інші криптографічні інструменти.Примітка:
У прикладах нижче використовуються адреси IPv4, але ви також можете налаштувати kubeadm, kubelet та etcd на використання адрес IPv6. Підтримка подвійного стека передбачена для деяких параметрів Kubernetes, але не для etcd. Докладніше щодо підтримки подвійного стека Kubernetes дивіться Підтримка подвійного стека з kubeadm.Налаштуйте kubelet як менеджер служб для etcd.
Оскільки etcd був створений першим, вам слід перевизначити пріоритет служби, створивши новий файл юніта, який має вищий пріоритет, ніж файл юніта kubelet, який надає kubeadm.Примітка:
Це потрібно зробити на кожному хості, на якому повинен працювати etcd.cat << EOF > /etc/systemd/system/kubelet.service.d/kubelet.conf # Замініть "systemd" на драйвер cgroup вашого середовища виконання контейнерів. Стандартне значення в kubelet - "cgroupfs". # Замініть значення "containerRuntimeEndpoint" на інше середовище виконання контейнерів за потреби. # apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration authentication: anonymous: enabled: false webhook: enabled: false authorization: mode: AlwaysAllow cgroupDriver: systemd address: 127.0.0.1 containerRuntimeEndpoint: unix:///var/run/containerd/containerd.sock staticPodPath: /etc/kubernetes/manifests EOF cat << EOF > /etc/systemd/system/kubelet.service.d/20-etcd-service-manager.conf [Service] ExecStart= ExecStart=/usr/bin/kubelet --config=/etc/systemd/system/kubelet.service.d/kubelet.conf Restart=always EOF systemctl daemon-reload systemctl restart kubelet
Перевірте статус kubelet, щоб переконатися, що він працює.
systemctl status kubelet
Створіть конфігураційні файли для kubeadm.
Згенеруйте один файл конфігурації kubeadm для кожного хосту, на якому буде запущений екземпляр etcd, використовуючи наступний сценарій.
# Оновіть HOST0, HOST1 та HOST2 IP ваших хостів export HOST0=10.0.0.6 export HOST1=10.0.0.7 export HOST2=10.0.0.8 # Оновіть NAME0, NAME1 та NAME2 іменами хостів export NAME0="infra0" export NAME1="infra1" export NAME2="infra2" # Створіть тимчасові теки для зберігання файлів, які потраплять на інші хости mkdir -p /tmp/${HOST0}/ /tmp/${HOST1}/ /tmp/${HOST2}/ HOSTS=(${HOST0} ${HOST1} ${HOST2}) NAMES=(${NAME0} ${NAME1} ${NAME2}) for i in "${!HOSTS[@]}"; do HOST=${HOSTS[$i]} NAME=${NAMES[$i]} cat << EOF > /tmp/${HOST}/kubeadmcfg.yaml --- apiVersion: "kubeadm.k8s.io/v1beta4" kind: InitConfiguration nodeRegistration: name: ${NAME} localAPIEndpoint: advertiseAddress: ${HOST} --- apiVersion: "kubeadm.k8s.io/v1beta4" kind: ClusterConfiguration etcd: local: serverCertSANs: - "${HOST}" peerCertSANs: - "${HOST}" extraArgs: - name: initial-cluster value: ${NAMES[0]}=https://${HOSTS[0]}:2380,${NAMES[1]}=https://${HOSTS[1]}:2380,${NAMES[2]}=https://${HOSTS[2]}:2380 - name: initial-cluster-state value: new - name: name value: ${NAME} - name: listen-peer-urls value: https://${HOST}:2380 - name: listen-client-urls value: https://${HOST}:2379 - name: advertise-client-urls value: https://${HOST}:2379 - name: initial-advertise-peer-urls value: https://${HOST}:2380 EOF done
Згенеруйте центр сертифікації.
Якщо у вас вже є ЦС, то єдине що треба зробити — скопіювати файли
crt
таkey
ЦС у/etc/kubernetes/pki/etcd/ca.crt
та/etc/kubernetes/pki/etcd/ca.key
. Після копіювання цих файлів перейдіть до наступного кроку — "Створення сертифікатів для кожного учасника".Якщо у вас ще немає ЦС, то виконайте цю команду на
$HOST0
(де ви згенерували файли конфігурації для kubeadm).kubeadm init phase certs etcd-ca
Це створює два файли:
/etc/kubernetes/pki/etcd/ca.crt
/etc/kubernetes/pki/etcd/ca.key
Створення сертифікатів для кожного учасника.
kubeadm init phase certs etcd-server --config=/tmp/${HOST2}/kubeadmcfg.yaml kubeadm init phase certs etcd-peer --config=/tmp/${HOST2}/kubeadmcfg.yaml kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST2}/kubeadmcfg.yaml kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST2}/kubeadmcfg.yaml cp -R /etc/kubernetes/pki /tmp/${HOST2}/ # очистити одноразові сертифікати find /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -delete kubeadm init phase certs etcd-server --config=/tmp/${HOST1}/kubeadmcfg.yaml kubeadm init phase certs etcd-peer --config=/tmp/${HOST1}/kubeadmcfg.yaml kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST1}/kubeadmcfg.yaml kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST1}/kubeadmcfg.yaml cp -R /etc/kubernetes/pki /tmp/${HOST1}/ find /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -delete kubeadm init phase certs etcd-server --config=/tmp/${HOST0}/kubeadmcfg.yaml kubeadm init phase certs etcd-peer --config=/tmp/${HOST0}/kubeadmcfg.yaml kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST0}/kubeadmcfg.yaml kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST0}/kubeadmcfg.yaml # Немає потреби переміщувати сертифікати, оскільки вони призначені для HOST0 # приберемо сертифікати, які не повинні бути скопійовані з цього хоста find /tmp/${HOST2} -name ca.key -type f -delete find /tmp/${HOST1} -name ca.key -type f -delete
Скопіюйте сертифікати та конфігурації kubeadm.
Сертифікати вже були згенеровані, і тепер їх потрібно перемістити на відповідні хости.
USER=ubuntu HOST=${HOST1} scp -r /tmp/${HOST}/* ${USER}@${HOST}: ssh ${USER}@${HOST} USER@HOST $ sudo -Es root@HOST $ chown -R root:root pki root@HOST $ mv pki /etc/kubernetes/
Переконайтеся, що всі очікувані файли існують.
Повний перелік обовʼязкових файлів на
$HOST0
:/tmp/${HOST0} └── kubeadmcfg.yaml --- /etc/kubernetes/pki ├── apiserver-etcd-client.crt ├── apiserver-etcd-client.key └── etcd ├── ca.crt ├── ca.key ├── healthcheck-client.crt ├── healthcheck-client.key ├── peer.crt ├── peer.key ├── server.crt └── server.key
На
$HOST1
:$HOME └── kubeadmcfg.yaml --- /etc/kubernetes/pki ├── apiserver-etcd-client.crt ├── apiserver-etcd-client.key └── etcd ├── ca.crt ├── healthcheck-client.crt ├── healthcheck-client.key ├── peer.crt ├── peer.key ├── server.crt └── server.key
На
$HOST2
:$HOME └── kubeadmcfg.yaml --- /etc/kubernetes/pki ├── apiserver-etcd-client.crt ├── apiserver-etcd-client.key └── etcd ├── ca.crt ├── healthcheck-client.crt ├── healthcheck-client.key ├── peer.crt ├── peer.key ├── server.crt └── server.key
Створіть маніфести статичних Podʼів.
Тепер, коли сертифікати та конфігурації на місці, прийшов час створити маніфести для etcd. На кожному хості виконайте команду
kubeadm
для генерації статичного маніфесту для etcd.root@HOST0 $ kubeadm init phase etcd local --config=/tmp/${HOST0}/kubeadmcfg.yaml root@HOST1 $ kubeadm init phase etcd local --config=$HOME/kubeadmcfg.yaml root@HOST2 $ kubeadm init phase etcd local --config=$HOME/kubeadmcfg.yaml
Опціонально: Перевірте стан кластера.
Якщо
etcdctl
недоступний, ви можете запустити цей інструмент в середовищі контейнера. Ви можете це зробити безпосередньо з вашим середовищем виконання контейнерів за допомогою такого інструменту, якcrictl run
, а не через KubernetesETCDCTL_API=3 etcdctl \ --cert /etc/kubernetes/pki/etcd/peer.crt \ --key /etc/kubernetes/pki/etcd/peer.key \ --cacert /etc/kubernetes/pki/etcd/ca.crt \ --endpoints https://${HOST0}:2379 endpoint health ... https://[HOST0 IP]:2379 is healthy: successfully committed proposal: took = 16.283339ms https://[HOST1 IP]:2379 is healthy: successfully committed proposal: took = 19.44402ms https://[HOST2 IP]:2379 is healthy: successfully committed proposal: took = 35.926451ms
- Встановіть
${HOST0}
на IP-адресу хосту, який ви тестуєте.
- Встановіть
Що далі
Коли у вас є кластер etcd з 3 робочими учасниками, ви можете продовжити налаштування високодоступного вузла панелі управління, використовуючи метод зовнішнього etcd з kubeadm.
8 - Налаштування кожного kubelet у кластері за допомогою kubeadm
Kubernetes v1.11 [stable]
Життєвий цикл інструменту командного рядка kubeadm не повʼязаний з kubelet, який є службою, що працює на кожному вузлі в кластері Kubernetes. Інструмент командного рядка kubeadm запускається користувачем під час ініціалізації або оновлення Kubernetes, тоді як kubelet завжди працює в фоновому режимі.
Оскільки kubelet — це демон, його потрібно обслуговувати за допомогою якоїсь системи ініціалізації або менеджера служб. Коли kubelet встановлено за допомогою DEB або RPM-пакунків, systemd налаштовується для управління kubelet. Ви можете використовувати інший менеджер служб, але його потрібно налаштувати вручну.
Деякі деталі конфігурації kubelet повинні бути однакові для всіх kubelet, які беруть участь в кластері, тоді як інші аспекти конфігурації повинні бути встановлені для кожного kubelet окремо, щоб врахувати різні характеристики кожної машини (такі як ОС, сховище та мережа). Ви можете керувати конфігурацією
kubelet вручну, але тепер kubeadm надає API-тип KubeletConfiguration
дляцентралізованого управління конфігураціями kubelet.
Шаблони конфігурації kubelet
У наступних розділах описано шаблони конфігурації kubelet, які спрощуються за допомогою kubeadm, замість керування конфігурацією kubelet для кожного вузла вручну.
Поширення конфігурації на рівні кластера для кожного kubelet
Ви можете надати kubelet стандартне значення для використання команд kubeadm init
та kubeadm join
. Цікаві приклади охоплюють використання іншого середовища виконання контейнерів або встановлення типової підмережі, яку використовують служби.
Якщо ви хочете, щоб ваші служби використовували мережу 10.96.0.0/12
, ви можете передати параметр --service-cidr
в kubeadm:
kubeadm init --service-cidr 10.96.0.0/12
Віртуальні IP-адреси для служб тепер виділяються з цієї підмережі. Вам також потрібно встановити адресу DNS, яку використовує kubelet, за допомогою прапорця --cluster-dns
. Це налаштування мають бути однаковим для кожного kubelet
на кожному вузлі управління та вузлі в кластері. Kubelet надає структурований, версійований обʼєкт API, який може налаштовувати більшість параметрів в kubelet та розсилати цю конфігурацію кожному працюючому kubelet в кластері. Цей обʼєкт називається KubeletConfiguration
. KubeletConfiguration
дозволяє користувачу вказувати прапорці, такі як IP-адреси DNS кластера, у вигляді списку значень для camelCased ключа, як показано в наступному прикладі:
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
clusterDNS:
- 10.96.0.10
Докладніше про KubeletConfiguration
можна знайти у цьому розділі.
Надання конфігурації, специфічної для екземпляра
Деякі хости вимагають специфічних конфігурацій kubelet через різницю в апаратному забезпеченні, операційній системі, мережевій конфігурації чи інших параметрах, специфічних для хосту. У наступному переліку наведено кілька прикладів.
Шлях до файлу розвʼязання DNS, як вказано прапорцем конфігурації kubelet
--resolv-conf
, може відрізнятися залежно від операційної системи або від того, чи використовуєтьсяsystemd-resolved
. Якщо цей шлях вказано неправильно, розвʼязування DNS буде невдалим на вузлі, конфігурація kubelet якого налаштована неправильно.Обʼєкт API вузла
.metadata.name
типово вказує імʼя хосту машини, якщо ви не використовуєте хмарного постачальника. Ви можете використовувати прапорець--hostname-override
, щоб змінити типову поведінку, якщо вам потрібно вказати імʼя вузла, відмінне від імені хосту машини.Зараз kubelet не може автоматично виявити драйвер cgroup, який використовується середовищем виконання контейнерів, але значення
--cgroup-driver
повинно відповідати драйверу cgroup, який використовується середовищем виконання контейнерів, щоб забезпечити нормальну роботу kubelet.Щоб вказати середовище виконання контейнерів, вам потрібно встановити його endpoint за допомогою прапорця
--container-runtime-endpoint=<шлях>
.
Рекомендований спосіб застосування такої конфігурації, специфічної для екземпляра, — використовувати патчі для KubeletConfiguration.
Налаштування kubelet за допомогою kubeadm
Можливо налаштувати kubelet, який запустить kubeadm, якщо вказано власний обʼєкт API KubeletConfiguration
з конфігураційним файлом таким чином kubeadm ... --config some-config-file.yaml
.
Викликаючи kubeadm config print init-defaults --component-configs KubeletConfiguration
, ви можете переглянути всі типові значення для цієї структури.
Також можливо застосувати специфічні для екземпляра патчі до базового KubeletConfiguration
. Див. Налаштування kubelet для отримання докладнішої інформації.
Послідовність дій при використанні kubeadm init
Коли ви викликаєте kubeadm init
, конфігурація kubelet записується на диск
в /var/lib/kubelet/config.yaml
і також завантажується в ConfigMap kubelet-config
в просторі імен kube-system
кластера. Файл конфігурації kubelet також записується у /etc/kubernetes/kubelet.conf
із базовою конфігурацією кластера для всіх kubelet в кластері. Цей файл конфігурації вказує на клієнтські сертифікати, які дозволяють kubelet взаємодіяти з сервером API. Це вирішує необхідність поширення конфігурації на рівні кластера для кожного kubelet.
Щоб вирішити другий шаблон надання конфігурації, специфічної для екземпляра, kubeadm записує файл середовища у /var/lib/kubelet/kubeadm-flags.env
, який містить список прапорців, які слід передати kubelet при запуску. Прапорці виглядають у файлі наступним чином:
KUBELET_KUBEADM_ARGS="--flag1=value1 --flag2=value2 ..."
Крім прапорців, використовуваних при запуску kubelet, файл також містить динамічні параметри, такі як драйвер cgroup та використання іншого сокету контейнерного середовища (--cri-socket
).
Після того як ці два файли конвертуються на диск, kubeadm намагається виконати дві команди, якщо ви використовуєте systemd:
systemctl daemon-reload && systemctl restart kubelet
Якщо перезавантаження та перезапуск вдалися, продовжується звичайний робочий процес kubeadm init
.
Послідовність при використанні kubeadm join
Коли ви викликаєте kubeadm join
, kubeadm використовує облікові дані Bootstrap Token, щоб виконати запуск TLS, який отримує необхідні облікові дані для завантаження kubelet-config
ConfigMap та записує його в /var/lib/kubelet/config.yaml
. Файл середовища генерується точно так само, як і при kubeadm init
.
Далі kubeadm
виконує дві команди для завантаження нової конфігурації в kubelet:
systemctl daemon-reload && systemctl restart kubelet
Після завантаження нової конфігурації kubelet, kubeadm записує /etc/kubernetes/bootstrap-kubelet.conf
файл конфігурації KubeConfig, який містить сертифікат CA та Bootstrap Token. Ці дані використовуються kubelet для виконання TLS Bootstrap та отримання унікальних облікових даних, які зберігається в /etc/kubernetes/kubelet.conf
.
Коли файл /etc/kubernetes/kubelet.conf
записаний, kubelet завершує виконання TLS Bootstrap. Kubeadm видаляє файл /etc/kubernetes/bootstrap-kubelet.conf
після завершення TLS Bootstrap.
Файл kubelet drop-in для systemd
kubeadm
постачається з конфігурацією systemd для запуску kubelet. Зверніть увагу, що команда kubeadm CLI ніколи не торкається цього drop-in файлу.
Цей файл конфігурації, встановлений за допомогою
пакунку kubeadm
, записується в /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
та використовується systemd. Він доповнює основний kubelet.service
.
Якщо ви хочете внести зміні, ви можете створити теку /etc/systemd/system/kubelet.service.d/
(зверніть увагу, не /usr/lib/systemd/system/kubelet.service.d/
) та внести власні налаштування у файл там. Наприклад, ви можете додати новий локальний файл /etc/systemd/system/kubelet.service.d/local-overrides.conf
для того, щоб перевизначити налаштування елементів в kubeadm
.
Ось що ви, імовірно, знайдете в /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
:
Примітка:
Наведені нижче вміст — це лише приклад. Якщо ви не хочете використовувати менеджер пакунків, дотримуйтеся інструкції, описаної в розділі (Без менеджера пакунків).[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# Це файл, який "kubeadm init" та "kubeadm join" генерують в режимі виконання, заповнюючи
# змінну KUBELET_KUBEADM_ARGS динамічно
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# Це файл, який користувач може використовувати для заміщення аргументів kubelet як останній захист. В ідеалі,
# користувач повинен використовувати обʼєкт .NodeRegistration.KubeletExtraArgs в файлах конфігурації.
# KUBELET_EXTRA_ARGS повинен бути джерелом цього файлу.
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
Цей файл вказує на типове знаходження для всіх файлів, які керуються kubeadm для kubelet.
- Файл KubeConfig для TLS Bootstrap —
/etc/kubernetes/bootstrap-kubelet.conf
, але він використовується тільки у випадку, якщо/etc/kubernetes/kubelet.conf
не існує. - Файл KubeConfig з унікальними ідентифікаційними даними kubelet —
/etc/kubernetes/kubelet.conf
. - Файл, що містить ComponentConfig kubelet —
/var/lib/kubelet/config.yaml
. - Динамічний файл середовища, що містить
KUBELET_KUBEADM_ARGS
, взятий з/var/lib/kubelet/kubeadm-flags.env
. - Файл, що може містити перевизначення прапорців, вказаних користувачем за допомогою
KUBELET_EXTRA_ARGS
, береться з/etc/default/kubelet
(для DEB) або/etc/sysconfig/kubelet
(для RPM).KUBELET_EXTRA_ARGS
останній в ланцюжку прапорців та має найвищий пріоритет у випадку конфлікту налаштувань.
Бінарні файли Kubernetes та вміст пакунків
DEB та RPM-пакети, які постачаються з випусками Kubernetes:
Назва пакунка | Опис |
---|---|
kubeadm | Встановлює інструмент командного рядка /usr/bin/kubeadm та файл drop-in для kubelet для kubelet. |
kubelet | Встановлює виконавчий файл /usr/bin/kubelet . |
kubectl | Встановлює виконавчий файл /usr/bin/kubectl . |
cri-tools | Встановлює виконавчий файл /usr/bin/crictl з репозиторію git cri-tools. |
kubernetes-cni | Встановлює бінарні файли /opt/cni/bin з репозиторію git plugins. |
9 - Підтримка подвійного стека за допомогою kubeadm
Kubernetes v1.23 [stable]
Ваш кластер Kubernetes має мережу з підтримкою подвійного стека, що означає, що у кластері мережева взаємодія може використовувати обидві адресні родини. У кластері панель управління може призначити як IPv4-адреси, так і IPv6-адреси Podʼу чи Service.
Перш ніж ви розпочнете
Вам потрібно встановити інструмент kubeadm, дотримуючись кроків з Встановлення kubeadm.
Для кожного сервера, який ви хочете використовувати як вузол, переконайтеся, що на ньому увімкнено переспрямовування IPv6 трафіку (IPv6 forwarding). На Linux це можна зробити, виконавши sysctl -w net.ipv6.conf.all.forwarding=1
з правами користувача root на кожному сервері.
Вам потрібні діапазони адрес IPv4 та IPv6. Оператори кластера, як правило,
використовують приватні діапазони адрес для IPv4. Щодо IPv6, оператор кластера, як правило, обирає глобальний унікальний блок адрес з області 2000::/3
, використовуючи діапазон, який виділений оператору. Вам не потрібно робити маршрутизацію IP-діапазонів кластера в Інтернет.
Розмір діапазону IP-адрес повинен бути достатнім для тієї кількості Podʼів та Serviceʼів, які ви плануєте запускати.
Примітка:
Якщо ви оновлюєте наявний кластер за допомогою командиkubeadm upgrade
, kubeadm
не підтримує внесення змін до діапазону IP-адрес ("кластер CIDR") або діапазону адрес служби кластера ("Service CIDR").Створення кластера з подвійним стеком
Для створення кластера з подвійним стеком за допомогою kubeadm init
ви можете передати аргументи командного рядка аналогічно наступному прикладу:
# Це діапазони адрес для прикладу
kubeadm init --pod-network-cidr=10.244.0.0/16,2001:db8:42:0::/56 --service-cidr=10.96.0.0/16,2001:db8:42:1::/112
Щоб зробити це більш зрозумілим, ось приклад конфігураційного файлу kubeadm kubeadm-config.yaml
для основного вузла панелі управління з подвійним стеком.
---
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
networking:
podSubnet: 10.244.0.0/16,2001:db8:42:0::/56
serviceSubnet: 10.96.0.0/16,2001:db8:42:1::/112
---
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: "10.100.0.1"
bindPort: 6443
nodeRegistration:
kubeletExtraArgs:
- name: "node-ip"
value: "10.100.0.2,fd00:1:2:3::2"
advertiseAddress
в InitConfiguration вказує IP-адресу, яку API Server оголошує як адресу, на якій він очікує трафік. Значення advertiseAddress
дорівнює значенню
прапорця --apiserver-advertise-address
команди kubeadm init
.
Використовуйте kubeadm для ініціалізації панелі управління на вузлі з подвійним стеком:
kubeadm init --config=kubeadm-config.yaml
Прапори kube-controller-manager --node-cidr-mask-size-ipv4|--node-cidr-mask-size-ipv6
встановлені у стандартні значення. Див. налаштування подвійного стека IPv4/IPv6.
Примітка:
Прапорець--apiserver-advertise-address
не підтримує подвійний стек.Приєднання вузла до кластера з подвійним стеком
Перш ніж приєднати вузол, переконайтеся, що вузол має мережевий інтерфейс з можливістю маршрутизації IPv6 та дозволяє пересилання IPv6.
Ось приклад конфігураційного файлу kubeadm kubeadm-config.yaml
для приєднання робочого вузла до кластера.
apiVersion: kubeadm.k8s.io/v1beta4
kind: JoinConfiguration
discovery:
bootstrapToken:
apiServerEndpoint: 10.100.0.1:6443
token: "clvldh.vjjwg16ucnhp94qr"
caCertHashes:
- "sha256:a4863cde706cfc580a439f842cc65d5ef112b7b2be31628513a9881cf0d9fe0e"
# змініть інформацію про автентифікацію вище, щоб відповідати фактичному токену та хешу сертифіката CA для вашого кластера
nodeRegistration:
kubeletExtraArgs:
- name: "node-ip"
value: "10.100.0.2,fd00:1:2:3::3"
Також ось приклад конфігураційного файлу kubeadm kubeadm-config.yaml
для приєднання іншого вузла панелі управління до кластера.
apiVersion: kubeadm.k8s.io/v1beta4
kind: JoinConfiguration
controlPlane:
localAPIEndpoint:
advertiseAddress: "10.100.0.2"
bindPort: 6443
discovery:
bootstrapToken:
apiServerEndpoint: 10.100.0.1:6443
token: "clvldh.vjjwg16ucnhp94qr"
caCertHashes:
- "sha256:a4863cde706cfc580a439f842cc65d5ef112b7b2be31628513a9881cf0d9fe0e"
# змініть інформацію про автентифікацію вище, щоб відповідати фактичному токену та хешу сертифіката CA для вашого кластера
nodeRegistration:
kubeletExtraArgs:
- name: "node-ip"
value: "10.100.0.2,fd00:1:2:3::4"
advertiseAddress
в JoinConfiguration.controlPlane вказує IP-адресу, яку API Server оголошує як адресу, на якій він слухає. Значення advertiseAddress
дорівнює прапорцю --apiserver-advertise-address
команди kubeadm join
.
kubeadm join --config=kubeadm-config.yaml
Створення кластера з одним стеком
Примітка:
Підтримка подвійного стека не означає, що вам потрібно використовувати подвійні адреси. Ви можете розгорнути кластер з одним стеком, в якому увімкнена функція роботи з мережею з подвійним стеком.Щоб зробити речі більш зрозумілими, конфігураційного файлу kubeadm kubeadm-config.yaml
для панелі управління з одним стеком.
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
networking:
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/16
Що далі
- Перевірка мережевої взаємодії в подвійному стеку IPv4/IPv6
- Дізнайтеся більше про підтримку подвійного стека
- Дізнайтеся більше про формат конфігурації kubeadm