Автор статьи: Рустем Галиев
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. По ссылке вы сможете подробнее узнать о курсе, а также зарегистрироваться на бесплатный вебинар.
lazy_val
"Краевые сети" - это о чем?
shurup
Edge networks :)
demtcheko
Думаю, речь об edge computing, то есть вычисления и сеть в непосредственной близости к конечным устройствам. Фишка из IoT.