Как развернуть высокодоступный кластер Kubernetes с помощью k3sup |
Добро пожаловать в это руководство по развертыванию высокодоступного кластера Kubernetes с помощью k3sup. Но прежде чем мы углубимся в суть этого вопроса, нам нужно знать, что представляет собой этот инструмент.
Kubernetes – это бесплатный инструмент оркестрации контейнеров с открытым исходным кодом, получивший широкое распространение за последнее десятилетие. Он позволяет запускать приложения на кластере хостов, предлагая при этом другие преимущества, такие как автоматическое масштабирование, автоматическая упаковка контейнеров, самовосстановление, автоматическое развертывание и откат, оркестровка хранилища для обнаружения сервисов, балансировка нагрузки и т. д.
Существует несколько методов, которые можно использовать для развертывания кластера Kubernetes. К ним относятся Minikube, Kubeadm, Kubernetes on AWS (Kube-AWS), Amazon EKS, RKE2 и т. д.
Что такое k3sup?
Часто представители мира облачных вычислений оказываются в ситуациях, когда Kubernetes не справляется при работе в средах с ограниченными ресурсами. Простейшим решением этой проблемы является k3sup(произносится как «кетчуп»). Это легкий инструмент, который можно использовать для развертывания кластера Kubernetes в локальной или удаленной системе. Все, что вам нужно для развертывания, — это доступ по SSH и двоичный файл k3sup.
k3sup, разработанный Алексом Эллисом (основателем OpenFaaS ® и inlets), можно использовать для:
- Загрузка Kubernetes с помощью k3s на любую виртуальную машину вручную, во время CI или через
cloudinit
- Переход с нуля на
kubectl
с помощью k3s на Raspberry Pi (RPi), виртуальных машинах, AWS EC2, Packet bare-metal, DigitalOcean, Civo, Scaleway и т. д. - Получение рабочего
KUBECONFIG
из существующего кластера k3s. - Построение HA, мультимастера (серверного) кластера
- Объединение узлов в существующий кластер k3s с помощью
k3sup join
В этом руководстве мы развернем Kubernetes в режиме высокой доступности с архитектурой, аналогичной показанной ниже.
Предварительные условия установки
Для этого развертывания мы будем использовать 5 серверов, настроенных, как показано:
Hostname | IP Address | Role |
workstation | 192.168.205.2 | Workstation |
master1 | 192.168.205.11 | etcd, server |
master2 | 192.168.205.22 | etcd, server |
master3 | 192.168.205.4 | etcd, server |
worker1 | 192.168.205.12 | agent |
Прежде чем продолжить, убедитесь, что:
- На всех остальных серверах настроен SSH без пароля. Вам необходимо скопировать ключи SSH с вашей рабочей станции на все серверы.
ssh-copy-id remote_username@Remote_IP
Не забудьте заменить имя_удаленного_пользователя и Remote_IP соответствующим образом.
sudo
без пароля должен быть настроен на всех серверах, как показано ниже.
sudo vim /etc/sudoers
Отредактируйте права пользователя, как показано:
<username> ALL=(ALL) NOPASSWD:ALL
- Убедитесь, что
curl
установлен на всех узлах:
##On Debian/Ubuntu
sudo apt update && sudo apt install curl -y
##On CentOS/Rocky/Alma Linux
sudo yum install curl -y
Шаг 1. Установите k3sup в свою систему.
Чтобы установить k3sup, вам необходимо получить двоичный файл со страницы выпуска. На рабочей станции Linux вы можете легко получить двоичный файл с помощью команды:
curl -sLS https://get.k3sup.dev | sh
Теперь установите k3sup с помощью команды:
sudo install k3sup /usr/local/bin/
Проверьте установку командой:
$ k3sup --help
Usage:
k3sup [flags]
k3sup [command]
Examples:
# Install k3s on a server with embedded etcd
k3sup install \
--cluster \
--host $SERVER_1 \
--user $SERVER_1_USER \
--k3s-channel stable
# Join a second server
k3sup join \
--server \
--host $SERVER_2 \
--user $SERVER_2_USER \
--server-host $SERVER_1 \
--server-user $SERVER_1_USER \
--k3s-channel stable
.......
Шаг 2. Настройка кластера Kubernetes с несколькими главными узлами (HA)
Проверьте IP-адрес вашего сервера
$ ip ad
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 7a:b1:46:97:20:e7 brd ff:ff:ff:ff:ff:ff
altname enp0s18
inet 192.168.205.11/24 brd 192.168.205.255 scope global noprefixroute ens18
valid_lft forever preferred_lft forever
inet6 fe80::b86c:4229:16ad:d06/64 scope link noprefixroute
valid_lft forever preferred_lft forever
После установки k3sup вы можете настроить кластер Kubernetes с помощью команды со следующим синтаксисом:
k3sup install --ip <ip-of-server> --user <user-name> --local-path ~/.kube/config --context <mycontext>
Вместе с командой install
можно использовать несколько других опций. Это:
- –cluster: запускает сервер в режиме кластеризации с использованием встроенного etcd (встроенного HA).
- –skip-install: используется, если у вас уже установлен k3s. Вы запускаете эту команду, чтобы получить kubeconfig.
- –ssh-key: указывает конкретный путь к ключу SSH для удаленного входа в систему.
- –ssh-port: указывает альтернативный порт, например 2222. Порт по умолчанию — 22.
- –local: выполняет локальную установку без использования ssh.
- –local-path: по умолчанию — ./kubeconfig. Вы можете указать файл, в котором хотите сохранить kubeconfig вашего кластера. По умолчанию этот файл будет перезаписан.
- –merge: объединяет конфигурацию в существующий файл вместо перезаписи (например, чтобы добавить конфигурацию к конфигурации kubectl по умолчанию, используйте –local-path ~/.kube/config –merge).
- –context: значение по умолчанию — default, но вы также можете установить имя контекста kubeconfig.
- –k3s-extra-args: используется для передачи установщику k3s дополнительных аргументов, заключенных в кавычки. Например, –k3s-extra-args ‘–no-deploy traefik’
- –k3s-channel: устанавливает конкретную версию k3s в зависимости от канала, т.е. стабильную.
- –k3s-version: устанавливает конкретную версию k3s, т. е. v1.21.1.
- –datastore: используется для передачи строки подключения SQL флагу
--datastore-endpoint
k3s. Вы должны использовать формат, требуемый k3s в документации Rancher.
Дополнительные параметры можно получить, выполнив команду:
$ k3sup install --help
Install k3s on a server via SSH.
🐳 k3sup needs your support: https://github.com/sponsors/alexellis
Usage:
k3sup install [flags]
Examples:
# Simple installation of stable version, outputting a
# kubeconfig to the working directory
k3sup install --ip IP --user USER
# Merge kubeconfig into local file under custom context
k3sup install \
--host HOST \
--merge \
--local-path $HOME/.kube/kubeconfig \
--context k3s-prod-eu-1
.......
В этом руководстве мы настроим высокодоступный кластер Kubernetes со встроенным etcd. Для этого требуется кворум серверов (нечетное количество узлов, например 3 мастера).
1. Добавление первого сервера
Экспортируйте переменные первого сервера. Например:
export SERVER1_IP=192.168.205.11
export USER1=ubuntu
В этом примере я использовал удаленный IP-адрес как 192.168.205.11 и имя удаленного пользователя как ubuntu. Замените эти переменные своими.
Теперь инициализируйте кластер с первым сервером с помощью команды:
k3sup install \
--ip $SERVER1_IP \
--user $USER1 \
--cluster
Пример вывода:
Установите кубектл:
curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/ /bin
Экспортируйте конфигурацию:
export KUBECONFIG=`pwd`/kubeconfig
Или скопируйте его в путь конфигурации по умолчанию.
mkdir ~/.kube
sudo cp `pwd`/kubeconfig ~/.kube/config
sudo chown $USER:$USER ~/.kube/config
Проверьте, добавлен ли сервер:
$ kubectl get node
NAME STATUS ROLES AGE VERSION
master1 Ready control-plane,etcd,master 109s v1.24.4+k3s1
2. Добавление второго и третьего сервера
Теперь добавьте второй сервер. Начните с экспорта его переменных:
export SERVER2_IP=192.168.205.22
export USER2=ubuntu
Теперь присоединитесь к кластеру командой:
k3sup join \
--ip $SERVER2_IP \
--user $USER2 \
--server-user $USER1 \
--server-ip $SERVER1_IP \
--server
Присоединяйтесь к третьему серверу:
export SERVER3_IP=192.168.205.4
export USER3=debian
Используйте команду ниже, чтобы присоединиться к кластеру;
k3sup join \
--ip $SERVER3_IP \
--user $USER3 \
--server-user $USER1 \
--server-ip $SERVER1_IP \
--server
Теперь проверьте, добавлены ли узлы управления:
$ kubectl get node
NAME STATUS ROLES AGE VERSION
master1 Ready control-plane,etcd,master 7m32s v1.24.4+k3s1
master2 Ready control-plane,etcd,master 103s v1.24.4+k3s1
master3 Ready control-plane,etcd,master 19s v1.24.4+k3s1
Шаг 3. Присоедините рабочие узлы к кластеру.
Чтобы присоединить узлы агентов к вашему кластеру, экспортируйте переменные:
##variables of the agent
export AGENT1_IP=192.168.205.12
export AGENT1_USER=rocky9
##Variables for the Control Node
export SERVER1_IP=192.168.205.11
export USER1=ubuntu
Для систем на основе Rhel установите SELinux в разрешительный режим на агенте перед выполнением приведенной ниже команды соединения.
sudo setenforce 0
sudo sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config
Теперь добавьте агент, как показано:
k3sup join \
--user $AGENT1_USER \
--ip $AGENT1_IP \
--server-ip $SERVER1_IP \
--server-user $USER1
Проверьте, добавлен ли узел:
$ kubectl get node
NAME STATUS ROLES AGE VERSION
master1 Ready control-plane,etcd,master 32m v1.24.4+k3s1
master2 Ready control-plane,etcd,master 26m v1.24.4+k3s1
master3 Ready control-plane,etcd,master 25m v1.24.4+k3s1
worker1 Ready <none> 15s v1.24.4+k3s1
Шаг 4. Развертывание приложения в кластере Kubernetes
Чтобы проверить, работает ли созданный кластер Kubernetes должным образом, мы развернем образец приложения Nginx с помощью команды:
kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
EOF
Проверьте, работает ли модуль:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-544dc8b7c4-bztwj 1/1 Running 0 31s
nginx-deployment-544dc8b7c4-hzkw4 1/1 Running 0 31s
Теперь выставьте развертывание. Например, с NodePort:
$ kubectl expose deployment nginx-deployment --type=NodePort --port=80
service/nginx-deployment exposed
Получите порт, которому открыта служба.
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 40m
nginx-deployment NodePort 10.43.244.44 <none> 80:30200/TCP 5s
Если у вас работает брандмауэр, разрешите порт через него:
##For UFW
sudo ufw allow 30200
##For Firewalld
sudo firewall-cmd --add-port=30200/tcp --permanent
sudo firewall-cmd --reload
Проверьте, доступен ли сервис через порт. Используйте IP-адрес и порт узла для доступа к службе, как показано.
Книги по обучению администрированию Kubernetes:
- Лучшие книги по изучению Kubernetes
Вердикт
На этом заканчивается руководство о том, как развернуть высокодоступный кластер Kubernetes с помощью k3sup. Я надеюсь, что это помогло решить проблему, возникающую при установке Kubernetes в средах с ограниченными ресурсами.
Похожие сообщения:
- Как развернуть балансировщик нагрузки MetalLB в кластере Kubernetes
- Развертывание k0s Kubernetes в Rocky Linux 9 с помощью k0sctl
- Развертывание кластера HA Kubernetes в Rocky Linux 8 с помощью RKE2
- Установите MicroK8s Kubernetes на Rocky Linux 9/AlmaLinux 9.