Деталі реалізації
Kubernetes v1.10 [stable]kubeadm init та kubeadm join разом забезпечують гарну послідовність дій користувача для створення базового кластера Kubernetes з нуля, відповідно до найкращих практик. Однак може бути не очевидно, як kubeadm це робить.
Цей документ надає додаткову інформацію про те, що відбувається за лаштунками, з метою поширення знань про найкращі практики для кластера Kubernetes.
Основні принципи дизайну
Кластер, який налаштовується за допомогою kubeadm init та kubeadm join, має бути:
- Захищеним: Він повинен дотримуватися останніх найкращих практик, таких як:
- забезпечення RBAC
- використання Node Authorizer
- використання захищеного зв’язку між компонентами панелі управління
- використання захищеного зв’язку між API-сервером і kubelet-ами
- обмеження доступу до API kubelet-а
- обмеження доступу до API для системних компонентів, таких як kube-proxy та CoreDNS
- обмеження доступу до того, що може отримати Bootstrap Token
- Зручним для користувачів: Користувачеві не повинно знадобитися виконувати більше, ніж кілька команд:
kubeadm initexport KUBECONFIG=/etc/kubernetes/admin.confkubectl apply -f <network-plugin-of-choice.yaml>kubeadm join --token <token> <endpoint>:<port>
- Розширюваним:
- Він не повинен віддавати перевагу жодному конкретному мережевому провайдеру. Налаштування мережі кластерів не входить до сфери компетенції
- Він повинен надавати можливість використовувати конфігураційний файл для налаштування різних параметрів
Константи та добре відомі значення та шляхи
Щоб зменшити складність і спростити розробку вищого рівня інструментів, що будуються на основі kubeadm, він використовує обмежений набір констант для добре відомих шляхів та імен файлів.
Тека Kubernetes /etc/kubernetes є константою в застосунку, оскільки вона є очевидним шляхом у більшості випадків і найінтуїтивнішим розташуванням; інші константні шляхи та імена файлів є такими:
/etc/kubernetes/manifestsяк шлях, де kubelet повинен шукати маніфести статичних Podʼів. Імена маніфестів статичних Podʼів:etcd.yamlkube-apiserver.yamlkube-controller-manager.yamlkube-scheduler.yaml
/etc/kubernetes/як шлях, де зберігаються файли kubeconfig з ідентифікаторами для компонентів панелі управління. Імена файлів kubeconfig:kubelet.conf(bootstrap-kubelet.confпід час TLS bootstrap)controller-manager.confscheduler.confadmin.confдля адміністратора кластера і kubeadmsuper-admin.confдля супер-адміністратора кластера, який може обходити RBAC
Імена сертифікатів і ключових файлів:
ca.crt,ca.keyдля центру авторизації Kubernetesapiserver.crt,apiserver.keyдля сертифіката API-сервераapiserver-kubelet-client.crt,apiserver-kubelet-client.keyдля клієнтського сертифіката, що використовується API-сервером для безпечного підключення до kubelet-івsa.pub,sa.keyдля ключа, який використовується менеджером контролерів при підписанні ServiceAccountfront-proxy-ca.crt,front-proxy-ca.keyдля центру авторизації front-проксіfront-proxy-client.crt,front-proxy-client.keyдля клієнта front-проксі
Формат конфігураційного файлу kubeadm
Більшість команд kubeadm підтримують прапорець --config, який дозволяє передавати конфігураційний файл з диска. Формат конфігураційного файлу відповідає загальній схемі API Kubernetes apiVersion / kind, але вважається форматом конфігурації компонентів. Деякі компоненти Kubernetes, такі як kubelet, також підтримують конфігурацію на основі файлів.
Різні підкоманди kubeadm вимагають різних kind файлів конфігурації. Наприклад, InitConfiguration для kubeadm init, JoinConfiguration для kubeadm join, UpgradeConfiguration для kubeadm upgrade і ResetConfiguration для kubeadm reset.
Командою kubeadm config migrate можна перенести файл конфігурації старого формату до нового (поточного) формату конфігурації. Інструмент kubeadm підтримує міграцію лише із застарілих форматів конфігурацій до поточного формату.
Докладні відомості наведено на сторінці kubeadm configuration reference.
Внутрішній дизайн робочого процесу kubeadm init
Команда kubeadm init складається з послідовності атомарних завдань для виконання, як описано в внутрішньому робочому процесі kubeadm init.
Команда kubeadm init phase дозволяє користувачам викликати кожне завдання окремо, і в кінцевому підсумку пропонує багаторазовий і компонований API/інструментарій, який може бути використаний іншими інструментами початкового завантаження Kubernetes, будь-яким інструментом автоматизації ІТ або досвідченим користувачем для створення власних кластерів.
Перевірка перед установкою (Preflight checks)
Kubeadm виконує набір перевірок перед початком ініціалізації з метою перевірки передумов і уникнення типових проблем під час запуску кластера.
Користувач може пропустити певні перевірки перед установкою або всі за допомогою опції --ignore-preflight-errors.
- [Попередження], якщо версія Kubernetes, яку слід використовувати (вказана за допомогою прапорця
--kubernetes-version), є хоча б на одну мінорну версію вищою за версію kubeadm CLI. - Вимоги до системи Kubernetes:
- якщо використовується Linux:
- [Помилка], якщо версія ядра старіша за мінімально необхідну версію
- [Помилка], якщо не налаштовані необхідні підсистеми cgroups
- якщо використовується Linux:
- [Помилка], якщо точка доступу CRI не відповідає
- [Помилка], якщо користувач не є root
- [Помилка], якщо імʼя машини не є дійсним DNS-піддоменом
- [Попередження], якщо імʼя хосту неможливо знайти через мережевий пошук
- [Помилка], якщо версія kubelet нижча за мінімальну підтримувану версію kubelet, підтримувану kubeadm (поточна мінорна версія -1)
- [Помилка], якщо версія kubelet хоча б на одну мінорну версію вища за необхідну версію панелі управління (непідтримуване відхилення версій)
- [Попередження], якщо служба kubelet не існує або вона вимкнена
- [Попередження], якщо активний firewalld
- [Помилка], якщо використовується порт привʼязки API-сервера або порти 10250/10251/10252
- [Помилка], якщо тека
/etc/kubernetes/manifestsвже існує і не є порожньою - [Помилка], якщо включений swap
- [Помилка], якщо команди
ip,iptables,mount,nsenterвідсутні в шляху до команд - [Попередження], якщо команди
ethtool,tc,touchвідсутні в шляху до команд - [Попередження], якщо додаткові аргументи для API-сервера, менеджера контролерів, планувальника містять недійсні параметри
- [Попередження], якщо зʼєднання з https://API.AdvertiseAddress:API.BindPort пройде через проксі
- [Попередження], якщо зʼєднання з підмережею сервісів пройде через проксі (перевіряється лише перша адреса)
- [Попередження], якщо зʼєднання з підмережею Podʼів пройде через проксі (перевіряється лише перша адреса)
- Якщо використовується зовнішній etcd:
- [Помилка], якщо версія etcd старіша за мінімально необхідну версію
- [Помилка], якщо сертифікати або ключі etcd вказані, але не надані
- Якщо використовується внутрішній etcd (і, таким чином, буде встановлений локальний etcd):
- [Помилка], якщо використовується порт 2379
- [Помилка], якщо тека Etcd.DataDir вже існує і не є порожньою
- Якщо режим авторизації — ABAC:
- [Помилка], якщо abac_policy.json не існує
- Якщо режим авторизації — WebHook:
- [Помилка], якщо webhook_authz.conf не існує
Примітка:
Перевірки перед установкою можна викликати індивідуально за допомогою командиkubeadm init phase preflight.Генерація необхідних сертифікатів
Kubeadm генерує пари сертифікатів і приватних ключів для різних цілей:
Самопідписаний центр сертифікації для кластера Kubernetes, збережений у файлі
ca.crtі приватний ключ у файліca.keyСертифікат обслуговування для API-сервера, згенерований за допомогою
ca.crtяк CA, збережений у файліapiserver.crtразом із приватним ключемapiserver.key. Цей сертифікат повинен містити наступні альтернативні імена:- Внутрішній clusterIP сервісу Kubernetes (перша адреса в CIDR служб, наприклад,
10.96.0.1, якщо підмережа сервісів —10.96.0.0/12) - DNS-імена Kubernetes, наприклад
kubernetes.default.svc.cluster.local, якщо значення прапорця--service-dns-domainєcluster.local, а також типові DNS-іменаkubernetes.default.svc,kubernetes.default,kubernetes - Імʼя вузла (node-name)
--apiserver-advertise-address- Додаткові альтернативні імена, вказані користувачем
- Внутрішній clusterIP сервісу Kubernetes (перша адреса в CIDR служб, наприклад,
Клієнтський сертифікат для API-сервера для безпечного підключення до kubelet-ів, згенерований за допомогою
ca.crtяк CA і збережений у файліapiserver-kubelet-client.crtразом із його приватним ключемapiserver-kubelet-client.key. Цей сертифікат повинен бути в організаціїsystem:mastersПриватний ключ для підпису токенів ServiceAccount, збережений у файлі
sa.keyразом із його публічним ключемsa.pubЦентр сертифікації для front proxy, збережений у файлі
front-proxy-ca.crtразом із його ключемfront-proxy-ca.keyКлієнтський сертифікат для клієнта front proxy, згенерований за допомогою
front-proxy-ca.crtяк CA і збережений у файліfront-proxy-client.crtразом із його приватним ключемfront-proxy-client.key
Сертифікати зберігаються типово у /etc/kubernetes/pki, але цю теку можна налаштувати за допомогою прапорця --cert-dir.
Зверніть увагу на наступне:
- Якщо дані пари сертифікат-приватний ключ вже існують і їх зміст відповідає вищезазначеним вимогам, вони будуть використані, і фаза генерації для даного сертифіката буде пропущена. Це означає, що користувач може, наприклад, скопіювати поточний CA в
/etc/kubernetes/pki/ca.{crt,key}, і після цього kubeadm використовуватиме ці файли для підпису інших сертифікатів. Див. також використання власних сертифікатів - Для CA можливо надати файл
ca.crt, але не надавати файлca.key. Якщо всі інші сертифікати і файли kubeconfig вже на місці, kubeadm визнає цю умову і активує ExternalCA, що також означає, що контролерcsrsignerв контролері-менеджері не буде запущений - Якщо kubeadm працює в режимі зовнішньої CA; всі сертифікати повинні бути надані користувачем, оскільки kubeadm не може їх генерувати самостійно
- У випадку запуску kubeadm у режимі
--dry-run, файли сертифікатів записуються в тимчасову теку - Генерацію сертифікатів можна викликати окремо за допомогою команди
kubeadm init phase certs all
It seems like you're referring to documentation or a detailed guide on how kubeadm handles various aspects of Kubernetes initialization and configuration. If you need a translation of this content into Ukrainian, I can provide that. Here's the translation:
Генерація kubeconfig файлів для компонентів панелі управління
Kubeadm генерує kubeconfig файли з ідентичностями для компонентів панелі управління:
Файл kubeconfig для kubelet, який використовується під час ініціалізації TLS —
/etc/kubernetes/bootstrap-kubelet.conf. У цьому файлі є bootstrap-token або вбудовані клієнтські сертифікати для автентифікації цього вузла у кластері.Цей клієнтський сертифікат повинен:
- Бути в організації
system:nodes, як вимагається модулем Node Authorization - Мати Загальне Імʼя (CN)
system:node:<hostname-lowercased>
- Бути в організації
Файл kubeconfig для контролера-менеджера,
/etc/kubernetes/controller-manager.conf; у цьому файлі вбудований клієнтський сертифікат з ідентичністю контролера-менеджера. Цей клієнтський сертифікат повинен мати CNsystem:kube-controller-manager, як визначено стандартними RBAC ролями ядра компонентівФайл kubeconfig для планувальника,
/etc/kubernetes/scheduler.conf; у цьому файлі вбудований клієнтський сертифікат з ідентичністю планувальника. Цей клієнтський сертифікат повинен мати CNsystem:kube-scheduler, як визначено стандартними RBAC ролями ядра компонентів
Додатково, kubeconfig файл для kubeadm як адміністративної сутності генерується і зберігається у /etc/kubernetes/admin.conf. Цей файл включає сертифікат з Subject: O = kubeadm:cluster-admins, CN = kubernetes-admin. kubeadm:cluster-admins — це група, керована kubeadm. Вона повʼязана з cluster-admin ClusterRole під час kubeadm init, за допомогою super-admin.conf файлу, який не потребує RBAC. Файл admin.conf повинен залишатися на вузлах панелі управління і не повинен бути переданий іншим користувачам.
Під час kubeadm init генерується інший kubeconfig файл і зберігається у /etc/kubernetes/super-admin.conf. Цей файл включає сертифікат з Subject: O = system:masters, CN = kubernetes-super-admin. system:masters — це суперкористувачі, які обходять RBAC і роблять super-admin.conf корисним у випадку надзвичайної ситуації, коли кластер заблокований через неправильну конфігурацію RBAC. Файл super-admin.conf повинен зберігатися в безпечному місці і не повинен передаватися іншим користувачам.
Дивіться RBAC user facing role bindings для додаткової інформації про RBAC і вбудовані ClusterRoles та групи.
Ви можете запустити kubeadm kubeconfig user для створення файлів kubeconfig для додаткових користувачів.
Увага:
Згенеровані конфігураційні файли містять вбудований ключ автентифікації, і ви повинні ставитися до них як до конфіденційних.Також, зверніть увагу на наступне:
- Всі kubeconfig файли включають в себе сертифікат
ca.crt. - Якщо вказаний kubeconfig файл вже існує і його зміст відповідає вищезазначеним вимогам, то буде використано існуючий файл, і фаза генерації для даного kubeconfig буде пропущена.
- Якщо kubeadm працює в режимі ExternalCA mode, всі необхідні kubeconfig файли також повинні бути надані користувачем, оскільки kubeadm не може згенерувати їх самостійно.
- У випадку виконання kubeadm в режимі
--dry-run, файли kubeconfig записуються в тимчасову теку. - Генерацію kubeconfig файлів можна викликати окремо за допомогою команди
kubeadm init phase kubeconfig all
Генерація маніфестів статичних Pod для компонентів панелі управління
Kubeadm записує файли маніфестів статичних Pod для компонентів панелі управління до /etc/kubernetes/manifests. kubelet спостерігає за цією текою для створення Podʼів при запуску.
Маніфести статичних Podʼів мають спільний набір властивостей:
Всі статичні Podʼи розгорнуті в просторі імен
kube-systemВсі статичні Podʼи мають мітки
tier:control-planeтаcomponent:{імʼя-компоненти}Всі статичні Podʼи використовують клас пріоритету
system-node-criticalНа всіх статичних Podʼах встановлено
hostNetwork: true, щоб дозволити запуск панелі управління до налаштування мережі; в результаті:- Адреса, яку використовує контролер-менеджер та планувальник для посилання на API-сервер, є
127.0.0.1 - Якщо сервер etcd налаштовано локально, адреса
etcd-serverбуде встановлена як127.0.0.1:2379
- Адреса, яку використовує контролер-менеджер та планувальник для посилання на API-сервер, є
Включено обрання лідера як для контролер-менеджера, так і для планувальника
Контролер-менеджер та планувальник будуть посилатися на файли kubeconfig з їхніми відповідними, унікальними ідентифікаторами
Всі статичні Podʼи отримують будь-які додаткові прапорці або патчі, вказані користувачем, як описано в передача користувацьких аргументів компонентам панелі управління
Всі статичні Podʼи отримують будь-які додаткові томи, вказані користувачем (Шлях хоста)
Зверніть увагу, що:
- Усі образи типово будуть витягуватися з registry.k8s.io. Для налаштування репозиторію образів див. використання власних образів
- У разі виконання kubeadm у режимі
--dry-runфайли статичних Podʼів записуються у тимчасову теку - Генерацію маніфестів статичних Podʼів для компонентів панелі управління можна запустити окремо за допомогою команди
kubeadm init phase control-plane all
Сервер API
Маніфест статичних Podʼів для сервера API обробляється наступними параметрами, наданими користувачами:
apiserver-advertise-addressтаapiserver-bind-portдля звʼязку; якщо вони не вказані, стандартне значення буде IP-адреса основного мережевого інтерфейсу на машині та порт 6443service-cluster-ip-rangeдля використання сервісів- Якщо вказаний зовнішній сервер etcd, то
etcd-serversта повʼязані налаштування TLS (etcd-cafile,etcd-certfile,etcd-keyfile); якщо зовнішній сервер etcd не вказано, буде використовуватися локальний etcd (через мережу хосту) - Якщо вказаний провайдер хмарних послуг, то налаштовується відповідний параметр
--cloud-providerразом зі шляхом--cloud-config, якщо такий файл існує (експериментально, альфа версія, буде вилучено в майбутній версії)
Інші прапорці сервера API, що встановлені безумовно, включають:
--insecure-port=0для уникнення небезпечних зʼєднань з сервером API--enable-bootstrap-token-auth=trueдля активації модуля автентифікаціїBootstrapTokenAuthenticator. Див. TLS Bootstrapping для деталей--allow-privilegedдоtrue(необхідно, наприклад, для kube-proxy)--requestheader-client-ca-fileдоfront-proxy-ca.crt--enable-admission-pluginsдо:NamespaceLifecycleнаприклад, для уникнення видалення системних зарезервованих просторів іменLimitRangerтаResourceQuotaдля встановлення обмежень на простори іменServiceAccountдля автоматизації службових облікових записівPersistentVolumeLabelприєднує мітки регіону або зони до PersistentVolumes, як визначено провайдером хмарних послуг (Цей контролер допуску є застарілим і буде вилучений у майбутній версії. Він типово не розгорнутий kubeadm починаючи з v1.9, якщо явно не вибрано використанняgceабоawsяк провайдерів хмарних послуг)DefaultStorageClassдля встановлення типового класу зберігання на обʼєктахPersistentVolumeClaimDefaultTolerationSecondsNodeRestrictionдля обмеження того, що kubelet може змінювати (наприклад, тільки Podʼи на цьому вузлі)
--kubelet-preferred-address-typesдоInternalIP,ExternalIP,Hostname;це робитьkubectl logsта іншу комунікацію API server-kubelet працюючою в середовищах, де імена хостів вузлів не розвʼязуютьсяПрапорці для використання сертифікатів, згенерованих на попередніх етапах:
--client-ca-fileдоca.crt--tls-cert-fileдоapiserver.crt--tls-private-key-fileдоapiserver.key--kubelet-client-certificateдоapiserver-kubelet-client.crt--kubelet-client-keyдоapiserver-kubelet-client.key--service-account-key-fileдоsa.pub--requestheader-client-ca-fileдоfront-proxy-ca.crt--proxy-client-cert-fileдоfront-proxy-client.crt--proxy-client-key-fileдоfront-proxy-client.key
Інші прапорці для забезпечення безпеки front proxy (Агрегація API) комунікацій:
--requestheader-username-headers=X-Remote-User--requestheader-group-headers=X-Remote-Group--requestheader-extra-headers-prefix=X-Remote-Extra---requestheader-allowed-names=front-proxy-client
Менеджер контролерів
Маніфест статичного Podʼа для менеджера контролерів обробляється наступними параметрами, наданими користувачами:
Якщо kubeadm запускається з вказанням
--pod-network-cidr, активується функція менеджера підмережі, необхідна для деяких мережевих втулків CNI, встановлюючи:--allocate-node-cidrs=true- Прапорці
--cluster-cidrта--node-cidr-mask-sizeвідповідно до заданого CIDR
Інші прапорці, які встановлюються безумовно, включають:
--controllers, що активує всі стандартні контролери плюс контролериBootstrapSignerтаTokenCleanerдля TLS-запуску. Див. TLS Bootstrapping для деталей.--use-service-account-credentialsдоtrueПрапорці для використання сертифікатів, згенерованих на попередніх етапах:
--root-ca-fileдоca.crt--cluster-signing-cert-fileдоca.crt, якщо відключений зовнішній режим CA, в іншому випадку до""--cluster-signing-key-fileдоca.key, якщо відключений зовнішній режим CA, в іншому випадку до""--service-account-private-key-fileдоsa.key.
Планувальник
Маніфест статичного Podʼа для планувальника обробляється наступними параметрами, наданими користувачами.
Генерація маніфесту статичного Pod для локального etcd
Якщо ви вказали зовнішній etcd, цей крок буде пропущено. В іншому випадку kubeadm генерує маніфест статичного Pod для створення локального екземпляра etcd, що працює в Pod з наступними характеристиками:
- слухати на
localhost:2379і використовуватиHostNetwork=true - зробити монтування
hostPathзdataDirдо файлової системи хосту - Будь-які додаткові прапорці, вказані користувачем
Зверніть увагу, що:
- Образ контейнера etcd буде типово витягнутий з
registry.gcr.io. Для налаштування власного репозиторію образів див. використання власних образів. - Якщо ви запускаєте kubeadm у режимі
--dry-run, маніфест статичного Pod для etcd записується у тимчасову теку. - Ви можете безпосередньо викликати генерацію маніфесту статичного Pod для локального etcd за допомогою команди
kubeadm init phase etcd local.
Очікування запуску панелі управління
На вузлах панелі управління kubeadm чекає до 4 хвилин, поки компоненти панелі управління та kubelet стануть доступними. Для цього виконується перевірка стану відповідних точок доступу компонентів /healthz або /livez.
Після того як панель управління буде запущена, kubeadm завершує виконання завдань, описаних у наступних розділах.
Збереження конфігурації кластера kubeadm у ConfigMap для подальшого посилання
kubeadm зберігає конфігурацію, передану в kubeadm init, у ConfigMap з назвою kubeadm-config в просторі імен kube-system.
Це забезпечить можливість kubeadm у майбутньому (наприклад, під час оновлення kubeadm upgrade) визначати фактичний поточний стан кластера і приймати нові рішення на основі цих даних.
Зверніть увагу, що:
- Перед збереженням конфігурації кластера чутлива інформація, така як токен, видаляється з конфігурації.
- Завантаження конфігурації вузла панелі управління може бути викликане окремо за допомогою команди
kubeadm init phase upload-config.
Позначення вузла як вузла панелі управління
Як тільки панель управління буде доступна, kubeadm виконує наступні дії:
- Позначає вузол як вузол панелі управління з міткою
node-role.kubernetes.io/control-plane="" - Додає на вузол taint
node-role.kubernetes.io/control-plane:NoSchedule
Зверніть увагу, що фазу позначення вузла як вузла панелі управління можна викликати окремо за допомогою команди kubeadm init phase mark-control-plane.
Налаштування TLS-Bootstrapping для приєднання вузлів
Kubeadm використовує Автентифікацію за допомогою Запускових Токенів для приєднання нових вузлів до існуючого кластера; для отримання більш детальної інформації дивіться також пропозицію дизайну.
kubeadm init забезпечує належну конфігурацію всього процесу, включаючи наступні кроки, а також налаштування прапорців API-сервера та контролера, як вже було описано у попередніх розділах.
Примітка:
TLS-запуск для вузлів можна налаштувати за допомогою командиkubeadm init phase bootstrap-token, виконуючи всі кроки налаштування, описані в наступних розділаї; альтернативно, кожен крок може бути викликаний окремо.Створення bootstrap токена
kubeadm init створює перший bootstrap токен, що генерується автоматично або надається користувачем за допомогою прапорця --token. Згідно з документацією щодо специфікації bootstrap токена, токен слід зберегти як секрет з іменем bootstrap-token-<token-id> у просторі імен kube-system.
Зверніть увагу, що:
- bootstrap токен, типово створений
kubeadm init, використовуватиметься для перевірки тимчасових користувачів під час процесу TLS-запуску; ці користувачі будуть членами групиsystem:bootstrappers:kubeadm:default-node-token. - Токен має обмежену чинність, стандартно 24 години (цей інтервал можна змінити за допомогою прапорця
--token-ttl). - Додаткові токени можна створити за допомогою команди
kubeadm token, яка також надає інші корисні функції для управління токенами.
Дозвіл на виклик API CSR вузлами, які приєднуються
Kubeadm забезпечує можливість користувачам у групі system:bootstrappers:kubeadm:default-node-token доступ до API підпису сертифікатів.
Це реалізується створенням ClusterRoleBinding з назвою kubeadm:kubelet-bootstrap між вищезазначеною групою та рольовим доступом RBAC стандартно system:node-bootstrapper.
Налаштування автоматичного схвалення нових bootstrap токенів
Kubeadm забезпечує автоматичне схвалення запитів на підпис сертифікату Bootstrap Token за допомогою контролера csrapprover.
Це реалізується створенням ClusterRoleBinding з назвою kubeadm:node-autoapprove-bootstrap між групою system:bootstrappers:kubeadm:default-node-token та стандартним рольовим доступом system:certificates.k8s.io:certificatesigningrequests:nodeclient.
Роль system:certificates.k8s.io:certificatesigningrequests:nodeclient також має бути створена, надаючи дозвіл POST на шлях /apis/certificates.k8s.io/certificatesigningrequests/nodeclient.
Налаштування ротації сертифікатів вузлів з автоматичним схваленням
Kubeadm забезпечує активацію ротації сертифікатів для вузлів і автоматичне схвалення запитів на підпис сертифікатів для вузлів за допомогою контролера csrapprover.
Це реалізується створенням ClusterRoleBinding з назвою kubeadm:node-autoapprove-certificate-rotation між групою system:nodes та стандартним рольовим доступом system:certificates.k8s.io:certificatesigningrequests:selfnodeclient.
Створення публічного ConfigMap cluster-info
У цій фазі створюється ConfigMap cluster-info у просторі імен kube-public.
Додатково створюється Role та RoleBinding, які надають доступ до ConfigMap неавтентифікованим користувачам (тобто користувачам у RBAC групі system:unauthenticated).
Примітка:
Доступ до ConfigMapcluster-info не обмежується за швидкістю. Це може бути проблемою, якщо ваш API-сервер кластера відкритий для інтернету; у найгіршому випадку може виникнути атака типу DoS, коли атакуючий використовує всі вхідні запити, які може обробити kube-apiserver, щоб обслуговувати ConfigMap cluster-info.Встановлення надбудов
Kubeadm встановлює внутрішній DNS-сервер і компоненти надбудов kube-proxy через API-сервер.
Примітка:
Цю фазу можна викликати окремо за допомогою командиkubeadm init phase addon all.proxy
Для kube-proxy створюється обліковий запис ServiceAccount у просторі імен kube-system, після чого kube-proxy розгортається як DaemonSet:
- Облікові дані (
ca.crtтаtoken) до панелі управління отримуються з облікового запису ServiceAccount. - Місцезнаходження (URL) API-сервера отримується з ConfigMap.
- Обліковий запис ServiceAccount
kube-proxyповʼязується з правами у рольовому доступі ClusterRolesystem:node-proxier.
DNS
Сервіс CoreDNS називається
kube-dnsдля сумісності з застарілою надбудовоюkube-dns.У просторі імен
kube-systemстворюється обліковий запис ServiceAccount для CoreDNS.Обліковий запис
corednsпривʼязаний до привілеїв у ClusterRolesystem:coredns.
У версії Kubernetes 1.21 була видалена підтримка використання kube-dns з kubeadm. Ви можете використовувати CoreDNS з kubeadm, навіть якщо повʼязаний сервіс називається kube-dns.
Внутрішній дизайн фаз kubeadm join
Подібно до kubeadm init, внутрішній робочий процес kubeadm join також складається з послідовності атомарних завдань, що виконуються.
Вони поділені на дві частини: виявлення (щоб вузол довіряв Kubernetes API Server) та початкове завантаження TLS (щоб Kubernetes API Server довіряв вузлу).
Дивіться Автентифікація за допомогою Bootstrap Tokens або відповідну пропозицію дизайну.
Попередні перевірки
kubeadm виконує набір попередніх перевірок перед початком приєднання, з метою перевірити попередні умови та уникнути поширених проблем запуску кластера.
Зверніть увагу на наступне:
- Попередні перевірки
kubeadm joinє, по суті, підмножиною попередніх перевірокkubeadm init. - Якщо ви приєднуєтеся до вузла Windows, специфічні для Linux елементи керування пропускаються.
- У будь-якому випадку користувач може пропустити певні попередні перевірки (або, врешті-решт, усі попередні перевірки) за допомогою опції
--ignore-preflight-errors.
Виявлення інформації про кластер
Є дві основні схеми для виявлення. Перша полягає у використанні спільного токена разом з IP-адресою сервера API. Друга — наданні файлу (який є підмножиною стандартного файлу kubeconfig).
Виявлення спільного токена
Якщо kubeadm join викликається з параметром --discovery-token, використовується виявлення за допомогою токена; у цьому випадку вузол основному отримує сертифікати CA кластера з ConfigMap cluster-info у просторі імен kube-public.
Щоб запобігти атакам типу "особа посередині", вживаються кілька заходів:
Спочатку сертифікат CA отримується через небезпечне зʼєднання (це можливо, тому що
kubeadm initнадає доступ користувачамcluster-infoдляsystem:unauthenticated)Потім сертифікат CA проходить наступні кроки перевірки:
- Базова перевірка: використовуючи ID токена через підпис JWT
- Перевірка публічного ключа: використовуючи наданий
--discovery-token-ca-cert-hash. Це значення доступне у виводіkubeadm initабо може бути обчислене за допомогою стандартних інструментів (хеш обчислюється над байтами обʼєкта Subject Public Key Info (SPKI) відповідно до RFC7469). Прапор--discovery-token-ca-cert-hashможе бути повторений кілька разів, щоб дозволити більше одного публічного ключа. - Як додаткова перевірка, сертифікат CA отримується через безпечне зʼєднання і порівнюється з сертифікатом CA, отриманим спочатку
Примітка:
Ви можете пропустити перевірку CA, передавши в командному рядку прапорець--discovery-token-unsafe-skip-ca-verification. Це послаблює модель безпеки kubeadm, оскільки інші потенційно можуть видавати себе за сервер API Kubernetes.Виявлення файлу/HTTPS
Якщо kubeadm join викликається з параметром --discovery-file, використовується виявлення за допомогою файлу; цей файл може бути локальним файлом або завантаженим через HTTPS URL; у випадку HTTPS, використовується встановлений на хості пакет сертифікатів CA для перевірки зʼєднання.
При виявленні файлу сертифікат CA кластера надається у самому файлі; фактично, файл для виявлення є файлом kubeconfig з встановленими тільки атрибутами server і certificate-authority-data, як описано у референс-документації kubeadm join; коли зʼєднання з кластером встановлено, kubeadm намагається отримати доступ до ConfigMap cluster-info, і якщо він доступний, використовує його.
TLS Bootstrap
Після того, як інформація про кластер відома, записується файл bootstrap-kubelet.conf, що дозволяє kubelet виконати початкове завантаження TLS.
Механізм початкового завантаження TLS використовує спільний токен для тимчасової автентифікації з сервером API Kubernetes для подання запиту на підписання сертифіката (CSR) для локально створеної пари ключів.
Запит автоматично затверджується, і операція завершується збереженням файлів ca.crt і kubelet.conf, які використовуються kubelet для приєднання до кластера, тоді як bootstrap-kubelet.conf видаляється.
Примітка:
- Тимчасова автентифікація перевіряється через токен, збережений під час процесу
kubeadm init(або за допомогою додаткових токенів, створених командоюkubeadm token) - Тимчасова автентифікація відноситься до користувача, який є членом групи
system:bootstrappers:kubeadm:default-node-token, якій було надано доступ до API CSR під час процесуkubeadm init - Автоматичне затвердження CSR управляється контролером csrapprover відповідно до конфігурації, присутньої в процесі
kubeadm init
Внутрішній дизайн робочого процесу kubeadm upgrade
Команда kubeadm upgrade має підкоманди для керування оновленням кластера Kubernetes, створеного за допомогою kubeadm. Вам слід виконати kubeadm upgrade apply на одному з вузлів панелі управління (ви можете вибрати, на якому саме); це запустить процес оновлення. Потім виконайте kubeadm upgrade node на всіх інших вузлах (як на робочих вузлах, так і на вузлах панелі управління).
І kubeadm upgrade apply, і kubeadm upgrade node мають підкоманду phase, яка надає доступ до внутрішніх фаз процесу оновлення. Докладніші відомості наведено у статті kubeadm upgrade phase.
Додатковими командами оновлення утиліти є kubeadm upgrade plan та kubeadm upgrade diff.
Усі підкоманди оновлення підтримують передачу конфігураційного файлу.
kubeadm upgrade plan
За бажанням ви можете запустити kubeadm upgrade plan перед запуском kubeadm upgrade apply. Підкоманда plan перевіряє, до яких версій можна оновитися, і перевіряє, чи можна оновити ваш поточний кластер.
kubeadm upgrade diff
Показує, які відмінності буде застосовано до існуючих статичних маніфестів пакунків для вузлів панелі управління. Більш розлогий спосіб зробити те саме — виконати kubeadm upgrade apply --dry-run або kubeadm upgrade node --dry-run.
kubeadm upgrade apply
Команда kubeadm upgrade apply готує кластер до оновлення всіх вузлів, а також оновлює вузол панелі управління, на якому вона виконується. Кроки, які вона виконує:
- Виконує передпольотні перевірки, подібні до
kubeadm initтаkubeadm join, переконуючись, що образи контейнерів завантажено і кластер перебуває у стані, придатному для оновлення. - Оновлює файли маніфесту панелі управління на диску у
/etc/kubernetes/manifestsі чекає, поки kubelet перезапустить компоненти, якщо файли було змінено. - Завантажує оновлені конфігурації kubeadm і kubelet в кластер у ConfigMaps
kubeadm-configіkubelet-config(обидві у просторі іменkube-system). - Записує оновлену конфігурацію kubelet для цього вузла у файл
/var/lib/kubelet/config.yaml, а також читає файл/var/lib/kubelet/instance-config.yamlцього вузла і накладає латки на такі поля, якcontainerRuntimeEndpointз цієї конфігурації інстансу у/var/lib/kubelet/config.yaml. - Налаштовує токен bootstrap і
cluster-infoConfigMap для правил RBAC. Це те ж саме, що і на етапіkubeadm initі гарантує, що кластер продовжує підтримувати приєднання вузлів за допомогою токенів bootstrap. - Оновлює kube-proxy та надбудови CoreDNS умовно, якщо всі існуючі kube-apiservers у кластері вже було оновлено до цільової версії.
- Виконує будь-які завдання після оновлення, такі як очищення застарілих функцій, що залежать від релізу.
kubeadm upgrade node
kubeadm upgrade node оновлює один вузол панелі управління або робочий вузол після запуску оновлення кластера (шляхом запуску kubeadm upgrade apply). Команда визначає, чи є вузол вузлом панелі управління, перевіряючи наявність файлу /etc/kubernetes/manifests/kube-apiserver.yaml. Знайшовши цей файл, інструмент kubeadm
припускає, що на цьому вузлі запущено Pod kube-apiserver.
- Виконує передпольотні перевірки подібно до
kubeadm upgrade apply. - Для вузлів панелі управління оновлює файли маніфесту панелі управління на диску у
/etc/kubernetes/manifestsі чекає, поки kubelet перезапустить компоненти, якщо файли було змінено. - Запише оновлену конфігурацію kubelet для цього вузла у
/var/lib/kubelet/config.yaml, а також читає файл/var/lib/kubelet/instance-config.yamlцього вузла і накладає латки на такі поля, якcontainerRuntimeEndpointз цієї конфігурації інстансу у/var/lib/kubelet/config.yaml. - (Для вузлів панелі управління) Оновлює kube-proxy та CoreDNS надбудови умовно, за умови, що всі наявні API-сервери у кластері вже оновлені до цільової версії.
- Виконує будь-які завдання після оновлення, такі як очищення застарілих функцій, специфічних для конкретного випуску.
Внутрішній дизайн робочого процесу kubeadm reset
Ви можете скористатися підкомандою kubeadm reset на вузлі, де раніше виконувалися команди kubeadm. Ця підкоманда виконує очищення вузла з best-effort зусиллями. Якщо певні дії не вдасться виконати, ви маєте втрутитися і виконати очищення вручну.
Команда підтримує фази. Докладні відомості наведено у статті kubeadm reset phase.
Команда підтримує файл конфігурації.
Додатково:
- Правила IPVS, iptables і nftables не очищуються.
- Конфігурацію CNI (мережевого втулка) не очищено.
- Файл
.kube/у домашній теці користувача не очищується.
Команда виконує наступні етапи:
- Виконує передпольотну перевірку вузла, щоб визначити, чи є він справним.
- Для вузлів панелі управління видаляє всі локальні дані членів etcd.
- Зупиняє роботу kubelet.
- Зупиняє запуск контейнерів.
- Відмонтує усі змонтовані теки у
/var/lib/kubelet. - Видаляє усі файли та теки, якими керує kubeadm у
/var/lib/kubeletта/etc/kubernetes.