Операційне середовище
Створіть кластер Kubernetes виробничої якості
Кластер Kubernetes виробничої якості вимагає планування та підготовки. Якщо ваш кластер Kubernetes повинен запускати критичні робочі навантаження, він повинен бути налаштований, щоб бути стійким та витривалим. На цій сторінці пояснюються кроки, які ви можете зробити для створення готового до промислової експлуатації кластера або для переведення наявного кластера в операційне середовище. Якщо ви вже знайомі з налаштуванням операційного середовища та хочете отримати посилання, перейдіть до розділу Що далі.
Аспекти промислової експлуатації
Зазвичай операційне середовище кластера Kubernetes накладає суворіші вимоги, ніж навчальне середовище, середовище для розробки та тестування. Операційне середовище може вимагати захищеного доступу для багатьох користувачів, високого рівня доступності та ресурсів для пристосування до змін вимог.
Коли ви визначаєте, де ви хочете розмістити ваше операційне середовище Kubernetes (у себе чи в хмарі) та рівень управління, який ви хочете взяти на себе або передати іншим, розгляньте, як ваші вимоги до кластера Kubernetes впливають на такі питання:
Доступність: Одномашинне навчальне середовище Kubernetes має одну точку відмови. Створення високодоступного кластера передбачає:
- Відділення панелі управління від робочих вузлів.
- Реплікації компонентів панелі управління на кілька вузлів.
- Балансування трафіку до API-сервера кластера.
- Наявність достатньої кількості робочих вузлів або можливість їх швидкого введення в експлуатацію залежно від змін в робочому навантажені.
Масштабування: Якщо ви очікуєте, що ваше операційне середовище Kubernetes отримає стабільний обсяг запитів, ви, можливо, зможете налаштувати потрібну потужність і на цьому зупинитись. Однак, якщо ви очікуєте, що попит зростатиме з часом або раптово змінюватиметься на основі таких чинників, як сезонність чи спеціальні події, вам потрібно розробити план щодо масштабування для обробки зростаючого навантаження від збільшення запитів до панелі управління та робочих вузлів або масштабування вниз для зменшення простою ресурсів, які більше не потрібні.
Безпека та управління доступом: У вас є повні привілеї адміністратора на власному навчальному кластері Kubernetes. Але спільні кластери з важливими навантаженнями та більше ніж одним або двома користувачами вимагають більш витонченого підходу до того, хто і що може отримати доступ до ресурсів кластера. Ви можете використовувати систему управління доступом на основі ролей (RBAC) та інші механізми безпеки, щоб переконатися, що користувачі та завдання можуть отримати доступ до необхідних ресурсів, підтримуючи завдання та сам кластер у безпеці. Ви можете встановлювати обмеження на ресурси, до яких користувачі та завдання мають доступ, керуючи політиками та ресурсами контейнерів.
Перш ніж створювати власне операційне середовище Kubernetes, розгляньте можливість передачі деяких частин або всієї цієї роботи постачальникам "хмарних рішень під ключ" або іншим партнерам Kubernetes. Серед варіантів:
- Serverless: Просто виконуйте робочі завдання на обладнанні сторонніх постачальників без управління кластером взагалі. Вам доведеться платити за такі речі, як використання процесора, памʼяті та дискові запити.
- Керування панеллю управління: Дозвольте постачальнику управляти масштабуванням та доступністю панелі управління кластера, а також розвʼязувати питання щодо застосування латок та встановлення оновлень.
- Керування робочими вузлами: Налаштуйте пули вузлів для задоволення ваших потреб, а потім постачальник забезпечить наявність цих вузлів та готовність виконувати оновлення за необхідності.
- Інтеграція: Є постачальники, які інтегрують Kubernetes з іншими сервісами, які вам можуть знадобитися, такими як сховища, реєстри контейнерів, методи автентифікаційні та інструменти розробки.
Чи ви будуєте виробничий кластер Kubernetes самостійно чи співпрацюєте з партнерами, перегляньте наступні розділи, щоб оцінити ваші потреби стосовно панелі управління кластером, робочих вузлів, доступу користувачів та ресурсів для виконання робочих навантажень.
Налаштування промислового кластера
У виробничому кластері Kubernetes, панель управління управляє кластером за допомогою сервісів, які можуть бути розподілені по різних компʼютерах різними способами. Кожен робочий вузол являє собою окремий обʼєкт, який налаштований для запуску Podʼів Kubernetes.
Панель управління промислового кластера
Найпростіший кластер Kubernetes має панель управління та всі робочі вузли на одному компʼютері. Ви можете розширювати це оточення додаючи робочі вузли, як про це йдеться в статі Компоненти Kubernetes. Якщо передбачається, що кластер має бути доступним впродовж короткого проміжку часу, або може бути знехтуваним у разі збою, це має відповідати вашим потребам.
Якщо вам потрібен постійний та високодоступний кластер, розгляньте способи розширення панелі управління. За проєктом, служби управління на одному вузлі, який працює на одній машині, не є високодоступними. Якщо важливо, щоб кластер працював переконатися, що його можна відновити у випадку проблем, розгляньте наступні кроки:
- Оберіть інструменти розгортання:
Ви можете розгорнути панель управління використовуючи інструменти, такі як: kubeadm, kops, kubespray. Перегляньте Встановлення Kubernetes за допомогою інструментів розгортання, щоб дізнатись порад щодо розгортання промислового кластера за допомогою цих методів. Різні середовища виконання контейнерів доступні для використання у вашому розгортанні.
- Керування сертифікатами:
Безпечний звʼязок між компонентами панелі управління реалізується за допомогою сертифікатів. Сертифікати автоматично генеруються під час розгортання, або ви можете генерувати їх за допомогою власного центру сертифікації. Дивіться Вимоги та сертифікати PKI.
- Налаштування балансування навантаженням apiserverʼа:
Налаштуйте балансувальник навантаження, щоб розподілити зовнішні запити до екземплярів apiserver, що працюють на різних вузлах. Дивіться Створення зовнішнього балансувальника навантаження.
- Відділіть та робіть резервні копії служби etcd:
Служба etcd може або працювати на тій же машині, що і панель управління, або працювати на окремих вузлах, для підвищення захищеності та доступності. Оскільки etcd зберігає дані конфігурації кластера, важливо робити резервні копії цих даних регулярно, щоб переконатись, що вони можуть бути відновлені в разі потреби. Дивіться ЧаПи etcd щодо налаштування та використання etcd. Дивіться Керування кластерами etcd Kubernetes та Налаштування високої доступності кластера etcd з kubeadm.
- Створення системи з кількома панелями управління:
Для забезпечення високої доступності панелі управління, необхідно відмовитися від обмеження щодо її знаходження на одні машині. Якщо служби панелі управління запускаються службою init (такої як systemd), кожна служба повинна працювати як мінімум на трьох машинах. Однак запуск служб панелі управління як Podʼів в Kubernetes гарантує, що реплікована кількість служб, яку ви вказуєте, завжди буде доступною. Планувальник повинен бути стійким до помилок, але не високодоступним. Деякі засоби розгортання налаштовують алгоритм консенсусу Raft для вибору лідера служб Kubernetes. Якщо основна служба зазнає збою, інша служба обирає себе лідером і перебирає контроль на себе.
- Використовуйте кілька зон:
Якщо важливо, щоб ваш кластер був доступним у будь-який час, розгляньте можливість створення кластера, який працює у кількох центрах обробки даних, відомих як зони в хмарних середовищах. Групи зон називаються регіонами. Розподіливши кластер по кількох зонах в одному регіоні, ви можете покращити ймовірність того, що ваш кластер продовжуватиме працювати, навіть якщо одна зона стане недоступною. Дивіться Робота у кількох зонах.
- Керуйте тривалими функціями:
Якщо ви плануєте тримати свій кластер протягом тривалого часу, є завдання, які вам потрібно виконати для забезпечення його самовідновлення та безпеки. Наприклад, якщо ви встановили кластер за допомогою kubeadm, є інструкції, які допоможуть вам з керуванням сертифікатами та оновленням кластерів kubeadm. Дивіться Адміністрування кластера для отримання більш докладного списку адміністративних завдань Kubernetes.
Щоб дізнатися про доступні опції при запуску служб панелі управління, дивіться сторінки компонентів kube-apiserver, kube-controller-manager та kube-scheduler. Для прикладів конфігурації високої доступності панелі управління дивіться Варіанти високодоступної топології, Створення високодоступних кластерів за допомогою kubeadm та Експлуатація кластерів etcd для Kubernetes. Для інформації щодо плану створення резервних копій etcd дивіться Резервне копіювання кластера etcd.
Робочі вузли промислового кластера
Робочі навантаження повинні бути стійкими, і все, на що вони покладаються, має бути стійким (наприклад, CoreDNS). Незалежно від того, чи керуєте ви власною панеллю управління, чи хмарний провайдер робить це за вас, вам все одно потрібно подумати, як ви хочете керувати своїми робочими вузлами (також їх просто називають вузлами).
- Налаштування вузлів: Вузли можуть бути фізичними або віртуальними машинами. Якщо ви хочете створювати та управляти власними вузлами, ви можете встановити підтримувану операційну систему, додати та запустити відповідні Служби вузлів. Розгляньте такі питання:
- Вимоги вашого робочого навантаження при налаштуванні вузлів, маючи відповідну кількість памʼяті, процесора та швидкості дискових операцій та обʼєму сховища.
- Чи підійдуть загальні компʼютерні системи, чи у вас є завдання, які потребують процесорів GPU, вузлів з операційною системою Windows або ізоляції віртуальних машин.
- Перевірка вузлів: Дивіться Правильне налаштування вузлів для інформації про те, як переконатися, що вузол відповідає вимогам для приєднання до кластера Kubernetes.
- Додавання вузлів до кластера: Якщо ви керуєте своїм власним кластером, ви можете додавати вузли, налаштовуючи свої власні машини та додаючи їх вручну або реєструючи їх в службі apiserver кластера. Дивіться розділ Вузли для інформації щодо того, як налаштувати Kubernetes для додавання вузлів цими способами.
- Масштабування вузлів: Майте план розширення потужності вашого кластера на майбутнє. Дивіться Рекомендації для великих кластерів, щоб визначити, скільки вузлів вам потрібно, виходячи з кількості podʼів і контейнерів, які вам потрібно запустити. Якщо ви керуєте вузлами самостійно, це може означати придбання та встановлення власного фізичного обладнання.
- Автомасштабування вузлів: Ознайомтесь з Автомасштабуванням кластера, щоб дізнатись про інструменти доступні для автоматизованого керування вашими вузлами та ресурсами, які вони надають.
- Налаштування перевірок справності вузлів: Для важливих завдань важливо переконатися, що Nodeʼи та Podʼи, які працюють на цих вузлах, є працездатними. За допомогою демона Node Problem Detector ви можете забезпечити працездатність своїх вузлів.
Доступ користувачів до промислового кластера
У промисловій експлуатації ви можете перейти від моделі, де ви невелика група людей, що має доступ до кластера, до, де потенційно можуть бути десятки або сотні людей. У навчальному середовищі або прототипі платформи у вас може бути єдиний адміністративний обліковий запис для всього, що ви робите. У промисловій експлуатації вам знадобиться більше облікових записів з різними рівнями доступу до різних просторів імен.
Беручи до уваги кластер промислової експлуатації, вирішуючи, як ви хочете дозволити вибірковий доступ іншим користувачам. Зокрема, вам потрібно вибрати стратегії для перевірки ідентичності тих, хто намагається отримати доступ до вашого кластера (автентифікація) та вирішити, чи мають вони дозволи робити те, що вони просять (авторизація):
Автентифікація: apiserver може автентифікувати користувачів за допомогою клієнтських сертифікатів, токенів доступу, проксі автентифікації або базової HTTP-автентифікації. Ви можете вибрати методи автентифікації, які ви хочете використовувати. За допомогою втулків apiserver може використовувати наявні методи автентифікації вашої організації, такі як LDAP або Kerberos. Див. Автентифікація для опису різних методів автентифікації користувачів Kubernetes.
Авторизація: Коли ви починаєте авторизовувати звичайних користувачів, ви, ймовірно, вибиратимете між авторизацією RBAC та ABAC. Див. Огляд авторизації для ознайомлення з різними режимами авторизації облікових записів користувачів (а також доступу службових облікових записів до вашого кластера):
- Контроль доступу на основі ролей (RBAC): Дозволяє вам призначати доступ до вашого кластера, виставляючи конкретні набори дозволів автентифікованим користувачам. Дозволи можуть бути призначені для конкретного простору імен (Role) або по всьому кластеру (ClusterRole). Потім, використовуючи RoleBindings та ClusterRoleBindings, ці дозволи можна призначити певним користувачам.
- Контроль доступу на основі атрибутів (ABAC): Дозволяє вам створювати політики на основі атрибутів ресурсів у кластері та дозволяти чи відмовляти у доступі на основі цих атрибутів. Кожен рядок файлу політики ідентифікує властивості версії (apiVersion та kind) та вказує у властивостях spec збіг з субʼєктом (користувачем або групою), властивістю ресурсу, властивості не-ресурсу (/version або /apis) або readonly. Дивіться Приклади для отримання деталей.
Якщо ви налаштовуєте автентифікацію та авторизацію на своєму промисловому кластері Kubernetes, ось кілька речей, які варто врахувати:
- Встановлення режиму авторизації:
Коли сервер API Kubernetes (kube-apiserver) запускається, підтримувані режими автентифікації повинні бути встановлені за допомогою прапорця --authorization-mode. Наприклад, цей прапорець у файлі kube-adminserver.yaml (в /etc/kubernetes/manifests) може бути встановлений у значення Node, RBAC. Це дозволить авторизацію Node та RBAC для автентифікованих запитів.
- Створення сертифікатів користувача та привʼязка ролей (RBAC):
Якщо ви використовуєте авторизацію RBAC, користувачі можуть створювати CertificateSigningRequest (CSR), які можуть бути підписати CA кластера. Потім ви можете привʼязувати Roles та ClusterRoles до кожного користувача. Дивіться Запити на підпис сертифікатів для отримання деталей.
- Створення політик, що комбінують атрибути (ABAC):
Якщо ви використовуєте авторизацію ABAC, ви можете призначати комбінації атрибутів для формування політик для авторизації обраних користувачів або груп для доступу до певних ресурсів (наприклад, Podʼів), просторів імен або apiGroup. Докладніше дивіться Приклади.
- Використання контролерів вхідних даних:
Додаткові форми авторизації для запитів, які можуть надходити через сервер API, включають Автентифікацію токенів за допомогою вебхуків. Вебхуки та інші спеціальні типи авторизації повинні бути увімкнені додаванням Контролерів допуску (Admission Controllers) до сервера API.
Встановлення лімітів для робочих навантажень
Вимоги від виробничих навантажень можуть створювати тиск як всередині, так і поза панеллю управління Kubernetes. Розгляньте ці пункти при налаштуванні лімітів для робочого навантаження вашого кластера:
- Встановіть обмеження простору імен:
Встановіть квоти в кожному просторі імен для речей, таких як памʼять та ЦП. Дивіться Керування памʼяттю, ЦП та ресурсами API для отримання деталей. Ви також можете встановити Ієрархічні простори імен для успадкування обмежень.
- Підготуйтесь до вимог DNS:
Якщо ви очікуєте, що робочі навантаження масштабуються, ваша служба DNS повинна бути готовою масштабуватися також. Дивіться Масштабування служби DNS в кластері.
- Створюйте додаткові службові облікові записи:
Облікові записи користувачів визначають, що користувачі можуть робити в кластері, тоді як службовий обліковий запис визначає доступ до Podʼів у межах певного простору імен. Стандартно Pod приймає стандартний службовий обліковий запис у своєму просторі імен. Дивіться Управління службовими обліковими записами для інформації про створення нового службового облікового запису. Наприклад, ви можете:
Що далі
1 - Середовище виконання контейнерів
Для того, щоб запускати Podʼи на кожному вузлі кластера, потрібно встановити
container runtime. Ця сторінка надає огляд того, які компоненти беруть в цьому участь, та описує повʼязані завдання для налаштування вузлів.
Kubernetes 1.31 вимагає використання runtime, який відповідає
специфікації Container Runtime Interface (CRI).
Дивіться Підтримка версій CRI для отримання додаткової інформації.
Ця сторінка містить огляд того, як використовувати кілька поширених середовищ виконання контейнерів з Kubernetes.
Примітка:
Релізи Kubernetes до v1.24 включно мали безпосередню інтеграцію з Docker Engine, використовуючи компонент під назвою dockershim. Ця безпосередня інтеграція більше не є частиною Kubernetes (про що було оголошено у випуску v1.20). Ви можете ознайомитись з матеріалами статті Перевірте, чи вас стосується видалення Dockershim, щоб зрозуміти, як це видалення може вплинути на вас. Щоб дізнатися про міграцію з dockershim, перегляньте
Міграція з dockershim.
Якщо ви використовуєте версію Kubernetes іншу, ніж v1.31, перевірте документацію для цієї версії.
Конфігурація мережі
Стандартно ядро Linux не дозволяє маршрутизувати пакети IPv4 між інтерфейсами. Більшість реалізацій мережі кластера Kubernetes змінить це налаштування (якщо це потрібно), але деякі можуть очікувати, що адміністратор зробить це за них. (Деякі також можуть очікувати встановлення інших параметрів sysctl, завантаження модулів ядра тощо; перевірте документацію для вашої конкретної мережної реалізації.)
Увімкнення маршрутизації IPv4 пакетів
Для увімкнення вручну маршрутизації IPv4 пакетів:
# параметри sysctl, необхідні для налаштування, параметри зберігаються після перезавантаження
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF
# Застосувати параметри sysctl без перезавантаження
sudo sysctl --system
Перевірте, що net.ipv4.ip_forward
встановлено на 1 за допомогою:
sysctl net.ipv4.ip_forward
Драйвери cgroup
У Linux використовуються control groups для обмеження ресурсів, які виділяються процесам.
І kubelet, і відповідні середовища виконання контейнерів потребують взаємодії з cgroup для управління ресурсами для Podʼів та контейнерів та встановлення ресурсів, таких як обсяг памʼяті та обчислювальних ресурсів центрального процесора, а також їх обмежень. Щоб взаємодіяти з cgroup, kubelet та середовище виконання контейнерів повинні використовувати драйвер cgroup. Важливо, щоб kubelet та середовище виконання контейнерів використовували один і той самий драйвер cgroup та були налаштовані однаково.
Існують два доступні драйвери cgroup:
Драйвер cgroupfs
Драйвер cgroupfs
є стандартним драйвером cgroup в kubelet. Коли використовується драйвер cgroupfs
, kubelet та середовище виконання контейнерів безпосередньо взаємодіють
з файловою системою cgroup для їх налаштування.
Драйвер cgroupfs
не рекомендується використовувати, коли systemd є системою ініціалізації, оскільки systemd очікує наявності єдиного менеджера cgroup в системі. Крім того, якщо використовуєте cgroup v2, використовуйте драйвер systemd
cgroup замість cgroupfs
.
Драйвер cgroup системи systemd
Коли systemd вибрано як систему ініціалізації в дистрибутиві Linux, процес ініціалізації створює і використовує кореневу групу cgroup (cgroup
) та діє як менеджер cgroup.
systemd тісно інтегрований з cgroup та розміщує по одній cgroup на кожному юніті systemd. В результаті, якщо ви використовуєте systemd
як систему ініціалізації з драйвером cgroupfs
, система отримує два різних менеджери cgroup.
Наявність двох менеджерів cgroup призводить до двох видів доступних та використаних ресурсів в системі. У деяких випадках вузли, які налаштовані на використання cgroupfs
для kubelet та середовище виконання контейнерів, але використовують systemd
для інших процесів, стають нестійкими при зростанні тиску на ресурси.
Підхід до помʼякшення цієї нестійкості — використовувати systemd
як драйвер cgroup для kubelet та середовище виконання контейнерів, коли systemd
вибрано системою ініціалізації.
Щоб встановити systemd
як драйвер cgroup, відредагуйте в KubeletConfiguration
опцію cgroupDriver
та встановіть її в systemd
. Наприклад:
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
...
cgroupDriver: systemd
Примітка:
Починаючи з v1.22 і пізніше, при створенні кластера за допомогою kubeadm, якщо користувач не встановить поле cgroupDriver
в KubeletConfiguration
, kubeadm встановлює типове значення — systemd
.Якщо ви конфігуруєте systemd
як драйвер cgroup для kubelet, вам також слід налаштувати systemd
як драйвер cgroup для середовища виконання контейнерів. Дивіться документацію для вашого середовища виконання контейнерів для отримання докладних інструкцій. Наприклад:
У Kubernetes 1.31, з увімкненою функціональною можливістю KubeletCgroupDriverFromCRI
і середовищем виконання контейнерів, яке підтримує RuntimeConfig
CRI RPC, kubelet автоматично визначає відповідний драйвер cgroup з runtime, та ігнорує налаштування cgroupDriver
у конфігурації kubelet.
Увага:
Зміна драйвера cgroup вузла, який приєднався до кластера, — це чутлива операція. Якщо kubelet створював Podʼи, використовуючи семантику одного драйвера cgroup, зміна середовища виконання контейнерів на інший драйвер cgroup може спричинити помилки при спробі повторного створення пісочниці Pod для таких наявних Podʼів. Перезапуск kubelet може не вирішити таких помилок.
Якщо у вас є автоматизація, яка дозволяє це зробити, замініть вузол іншим з оновленою конфігурацією, або перевстановіть його за допомогою автоматизації.
Міграція на драйвер systemd
в кластерах, що керуються kubeadm
Якщо ви хочете мігрувати на драйвер systemd
cgroup в кластерах, що керуються kubeadm, дотримуйтеся рекомендацій налаштування драйвера cgroup.
Підтримка версій CRI
Ваше середовище виконання контейнерів повинне підтримувати принаймні версію v1alpha2 інтерфейсу контейнера.
Kubernetes починаючи з v1.26 працює тільки з v1 CRI API. Попередні версії типово
використовують версію v1, проте, якщо середовище виконання контейнерів не підтримує v1 API, kubelet перемкнеться на використання (застарілої) версії API v1alpha2.
Середовища виконання контейнерів
Примітка: Цей розділ містить посилання на проєкти сторонніх розробників, які надають функціонал, необхідний для Kubernetes. Автори проєкту Kubernetes не несуть відповідальності за ці проєкти. Проєкти вказано в алфавітному порядку. Щоб додати проєкт до цього списку, ознайомтеся з
посібником з контенту перед надсиланням змін.
Докладніше. containerd
У цьому розділі описані необхідні кроки для використання containerd як середовища виконання контейнерів (CRI).
Щоб встановити containerd на вашу систему, дотримуйтеся інструкцій з
Початок роботи з containerd. Поверніться до цього кроку, якщо ви створили файл конфігурації config.toml
.
Ви можете знайти цей файл тут: /etc/containerd/config.toml
.
Ви можете знайти цей файл тут: C:\Program Files\containerd\config.toml
.
У Linux, типовий CRI-socket для containerd — /run/containerd/containerd.sock
. У Windows, типова CRI-точка доступу — npipe://./pipe/containerd-containerd
.
Налаштування драйвера cgroup systemd
Щоб використовувати драйвер cgroup systemd
в /etc/containerd/config.toml
з runc
, встановіть
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
...
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
Драйвер cgroup systemd
є рекомендованим, якщо ви використовуєте cgroup v2.
Примітка:
Якщо ви встановили containerd за допомогою менеджера пакунків (наприклад, RPM або .deb
, ви можете знайти, що втулок інтеграції CRI є типово вимкненим.
Вам потрібно увімкнути підтримку CRI для того, щоб мати можливість використовувати containerd в Kubernetes. Переконайтеся, що cri
немає в disabled_plugins
у файлі /etc/containerd/config.toml
; якщо вносили зміни до цього файлу, перезапустіть containerd
.
Якщо ви стикаєтесь з постійними збоями після початкового встановлення кластера або після встановлення CNI, скоріш за все конфігурація containerd отримана з пакунка містить несумісні налаштування. Зважте на перевстановлення налаштувань containerd, командою containerd config default > /etc/containerd/config.toml
(див. getting-strated.md і потім внесіть зміни в налаштування, як вказано вище.
Після внесення змін в перезавантажте containerd.
sudo systemctl restart containerd
Використовуючи kubeadm, вручну налаштуйте cgroup драйвер для kubelet.
У Kubernetes v1.28 ви можете увімкнути alpha-функцію автоматичного виявлення драйвера cgroup. Дивіться systemd cgroup driver для отримання додаткової інформації.
Перевизначення образу пісочниці (pause)
У вашій конфігурації containerd ви можете перевизначити образ, встановивши наступну конфігурацію:
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.k8s.io/pause:3.2"
Можливо, вам доведеться також перезапустити containerd
, якщо ви оновили файл конфігурації: systemctl restart containerd
.
CRI-O
У цьому розділі наведено необхідні кроки для встановлення CRI-O як середовища виконання контейнерів.
Для встановлення CRI-O слід дотримуватися Інструкцій з встановлення CRI-O.
Драйвер cgroup
CRI-O використовує стандартний драйвер cgroup, який ймовірно буде працювати добре для вас. Для перемикання на драйвер cgroupfs, відредагуйте /etc/crio/crio.conf
або розмістіть конфігурацію у вигляді окремого файлу в /etc/crio/crio.conf.d/02-cgroup-manager.conf
, наприклад:
[crio.runtime]
conmon_cgroup = "pod"
cgroup_manager = "cgroupfs"
Важливо відзначити змінений conmon_cgroup
, який повинен бути встановлений в значення pod
при використанні CRI-O з cgroupfs
. Зазвичай необхідно синхронізувати конфігурацію драйвера cgroup kubelet (зазвичай встановлюється за допомогою kubeadm) та CRI-O.
У Kubernetes v1.28 можна ввімкнути автоматичне виявлення драйвера cgroup як альфа-функцію. Див. драйвер cgroup systemd докладніше.
Для CRI-O типовий сокет CRI — /var/run/crio/crio.sock
.
Перевизначення образу пісочниці (pause)
У вашій конфігурації CRI-O ви можете встановити наступне значення конфігурації:
[crio.image]
pause_image="registry.k8s.io/pause:3.6"
Цей параметр конфігурації підтримує перезавантаження конфігурації в реальному часі для застосування цих змін: systemctl reload crio
або відсилання сигналу SIGHUP
процесу crio
.
Docker Engine
Примітка:
Ці інструкції передбачають, що ви використовуєте адаптер
cri-dockerd
для інтеграції Docker Engine з Kubernetes.
На кожному з ваших вузлів встановіть Docker для вашого дистрибутиву Linux; дивіться Інсталяція Docker Engine.
Встановіть cri-dockerd
, дотримуючись інструкцій у репозиторій з вихідним кодом.
Для cri-dockerd
типовий сокет CRI — /run/cri-dockerd.sock
.
Mirantis Container Runtime
Mirantis Container Runtime (MCR) є комерційно доступною реалізацією середовища виконання контейнерів, яка була раніше відома як Docker Enterprise Edition.
Ви можете використовувати Mirantis Container Runtime з Kubernetes за допомогою відкритої реалізації компонента cri-dockerd
, який входить до складу MCR.
Для отримання докладнішої інформації щодо встановлення Mirantis Container Runtime
дивіться посібник з розгортання MCR.
Перевірте юніт systemd із назвою cri-docker.socket
, щоб дізнатися шлях до сокета CRI.
Перевизначення образу пісочниці (pause)
Адаптер cri-dockerd
приймає аргумент командного рядка для зазначення образу контейнера, який слід використовувати як інфраструктурний контейнер для Podʼа («pause image»). Аргумент командного рядка, який слід використовувати — --pod-infra-container-image
.
Що далі
Так само як і середовище виконання контейнерів, вашому кластеру знадобиться втулок мережі.
2 - Встановлення Kubernetes за допомогою інструментів розгортання
Існує багато методів та інструментів для встановлення власного промислового кластера Kubernetes. Наприклад:
- kubeadm
- Cluster API: Підпроєкт Kubernetes зосереджений на наданні декларативних API та інструментарію для спрощення створення, оновлення та експлуатації кількох кластерів Kubernetes.
- kops: автоматизований інструмент для розгортання кластера. За навчальними матеріалами, найкращими практиками, параметрами конфігурації та інформацією про спільноту звертайтесь до вебсайту
kOps
. - kubespray: набір плейбуків Ansible, інвентарю, інструментів керування та знання про загальні завдання з конфігурації OS/Kubernetes. Ви можете звертатися до спільноти на каналі Slack #kubespray.
2.1 - Запуск кластерів з kubeadm
2.1.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, щоб перевірити, чи відкритий порт. Наприклад:
Мережевий втулок 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.
Наведені нижче таблиці містять відомі точки доступу для підтримуваних операційних систем:
Linux container runtimesСередовище виконання | Шлях до 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 |
Windows container runtimesСередовище виконання | Шлях до іменованого 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 вимагають
спеціальної уваги під час оновлення.
Докладніше про відмінності версій:
Примітка:
Є окремий репозиторій пакунків для кожної мінорної версії Kubernetes. Якщо ви хочете встановити іншу мінорну версію, крім v1.31, див. посібник з встановлення для бажаної мінорної версії.Ці інструкції для Kubernetes v1.31.
Оновіть індекс пакунків apt
та встановіть пакунки, необхідні для використання репозитарію Kubernetes apt
:
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.
Як середовище виконання контейнерів, так і kubelet мають властивість, відому як "cgroup driver", яка є важливою для управління cgroup на машинах з операційною системою Linux.
Попередження:
Обовʼязково встановлюйте спільний драйвер cgroup для середовища виконання контейнерів та kubelet, інакше процес kubelet завершиться із помилкою.
Докладніше дивіться в розділі Налаштування драйвера cgroup.
Розвʼязання проблем
Якщо у вас виникають труднощі з kubeadm, будь ласка, звертайтеся до наших документів щодо розвʼязання проблем.
Що далі
2.1.2 - Розвʼязання проблем kubeadm
Так само як і з будь-якою іншою технологією, ви можете зіткнутися з проблемами під час встановлення або використання kubeadm. Цей документ містить список найпоширеніших проблем та їх рішень, пропонуючи вам кроки, які допоможуть зʼясувати та розвʼязати проблеми.
Якщо вашої проблеми немає в переліку нижче, будь ласка, скористайтесь настпуним:
Ви вважаєте, що це помилка в 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:
[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
за допомогою:
Або встановіть його в типове розташування 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
структури kubeadm NodeRegistrationOptions
може бути використаний для цього.
Потім перезапустіть kubelet
:
systemctl daemon-reload
systemctl restart kubelet
Podʼи coredns
перебувають у стані CrashLoopBackOff
або Error
Якщо у вас є вузли, які працюють із SELinux та старішою версією Docker, ви можете стикнутися зі сценарієм, де Podʼи coredns
не запускаються. Щоб вирішити це, ви можете спробувати один з наступних варіантів:
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
Прапорці 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
Більше інформації можна знайти в тікеті для цієї помилки.
2.1.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
. Дивіться Встановлення середовища виконання.
Щоб ініціалізувати вузол панелі управління, виконайте:
Міркування щодо 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
:
Процес скидання не відновлює або не очищає правила iptables чи таблиці IPVS. Якщо ви хочете скинути iptables, вам слід це зробити вручну:
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
Якщо ви хочете скинути таблиці IPVS, вам слід виконати наступну команду:
Тепер видаліть вузол:
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, яка працює на ньому. Це означає, що якщо вузол для панелі управління вийде з ладу, ваш кластер може втратити дані і може деведеться його перестворювати з нуля.
Обхідні шляхи:
Пакунки та бінарники kubeadm для deb/rpm будуються для amd64, arm (32-біт), arm64, ppc64le та s390x, відповідабть пропозиції щодо багатоплатформовості.
Багатоплатформові образи контейнерів для вузла панелі управління та надбудов також підтримуються з версії 1.12.
Тільки деякі постачальники мережі пропонують рішення для всіх платформ. Зверніться до списку постачальників мережі вище або до документації кожного постачальника, щоб визначити, чи підтримує постачальник вашу платформу.
Усунення несправностей
Якщо ви стикаєтеся з труднощами у роботі з kubeadm, будь ласка, звертайтеся до наших
документів із усунення несправностей.
Що далі
Зворотній звʼязок
2.1.4 - Налаштування компонентів за допомогою kubeadm API
Ця сторінка охоплює способи налаштування компонентів, які розгортаються за допомогою kubeadm. Для компонентів панелі управління можна використовувати прапорці у структурі ClusterConfiguration
або патчі на рівні вузла. Для kubelet і kube-proxy ви можете використовувати KubeletConfiguration
та KubeProxyConfiguration
, відповідно.
Всі ці опції можливі за допомогою конфігураційного API kubeadm. Докладніше про кожне поле в конфігурації ви можете дізнатися на наших довідкових сторінках API.
Примітка:
На жаль, наразі не підтримується налаштування розгортання CoreDNS за допомогою kubeadm. Вам слід вручну патчити
ConfigMap kube-system/coredns
та перестворити
Pods CoreDNS після цього. Альтернативно, ви можете пропустити типове розгортання CoreDNS та розгорнути свій варіант. Докладніше про це читайте у
Використання фаз ініціалізації з 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 в кластері.
2.1.5 - Варіанти топології високої доступності (HA)
Ця сторінка пояснює два варіанти конфігурації топології ваших високо доступних (HA) кластерів Kubernetes.
Ви можете налаштувати стійкий кластер:
- З вузлами панелі управління, де вузли etcd розташовані разом із вузлами панелі управління.
- З зовнішніми вузлами etcd, де 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 необхідні для стійкого кластера з цією топологією.
Що далі
2.1.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 це вирішується автоматично.
Наступні кроки схожі на налаштування 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 на своєму основному пристрої, який має доступ до всіх інших вузлів в системі:
Додайте свій SSH-ідентифікатор до сеансу:
ssh-add ~/.ssh/path_to_private_key
Перемикайтесь між вузлами, щоб перевірити, чи зʼєднання правильно працює.
Коли ви входите в будь-який вузол через SSH, додайте прапорець -A
. Цей прапорець дозволяє вузлу, на який ви увійшли за допомогою SSH, отримувати доступ до агента SSH на вашому ПК. Розгляньте альтернативні методи, якщо ви не повністю довіряєте безпеці вашої сесії користувача на вузлі.
Коли використовуєте sudo на будь-якому вузлі, обовʼязково зберігайте середовище, щоб SSH forwarding працював:
Після налаштування 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
2.1.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.Оскільки etcd був створений першим, вам слід перевизначити пріоритет служби, створивши новий файл юніта, який має вищий пріоритет, ніж файл юніта kubelet, який надає kubeadm.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, щоб переконатися, що він працює.
Створіть конфігураційні файли для 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
, а не через Kubernetes
ETCDCTL_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.
2.1.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, якщо вказано власний обʼєкт 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. |
2.1.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
Що далі
3 - Хмарні рішення під ключ
Ця сторінка надає список постачальників сертифікованих рішень Kubernetes. З кожної сторінки постачальника ви можете дізнатися, як встановити та налаштувати готові до експлуатації кластери.