Це багатосторінковий друкований вигляд цього розділу. Натисність щоб друкувати.
Адміністрування з kubeadm
1 - Управління сертифікатами з kubeadm
Kubernetes v1.15 [stable]
Клієнтські сертифікати, що генеруються kubeadm, закінчуються через 1 рік. Ця сторінка пояснює, як управляти поновленням сертифікатів за допомогою kubeadm. Вона також охоплює інші завдання, повʼязані з управлінням сертифікатами kubeadm.
Перш ніж ви розпочнете
Ви повинні бути знайомі з сертифікатами PKI та вимогами Kubernetes.
Використання власних сертифікатів
Типово, kubeadm генерує всі необхідні сертифікати для роботи кластера. Ви можете перевизначити цю поведінку, надавши власні сертифікати.
Для цього вам потрібно помістити їх у ту теку, яка вказується за допомогою прапорця --cert-dir
або поля certificatesDir
конфігурації кластера ClusterConfiguration
kubeadm. Типово це /etc/kubernetes/pki
.
Якщо певна пара сертифікатів і приватний ключ існують до запуску kubeadm init
, kubeadm не перезаписує їх. Це означає, що ви можете, наприклад, скопіювати наявний ЦС (Центр сертифікації — Certificate authority) в /etc/kubernetes/pki/ca.crt
та /etc/kubernetes/pki/ca.key
, і kubeadm використовуватиме цей ЦС для підпису решти сертифікатів.
Режим зовнішнього ЦС
Також можливо надати лише файл ca.crt
і не файл ca.key
(це доступно лише для файлу кореневого ЦС, а не інших пар сертифікатів). Якщо всі інші сертифікати та файли kubeconfig на місці, kubeadm розпізнає цю умову та активує режим "Зовнішній ЦС". kubeadm буде продовжувати без ключа ЦС на диску.
Замість цього, запустіть контролер-менеджер самостійно з параметром --controllers=csrsigner
та вкажіть на сертифікат та ключ ЦС.
Існують різні способи підготовки облікових даних компонента при використанні режиму зовнішнього ЦС.
Ручна підготовка облікових даних компонента
Сертифікати PKI та вимоги містять інформацію про те, як підготувати всі необхідні облікові дані для компонентів, які вимагаються kubeadm, вручну.
Підготовка облікових даних компонента шляхом підпису CSR, що генеруються kubeadm
kubeadm може генерувати файли CSR, які ви можете підписати вручну за допомогою інструментів, таких як openssl
, та вашого зовнішнього ЦС. Ці файли CSR будуть включати всі вказівки для облікових даних, які вимагаються компонентами, розгорнутими kubeadm.
Автоматизована підготовка облікових даних компонента за допомогою фаз kubeadm
З іншого боку, можливо використовувати команди фаз kubeadm для автоматизації цього процесу.
- Перейдіть на хост, який ви хочете підготувати як вузол панелі управління kubeadm з зовнішнім ЦС.
- Скопіюйте зовнішні файли ЦС
ca.crt
таca.key
, які ви маєте, до/etc/kubernetes/pki
на вузлі. - Підготуйте тимчасовий файл конфігурації kubeadm під назвою
config.yaml
, який можна використовувати зkubeadm init
. Переконайтеся, що цей файл містить будь-яку відповідну інформацію на рівні кластера або хосту, яка може бути включена в сертифікати, таку як,ClusterConfiguration.controlPlaneEndpoint
,ClusterConfiguration.certSANs
таInitConfiguration.APIEndpoint
. - На тому ж самому хості виконайте команди
kubeadm init phase kubeconfig all --config config.yaml
таkubeadm init phase certs all --config config.yaml
. Це згенерує всі необхідні файли kubeconfig та сертифікати у теці/etc/kubernetes/
та її підтеціpki
. - Перевірте згенеровані файли. Видаліть
/etc/kubernetes/pki/ca.key
, видаліть або перемістіть в безпечне місце файл/etc/kubernetes/super-admin.conf
. - На вузлах, де буде викликано
kubeadm join
, також видаліть/etc/kubernetes/kubelet.conf
. Цей файл потрібний лише на першому вузлі, де буде викликаноkubeadm init
. - Зауважте, що деякі файли, такі як
pki/sa.*
,pki/front-proxy-ca.*
таpki/etc/ca.*
, спільно використовуються між вузлами панелі управління, Ви можете згенерувати їх один раз та розподілити їх вручну на вузли, де буде викликаноkubeadm join
, або ви можете використовувати функціональність--upload-certs
kubeadm init
та--certificate-key
kubeadm join
для автоматизації цього розподілу.
Після того, як облікові дані будуть підготовлені на всіх вузлах, викличте kubeadm init
та kubeadm join
для цих вузлів, щоб приєднати їх до кластера. kubeadm використовуватиме наявні файли kubeconfig та сертифікати у теці /etc/kubernetes/
та її підтеці pki
.
Перевірка закінчення терміну дії сертифікатів
Ви можете використовувати підкоманду check-expiration
, щоб перевірити термін дії сертифікатів:
kubeadm certs check-expiration
Вивід подібний до наступного:
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Dec 30, 2020 23:36 UTC 364d no
apiserver Dec 30, 2020 23:36 UTC 364d ca no
apiserver-etcd-client Dec 30, 2020 23:36 UTC 364d etcd-ca no
apiserver-kubelet-client Dec 30, 2020 23:36 UTC 364d ca no
controller-manager.conf Dec 30, 2020 23:36 UTC 364d no
etcd-healthcheck-client Dec 30, 2020 23:36 UTC 364d etcd-ca no
etcd-peer Dec 30, 2020 23:36 UTC 364d etcd-ca no
etcd-server Dec 30, 2020 23:36 UTC 364d etcd-ca no
front-proxy-client Dec 30, 2020 23:36 UTC 364d front-proxy-ca no
scheduler.conf Dec 30, 2020 23:36 UTC 364d no
CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
ca Dec 28, 2029 23:36 UTC 9y no
etcd-ca Dec 28, 2029 23:36 UTC 9y no
front-proxy-ca Dec 28, 2029 23:36 UTC 9y no
Команда показує час закінчення та залишковий час для сертифікатів клієнта у теці /etc/kubernetes/pki
та для сертифіката клієнта, вбудованого у файли kubeconfig, що використовуються kubeadm (admin.conf
, controller-manager.conf
та scheduler.conf
).
Крім того, kubeadm повідомляє користувача, якщо керування сертифікатом відбувається ззовні; у цьому випадку користувачу слід самостійно забезпечити керування поновленням сертифікатів вручну/за допомогою інших інструментів.
Попередження:
kubeadm
не може керувати сертифікатами, підписаними зовнішнім ЦС.Примітка:
kubelet.conf
не включений у цей список, оскільки kubeadm налаштовує kubelet на автоматичне поновлення сертифікатів зі змінними сертифікатами у теці /var/lib/kubelet/pki
. Для відновлення простроченого сертифіката клієнта kubelet див.
Помилка оновлення сертифіката клієнта kubelet.Попередження:
На вузлах, створених за допомогою kubeadm init
, до версії kubeadm 1.17, існує помилка, де вам потрібно вручну змінити зміст kubelet.conf
. Після завершення kubeadm init
ви повинні оновити 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
Автоматичне поновлення сертифікатів
kubeadm поновлює всі сертифікати під час оновлення панелі управління.
Ця функція призначена для вирішення найпростіших випадків використання; якщо у вас немає конкретних вимог до поновлення сертифікатів і ви регулярно виконуєте оновлення версії Kubernetes (частіше ніж 1 раз на рік між кожним оновленням), kubeadm буде піклуватися про те, щоб ваш кластер був завжди актуальним і досить безпечним.
Примітка:
Найкраще практикувати часті оновлення вашого кластера для забезпечення безпеки.Якщо у вас є складніші вимоги до поновлення сертифікатів, ви можете відмовитися від стандартної поведінки, передавши --certificate-renewal=false
до kubeadm upgrade apply
або до kubeadm upgrade node
.
Попередження:
До версії kubeadm 1.17 існує помилка, де стандартне значення для--certificate-renewal
є false
для команди kubeadm upgrade node
. У цьому випадку вам слід явно встановити --certificate-renewal=true
.Ручне поновлення сертифікатів
Ви можете в будь-який момент вручну оновити свої сертифікати за допомогою команди kubeadm certs renew
з відповідними параметрами командного рядка.
Ця команда виконує поновлення за допомогою сертифіката та ключа ЦС (або front-proxy-CA), збережених у /etc/kubernetes/pki
.
Після виконання команди вам слід перезапустити Podʼи панелі управління. Це необхідно, оскільки
динамічне перезавантаження сертифікатів наразі не підтримується для всіх компонентів та сертифікатів. Статичні Podʼи керуються локальним kubelet і не API-сервером, тому kubectl не може бути використаний для їх видалення та перезапуску. Щоб перезапустити статичний Pod, ви можете тимчасово видалити файл його маніфеста з /etc/kubernetes/manifests/
і зачекати 20 секунд (див. значення fileCheckFrequency
у KubeletConfiguration struct). kubelet завершить роботу Pod, якщо він більше не знаходиться в теці маніфестів. Потім ви можете повернути файл назад і після ще одного періоду fileCheckFrequency
kubelet знову створить Pod, і поновлення сертифікатів для компонента буде завершено.
Попередження:
Якщо ви використовуєте кластер з високою доступністю (HA), цю команду потрібно виконати на всіх вузлах панелі управління.Примітка:
certs renew
використовує наявні сертифікати як авторитетне джерело для атрибутів (Common Name, Organization, SAN тощо) замість kubeadm-config
ConfigMap. Дуже рекомендується тримати їх обидва синхронізованими.kubeadm certs renew
може оновити будь-який конкретний сертифікат або, за допомогою підкоманди all
, він може оновити всі з них, як показано нижче:
kubeadm certs renew all
Примітка:
Кластери, побудовані за допомогою kubeadm, часто копіюють сертифікат admin.conf
у $HOME/.kube/config
, як вказано у Створення кластера за допомогою kubeadm. У такій системі, для оновлення вмісту $HOME/.kube/config
після поновлення admin.conf
, вам слід виконати наступні команди:
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Поновлення сертифікатів за допомогою API сертифікатів Kubernetes
У цьому розділі надаються додаткові відомості про те, як виконати ручне поновлення сертифікатів за допомогою API сертифікатів Kubernetes.
Увага:
Це розширені теми для користувачів, які потребують інтеграції сертифікатної інфраструктури своєї організації в кластер, побудований за допомогою kubeadm. Якщо типово конфігурація kubeadm відповідає вашим потребам, вам слід дозволити kubeadm керувати сертифікатами.Налаштування підписувача
Kubernetes Certificate Authority не працює зразу. Ви можете налаштувати зовнішнього підписувача, такого як cert-manager, або можете використовувати вбудованого підписувача.
Вбудований підписувач є частиною kube-controller-manager
.
Для активації вбудованого підписувача вам необхідно передати прапорці --cluster-signing-cert-file
та --cluster-signing-key-file
.
Якщо ви створюєте новий кластер, ви можете використовувати файл конфігурації kubeadm:
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
controllerManager:
extraArgs:
cluster-signing-cert-file: /etc/kubernetes/pki/ca.crt
cluster-signing-key-file: /etc/kubernetes/pki/ca.key
Створення запитів на підпис сертифікатів (CSR)
Дивіться Створення CertificateSigningRequest для створення CSRs за допомогою API Kubernetes.
Поновлення сертифікатів зовнішнім ЦС
У цьому розділі надаються додаткові відомості про те, як виконати ручне поновлення сертифікатів за допомогою зовнішнього ЦС.
Для кращої інтеграції з зовнішніми ЦС, kubeadm також може створювати запити на підпис сертифікатів (CSR). Запит на підпис сертифіката є запитом до ЦС на підписаний сертифікат для клієнта. За термінологією kubeadm, будь-який сертифікат, який зазвичай підписується ЦС на диску, може бути створений у вигляді CSR. Однак ЦС не може бути створено як CSR.
Поновлення за допомогою запитів на підпис сертифікатів (CSR)
Поновлення сертифікатів можливе шляхом генерації нових CSR і підпису їх зовнішнім ЦС. Для отримання докладнішої інформації щодо роботи з CSR, створеними kubeadm, див. розділ Підпис запитів на підпис сертифікатів (CSR), згенерованих kubeadm.
Оновлення Certificate authority (ЦС)
Kubeadm не підтримує автоматичне оновлення або заміну сертифікатів ЦС зразу.
Для отримання додаткової інформації про ручне оновлення або заміну ЦС дивіться ручне оновлення сертифікатів ЦС.
Ввімкнення підписаних службових сертифікатів kubelet
Типово службовий сертифікат kubelet, розгорнутий за допомогою kubeadm, є самопідписним. Це означає, що зʼєднання зовнішніх служб, наприклад, сервера метрик з kubelet, не може бути захищено TLS.
Щоб налаштувати kubelet в новому кластері kubeadm для отримання належно підписаних службових сертифікатів, ви повинні передати наступну мінімальну конфігурацію до kubeadm init
:
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
serverTLSBootstrap: true
Якщо ви вже створили кластер, вам слід адаптувати його, виконавши наступне:
- Знайдіть і відредагуйте ConfigMap
kubelet-config-1.30
в просторі іменkube-system
. У ConfigMap ключkubelet
має документ KubeletConfiguration як своє значення. Відредагуйте документ KubeletConfiguration, щоб встановитиserverTLSBootstrap: true
. - На кожному вузлі додайте поле
serverTLSBootstrap: true
у/var/lib/kubelet/config.yaml
і перезапустіть kubelet за допомогоюsystemctl restart kubelet
.
Поле serverTLSBootstrap: true
дозволить ініціювати завантаження службових сертифікатів kubelet, запитуючи їх з API certificates.k8s.io
. Одне з відомих обмежень поля serverTLSBootstrap: true
— CSRs (запити на підпис сертифікатів) для цих сертифікатів не можуть бути автоматично затверджені типовим підписувачем в kube-controller-manager — kubernetes.io/kubelet-serving
. Це потребує дій користувача або стороннього контролера.
Ці CSRs можна переглянути за допомогою:
kubectl get csr
NAME AGE SIGNERNAME REQUESTOR CONDITION
csr-9wvgt 112s kubernetes.io/kubelet-serving system:node:worker-1 Pending
csr-lz97v 1m58s kubernetes.io/kubelet-serving system:node:control-plane-1 Pending
Щоб затвердити їх, ви можете виконати наступне:
kubectl certificate approve <CSR-name>
Типово ці службові сертифікати закінчуються через рік. Kubeadm встановлює поле rotateCertificates
в true
у KubeletConfiguration
, що означає, що близько до закінчення буде створено новий набір CSRs для службових сертифікатів і їх слід затвердити, щоб завершити оновлення. Для отримання додаткової інформації дивіться Оновлення сертифікатів.
Якщо ви шукаєте рішення для автоматичного затвердження цих CSRs, рекомендується звернутися до свого постачальника хмарних послуг і дізнатись, чи він має підписувача CSR, який перевіряє ідентифікацію вузла за допомогою окремого механізму.
Ви можете використовувати власні контролери сторонніх постачальників:
Такий контролер не є безпечним механізмом, якщо він перевіряє лише CommonName в CSR, але також перевіряє запитані IP-адреси та доменні імена. Це запобігло б зловмиснику, який має доступ до сертифіката клієнта kubelet, створювати CSRs, запитуючи службові сертифікати для будь-якої IP-адреси або доменного імені.
Генерація файлів kubeconfig для додаткових користувачів
Під час створення кластера, kubeadm підписує сертифікат у admin.conf
, щоб мати Subject: O = system:masters, CN = kubernetes-admin
. system:masters
є групою суперкористувачів, яка обходить рівень авторизації (наприклад, RBAC). Не рекомендується ділитися admin.conf
з додатковими користувачами!
Замість цього, ви можете використовувати команду kubeadm kubeconfig user
для генерації файлів kubeconfig для додаткових користувачів. Команда приймає змішаний набір параметрів командного рядка та опцій конфігурації kubeadm. Згенерований kubeconfig буде записаний до stdout і може бути перенаправлений у файл за допомогою kubeadm kubeconfig user ... > somefile.conf
.
Приклад конфігураційного файлу, який можна використовувати з --config
:
# example.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
# Буде використано як цільовий "кластер" у kubeconfig
clusterName: "kubernetes"
# Буде використано як "сервер" (IP або DNS-імʼя) цього кластера в kubeconfig
controlPlaneEndpoint: "some-dns-address:6443"
# Ключ і сертифікат ЦС кластера будуть завантажені з цієї локальної теки
certificatesDir: "/etc/kubernetes/pki"
Переконайтеся, що ці параметри відповідають бажаним параметрам цільового кластера. Щоб переглянути параметри поточного кластера, скористайтеся:
kubectl get cm kubeadm-config -n kube-system -o=jsonpath="{.data.ClusterConfiguration}"
Наступний приклад згенерує файл kubeconfig з обліковими даними, дійсними протягом 24 годин, для нового користувача johndoe
, який належить до групи appdevs
:
kubeadm kubeconfig user --config example.yaml --org appdevs --client-name johndoe --validity-period 24h
Наступний приклад згенерує файл kubeconfig з обліковими даними адміністратора, дійсними протягом 1 тижня:
kubeadm kubeconfig user --config example.yaml --client-name admin --validity-period 168h
Підписування запитів на підпис сертифікатів (CSR), згенерованих kubeadm
Ви можете створювати запити на підпис сертифікатів за допомогою kubeadm certs generate-csr
. Виклик цієї команди згенерує пари файлів .csr
/ .key
для звичайних сертифікатів. Для сертифікатів, вбудованих у файли kubeconfig, команда згенерує пару файлів .csr
/ .conf
, де ключ вже вбудований у файл .conf
.
Файл CSR містить всю необхідну інформацію для ЦС для підпису сертифіката. kubeadm використовує чітко визначену специфікацію для всіх своїх сертифікатів і CSR.
Типовою текою для сертифікатів є /etc/kubernetes/pki
, тоді як типова тека для файлів kubeconfig є /etc/kubernetes
. Ці стандартні значення можна змінити за допомогою прапорців --cert-dir
та --kubeconfig-dir
, відповідно.
Для передачі власних параметрів команді kubeadm certs generate-csr
використовуйте прапорець --config
, який приймає файл конфігурації kubeadm, так само як і команди, такі як kubeadm init
. Будь-яка специфікація, така як додаткові SAN та власні IP-адреси, повинна зберігатися в тому ж файлі конфігурації та використовуватися для всіх відповідних команд kubeadm, передаючи його як --config
.
Примітка:
У цьому керівництві буде описане використання командиopenssl
для підпису CSRs, але ви можете використовувати свої улюблені інструменти.Примітка:
У цьому керівництві буде використано стандартну теку Kubernetes/etc/kubernetes
, що вимагає прав доступу суперкористувача. Якщо ви дотримуєтесь цього керівництва з дозволеними теками (передаючи --cert-dir
та --kubeconfig-dir
), ви можете пропустити команду sudo
). Але зауважте, що результати потрібно скопіювати у дерево /etc/kubernetes
, щоб kubeadm init
або kubeadm join
могли їх знайти.Підготовка файлів ЦС та сервісного облікового запису
На головному вузлі панелі управління, де буде виконано команду kubeadm init
, виконайте наступні команди:
sudo kubeadm init phase certs ca
sudo kubeadm init phase certs etcd-ca
sudo kubeadm init phase certs front-proxy-ca
sudo kubeadm init phase certs sa
Це заповнить теки /etc/kubernetes/pki
та /etc/kubernetes/pki/etcd
усіма самопідписними файлами ЦС (сертифікати та ключі) та сервісним обліковим записом (публічні та приватні ключі), які необхідні kubeadm для вузла панелі управління.
Примітка:
Якщо ви використовуєте зовнішній ЦС, вам потрібно згенерувати ті ж самі файли окремо та вручну скопіювати їх на головний вузол панелі управління у/etc/kubernetes
. Після підписання всіх CSR ви можете видалити ключ кореневого ЦС (ca.key
), як зазначено у розділі Режим зовнішнього ЦС.Для другорядних вузлів панелі управління (kubeadm join --control-plane
) нема потреби викликати вищезазначені команди. Залежно від того, як ви налаштували Високодоступний кластер, вам або потрібно вручну скопіювати ті ж самі файли з головного вузла панелі управління, або використати автоматизовану функціональність --upload-certs
від kubeadm init
.
Генерація CSR
Команда kubeadm certs generate-csr
генерує CSR для всіх відомих сертифікатів, якими керує kubeadm. Після завершення команди вам потрібно вручну видалити файли .csr
, .conf
або .key
, які вам не потрібні.
Врахування kubelet.conf
Цей розділ стосується як вузлів панелі управління, так і робочих вузлів.
Якщо ви видалили файл ca.key
з вузлів панелі управління (Режим зовнішнього ЦС), активний kube-controller-manager у цьому кластері не зможе підписати клієнтські сертифікати kubelet. Якщо у вашій конфігурації не існує зовнішнього методу для підписання цих сертифікатів (наприклад, зовнішній підписувач), ви могли б вручну підписати kubelet.conf.csr
, як пояснено в цьому посібнику.
Зверніть увагу, що це також означає, що автоматичне оновлення клієнтського сертифіката kubelet буде відключено. Таким чином, близько до закінчення терміну дії сертифіката, вам потрібно буде генерувати новий kubelet.conf.csr
, підписувати сертифікат, вбудовувати його в kubelet.conf
і перезапускати kubelet.
Якщо це не стосується вашої конфігурації, ви можете пропустити обробку kubelet.conf.csr
на другорядних вузлах панелі управління та на робочих вузлах (всі вузли, що викликають kubeadm join ...
). Це тому, що активний kube-controller-manager буде відповідальний за підписання нових клієнтських сертифікатів kubelet.
Примітка:
Обробкаkubelet.conf.csr
на головному вузлі панелі управління (kubeadm init
) є обовʼязковою, оскільки цей вузол вважається вузлом, який ініціалізує кластер, і попередньо заповнений kubelet.conf
потрібен.Вузли панелі управління
Виконайте наступну команду на головному (kubeadm init
) та вторинних (kubeadm join --control-plane
) вузлах панелі управління, щоб згенерувати всі файли CSR:
sudo kubeadm certs generate-csr
Якщо має використовуватися зовнішній etcd, дотримуйтесь керівництва Зовнішній etcd з kubeadm, щоб зрозуміти, які файли CSR потрібні на вузлах kubeadm та etcd. Інші файли .csr
та .key
у теці /etc/kubernetes/pki/etcd
можна видалити.
Виходячи з пояснення у розділі Врахування kubelet.conf, збережіть або видаліть файли kubelet.conf
та kubelet.conf.csr
.
Робочі вузли
Згідно з поясненням у розділі Врахування kubelet.conf, за необхідності викличте:
sudo kubeadm certs generate-csr
та залиште лише файли kubelet.conf
та kubelet.conf.csr
. Альтернативно, повністю пропустіть кроки для робочих вузлів.
Підписання CSR для всіх сертифікатів
Примітка:
Якщо ви використовуєте зовнішній ЦС та вже маєте файли серійних номерів ЦС (.srl
) для openssl
, ви можете скопіювати такі файли на вузол kubeadm, де будуть оброблятися CSR. Файли .srl
, які потрібно скопіювати, це /etc/kubernetes/pki/ca.srl
, /etc/kubernetes/pki/front-proxy-ca.srl
та /etc/kubernetes/pki/etcd/ca.srl
. Потім файли можна перемістити на новий вузол, де будуть оброблятися файли CSR.
Якщо файл .srl
для ЦС відсутній на вузлі, скрипт нижче згенерує новий файл SRL з випадковим початковим серійним номером.
Щоб дізнатися більше про файли .srl
, дивіться документацію openssl
для прапорця --CAserial
.
Повторіть цей крок для всіх вузлів, що мають файли CSR.
Запишіть наступний скрипт у теку /etc/kubernetes
, перейдіть до цієї теки та виконайте скрипт. Скрипт згенерує сертифікати для всіх файлів CSR, які присутні в дереві /etc/kubernetes
.
#!/bin/bash
# Встановіть термін дії сертифіката в днях
DAYS=365
# Обробіть всі файли CSR, крім тих, що призначені для front-proxy і etcd
find ./ -name "*.csr" | grep -v "pki/etcd" | grep -v "front-proxy" | while read -r FILE;
do
echo "* Обробка ${FILE} ..."
FILE=${FILE%.*} # Відкинути розширення
if [ -f "./pki/ca.srl" ]; then
SERIAL_FLAG="-CAserial ./pki/ca.srl"
else
SERIAL_FLAG="-CAcreateserial"
fi
openssl x509 -req -days "${DAYS}" -CA ./pki/ca.crt -CAkey ./pki/ca.key ${SERIAL_FLAG} \
-in "${FILE}.csr" -out "${FILE}.crt"
sleep 2
done
# Обробіть всі CSR для etcd
find ./pki/etcd -name "*.csr" | while read -r FILE;
do
echo "* Обробка ${FILE} ..."
FILE=${FILE%.*} # Відкинути розширення
if [ -f "./pki/etcd/ca.srl" ]; then
SERIAL_FLAG=-CAserial ./pki/etcd/ca.srl
else
SERIAL_FLAG=-CAcreateserial
fi
openssl x509 -req -days "${DAYS}" -CA ./pki/etcd/ca.crt -CAkey ./pki/etcd/ca.key ${SERIAL_FLAG} \
-in "${FILE}.csr" -out "${FILE}.crt"
done
# Обробіть CSR для front-proxy
echo "* Обробка ./pki/front-proxy-client.csr ..."
openssl x509 -req -days "${DAYS}" -CA ./pki/front-proxy-ca.crt -CAkey ./pki/front-proxy-ca.key -CAcreateserial \
-in ./pki/front-proxy-client.csr -out ./pki/front-proxy-client.crt
Вбудовування сертифікатів у файли kubeconfig
Повторіть цей крок для всіх вузлів, що мають файли CSR.
Запишіть наступний скрипт у теку /etc/kubernetes
, перейдіть до цієї теки та виконайте скрипт. Скрипт візьме файли .crt
, які були підписані для файлів kubeconfig з CSR на попередньому кроці, та вбудує їх у файли kubeconfig.
#!/bin/bash
CLUSTER=kubernetes
find ./ -name "*.conf" | while read -r FILE;
do
echo "* Обробка ${FILE} ..."
KUBECONFIG="${FILE}" kubectl config set-cluster "${CLUSTER}" --certificate-authority ./pki/ca.crt --embed-certs
USER=$(KUBECONFIG="${FILE}" kubectl config view -o jsonpath='{.users[0].name}')
KUBECONFIG="${FILE}" kubectl config set-credentials "${USER}" --client-certificate "${FILE}.crt" --embed-certs
done
Виконання очищення
Виконайте цей крок на всіх вузлах, які мають файли CSR.
Запишіть наступний скрипт у теці /etc/kubernetes
, перейдіть до цієї теки та виконайте скрипт.
#!/bin/bash
# Очищення файлів CSR
rm -f ./*.csr ./pki/*.csr ./pki/etcd/*.csr # Очистка всіх файлів CSR
# Очищення файлів CRT, які вже були вбудовані у файли kubeconfig
rm -f ./*.crt
За бажанням, перемістіть файли .srl
на наступний вузол, який буде оброблено.
За бажанням, якщо використовується зовнішній ЦС, видаліть файл /etc/kubernetes/pki/ca.key
, як пояснено у розділі Вузол зовнішнього ЦС.
Ініціалізація вузла kubeadm
Як тільки файли CSR підписані і необхідні сертифікати розміщені на хостах, які ви хочете використовувати як вузли, ви можете використовувати команди kubeadm init
та kubeadm join
для створення Kubernetes кластера з цих вузлів. Під час init
та join
, kubeadm використовує існуючі сертифікати, ключі шифрування та файли kubeconfig, які він знаходить у дереві /etc/kubernetes
у локальній файловій системі хоста.
2 - Налаштування драйвера cgroup
Ця сторінка пояснює, як налаштувати драйвер cgroup kubelet, щоб він відповідав драйверу cgroup контейнера для кластерів kubeadm.
Перш ніж ви розпочнете
Вам слід ознайомитися з вимогами до контейнерних середовищ Kubernetes.
Налаштування драйвера cgroup середовища виконання контейнерів
Сторінка Середовища виконання контейнерів пояснює, що для налаштувань на основі kubeadm рекомендується використовувати драйвер systemd
замість типового драйвера cgroupfs
kubelet, оскільки kubeadm керує kubelet як сервісом systemd.
На сторінці також наведено деталі щодо того, як налаштувати різні контейнерні середовища зі стандартним використанням драйвера systemd
.
Налаштування драйвера cgroup для kubelet
kubeadm дозволяє передавати структуру KubeletConfiguration
під час ініціалізації за допомогою kubeadm init
. Ця структура KubeletConfiguration
може включати поле cgroupDriver
, яке контролює драйвер cgroup для kubelet.
Примітка:
Починаючи з v1.22, якщо користувач не встановить поле cgroupDriver
у KubeletConfiguration
, kubeadm стандартно задає його як systemd
.
У Kubernetes v1.28 можна увімкнути автоматичне виявлення драйвера cgroup як експериментальну функцію. Див. Драйвер cgroup системи systemd для отримання детальнішої інформації.
Ось мінімальний приклад, який явним чином вказує значення поля cgroupDriver
:
# kubeadm-config.yaml
kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
kubernetesVersion: v1.21.0
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd
Такий файл конфігурації можна передати команді kubeadm:
kubeadm init --config kubeadm-config.yaml
Примітка:
Kubeadm використовує ту саму конфігурацію KubeletConfiguration
для всіх вузлів у кластері. KubeletConfiguration
зберігається в обʼєкті ConfigMap в просторі імен kube-system
.
Виконання підкоманд init
, join
та upgrade
призведе до запису kubeadm KubeletConfiguration
у файл під /var/lib/kubelet/config.yaml
і передачі його до kubelet локального вузла.
Використання драйвера cgroupfs
Для використання cgroupfs
і запобігання модифікації драйвера cgroup в KubeletConfiguration
під час оновлення kubeadm
в поточних налаштуваннях, вам потрібно явно вказати його значення. Це стосується випадку, коли ви не хочете, щоб майбутні версії kubeadm
стандартно застосовували драйвер systemd
.
Дивіться нижче розділ "Зміна ConfigMap у kubelet" для отримання деталей щодо явного вказання значення.
Якщо ви хочете налаштувати середовище виконання контейнерів на використання драйвера cgroupfs
, вам слід звернутися до документації вашого середовища виконання контейнерів.
Міграція на використання драйвера systemd
Щоб змінити драйвер cgroup поточного кластера kubeadm з cgroupfs
на systemd
на місці, потрібно виконати подібну процедуру до оновлення kubelet. Це повинно включати обидва зазначені нижче кроки.
Примітка:
Також можливо замінити старі вузли в кластері новими, які використовують драйверsystemd
. Для цього потрібно виконати лише перший крок нижче перед приєднанням нових вузлів та забезпечити те, що робочі навантаження можуть безпечно переміщатися на нові вузли перед видаленням старих вузлів.Зміна ConfigMap у kubelet
Викличте
kubectl edit cm kubelet-config -n kube-system
.Змініть наявне значення
cgroupDriver
або додайте нове поле, яке виглядає наступним чином:cgroupDriver: systemd
Це поле повинно бути присутнє у розділі
kubelet:
в ConfigMap.
Оновлення драйвера cgroup на всіх вузлах
Для кожного вузла в кластері:
- Відключіть вузол за допомогою
kubectl drain <імʼя-вузла> --ignore-daemonsets
- Зупиніть kubelet за допомогою
systemctl stop kubelet
- Зупиніть середовище виконання контейнерів
- Змініть драйвер cgroup середовища виконання контейнерів на
systemd
- Встановіть
cgroupDriver: systemd
у/var/lib/kubelet/config.yaml
- Запустіть середовище виконання контейнерів
- Запустіть kubelet за допомогою
systemctl start kubelet
- Увімкніть вузол за допомогою
kubectl uncordon <імʼя-вузла>
Виконайте ці кроки на вузлах по одному, щоб забезпечити достатній час для розміщення робочих навантажень на різних вузлах.
Після завершення процесу переконайтеся, що всі вузли та робочі навантаження є справними.
3 - Переконфігурація кластера за допомогою kubeadm
kubeadm не підтримує автоматизованих способів переконфігурації компонентів, що були розгорнуті на керованих вузлах. Один зі способів автоматизації цього — використання власного оператора.
Для зміни конфігурації компонентів вам потрібно вручну редагувати повʼязані обʼєкти кластера та файли на диску.
Цей посібник показує правильну послідовність кроків, які потрібно виконати для досягнення переконфігурації кластера kubeadm.
Перш ніж ви розпочнете
- Вам потрібен кластер, що був розгорнутий за допомогою kubeadm.
- У вас мають бути адміністративні облікові дані (
/etc/kubernetes/admin.conf
) та мережеве зʼєднання з робочим kube-apiserver у кластері з хосту, на якому встановлено kubectl. - Мати текстовий редактор встановлений на всіх хостах.
Переконфігурація кластера
kubeadm записує набір параметрів конфігурації компонентів на рівні кластера у ConfigMaps та в інших обʼєктах. Ці обʼєкти потрібно редагувати вручну. Команда kubectl edit
може бути використана для цього.
Команда kubectl edit
відкриє текстовий редактор, в якому ви можете редагувати та зберегти обʼєкт безпосередньо.
Ви можете використовувати змінні середовища KUBECONFIG
та KUBE_EDITOR
для вказівки розташування файлу kubeconfig, який використовується kubectl, та обраного текстового редактора.
Наприклад:
KUBECONFIG=/etc/kubernetes/admin.conf KUBE_EDITOR=nano kubectl edit <параметри>
Примітка:
Після збереження будь-яких змін у цих обʼєктах кластера, компоненти, що працюють на вузлах, можуть не оновлюватись автоматично. У нижченаведених кроках вказано, як це зробити вручну.Попередження:
Конфігурація компонентів у ConfigMaps зберігається як неструктуровані дані (рядки YAML). Це означає, що перевірка правильності не буде проводитися при оновленні вмісту ConfigMap. Вам потрібно бути обережними та слідувати документованому формату API для певної конфігурації компонента, а також уникати друкарських помилок та помилок у відступах в YAML.Застосування змін у конфігурації кластера
Оновлення ClusterConfiguration
Під час створення кластера та його оновлення, kubeadm записує ClusterConfiguration
у ConfigMap, з назвою kubeadm-config
у просторі імен kube-system
.
Щоб змінити певну опцію у ClusterConfiguration
, ви можете редагувати ConfigMap за допомогою цієї команди:
kubectl edit cm -n kube-system kubeadm-config
Конфігурація знаходиться в ключі data.ClusterConfiguration
.
Примітка:
ClusterConfiguration
включає різноманітні параметри, які впливають на конфігурацію окремих компонентів, таких як kube-apiserver, kube-scheduler, kube-controller-manager, CoreDNS, etcd та kube-proxy. Зміни в конфігурації повинні бути віддзеркалені в компонентах вузла вручну.Віддзеркалення змін ClusterConfiguration
на вузлах панелі управління
kubeadm керує компонентами панелі управління як статичними маніфестами Pod, які розташовані в
теці /etc/kubernetes/manifests
. Будь-які зміни у ClusterConfiguration
в ключах apiServer
, controllerManager
, scheduler
або etcd
повинні віддзеркалюватись у відповідних файлах у теці маніфестів на вузлі панелі управління.
Такі зміни можуть включати:
extraArgs
— потребує оновлення списку прапорців, які передаються контейнеру компонентаextraMounts
— потребує оновлення точок монтування для контейнера компонента*SANs
— потребує написання нових сертифікатів з оновленими іменами альтернативних підсистем.
Перед продовженням цих змін переконайтеся, що ви зробили резервну копію теки /etc/kubernetes/
.
Для написання нових сертифікатів ви можете використовувати:
kubeadm init phase certs <component-name> --config <config-file>
Для написання нових файлів маніфестів у теці /etc/kubernetes/manifests
ви можете використовувати:
# Для компонентів панелі управління Kubernetes
kubeadm init phase control-plane <component-name> --config <config-file>
# Для локального etcd
kubeadm init phase etcd local --config <config-file>
Зміст <config-file>
повинен відповідати оновленням в ClusterConfiguration
. Значення <component-name>
повинно бути імʼям компонента панелі управління Kubernetes (apiserver
, controller-manager
або scheduler
).
Примітка:
Оновлення файлу у/etc/kubernetes/manifests
призведе до перезапуску статичного Podʼа для відповідного компонента. Спробуйте робити ці зміни один за одним на вузлі, щоб не переривати роботу кластера.Застосування змін конфігурації kubelet
Оновлення KubeletConfiguration
Під час створення кластера та оновлення, kubeadm записує KubeletConfiguration
у ConfigMap з назвою kubelet-config
в просторі імен kube-system
.
Ви можете редагувати цей ConfigMap за допомогою такої команди:
kubectl edit cm -n kube-system kubelet-config
Конфігурація розташована в ключі data.kubelet
.
Віддзеркалення змін в kubelet
Щоб віддзеркалити зміни на вузлах kubeadm, вам потрібно виконати наступне:
- Увійдіть на вузол kubeadm.
- Виконайте команду
kubeadm upgrade node phase kubelet-config
, щоб завантажити свіжий вмістkubelet-config
ConfigMap в локальний файл/var/lib/kubelet/config.yaml
. - Відредагуйте файл
/var/lib/kubelet/kubeadm-flags.env
, щоб застосувати додаткову конфігурацію за допомогою прапорців. - Перезапустіть службу kubelet за допомогою
systemctl restart kubelet
.
Примітка:
Виконуйте ці зміни по одному вузлу за раз, щоб дозволити належне перепланування робочих навантажень.Примітка:
Під час оновленняkubeadm
, kubeadm завантажує KubeletConfiguration
з ConfigMap kubelet-config
і перезаписує вміст /var/lib/kubelet/config.yaml
. Це означає, що локальна конфігурація вузла повинна бути застосована або за допомогою прапорців у /var/lib/kubelet/kubeadm-flags.env
, або шляхом ручного оновлення вмісту /var/lib/kubelet/config.yaml
після kubeadm upgrade
, з подальшим перезапуском kubelet.Застосування змін у конфігурації kube-proxy
Оновлення KubeProxyConfiguration
Під час створення кластера та оновлення, kubeadm
записує KubeProxyConfiguration
у ConfigMap в просторі імен kube-system
з назвою kube-proxy
.
Цей ConfigMap використовується DaemonSet kube-proxy
в просторі імен kube-system
.
Щоб змінити певну опцію в KubeProxyConfiguration
, ви можете відредагувати ConfigMap за допомогою цієї команди:
kubectl edit cm -n kube-system kube-proxy
Конфігурація знаходиться в ключі data.config.conf
.
Віддзеркалення змін у kube-proxy
Після оновлення ConfigMap kube-proxy
, ви можете перезапустити всі Podʼи kube-proxy:
Отримайте імена Podʼів:
kubectl get po -n kube-system | grep kube-proxy
Видаліть Pod за допомогою:
kubectl delete po -n kube-system <імʼя-поду>
Створюватимуться нові Podʼи, які використовують оновлений ConfigMap.
Примітка:
Оскількиkubeadm
розгортає kube-proxy
як DaemonSet, конфігурація, специфічна для вузла, не підтримується.Застосування змін конфігурації CoreDNS
Оновлення розгортання CoreDNS та сервісу
kubeadm розгортає CoreDNS як Deployment з назвою coredns
та Service з назвою kube-dns
, обидва у просторі імен kube-system
.
Для оновлення будь-яких налаштувань CoreDNS ви можете редагувати обʼєкти Deployment та Service:
kubectl edit deployment -n kube-system coredns
kubectl edit service -n kube-system kube-dns
Віддзеркалення змін у CoreDNS
Після застосування змін у CoreDNS ви можете видалити його Podʼи:
Отримайте назви Podʼів:
kubectl get po -n kube-system | grep coredns
Видаліть Pod за допомогою:
kubectl delete po -n kube-system <ім'я-пода>
Нові Podʼи з оновленою конфігурацією CoreDNS будуть створені.
Примітка:
kubeadm не дозволяє налаштування CoreDNS під час створення та оновлення кластера. Це означає, що якщо ви виконаєтеkubeadm upgrade apply
, ваші зміни в обʼєктах CoreDNS будуть втрачені та мають бути застосовані повторно.Збереження переконфігурації
Під час виконання команди kubeadm upgrade
на керованому вузлі kubeadm може перезаписати конфігурацію, яка була застосована після створення кластера (переконфігурація).
Збереження переконфігурації обʼєкту Node
kubeadm записує Labels, Taints, сокенти CRI та іншу інформацію в обʼєкті Node для конкретного вузла Kubernetes. Для зміни будь-якого змісту цього обʼєкта Node ви можете використовувати:
kubectl edit no <імʼя-вузла>
Під час виконання kubeadm upgrade
вміст такого Node може бути перезаписаний. Якщо ви бажаєте зберегти свої зміни в об'єкті Node після оновлення, ви можете підготувати команду патча для kubectl і застосувати її до обʼєкта Node:
kubectl patch no <ім'я-вузла> --patch-file <файл-патча>
Збереження переконфігурації компонента панелі управління
Основним джерелом конфігурації панелі управління є обʼєкт ClusterConfiguration
, збережений у кластері. Для розширення конфігурації статичних маніфестів Podʼів можна використовувати патчі.
Ці файли патчів повинні залишатися як файли на вузлах панелі управління, щоб забезпечити можливість їх використання командою kubeadm upgrade ... --patches <directory>
.
Якщо переконфігурування виконується для ClusterConfiguration
і статичних маніфестів Podʼів на диску, то набір патчів для конкретного вузла повинен бути відповідно оновлений.
Збереження переконфігурації kubelet
Будь-які зміни в KubeletConfiguration
, збережені у /var/lib/kubelet/config.yaml
, будуть перезаписані під час виконання kubeadm upgrade
, завантажуючи вміст конфігурації kubelet-config
ConfigMap для всього кластера. Для збереження конфігурації kubelet для Node потрібно або вручну змінити файл /var/lib/kubelet/config.yaml
після оновлення, або файл /var/lib/kubelet/kubeadm-flags.env
може містити прапорці. Прапорці kubelet перевизначають відповідні параметри KubeletConfiguration
, але слід зауважити, що деякі з прапорців є застарілими.
Після зміни /var/lib/kubelet/config.yaml
або /var/lib/kubelet/kubeadm-flags.env
потрібен перезапуск kubelet.
Що далі
4 - Оновлення кластерів з kubeadm
Ця сторінка пояснює, як оновити кластер Kubernetes, створений за допомогою kubeadm, з версії 1.29.x до версії 1.30.x і з версії 1.30.x до 1.30.y (де y > x
). Пропуск МІНОРНИХ версій при оновленні не підтримується. Для отримання додаткових відомостей відвідайте Політику версій зміни.
Щоб переглянути інформацію про оновлення кластерів, створених за допомогою старіших версій kubeadm, зверніться до наступних сторінок:
- Оновлення кластера kubeadm з 1.28 на 1.29
- Оновлення кластера kubeadm з 1.27 на 1.28
- Оновлення кластера kubeadm з 1.26 на 1.27
- Оновлення кластера kubeadm з 1.25 на 1.26
Процес оновлення загалом виглядає наступним чином:
- Оновлення первинного вузла панелі управління.
- Оновлення додаткових вузлів панелі управління.
- Оновлення вузлів робочого навантаження.
Перш ніж ви розпочнете
- Переконайтеся, що ви уважно прочитали примітки до випуску.
- Кластер повинен використовувати статичні вузли керування та контейнери etcd або зовнішній etcd.
- Переконайтеся, що ви зробили резервне копіювання важливих компонентів, таких як стан на рівні застосунків, збережений у базі даних.
kubeadm upgrade
не торкнеться вашого робочого навантаження, лише компонентів, внутрішніх для Kubernetes, але резервне копіювання завжди є найкращою практикою. - Своп має бути вимкнено.
Додаткова інформація
- Наведені нижче інструкції описують, коли потрібно вивести з експлуатації кожний вузол під час процесу оновлення. Якщо ви виконуєте оновлення для мінорного номера версії для будь-якого kubelet, ви обовʼязково спочатку повинні вивести вузол (або вузли) з експлуатації, які ви оновлюєте. У випадку вузлів панелі управління, на них можуть працювати контейнери CoreDNS або інші критичні робочі навантаження. Для отримання додаткової інформації дивіться Виведення вузлів з експлуатації.
- Проєкт Kubernetes рекомендує щоб версії kubelet і kubeadm збігались. Замість цього ви можете використовувати версію kubelet, яка є старішою, ніж kubeadm, за умови, що вона знаходиться в межах підтримуваних версій. Для отримання додаткових відомостей, будь ласка, відвідайте Відхилення kubeadm від kubelet.
- Всі контейнери перезавантажуються після оновлення, оскільки змінюється значення хешу специфікації контейнера.
- Щоб перевірити, що служба kubelet успішно перезапустилась після оновлення kubelet, ви можете виконати
systemctl status kubelet
або переглянути логи служби за допомогоюjournalctl -xeu kubelet
. - Використання прапорця
--config
командиkubeadm upgrade
з типами конфігурації kubeadm з метою переконфігурування кластера не рекомендується і може мати неочікувані наслідки. Дотримуйтеся кроків з Переконфігурація кластера kubeadm замість цього.
Що треба враховувати при оновленні etcd
Оскільки статичний Pod kube-apiserver
працює постійно (навіть якщо ви вивели вузол з експлуатації), під час виконання оновлення kubeadm, яке включає оновлення etcd, запити до сервера зупиняться, поки новий статичний Pod etcd не перезапуститься. Як обхідний механізм, можна активно зупинити процес kube-apiserver
на кілька секунд перед запуском команди kubeadm upgrade apply
. Це дозволяє завершити запити, що вже відправлені, і закрити наявні зʼєднання, що знижує наслідки перерви роботи etcd. Це можна зробити на вузлах панелі управління таким чином:
killall -s SIGTERM kube-apiserver # виклик належного припинення роботи kube-apiserver
sleep 20 # зачекайте трохи, щоб завершити запити, які вже були відправлені
kubeadm upgrade ... # виконати команду оновлення kubeadm
Зміна репозиторію пакунків
Якщо ви використовуєте репозиторії пакунків, що керуються спільнотою (pkgs.k8s.io
), вам потрібно увімкнути репозиторій пакунків для бажаної мінорної версії Kubernetes. Як це зробити можна дізнатись з документа Зміна репозиторію пакунків Kubernetes.
apt.kubernetes.io
та yum.kubernetes.io
) визнані
застарілими та заморожені станом на 13 вересня 2023.
Використання нових репозиторіїв пакунків, розміщених за адресою pkgs.k8s.io`,
настійно рекомендується і є обовʼязковим для встановлення версій Kubernetes, випущених після 13 вересня 2023 року.
Застарілі репозиторії та їхні вміст можуть бути видалені у будь-який момент у майбутньому і без попереднього повідомлення.
Нові репозиторії пакунків надають можливість завантаження версій Kubernetes, починаючи з v1.24.0.Визначення версії, на яку потрібно оновитися
Знайдіть останнє патч-видання для Kubernetes 1.30 за допомогою менеджера пакунків ОС:
# Знайдіть останню версію 1.30 у списку.
# Вона має виглядати як 1.30.x-*, де x — останній патч.
sudo apt update
sudo apt-cache madison kubeadm
# Знайдіть останню версію 1.30 у списку.
# Вона має виглядати як 1.30.x-*, де x — останній патч.
sudo yum list --showduplicates kubeadm --disableexcludes=kubernetes
Оновлення вузлів панелі управління
Процедуру оновлення на вузлах панелі управління слід виконувати по одному вузлу за раз. Виберіть перший вузол панелі управління, який ви хочете оновити. Він повинен мати файл /etc/kubernetes/admin.conf
.
Here's the translation:
Виклик "kubeadm upgrade"
Для першого вузла панелі управління
Оновіть kubeadm:
# замініть x на останню версію патча sudo apt-mark unhold kubeadm && \ sudo apt-get update && sudo apt-get install -y kubeadm='1.30.x-*' && \ sudo apt-mark hold kubeadm
# замініть x на останню версію патча sudo yum install -y kubeadm-'1.30.x-*' --disableexcludes=kubernetes
Перевірте, що завантаження працює і має очікувану версію:
kubeadm version
Перевірте план оновлення:
sudo kubeadm upgrade plan
Ця команда перевіряє можливість оновлення вашого кластера та отримує версії, на які ви можете оновитися. Також вона показує таблицю стану версій компонентів.
Примітка:
kubeadm upgrade
також автоматично оновлює сертифікати, якими він керує на цьому вузлі. Щоб відмовитися від оновлення сертифікатів, можна використовувати прапорець--certificate-renewal=false
. Для отримання додаткової інформації див. керівництво з керування сертифікатами.Примітка:
Якщоkubeadm upgrade plan
показує, що потрібно вручну оновити конфігурації компонентів, користувачі повинні надати оновлений файл конфігурації уkubeadm upgrade apply
через прапорець командного рядка--config
. Якщо цього не зробити,kubeadm upgrade apply
завершиться з помилкою і не виконає оновлення.Виберіть версію для оновлення та запустіть відповідну команду. Наприклад:
# замініть x на версію патча, яку ви вибрали для цього оновлення sudo kubeadm upgrade apply v1.30.x
Після завершення команди ви маєте побачити:
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.30.x". Enjoy! [upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.
Примітка:
Для версій, старіших, ніж v1.28, kubeadm типово використовував режим, який оновлює надбудови (включно з CoreDNS та kube-proxy) безпосередньо під часkubeadm upgrade apply
, незалежно від того, чи є інші екземпляри вузлів панелі управління, які не були оновлені. Це може викликати проблеми сумісності. Починаючи з v1.28, kubeadm стандартно перевіряє, чи всі екземпляри вузлів панелі управління були оновлені, перед початком оновлення надбудов. Ви повинні виконати оновлення екземплярів вузлів керування послідовно або принаймні забезпечити, що останнє оновлення екземпляра вузла панелі управління не розпочато, поки всі інші екземпляри вузлів панелі управління не будуть повністю оновлені, і оновлення надбудов буде виконано після останнього оновлення екземпляра вузла керування. Якщо ви хочете залишити стару поведінку оновлення, будь ласка, увімкніть feature gateUpgradeAddonsBeforeControlPlane
за допомогоюkubeadm upgrade apply --feature-gates=UpgradeAddonsBeforeControlPlane=true
. Проєкт Kubernetes не рекомендує взагалі включати цю функцію, вам замість цього слід змінити процес оновлення або надбудови кластера таким чином, щоб вам не потрібно було залучати стару поведінку. Feature gateUpgradeAddonsBeforeControlPlane
буде видалено в майбутній версії.Вручну оновіть втулок постачальник мережевого інтерфейсу контейнера (CNI).
Ваш постачальник мережевого інтерфейсу контейнера (CNI) може мати власні інструкції щодо оновлення. Перевірте надбудови для знаходження вашого постачальника CNI та перегляньте, чи потрібні додаткові кроки оновлення.
Цей крок не потрібен на додаткових вузлах панелі управління, якщо постачальник CNI працює як DaemonSet.
Для інших вузлів панелі управління
Те саме, що для першого вузла керування, але використовуйте:
sudo kubeadm upgrade node
замість:
sudo kubeadm upgrade apply
Також виклик kubeadm upgrade plan
та оновлення постачальника мережевого інтерфейсу контейнера (CNI) вже не потрібні.
Виведення вузла з експлуатації
Готуємо вузол для обслуговування, відмітивши його як непридатний для планування та вивівши з нього робочі навантаження:
# замініть <node-to-drain> іменем вашого вузла, який ви хочете вивести з експлуатації
kubectl drain <node-to-drain> --ignore-daemonsets
Оновлення kubelet та kubectl
Оновіть kubelet та kubectl:
# замініть x у 1.30.x-* на останню патч-версію sudo apt-mark unhold kubelet kubectl && \ sudo apt-get update && sudo apt-get install -y kubelet='1.30.x-*' kubectl='1.30.x-*' && \ sudo apt-mark hold kubelet kubectl
# замініть x у 1.30.x-* на останню патч-версію sudo yum install -y kubelet-'1.30.x-*' kubectl-'1.30.x-*' --disableexcludes=kubernetes
Перезапустіть kubelet:
sudo systemctl daemon-reload sudo systemctl restart kubelet
Повернення вузла до експлуатації
Відновіть роботу вузла, позначивши його як доступний для планування:
# замініть <node-to-uncordon> на імʼя вашого вузла
kubectl uncordon <node-to-uncordon>
Оновлення вузлів робочих навантажень
Процедуру оновлення на робочих вузлах слід виконувати один за одним або декільком вузлами одночасно, не посягаючи на мінімально необхідні можливості для виконання вашого навантаження.
Наступні сторінки показують, як оновити робочі вузли у Linux та Windows:
Перевірка стану кластера
Після оновлення kubelet на всіх вузлах перевірте доступність всіх вузлів, виконавши наступну команду з будь-якого місця, де кubectl має доступу до кластера:
kubectl get nodes
У стовпці STATUS
повинно бути вказано Ready
для всіх ваших вузлів, а номер версії повинен бути оновлений.
Відновлення після несправності
Якщо kubeadm upgrade
виявляється несправним і не відновлює роботу, наприклад через неочікуване вимкнення під час виконання, ви можете виконати kubeadm upgrade
ще раз. Ця команда є ідемпотентною і, зрештою, переконується, що фактичний стан відповідає заданому вами стану.
Для відновлення з несправного стану ви також можете запустити sudo kubeadm upgrade apply --force
без зміни версії, яку використовує ваш кластер.
Під час оновлення kubeadm записує наступні резервні теки у /etc/kubernetes/tmp
:
kubeadm-backup-etcd-<дата>-<час>
kubeadm-backup-manifests-<дата>-<час>
kubeadm-backup-etcd
містить резервну копію даних локального etcd для цього вузла панелі управління. У разі невдачі оновлення etcd і якщо автоматичне відновлення не працює, вміст цієї теки може бути відновлений вручну в /var/lib/etcd
. У разі використання зовнішнього etcd ця тека резервного копіювання буде порожньою.
kubeadm-backup-manifests
містить резервну копію файлів маніфестів статичних Podʼів для цього вузла панелі управління. У разі невдачі оновлення і якщо автоматичне відновлення не працює, вміст цієї теки може бути відновлений вручну в /etc/kubernetes/manifests
. Якщо з будь-якої причини немає різниці між попереднім та файлом маніфесту після оновлення для певного компонента, резервна копія файлу для нього не буде записана.
Примітка:
Після оновлення кластера за допомогою kubeadm, тека резервних копій/etc/kubernetes/tmp
залишиться, і ці резервні файли потрібно буде очистити вручну.Як це працює
kubeadm upgrade apply
робить наступне:
- Перевіряє, що ваш кластер можна оновити:
- Сервер API доступний
- Всі вузли знаходяться у стані
Ready
- Панель управління працює належним чином
- Застосовує політику різниці версій.
- Переконується, що образи панелі управління доступні або доступні для отримання на машині.
- Генерує заміни та/або використовує зміни підготовлені користувачем, якщо компонентні конфігурації вимагають оновлення версії.
- Оновлює компоненти панелі управління або відкочується, якщо будь-який з них не може бути запущений.
- Застосовує нові маніфести
CoreDNS
іkube-proxy
і переконується, що створені всі необхідні правила RBAC. - Створює нові сертифікати та файли ключів API-сервера і робить резервні копії старих файлів, якщо вони мають закінчитися за 180 днів.
kubeadm upgrade node
робить наступне на додаткових вузлах панелі управління:
- Витягує
ClusterConfiguration
kubeadm з кластера. - Опційно робить резервні копії сертифіката kube-apiserver.
- Оновлює маніфести статичних Podʼів для компонентів панелі управління.
- Оновлює конфігурацію kubelet для цього вузла.
kubeadm upgrade node
робить наступне на вузлах робочих навантажень:
- Витягує
ClusterConfiguration
kubeadm з кластера. - Оновлює конфігурацію kubelet для цього вузла.
5 - Оновлення вузлів Linux
Ця сторінка пояснює, як оновити вузли робочих навантажень Linux, створені за допомогою kubeadm.
Перш ніж ви розпочнете
Вам потрібен доступ до оболонки на всіх вузлах, а також інструмент командного рядка kubectl повинен бути налаштований для спілкування з вашим кластером. Рекомендується виконувати цю інструкцію у кластері, який має принаймні два вузли, які не виконують функції вузлів панелі управління.
Для перевірки версії введітьkubectl version
.- Ознайомтеся з процесом оновлення решти вузлів панелі управління за допомогою kubeadm. Вам потрібно буде спочатку оновити вузли панелі управління перед оновленням вузлів робочих навантажень Linux.
Зміна репозиторію пакунків
Якщо ви використовуєте репозиторії пакунків (pkgs.k8s.io
), вам потрібно увімкнути репозиторій пакунків для потрібного мінорного релізу Kubernetes. Це пояснено в документі Зміна репозиторію пакунків Kubernetes.
apt.kubernetes.io
та yum.kubernetes.io
) визнані
застарілими та заморожені станом на 13 вересня 2023.
Використання нових репозиторіїв пакунків, розміщених за адресою pkgs.k8s.io`,
настійно рекомендується і є обовʼязковим для встановлення версій Kubernetes, випущених після 13 вересня 2023 року.
Застарілі репозиторії та їхні вміст можуть бути видалені у будь-який момент у майбутньому і без попереднього повідомлення.
Нові репозиторії пакунків надають можливість завантаження версій Kubernetes, починаючи з v1.24.0.Оновлення робочих вузлів
Оновлення kubeadm
Оновіть kubeadm:
# замініть x у 1.30.x-* на останню версію патча
sudo apt-mark unhold kubeadm && \
sudo apt-get update && sudo apt-get install -y kubeadm='1.30.x-*' && \
sudo apt-mark hold kubeadm
# замініть x у 1.30.x-* на останню версію патча
sudo yum install -y kubeadm-'1.30.x-*' --disableexcludes=kubernetes
Виклик "kubeadm upgrade"
Для робочих вузлів це оновлює локальну конфігурацію kubelet:
sudo kubeadm upgrade node
Виведіть вузол з експлуатації
Підготуйте вузол до обслуговування, позначивши його як недоступний для планування та виселивши завдання:
# виконайте цю команду на вузлі панелі управління
# замініть <node-to-drain> імʼям вузла, який ви виводите з експлуатації
kubectl drain <node-to-drain> --ignore-daemonsets
Оновлення kubelet та kubectl
Оновіть kubelet та kubectl:
# замініть x у 1.30.x-* на останню версію патча sudo apt-mark unhold kubelet kubectl && \ sudo apt-get update && sudo apt-get install -y kubelet='1.30.x-*' kubectl='1.30.x-*' && \ sudo apt-mark hold kubelet kubectl
# замініть x у 1.30.x-* на останню версію патча sudo yum install -y kubelet-'1.30.x-*' kubectl-'1.30.x-*' --disableexcludes=kubernetes
Перезавантажте kubelet:
sudo systemctl daemon-reload sudo systemctl restart kubelet
Відновіть роботу вузла
Поверніть вузол в роботу, позначивши його як придатний для планування:
# виконайте цю команду на вузлі панелі управління
# замініть <node-to-uncordon> імʼям вашого вузла
kubectl uncordon <node-to-uncordon>
Що далі
- Подивіться, як оновити вузли Windows.
6 - Оновлення вузлів Windows
Kubernetes v1.18 [beta]
Ця сторінка пояснює, як оновити вузол Windows, створений за допомогою kubeadm.
Перш ніж ви розпочнете
Вам потрібен доступ до оболонки на всіх вузлах, а також інструмент командного рядка kubectl повинен бути налаштований для спілкування з вашим кластером. Рекомендується виконувати цю інструкцію у кластері, який має принаймні два вузли, які не виконують функції вузлів панелі управління.
Версія вашого Kubernetes сервера має бути не старішою ніж 1.17. Для перевірки версії введітьkubectl version
.- Ознайомтеся з процесом оновлення інших вузлів вашого кластера kubeadm. Вам слід оновити вузли панелі управління перед оновленням вузлів Windows.
Оновлення робочих вузлів
Оновлення kubeadm
З вузла Windows оновіть kubeadm:
# замініть 1.30.0 на вашу бажану версію curl.exe -Lo <path-to-kubeadm.exe> "https://dl.k8s.io/v1.30.0/bin/windows/amd64/kubeadm.exe"
Виведіть вузол з експлуатації
З машини з доступом до API Kubernetes підготуйте вузол до обслуговування, позначивши його як недоступний для планування та виселивши завдання:
# замініть <node-to-drain> імʼям вашого вузла, який ви виводите з експлуатації kubectl drain <node-to-drain> --ignore-daemonsets
Ви повинні побачити подібний вивід:
node/ip-172-31-85-18 cordoned node/ip-172-31-85-18 drained
Оновлення конфігурації kubelet
З вузла Windows викличте наступну команду, щоб синхронізувати нову конфігурацію kubelet:
kubeadm upgrade node
Оновлення kubelet та kube-proxy
З вузла Windows оновіть та перезапустіть kubelet:
stop-service kubelet curl.exe -Lo <path-to-kubelet.exe> "https://dl.k8s.io/v1.30.0/bin/windows/amd64/kubelet.exe" restart-service kubelet
З вузла Windows оновіть та перезапустіть kube-proxy.
stop-service kube-proxy curl.exe -Lo <path-to-kube-proxy.exe> "https://dl.k8s.io/v1.30.0/bin/windows/amd64/kube-proxy.exe" restart-service kube-proxy
Примітка:
Якщо ви запускаєте kube-proxy в контейнері HostProcess всередині Podʼа, а не як службу Windows, ви можете оновити kube-proxy, застосувавши нову версію ваших маніфестів kube-proxy.Відновіть роботу вузла
З машини з доступом до API Kubernetes, поверніть вузол в роботу, позначивши його як придатний для планування:
# замініть <node-to-drain> імʼям вашого вузла kubectl uncordon <node-to-drain>
Що далі
- Подивіться, як оновити вузли Linux.
7 - Зміна репозиторія пакунків Kubernetes
Ця сторінка пояснює, як увімкнути репозиторій пакунків для бажаного мінорного випуску Kubernetes під час оновлення кластера. Це потрібно лише для користувачів репозиторіїв пакунків, що підтримуються спільнотою та розміщені на pkgs.k8s.io
. На відміну від застарілих репозиторіїв пакунків, репозиторії пакунків, що підтримуються спільнотою, структуровані таким чином, що для кожної мінорної версії Kubernetes є окремий репозиторій пакунків.
Примітка:
Цей посібник охоплює лише частину процесу оновлення Kubernetes. Для отримання додаткової інформації про оновлення кластерів Kubernetes див. посібник з оновлення.Примітка:
Цей крок потрібно виконати лише під час оновлення кластера до іншого мінорного випуску. Якщо ви оновлюєтеся до іншого патч-релізу в межах тієї самої мінорної версії (наприклад, з v1.30.5 до v1.30.7), вам не потрібно дотримуватися цього посібника. Однак, якщо ви все ще використовуєте застарілі репозиторії пакунків, вам потрібно перейти на нові репозиторії пакунків, які підтримуються спільнотою, перед оновленням (див. наступний розділ для отримання деталей про те, як це зробити).Перш ніж ви розпочнете
У цьому документі припускається, що ви вже використовуєте репозиторії пакунків, які підтримуються спільнотою (pkgs.k8s.io
). Якщо це не так, настійно рекомендується перейти на репозиторії пакунків, які підтримуються спільнотою, як описано в офіційному оголошенні.
apt.kubernetes.io
та yum.kubernetes.io
) визнані
застарілими та заморожені станом на 13 вересня 2023.
Використання нових репозиторіїв пакунків, розміщених за адресою pkgs.k8s.io`,
настійно рекомендується і є обовʼязковим для встановлення версій Kubernetes, випущених після 13 вересня 2023 року.
Застарілі репозиторії та їхні вміст можуть бути видалені у будь-який момент у майбутньому і без попереднього повідомлення.
Нові репозиторії пакунків надають можливість завантаження версій Kubernetes, починаючи з v1.24.0.Перевірка використання репозиторіїв пакунків Kubernetes
Якщо ви не впевнені, чи ви використовуєте репозиторії пакунків, які підтримуються спільнотою, чи застарілі репозиторії пакунків, виконайте наступні кроки для перевірки:
Виведіть вміст файлу, який визначає apt
-репозиторій Kubernetes:
# У вашій системі цей файл конфігурації може мати іншу назву
pager /etc/apt/sources.list.d/kubernetes.list
Якщо ви бачите рядок, схожий на:
deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /
Ви використовуєте репозиторії пакунків Kubernetes, і цей посібник стосується вас. Інакше настійно рекомендується перейти на репозиторії пакунків Kubernetes, які підтримуються спільнотою, як описано в офіційному оголошенні.
Виведіть вміст файлу, який визначає yum
-репозиторій Kubernetes:
# У вашій системі цей файл конфігурації може мати іншу назву
cat /etc/yum.repos.d/kubernetes.repo
Якщо ви бачите baseurl
, схожий на baseurl
в наведеному нижче виводі:
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl
Ви використовуєте репозиторії пакунків Kubernetes, і цей посібник стосується вас. Інакше настійно рекомендується перейти на репозиторії пакунків Kubernetes, які підтримуються спільнотою, як описано в офіційному оголошенні.
Виведіть вміст файлу, який визначає zypper
-репозиторій Kubernetes:
# У вашій системі цей файл конфігурації може мати іншу назву
cat /etc/zypp/repos.d/kubernetes.repo
Якщо ви бачите baseurl
, схожий на baseurl
в наведеному нижче виводі:
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl
Ви використовуєте репозиторії пакунків Kubernetes, і цей посібник стосується вас. Інакше настійно рекомендується перейти на репозиторії пакунків Kubernetes, які підтримуються спільнотою, як описано в офіційному оголошенні.
Примітка:
URL, використаний для репозиторіїв пакунків Kubernetes, не обмежується pkgs.k8s.io
, він також може бути одним із наступних:
pkgs.k8s.io
pkgs.kubernetes.io
packages.kubernetes.io
Перехід на інший репозиторій пакунків Kubernetes
Цей крок слід виконати при оновленні з одного мінорного випуску Kubernetes на інший для отримання доступу до пакунків бажаної мінорної версії Kubernetes.
Відкрийте файл, який визначає
apt
-репозиторій Kubernetes за допомогою текстового редактора на ваш вибір:nano /etc/apt/sources.list.d/kubernetes.list
Ви повинні побачити один рядок з URL, що містить вашу поточну мінорну версію Kubernetes. Наприклад, якщо ви використовуєте v1.29, ви повинні побачити це:
deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /
Змініть версію в URL на наступний доступний мінорний випуск, наприклад:
deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /
Збережіть файл і вийдіть з текстового редактора. Продовжуйте дотримуватися відповідних інструкцій щодо оновлення.
Відкрийте файл, який визначає
yum
-репозиторій Kubernetes за допомогою текстового редактора на ваш вибір:nano /etc/yum.repos.d/kubernetes.repo
Ви повинні побачити файл з двома URL, що містять вашу поточну мінорну версію Kubernetes. Наприклад, якщо ви використовуєте v1.29, ви повинні побачити це:
[kubernetes] name=Kubernetes baseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/ enabled=1 gpgcheck=1 gpgkey=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/repodata/repomd.xml.key exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
Змініть версію в цих URL на наступний доступний мінорний випуск, наприклад:
[kubernetes] name=Kubernetes baseurl=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/ enabled=1 gpgcheck=1 gpgkey=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/repodata/repomd.xml.key exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
Збережіть файл і вийдіть з текстового редактора. Продовжуйте дотримуватися відповідних інструкцій щодо оновлення.
Що далі
- Подивіться, як оновити вузли Linux.
- Подивіться, як оновити вузли Windows.