Навчання Kubernetes через ручне налаштування кластера та його компонентів.

Kubernetes має дуже багато інструментів та жаргону, і це може бути дуже складно для сприйняття. Найкращий спосіб навчитися — це зрозуміти основні компоненти K8s та зібрати ці частини разом. Таким чином, ми зможемо отримати базове розуміння того, як це працює.

Огляд

Kubernetes — це портативна, розширювана, відкрита платформа для управління контейнеризованими навантаженнями та сервісами, яка забезпечує як декларативну конфігурацію, так і автоматизацію. Вона має велику та швидко зростаючу екосистему. Послуги Kubernetes, підтримка та інструменти широко доступні.

Я налаштовуватиму свій кластер k8s з нуля та вручну встановлюватиму кожен компонент для навчальних цілей. Я добровільно зайду в Камеру Таємниць, щоб зустріти Змію і замарати руки, насолоджуючись процесом.

Те, що нам потрібно найбільше, часто знаходиться там, де ми найменше хочемо шукати.

Основні компоненти.

В документації K8s це ключові компоненти Kubernetes.

pic

Основні компоненти Kubernetes

Контрольна площина.

etcd, kube-api-server, scheduler, controller manager та cloud controller manager.

Робочий вузол.

kubelet, kube-proxy, та container-runtime.

Я слідую цьому Посібнику.

Налаштування кластера k8s.

Я використовую AWS для налаштування кластера k8s, створюючи EC2 інстанси для контрольних площин і робочих вузлів. Встановлюватиму та налаштовуватиму кожен компонент там, де він повинен бути. Як показано на діаграмі нижче. Два інстанси для контрольних площин, два для робочих вузлів для високої доступності на випадок, якщо одна з машин вийде з ладу, і один інстанс, який буде служити балансувальником навантаження для k8s API, що знаходиться в контрольних площинах. Найкраща практика — це автоматичне масштабування, але я цього не робитиму цього разу.

pic

Кластер Kubernetes

Я використовую Terraform для створення цих інстансів і вручну встановлюватиму кожен компонент на контрольних площинах і робочих вузлах. Весь скрипт я опублікував у своєму репозиторії на GitHub (kubernetes-cluster-setup-manually).

Обчислювальні ресурси.

Скрипти Terraform знаходяться в compute-resources.

Після того, як інстанси будуть запущені, можна починати. Я використовую Ubuntu ami, типи інстансів t2.micro для балансувальника навантаження та робочих вузлів, а t2.medium для контрольних площин.

pic

Кластер K8s з 5 інстансів

Утиліти.

Я використовую інстанс k8-api-load-balancer як мій хост для переходу, де я маю генерувати сертифікати та інші конфігурації перед тим, як скопіювати їх на інші інстанси.
Встановлення цих скриптів utilities.sh та kubectl.sh для нашого інтерфейсу командного рядка, щоб взаємодіяти з k8s API як користувач.

Сертифікати.

Перше, що потрібно підготувати перед налаштуванням кластера k8s — це сертифікати, оскільки компоненти k8s і облікові записи сервісів потребують автентифікації для взаємодії з k8s API.

Ці скрипти: config.conf, ca.sh (для генерації ca.crt та ca.key) за допомогою openssl.

  1. Виконайте цей скрипт client-server-cert.sh для наших сертифікатів користувача admin та компонентів k8s.
  2. Після того як все згенеровано, розподіліть ці файли .key та .crt на інші інстанси за допомогою скриптів scp-to-control-planes.sh та scp-to-worker-nodes.sh

/etc/hosts.

Я оновив файл /etc/hosts на своїх п’яти інстансах, використовуючи hosts.txt.

Балансування навантаження між серверами контрольних площин.

У процесі підготовки до налаштування k8s API та інших компонентів контрольної площини я створюю проксі-сервер nginx для балансування навантаження між двома інстансами контрольних площин.

  1. Встановлення nginx через скрипт nginx.sh та створення конфігураційного файлу.
  2. Я також оновив файл /etc/nginx/nginx.conf, додавши рядок
    include /etc/nginx/tcpconf.d/*
  3. Потім перезавантажив nginx командою sudo nginx -s reload

Контрольні площини.

На даний момент все працює добре, я готовий почати налаштування компонентів контрольної площини на обох інстансах, призначених для цієї мети.

  1. Починаємо з etcd, сховище ключ-значення для даних кластера k8s.
    Завантаження скрипту (etcd.sh) та створення unit file, який буде управлятися за допомогою systemd.
  2. Скрипт kube-components.sh завантажить необхідні бінарні компоненти та перемістить їх в /usr/local/bin/. Також буде включено інструмент командного рядка kubectl.
  3. Генерація encryption-config.yaml, що буде виконано скриптом encryption.sh. K8s використовуватиме цей файл для шифрування даних на диску.
    4.
    Генерація kube-config.sh для організації доступу до кластера для компонентів контрольної площини, таких як scheduler, та controller manager. Скрипти також копіюють файли .crt, .key, .kubeconfig та encryption-config.yaml в каталог /var/lib/kubernetes/.

  4. Налаштування контрольної площини майже завершено, залишився лише unit file для apiserver.sh, kube-controller-manager.sh та kube-scheduler.sh.

  5. Все працює добре. Тепер, щоб запустити вище вказані сервіси, використовую скрипт start-kube-components.sh.

Примітка: Cloud controller manager виключено, оскільки це необов'язковий компонент.

pic

etcd статус

pic

виведення sudo etcdctl member list на одному з контрольних вузлів.

pic

статус сервісів kube-apiserver, kube-controller-manager і kube-scheduler.

Усі необхідні сервіси для компонентів контрольної площини працюють.

Тестування K8s API.

Використовуючи скрипт test-kubernetes-api.sh, я тестую k8s API за допомогою команд curl. Також тестую деякі команди kubectl.

pic

Це можна зробити як на контрольних площинах, так і на балансувальнику навантаження, де також необхідний скрипт admin-kube-config.sh.

Робочі вузли.

Оскільки робочі вузли ще не готові, команда kubectl get nodes --kubeconfig admin.kubeconfig покаже No resource found.

pic

отримання вузлів, якщо робочі вузли ще не готові.

Встановлення та налаштування компонентів робочих вузлів.

  1. Завантаження бінарних файлів та інсталяція, скрипт components.sh. Також встановлюю інструмент командного рядка kubectl за допомогою скрипту command line tool.
  2. Створення файлів конфігурації containerd config.toml і unit file скриптом containerd.sh.
  3. Створення файлів bridge.conf і loopback.conf для налаштування CNI мережі, скриптом network.sh.
  4. Генерація файлу kubeconfig.sh для kube-proxy та робочого вузла для взаємодії з k8s API.
    5.
    Створення unit files для kubelet(kubelet.sh) і kube-proxy.sh
  5. Застосування RBAC для доступу до k8s API з kubelet на робочих вузлах. Скрипт rbac-kubelet-auth.sh.
  6. Робочі вузли готові. Запуск сервісів за допомогою скрипта start-worker-components.sh.

Перевірка статусу трьох сервісів повинна показати їх як активні та працюючі:

pic

sudo systemctl status containerd kube-proxy kubelet

pic

kubectl get nodes — kubeconfig admin.kubeconfig

pic

І ось ми й дійшли до мети, кластер k8s з нуля працює!

pic

Фото від Zac Durant на Unsplash

Легкий шлях.

Весь цей процес налаштування кластера досить виснажливий, але він чудово підходить для навчання. У майбутньому більшість хмарних провайдерів, таких як AWS, мають свій EKS.

Також існує безліч інструментів для управління Kubernetes. Ось кілька з них, наприклад, Helm, Kubeadm, Minikube та інші.

Перекладено з: Learning Kubernetes by setting up a cluster and its components manually.