K3s как альтернатива K8s

от автора

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

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

Привет Хабр! Сегодня развернем и рассмотрим кластер K3s

Немного теории

K3s — проект, созданный Rancher Labs, который представляет собой легковесную и простую в установке версию Kubernetes. K3s предлагает решение для разработчиков, которые хотят использовать Kubernetes в своих проектах, но не хотят сталкиваться со сложностью установки и управления полной версией Kubernetes.

K3s — это дистрибутив Kubernetes, разработанный так, чтобы быть максимально легковесным, простым в установке и подходящим для развертывания на ресурсоограниченных системах. В отличие от полной версии Kubernetes, K3s стремится минимизировать использование ресурсов, что делает его идеальным выбором для развертывания на одном узле, в краевых сетях, IoT-устройствах и в других ситуациях, где ограничены вычислительные ресурсы.

Тут, все понятно, легкий кубер, погнали разворачивать.

Сперва скачаем shell-скрипт и запустим его.

curl -sfL https://get.k3s.io | sh -

Проверяем

k3s --version k3s kubectl version

Эта первая установка представляет собой кластер с одним узлом. Что часто идеально подходит для быстрой разработки, экспериментов, проверки и обучения. Проверим состояние узла кластера:

k3s kubectl get nodes | grep -z 'STATUS\|Ready'

Теперь инструменты командной строки K3s и kubectl установлены. Если у вас ранее не был установлен контекст kubectl, K3s kubectl станет вашим основным инструментом. Вы можете использовать те же команды, что и всегда, используя только kubectl:

kubectl get nodes -o wide

Мы проверяем статус мастера Kubernetes (устаревшая функция, которая все еще работает):

{ 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'

Давайте создадим псевдоним с завершением командной строки.

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

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

Это делает работу с CLI более продуктивной. Вместо полного ввода «k get events» (как показано ниже), вы можете ввести k get ev и нажать Tab.

Мы рассмотрим несколько команд инструментов k3s и kubectl, чтобы проверить состояние кластера.

Во-первых, мы взглянем на весь кластер с помощью команды cluster-info:

Мы видим, что Kubernetes API открыт на порту 6443, а стандартный CoreDNS и сервер Metrics присутствуют. Давайте проверим состояние мастера:

kubectl get pods,services --all-namespaces

Доступны компоненты и службы control plane или же мастера. При запущенном сервере метрик вы можете получить доступ к некоторым данным метрик с помощью команды top:

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

Если вас беспокоит объем памяти K3s, то:

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

Проверяем неймспейсы

kubectl get namespaces

На стороне Linux все библиотеки K3s находятся в каталоге lib:

tree -L 2 /var/lib/rancher/k3s

K3s работает как служба Linux и может быть проверена с помощью systemctl:

systemctl status k3s --no-pager

Статус K3s можно проверить:

k3s check-config

В Kubelet механизм выполнения контейнера containerd генерирует логи:

tail /var/lib/rancher/k3s/agent/containerd/containerd.log

Закончили проверять кластер, все хорошо, идем дальше.

Чтобы также показать вам, что K3s действительно похож на другие кластеры Kubernetes, давайте запустим стандартное приложение. Здесь нет ничего уникального для K3 и стандартного Kubernetes.

Создадим Deployment:

kubectl create deployment my-nginx --image=nginx

И как же без сервисов

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

И проверяем

k get pods,services

Получим значение 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», мы открываем Service для определенного 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

Откроем в браузере

Поскольку это обычный Kubernetes, мы можем установить другие полезные приложения, такие как Dashboard Kubernetes. Обычный способ установки панели мониторинга Kubernetes — через чарм Helm.

Добавим чарм

helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/ && helm repo list

Установим

helm install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard \   --version=5.11.0 \   --namespace kubernetes-dashboard \   --create-namespace \   --values dash-values.yaml

После того, как Dashboard pod сообщит о статусе «Running», к нему можно будет получить доступ:

kubectl get services,pods -n kubernetes-dashboard -l app.kubernetes.io/name=kubernetes-dashboard

Мы добавляем учетную запись службы администратора, чтобы предоставить Dashboard роли для доступа к ресурсам и объектам кластера, мы создаем файл dash-auth:

apiVersion: v1 kind: ServiceAccount metadata:   name: admin-user   namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata:   name: admin-user roleRef:   apiGroup: rbac.authorization.k8s.io   kind: ClusterRole   name: cluster-admin subjects: - kind: ServiceAccount   name: admin-user   namespace: kubernetes-dashboard

Создаем

kubectl apply -f dash-auth.yaml

Ну и когда нам кластер больше не нужен, можно будет его удалить с помощью скрипта uninstall_k3s.sh:

#!/bin/sh set -x [ $(id -u) -eq 0 ] || exec sudo $0 $@  /usr/local/bin/k3s-killall.sh  if command -v systemctl; then systemctl disable k3s systemctl reset-failed k3s systemctl daemon-reload fi if command -v rc-update; then rc-update delete k3s default fi  rm -f /etc/systemd/system/k3s.service rm -f /etc/systemd/system/k3s.service.env  remove_uninstall() { rm -f /usr/local/bin/k3s-uninstall.sh } trap remove_uninstall EXIT  if (ls /etc/systemd/system/k3s*.service || ls /etc/init.d/k3s*) >/dev/null 2>&1; then set +x; echo 'Additional k3s services installed, skipping uninstall of k3s'; set -x exit fi  for cmd in kubectl crictl ctr; do if [ -L /usr/local/bin/$cmd ]; then     rm -f /usr/local/bin/$cmd fi done  rm -rf /etc/rancher/k3s rm -rf /run/k3s rm -rf /run/flannel rm -rf /var/lib/rancher/k3s rm -rf /var/lib/kubelet rm -f /usr/local/bin/k3s rm -f /usr/local/bin/k3s-killall.sh  if type yum >/dev/null 2>&1; then yum remove -y k3s-selinux rm -f /etc/yum.repos.d/rancher-k3s-common*.repo elif type rpm-ostree >/dev/null 2>&1; then rpm-ostree uninstall k3s-selinux rm -f /etc/yum.repos.d/rancher-k3s-common*.repo elif type zypper >/dev/null 2>&1; then uninstall_cmd="zypper remove -y k3s-selinux" if [ "${TRANSACTIONAL_UPDATE=false}" != "true" ] && [ -x /usr/sbin/transactional-update ]; then     uninstall_cmd="transactional-update --no-selfupdate -d run $uninstall_cmd" fi $uninstall_cmd rm -f /etc/zypp/repos.d/rancher-k3s-common*.repo fi 

К3s удален

Однако Kubernetes лучше всего работает в компании со многими рабочими узлами. На рабочих нодах размещаются поды. Давайте еще установим K3s с подключим к нему рабочую ноду с хоста node01.

Для начала на первом хосте выполним:

curl -sfL https://get.k3s.io | INSTALL_K3S_SKIP_ENABLE=true INSTALL_K3S_SKIP_START=true sh -

Запустим k3s сервер

k3s server > /var/log/k3s_server.log 2>&1 &

И проверим наш, пока, одноузловой кластер

k3s kubectl get nodes | grep -z 'STATUS\|Ready'

Чтобы подключить рабочий узел к мастеру, нам потребуется токен узла K3s для доступа. Следующая команда получит токен и скопирует его как переменную среды bash для node01:

ssh -q node01 "echo \"export K3S_TOKEN=$(cat /var/lib/rancher/k3s/server/node-token)\" >> ~/.bashrc"

Теперь переходим на хост где будет наш воркер.

Установим k3s CLI

curl -sfL https://get.k3s.io | INSTALL_K3S_SKIP_ENABLE=true INSTALL_K3S_SKIP_START=true sh -

На этом node01 мы запустим агент K3s. Команде требуется два бита информации, чтобы присоединить node01 в качестве рабочего узла к мастеру:

  • URL-адрес API Kubernetes на узле мастере.

  • Токен узла для доступа к плоскости управления.

API Kubernetes находится здесь:

export K3S_URL=https://$(dig controlplane a +short | tail -n1):6443 && echo $K3S_URL

Мы получаем токен доступа из файла ~/.bashrc, который мы обновили несколькими командами выше:

source ~/.bashrc

Теперь у вас есть эти два бита информации для агента:

echo -e "\n\u001b[1;32mK3S_URL\u001b[0m=$K3S_URL\n\u001b[1;32mK3S_TOKEN\u001b[0m=$K3S_TOKEN\n"

Давайте установим и запустим агент:

k3s agent --server $K3S_URL --token $K3S_TOKEN > /var/log/k3s_agent.log 2>&1 &

Вернемся на хост с мастером и проверим ноды

k3s kubectl get nodes | grep -z 'STATUS\|Ready'

Запустим под на воркере

kubectl create deployment my-nginx --image=nginx  kubectl get pods -o wide

K3s — это гибкое и простое в установке решение для развертывания Kubernetes, которое подходит для различных сценариев. Он идеально подходит для ресурсоограниченных сред, тестирования, разработки, демонстраций и работы с краевыми сетями. Однако, стоит помнить, что наиболее подходящее решение зависит от ваших конкретных потребностей и требований к кластеру Kubernetes. K3s предоставляет отличный вариант для тех, кто ищет легковесное и быстрое решение для своих проектов.

Статья подготовлена в преддверии старта курса Инфраструктурная платформа на основе Kubernetes. По ссылке вы сможете подробнее узнать о курсе, а также зарегистрироваться на бесплатный вебинар.


ссылка на оригинал статьи https://habr.com/ru/companies/otus/articles/751752/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *