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».