Створення високодоступних кластерів за допомогою kubeadm
На цій сторінці пояснюється два різних підходи до налаштування високодоступного кластера Kubernetes з використанням інструменту kubeadm:
- Зі стековими вузлами панелі управління. Цей підхід вимагає менше інфраструктури. Члени etcd та вузли панелі управління розташовані разом.
- Зовнішній кластер etcd. Цей підхід вимагає більше інфраструктури. Вузли панелі управління та члени etcd розділені.
Перед тим як продовжити, вам слід ретельно розглянути, який підхід найкраще відповідає потребам ваших застосунків та оточенню. Варіанти топології високої доступності наводять переваги та недоліки кожного з них.
У випадку виникнення проблем з налаштуванням HA-кластера, будь ласка, повідомте про це в системі відстеження проблем kubeadm.
Також дивіться документацію з оновлення.
Увага:
Ця сторінка не стосується запуску вашого кластера на платформі хмарного провайдера. У хмарному середовищі жоден із документованих тут підходів не працює з обʼєктами служб типу LoadBalancer або з динамічними PersistentVolumes.Перш ніж ви розпочнете
Передумови залежать від топології, яку ви обрали для панелі управління кластера:
Вам потрібно:
- Три або більше машин, які відповідають мінімальним вимогам kubeadm для вузлів панелі управління. Наявність непарної кількості вузлів панелі управління може бути корисною при виборі лідера в разі відмови машини чи зони,
- включаючи середовище виконання контейнерів, яке вже налаштоване та працює.
- Три або більше машин, які відповідають мінімальним вимогам kubeadm для робочих вузлів,
- включаючи середовище виконання контейнерів, яке вже налаштоване та працює.
- Повноцінне мережеве зʼєднання між усіма машинами в кластері (публічна чи приватна мережа).
- Привілеї суперкористувача на всіх машинах за допомогою
sudo.- Ви можете використовувати інший інструмент; цей посібник використовує
sudoу прикладах.
- Ви можете використовувати інший інструмент; цей посібник використовує
- SSH-доступ з одного пристрою до всіх вузлів системи.
kubeadmтаkubeletвже встановлені на всіх машинах.
Дивіться Топологія стекового etcd для контексту.
Вам потрібно:
- Три або більше машин, які відповідають мінімальним вимогам kubeadm для вузлів панелі управління. Наявність непарної кількості вузлів панелі управління може бути корисною при виборі лідера в разі відмови машини чи зони,
- включаючи робоче середовище виконання контейнерів, яке вже налаштоване та працює
- Три або більше машин, які відповідають мінімальним вимогам kubeadm для робочих вузлів,
- включаючи середовище виконання контейнерів контейнера, яке вже налаштоване та працює.
- Повноцінне мережеве зʼєднання між усіма машинами в кластері (публічна чи приватна мережа).
- Привілеї суперкористувача на всіх машинах за допомогою
sudo.- Ви можете використовувати інший інструмент; цей посібник використовує
sudoу прикладах.
- Ви можете використовувати інший інструмент; цей посібник використовує
- SSH-доступ з одного пристрою до всіх вузлів системи.
kubeadmтаkubeletвже встановлені на всіх машинах.
І вам також потрібно:
- Три або більше додаткових машин, які стануть членами кластера etcd. Наявність непарної кількості членів у кластері etcd — це вимога для досягнення оптимального кворуму під час голосування.
- Ці машини також повинні мати встановлені
kubeadmтаkubelet. - На цих машинах також потрібно мати середовище виконання контейнерів, яке вже налаштоване та працює.
- Ці машини також повинні мати встановлені
Дивіться Топологія зовнішнього etcd для контексту.
Образи контейнерів
Кожен хост повинен мати доступ для отримання та завантаження образів з реєстру контейнерів Kubernetes, registry.k8s.io. Якщо ви хочете розгорнути високодоступний кластер, де хостам не можна здійснювати доступ до образів, це можливо. Вам слід забезпечити, що правильні образи контейнерів вже доступні на відповідних хостах за допомогою інших засобів.
Інтерфейс командного рядка
Для управління Kubernetes після налаштування кластера, вам слід
встановити kubectl на вашому компʼютері. Також корисно
встановити інструмент kubectl на кожному вузлі панелі управління, оскільки це може бути корисним для усунення несправностей.
Перші кроки для обох методів
Створення балансувальника навантаження для kube-apiserver
Примітка:
Існує багато конфігурацій для балансувальників навантаження. Наведений нижче приклад — лише один із варіантів. Ваші вимоги до кластера можуть вимагати іншої конфігурації.Створіть балансувальник навантаження kube-apiserver з імʼям, яке розпізнається DNS.
У хмарному середовищі ви повинні розмістити вузли панелі управління за TCP балансувальником навантаження, який виконує переспрямовування трафіку. Цей балансувальник розподіляє трафік до всіх справних вузлів панелі управління у своєму списку цілей. Перевірка доступності apiserver — це перевірка TCP порту, на якому слухає kube-apiserver (типове значення порту
:6443).Не рекомендується використовувати IP-адресу безпосередньо у хмарному середовищі.
Балансувальник навантаження повинен мати можливість взаємодіяти з усіма вузлами панелі управління на порті apiserver. Також він повинен дозволяти вхідний трафік на його порту прослуховування.
Переконайтеся, що адреса балансувальника завжди відповідає адресі
ControlPlaneEndpointkubeadm.Прочитайте Параметри для програмного балансування навантаження для отримання додаткових відомостей.
Додайте перший вузол панелі управління до балансувальника та перевірте зʼєднання:
nc -zv -w 2 <LOAD_BALANCER_IP> <PORT>Помилка "connection refused" є очікуваною, оскільки API-сервер ще не запущено. Проте тайм-аут означає, що балансувальник не може взаємодіяти з вузлом панелі управління. Якщо виникає тайм-аут, повторно налаштуйте балансувальник для взаємодії з вузлом панелі управління.
Додайте решту вузлів панелі управління до цільової групи балансувальника.
Панель управління та вузли etcd зі стековою архітектурою
Кроки для першого вузла панелі управління
Ініціалізуйте панель управління:
sudo kubeadm init --control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" --upload-certsВи можете використовувати прапорець
--kubernetes-version, щоб встановити версію Kubernetes, яку слід використовувати. Рекомендується, щоб версії kubeadm, kubelet, kubectl та Kubernetes відповідали одна одній.Прапорець
--control-plane-endpointповинен бути встановлений на адресу або DNS та порт балансувальника.Прапорець
--upload-certsвикористовується для завантаження сертифікатів, які слід використовувати на всіх екземплярах панелі управління. Якщо натомість ви віддаєте перевагу копіюванню сертифікатів між вузлами панелі управління вручну або за допомогою засобів автоматизації, видаліть цей прапорець та зверніться до розділу Розподіл сертифікатів вручну нижче.
Примітка:
Прапорціkubeadm init--configта--certificate-keyне можна змішувати, тому якщо ви хочете використовувати конфігурацію kubeadm вам слід додати полеcertificateKeyу відповідні місця конфігурації (підInitConfigurationтаJoinConfiguration: controlPlane).Примітка:
Деякі мережеві втулки CNI вимагають додаткової конфігурації, наприклад вказівки IP для Podʼа в форматі CIDR, тоді як інші — ні. Див. документацію мережі CNI. Щоб додати CIDR Podʼу, скористайтесь прапорцем--pod-network-cidr, або якщо ви використовуєте файл конфігурації kubeadm встановіть полеpodSubnetв обʼєктіnetworkingконфігураціїClusterConfiguration.Вивід виглядатиме десь так:
... You can now join any number of control-plane node by running the following command on each as a root: kubeadm join 192.168.0.200:6443 --token 9vr73a.a8uxyaju799qwdjv --discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866 --control-plane --certificate-key f8902e114ef118304e561c3ecd4d0b543adc226b7a07f675f56564185ffe0c07 Please note that the certificate-key gives access to cluster sensitive data, keep it secret! As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use kubeadm init phase upload-certs to reload certs afterward. Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.0.200:6443 --token 9vr73a.a8uxyaju799qwdjv --discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866Скопіюйте цей вивід у текстовий файл. Ви будете потребувати його пізніше для приєднання вузлів панелі управління та робочих вузлів до кластера.
Коли використовується
--upload-certsзkubeadm init, сертифікати основної панелі управління шифруються та завантажуються уkubeadm-certsSecret.Щоб знову завантажити сертифікати та згенерувати новий ключ розшифрування, використовуйте наступну команду на вузлі панелі управління який вже приєднаний до кластера:
sudo kubeadm init phase upload-certs --upload-certsВи також можете вказати власний
--certificate-keyпід часinit, який пізніше може бути використаний зjoin. Щоб згенерувати такий ключ, використовуйте наступну команду:kubeadm certs certificate-key
Ключ сертифіката — це рядок, закодований у шістнадцятковій формі, який є ключем AES розміром 32 байти.
Примітка:
Секретkubeadm-certsта ключ розшифрування діють впродовж двох годин.Увага:
Як зазначено у виводі команди, ключ сертифіката надає доступ до чутливих даних кластера, тримайте його в таємниці!Застосуйте обраний вами мережевий втулок CNI: Дотримуйтеся цих інструкцій для встановлення постачальника CNI. Переконайтеся, що конфігурація відповідає CIDR IP для Podʼа, вказаному в файлі конфігурації kubeadm (якщо застосовується).
Примітка:
Вам слід вибрати мережевий втулок, який відповідає вашому випадку використання та встановити його, перш ніж перейти до наступного кроку. Якщо ви цього не зробите, вам не вдасться належним чином запустити свій кластер.Введіть наступну команду та спостерігайте, як запускаються екземпляри компонентів панелі управління:
kubectl get pod -n kube-system -w
Кроки для інших вузлів панелі управління
Для кожного додаткового вузла панелі управління:
Виконайте команду приєднання, яка вам була надана раніше виводом
kubeadm initна першому вузлі. Вона повинна виглядати приблизно так:sudo kubeadm join 192.168.0.200:6443 --token 9vr73a.a8uxyaju799qwdjv --discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866 --control-plane --certificate-key f8902e114ef118304e561c3ecd4d0b543adc226b7a07f675f56564185ffe0c07- Прапорець
--control-planeвказуєkubeadm join, що потрібно створити новий вузол панелі управління. - Прапорець
--certificate-key ...призведе до того, що сертифікати вузлів панелі управління будуть завантажені з секретуkubeadm-certsв кластері та розшифровані за допомогою вказаного ключа.
- Прапорець
Примітка:
Оскільки вузли кластера зазвичай ініціалізуються послідовно, CoreDNS Podʼи, ймовірно, будуть працювати на першому вузлі панелі управління. Щоб забезпечити високу доступність, перебалансуйте CoreDNS Podʼи за допомогою командиkubectl -n kube-system rollout restart deployment coredns після приєднання принаймні одного нового вузла.Зовнішні вузли etcd
Налаштування кластера з зовнішніми вузлами etcd подібно до процедури, використовуваної для стекових вузлів etcd, з винятком того, що ви повинні налаштувати etcd спочатку, і ви повинні передавати інформацію про etcd у конфігураційному файлі kubeadm.
Налаштуйте кластер etcd
Слідуйте цим інструкціям для налаштування кластера etcd.
Налаштуйте SSH, як описано тут.
Скопіюйте наступні файли з будь-якого вузла etcd в кластері на перший вузол панелі управління:
export CONTROL_PLANE="ubuntu@10.0.0.7" scp /etc/kubernetes/pki/etcd/ca.crt "${CONTROL_PLANE}": scp /etc/kubernetes/pki/apiserver-etcd-client.crt "${CONTROL_PLANE}": scp /etc/kubernetes/pki/apiserver-etcd-client.key "${CONTROL_PLANE}":- Замініть значення
CONTROL_PLANEнаuser@hostпершого вузла панелі управління.
- Замініть значення
Налаштуйте перший вузол панелі управління
Створіть файл із назвою
kubeadm-config.yamlіз наступним змістом:--- apiVersion: kubeadm.k8s.io/v1beta4 kind: ClusterConfiguration kubernetesVersion: stable controlPlaneEndpoint: "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" # змініть це (див. нижче) etcd: external: endpoints: - https://ETCD_0_IP:2379 # змініть ETCD_0_IP відповідно - https://ETCD_1_IP:2379 # змініть ETCD_1_IP відповідно - https://ETCD_2_IP:2379 # змініть ETCD_2_IP відповідно caFile: /etc/kubernetes/pki/etcd/ca.crt certFile: /etc/kubernetes/pki/apiserver-etcd-client.crt keyFile: /etc/kubernetes/pki/apiserver-etcd-client.keyПримітка:
Різниця між stacked etcd та external etcd полягає в тому, що налаштування external etcd потребує конфігураційного файлу з точками доступу etcd в обʼєктіexternalдляetcd. У випадку топології stacked etcd це вирішується автоматично.Замініть наступні змінні в шаблоні конфігурації на відповідні значення для вашого кластера:
LOAD_BALANCER_DNSLOAD_BALANCER_PORTETCD_0_IPETCD_1_IPETCD_2_IP
Наступні кроки схожі на налаштування stacked etcd:
Виконайте команду
sudo kubeadm init --config kubeadm-config.yaml --upload-certsна цьому вузлі.Запишіть вихідні команди для приєднання, які повертаються, у текстовий файл для подальшого використання.
Застосуйте обраний вами втулок CNI.
Примітка:
Ви повинні вибрати мережевий втулок, який відповідає вашому випадку використання та розгорнути його, перш ніж перейдете до наступного кроку. Якщо цього не зробити, ви не зможете належним чином запустити ваш кластер.
Кроки для інших вузлів панелі управління
Кроки аналогічні налаштуванню для stacked etcd:
- Переконайтеся, що перший вузол панелі управління повністю ініціалізований.
- Приєднайте кожен вузол панелі управління за допомогою команди приєднання, яку ви зберегли в текстовий файл. Рекомендується приєднувати вузли панелі управління по одному.
- Не забудьте, що ключ розшифрування з параметром
--certificate-keyдіє дві години.
Загальні завдання після налаштування панелі управління
Встановлення робочих вузлів
Робочі вузли можна приєднати до кластера за допомогою команди, яку ви зберегли раніше як вивід з команди kubeadm init:
sudo kubeadm join 192.168.0.200:6443 --token 9vr73a.a8uxyaju799qwdjv --discovery-token-ca-cert-hash sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866
Ручне поширення сертифікатів
Якщо ви вирішили не використовувати kubeadm init з параметром --upload-certs, це означає, що вам доведеться вручну скопіювати сертифікати з первинного вузла панелі управління до приєднуваних вузлів панелі.
Є багато способів це зробити. У наступному прикладі використовуються ssh та scp:
SSH потрібен, якщо ви хочете керувати всіма вузлами з одного пристрою.
Активуйте ssh-agent на своєму основному пристрої, який має доступ до всіх інших вузлів в системі:
eval $(ssh-agent)Додайте свій SSH-ідентифікатор до сеансу:
ssh-add ~/.ssh/path_to_private_keyПеремикайтесь між вузлами, щоб перевірити, чи зʼєднання правильно працює.
Коли ви входите в будь-який вузол через SSH, додайте прапорець
-A. Цей прапорець дозволяє вузлу, на який ви увійшли за допомогою SSH, отримувати доступ до агента SSH на вашому ПК. Розгляньте альтернативні методи, якщо ви не повністю довіряєте безпеці вашої сесії користувача на вузлі.ssh -A 10.0.0.7Коли використовуєте sudo на будь-якому вузлі, обовʼязково зберігайте середовище, щоб SSH forwarding працював:
sudo -E -s
Після налаштування SSH на всіх вузлах ви повинні запустити наступний скрипт на першому вузлі панелі управління після запуску
kubeadm init. Цей скрипт скопіює сертифікати з першого вузла панелі управління на інші вузли панелі:У наступному прикладі замініть
CONTROL_PLANE_IPSна IP-адреси інших вузлів панелі управління.USER=ubuntu # налаштовується CONTROL_PLANE_IPS="10.0.0.7 10.0.0.8" for host in ${CONTROL_PLANE_IPS}; do scp /etc/kubernetes/pki/ca.crt "${USER}"@$host: scp /etc/kubernetes/pki/ca.key "${USER}"@$host: scp /etc/kubernetes/pki/sa.key "${USER}"@$host: scp /etc/kubernetes/pki/sa.pub "${USER}"@$host: scp /etc/kubernetes/pki/front-proxy-ca.crt "${USER}"@$host: scp /etc/kubernetes/pki/front-proxy-ca.key "${USER}"@$host: scp /etc/kubernetes/pki/etcd/ca.crt "${USER}"@$host:etcd-ca.crt # Пропустіть наступний рядок, якщо використовуєте зовнішній etcd scp /etc/kubernetes/pki/etcd/ca.key "${USER}"@$host:etcd-ca.key doneУвага:
Копіюйте лише сертифікати в переліку вище. kubeadm буде опікуватись генеруванням решти сертифікатів з необхідними SAN для приєднання екземплярів панелі управління. Якщо ви помилитесь при копіюванні всіх сертифікатів, створення додаткових вузлів може зазнати невдачі через відсутність необхідних SAN.Потім на кожному приєднуваному вузлі панелі управління вам слід виконати наступний скрипт перед виконанням
kubeadm join. Цей скрипт перемістить раніше скопійовані сертифікати з домашньої теки в/etc/kubernetes/pki:USER=ubuntu # налаштовується mkdir -p /etc/kubernetes/pki/etcd mv /home/${USER}/ca.crt /etc/kubernetes/pki/ mv /home/${USER}/ca.key /etc/kubernetes/pki/ mv /home/${USER}/sa.pub /etc/kubernetes/pki/ mv /home/${USER}/sa.key /etc/kubernetes/pki/ mv /home/${USER}/front-proxy-ca.crt /etc/kubernetes/pki/ mv /home/${USER}/front-proxy-ca.key /etc/kubernetes/pki/ mv /home/${USER}/etcd-ca.crt /etc/kubernetes/pki/etcd/ca.crt # Пропустіть наступний рядок, якщо використовуєте зовнішній etcd mv /home/${USER}/etcd-ca.key /etc/kubernetes/pki/etcd/ca.key