Microk8s, еще один легковесный K8s

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.
Автор статьи: Рустем Галиев

IBM Senior DevOps Engineer & Integration Architect. Официальный DevOps ментор и коуч в IBM

В современном мире разработки и развертывания приложений, контейнеризация стала ключевым элементом для обеспечения масштабируемости, гибкости и надежности. В этом контексте технология Kubernetes, как ведущая платформа оркестрации контейнеров, становится неотъемлемым инструментом для управления и развертывания многокомпонентных приложений.

Microk8s предоставляет собой легковесное решение для установки и управления Kubernetes-кластером на локальной машине или в облаке, делая процесс эксплуатации контейнеризированных приложений доступным для широкого круга разработчиков и системных администраторов. В этой статье мы рассмотрим основные шаги быстрого старта с Microk8s, от установки до первого развертывания приложения, чтобы обеспечить эффективное использование Kubernetes в ваших проектах.

MicroK8s - отличный способ запустить и ознакомиться с Kubernetes. Это полностью совместимый, легковесный пакет Kubernetes, который работает на 42 видах Linux и идеально подходит для:

  • Рабочих станций разработчиков.

  • Интернета вещей (IoT).

  • Edge-вычислений.

  • Быстрого тестирования, экспериментирования и обучения.

Почему MicroK8s? Потому что:

  • Компактный. Разработчики хотят наименьший экземпляр Kubernetes для разработки на ноутбуках и рабочих станциях. MicroK8s предоставляет автономный экземпляр Kubernetes, совместимый с Azure Kubernetes Service, Amazon Elastic Kubernetes Service и Google Kubernetes Engine при запуске на Ubuntu.

  • Простой. Минимизация администрирования и операций с помощью установки единственного пакета без подвижных частей для обеспечения простоты и надежности. Все зависимости и необходимые компоненты включены.

  • Безопасны. Обновления доступны для всех проблем безопасности и могут быть применены немедленно или запланированы в соответствии с вашим циклом обслуживания.

  • Актуальный. MicroK8s отслеживает upstream и выпускает бета-версии, кандидаты в релиз и финальные версии в тот же день, что и upstream Kubernetes. Вы можете следить за последней версией Kubernetes или придерживаться любой версии релиза с 1.10 и выше.

  • Комплексный. MicroK8s включает в себя отобранный набор манифестов для общих возможностей и служб Kubernetes (например, meshes, observability, ingress, auto updates и привязки GPGPU).

Сегодня я расскажу, как:

  • Установить MicroK8s на Linux.

  • Использовать MicroK8s так же, как и другие кластеры Kubernetes.

  • Получить доступ к панели управления Kubernetes.

  • Добавить рабочие узлы в кластер MicroK8s.

Сперва определим версии кластера в переменных среды

MICROK8S_VERSION=1.24; KUBE_VERSION=1.24.0

Установим

snap install microk8s --classic --channel=$MICROK8S_VERSION/stable

Проверим работает ли все

Команда snap install не только устанавливает инструмент командной строки, но также запускает Kubernetes на нашу машину. Проверим его статус:

microk8s status --wait-ready | grep -z "microk8s is running"

После возврата статуса, у нас запущен одноузловой кластер Kubernetes. Давайте проверим версию Kubernetes:

microk8s kubectl version --output=yaml

Вы заметите, что команда microk8s привязывается к команде kubectl. Это сделано для того, чтобы убедиться, что контекст кластера microk8s передается в kubectl. Иногда удобнее создать alias:

alias mk='microk8s kubectl'

На данном этапе это просто обычный Kubernetes, поэтому вам нужны только kubectl, и, возможно, позже, helm. Поэтому лучше иметь готовый инструмент kubectl с установленным правильным контекстом. Загрузим соответствующую версию kubectl:

curl -LO https://dl.k8s.io/release/v${KUBE_VERSION}/bin/linux/amd64/kubectl

Установим

install -o root -g root -m 0755 kubectl /usr/bin/kubectl

Мы установим контекст kubectl в контекст microk8s:

microk8s config > $HOME/.kube/config

Проверочка

kubectl version && kubectl get nodes,namespaces

Автозавершение командной строки (также называемое завершением по вкладке или автозаполнением) - это распространенная функция интерпретаторов командной строки, при которой программа автоматически дополняет частично введенные команды. Некоторые люди испытывают затруднения с командной строкой и ее инструментами из-за множества команд, параметров и правил синтаксиса, которые нужно помнить. С функцией автозавершения, нескольких начальных букв команды или параметра часто достаточно для того, чтобы автозаполнение поняло, что вы имеете в виду, и завершило оставшуюся часть после быстрого запроса клавиши Tab.

kubectl используется настолько часто, что он становится громоздким, когда просто k было бы достаточно

echo 'alias k=kubectl' >>~/.bashrc
echo 'source <(kubectl completion bash)' >>~/.bashrc
echo 'complete -F __start_kubectl k' >>~/.bashrc
source ~/.bashrc

Все вышеописанное делает работу с командной строкой более продуктивной:

MicroK8s - одна из многих форм Kubernetes. Первичная установка представляет собой однокузловой кластер. Это часто подходит для быстрой разработки, экспериментирования, валидации и обучения. Получим общую информацию о статусе кластера:

{ clear && \
  echo -e "\n=== Kubernetes Status ===\n" && \
  kubectl get --raw '/healthz?verbose' && \
  kubectl version --short && \
  kubectl get nodes && \
  kubectl cluster-info; 
} | grep -z 'Ready\| ok\|passed\|running'

Проверим healtz эндпоинты controlplane

kubectl get --raw '/healthz?verbose' | grep ' ok'

На первый взгляд MicroK8s выглядит и ведет себя как другие кластеры Kubernetes. Сервер API Kubernetes (kube-apiserver) готов принимать наши команды:

kubectl get --raw /

Например, мы запрашиваем у API информацию о состоянии пространства имен по умолчанию:

kubectl get --raw /api/v1/namespaces/default | jq

Заглянем поглубже. Вы, вероятно, заметите, что MicroK8s выбрал некоторые альтернативные конфигурации для поддерживающих контроллеров controlplane Kubernetes. В отличие от других кластеров, вы увидите, что несколько cp работают в пространстве имен kube-system:

На данном этапе перечислен только Calico, который является интерфейсом контейнера по умолчанию (CNI) в MicroK8s. Другие ключевые компоненты cp, такие как etcd, CoreDNS, kube-apiserver, kube-proxy, kube-scheduler и kube-controller-manager, отсутствуют, однако кластер сообщает, что он здоров. Что происходит? Где они?

Архитекторы MicroK8s добавили эти ключевые контролирующие компоненты Kubernetes в виде служб-демонов, управляемых systemd:

systemctl list-units 'snap.microk8s.*' --no-pager

Они заменили etcd другим хранилищем данных под названием daemon-k8s-dqlite, также разработанным Canonical. MicroK8s часто ориентирован на установки на ноутбуки, в edge-среды и IoT, где ресурсы могут быть ограничены по сравнению с виртуальными машинами облачных предприятий.

Давайте расширим наш кластер, добавим ноды.

На этом cp ноде мы просим MicroK8s создать строку подключения:

microk8s add-node

Заджойним ноду с нашей второй машинки.

Существует разнообразие предварительно настроенных служб, которые можно быстро добавить в MicroK8s. Иметь их под рукой удобно. Вот список дополнительных служб:

microk8s status

Для разработки и локального тестирования часто сначала мы захотим добавить эти четыре службы Kubernetes:

microk8s enable dashboard dns registry metrics-server

Эти дополнительные службы будут запущены в подах:

kubectl get pods --namespace kube-system

С учетом вышесказанного, дэшборд теперь доступен как сервис ClusterIP:

Давайте получим к нему доступ через NodePort, создадим манифест:

apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-np
  namespace: kube-system
spec:
  type: NodePort
  ports:
  - port: 443
    protocol: TCP
    targetPort: 8443
    nodePort: 30000
  selector:
    k8s-app: kubernetes-dashboard

И задеплоим его:

kubectl apply -f dashboard-via-nodeport.yamlkubectl get services -A | grep -z "kubernetes-dashboard\|30000"

Теперь можно подключится к нашему дэшборду через ip нашей ноды по 30000 порту

Еще одним добавленным дополнением является metrics-server:

kubectl get services -A | grep -z "metrics-server"

При наличии этой службы мы можем получить доступ к некоторым данным метрик с использованием команды top:

kubectl top nodes && kubectl top pods -n kube-system

Эти метрики также отображаются в дэшборде. Можно ознакомиться с нодами и подами, чтобы увидеть метрики.

Если вы беспокоитесь о ресурсах, используемых MicroK8s, выведите базовые значения потребления памяти компонентов, когда кластер находится в тихом состоянии:

top -o %MEM -b -n1 | head -n 19

Для продолжения демонстрации того, что MicroK8s также, как и другие ваши кластеры Kubernetes, давайте запустим стандартное приложение. Все здесь применимо к стандартному Kubernetes и не является уникальным для MicroK8s.

Создадим Deployment:

kubectl create deployment my-nginx --image=nginx

И создадим к нему сервис вида Nodeport

kubectl expose deployment my-nginx --type=NodePort --port=80


Узнаем значение NodePort, присвоенное сервису:

PORT=$(kubectl get service my-nginx  -o jsonpath="{.spec.ports[0].nodePort}") && echo $PORT

Мы видим, что приложение NGINX реагирует ожидаемым образом:

curl http://host01:$PORT | grep -C1 "successfully"

Чтобы увидеть пример страницы NGINX в ее полном великолепии "hello-world", выведем службу на определенный NodePort, например, 32001:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: my-nginx
  name: public-nginx
spec:
  ports:
  - nodePort: 32001
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: my-nginx
  type: NodePort

И создадим

kubectl apply -f public-nginx.yaml


Переходим по ip ноды на 32001 порт и видим, что все работает:

Теперь, если нам пока не нужно работать с k8s, мы можем поставить кластер на паузу

microk8s stop

И снова его запустить, когда надо через microk8s start.

Как видите задеплоить и сконфигурировать легковесный Microk8s кластер достаточно несложно.

Статья подготовлена в преддверии старта курса "Инфраструктурная платформа на основе Kubernetes".

Источник: https://habr.com/ru/companies/otus/articles/794398/


Интересные статьи

Интересные статьи

Надоело, что одни пороги метрик настроены в Prometheus, другие в Zabbix, третьи еще в каком-то Zabbix? А когда трясет инфру и vCenter, то с vROps летят оповещения, причем те же самые о виртуалках, что...
Много лет назад я занимался созданием маленьких Flash игр и публиковал их на сайте Newgrounds. Сейчас я делаю полноценные игры для ПК.На сегодняшний день у меня 4 законченных коммерческих игр в Steam,...
Доброго времени суток, хабравчане! Я уверен, что все заметили, когда делали деплой своей программы через windeployqt.exe, программа зависит от разных динамических и qt'шных библиотек. ...
Доброго дня, товарищи! Во время пандемии у всех был выбор, что использовать для организации удаленного доступа. Я выбрал OpenVPN. Чтобы помочь другим, (в первую очередь себе, конечно), ...
Философское вступление Как известно, существует всего два метода для решения задач: Метод анализа или метод дедукции, или от общего к частному. Метод синтеза или метод индукции, или от...