Поиск по сайту:

Как развернуть высокодоступный кластер 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.

Статьи по данной тематике: