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

0f2adabbc4fac5669993b0bf6ef605d8.jpgАвтор статьи: Рустем Галиев

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

02a3010c3b72bc16db6796132feb259d.png

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

437144d10539a1e67b0095374da0ba1e.png

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

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

186820410965cb71222bc782581d4d91.png

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

microk8s kubectl version --output=yaml

3e95d7f1ad67401af721b7563355f7f1.pngb8e8475fda70d8270350c3ce7f631932.png

Вы заметите, что команда 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

7dd3f345a8ca6eaefc847572d69aa3c1.png

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

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

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

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

f95a781deffc8912619e5d53402ecd8f.png

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'

ce1fa5a13a5f0e36921f3f95b1a63060.png

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

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

95f5c82f682835009d017a5f4cf75838.png

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

kubectl get --raw /

3b1ae124f4eaf490a895c7471b59038b.png

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

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

933dbf6ef71a5d00950a8903c61b2f3f.png

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

1641225fe61c4b94ce0ca7cccf7e319d.png

На данном этапе перечислен только 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

7a0245278ae320f377d66cadccaab892.png

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

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

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

microk8s add-node

098939b35d02c27a88ea7f10a0b2d2b9.png

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

e2f891d85abb3b9ff4f89c53b93c0d37.pngc8ba6f4a1e1dd018c697fcf9f8b34c7c.png

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

microk8s status

5a0bd8d3ecf1054e13e3dde7d36f7c02.png

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

microk8s enable dashboard dns registry metrics-server

b93c03390ad31de3a619e3a73a41bba2.png55fba65762ea73a2d0ce582d4cbc5944.png

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

kubectl get pods --namespace kube-system

eb4d3d5959436b81b9e44b4779129665.png

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

ffb624dbcd6cd44ea2cb12ff3802fb53.png

Давайте получим к нему доступ через 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"

95f1973271ed9ff5e542cebaf62823e3.png

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

3c33dfe2fb8abb272148eb3ff01fa674.png

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

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

2c7c4013cbf1fdf44b21b7ef09615138.png

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

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

5c57b7e2ce62939f596643adfc6699e3.png

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

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

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

dcffc027981b70c944bf09c84d7fb40f.png

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

Создадим Deployment:

kubectl create deployment my-nginx --image=nginx

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

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

7bca92b75c0960f0af38eff9d6aa740a.png


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

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

29ea3281669975cd1a4e77f677a869ed.png

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

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

12cebcb876cf46ee4fdc0986b9a0336f.png

Чтобы увидеть пример страницы 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 порт и видим, что все работает:

0d0065c3a2f914876fe77c72913f05e7.png

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

microk8s stop

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

f67b0d1de3175be3d4483c98ebe71c5b.png

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

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

© Habrahabr.ru