База знаний

Установка RKE2 в сетях проекта CLO вручную

RKE2 (Rancher Kubernetes Engine) — это дистрибутив Kubernetes, поставляемый и запускаемый целиком в виде контейнерного приложения (Docker). Использование RKE позволяет избежать сложностей, связанных с установкой и первоначальной настройкой Kubernetes.

После установки RKE2 в соответствии с официальным руководством внутренняя сеть между нодами может не работать при подключении дополнительных нод к кластеру. Чтобы избежать этой проблемы, выполните установку RKE2 вручную с помощью приведённой ниже инструкции.

Примечание. Установка RKE2 через Rancher Manager не приводит к такой ошибке.

Пример установки RKE2 вручную

Конфигурация сервера

В данном примере используется следующая конфигурация:

  • Сервер: Ubuntu 22
  • control plane: 2 CPU, 4Gb RAM, 20 Gb диск , 1 внешний IP-адрес 
  • worker: 6 CPU, 8Gb RAM, 80 Gb диск, 1 внешний IP-адрес

Установка ноды control plane

В первую очередь установите ноду control plane. Для этого выполните следующие действия:

  • Подключитесь к ноде через SSH
  • Создайте конфигурационный файл:
cat <<EOF >>config.server.yaml

write-kubeconfig-mode: "0644"
node-ip:
  - [внутренний адрес ноды control plane]
node-external-ip:
  - [внешний адрес ноды control plane]
advertise-address:
  - [внутренний адрес ноды control plane>]
cni:
  - calico
disable:
  - rke2-canal
EOF

Примечание. Узнать внутренний и внешний IP-адреса ноды можно через Личный кабинет в списке серверов, или введя в консоли управления сервером команду ip a.

  • Выполните команды конфигурирования сервера

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

mkdir -p /etc/rancher/rke2/

cp config.server.yaml /etc/rancher/rke2/config.yaml

export KUBECONFIG=/etc/rancher/rke2/rke2.yaml

export PATH=$PATH:/var/lib/rancher/rke2/bin

systemctl enable --now rke2-server.service

Примечание. Запуск RKE2 в среднем занимает около 5 минут.

  • Проверить статус RKE2 можно с помощью следующих команд:

journalctl -u rke2-server -f
kubectl cluster-info

  • Получите токен авторизации для подключения нод к кластеру

cat /var/lib/rancher/rke2/server/node-token

Внимание! Сохраните строку вывода вышеприведённой команды — это токен, который понадобится для подключения каждой ведомой ноды!

Установка ноды worker plane

  • На ведомой ноде кластера создайте конфигурационный файл:
cat <<EOF >>config.agent.yaml 

server: https://[внутренний ip адрес control-plane]:9345
token: [токен]
node-ip:
  - <внутренний адрес ноды worker>
node-external-ip:
  - <внешний адрес ноды worker>
cni:
  - calico
disable:
  - rke2-canal
EOF

Примечание. Поле «токен» в конфигурационном файле заменяется на токен, полученный выводом последней команды cat при конфигурировании сервера control node (см. выше).

  • Установите агент с помощью следующих команд:

curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE="agent" sh -

mkdir -p /etc/rancher/rke2/

cp config.agent.yaml /etc/rancher/rke2/config.yaml

systemctl enable --now rke2-agent.service

  • Проверьте статус подключения рабочей ноды на сервере control node с помощью команды

kubectl get nodes

Эта команда выведет список нод, подключенных к кластеру.

  • Назначьте статус для рабочей ноды

kubectl label nodes worker node-role.kubernetes.io/worker=true

Пример: Развёртывание приложений в кластере RKE2 с помощью манифеста

Здесь приведён пример манифеста, разворачивающего в кластере RKE2 приложение из образа Docker. Манифест разворачивает приложение, открывает к нему доступ через Ingress и настраивает масштабирование.

Примечание. В данном примере манифеста используется приложение Simple Web из Docker-образа:

yeasy/simple-web:latest

Вместо указанного приложения может быть использован любой другой образ и приложение, отвечающее на запросы HTTP через порт 80.

Чтобы развернуть приложение в кластере, выполните следующие действия:

  • Создайте файл манифеста

#cat kubeplay.yaml

  • Введите содержание манифеста
apiVersion: apps/v1
kind: Deployment
metadata:
 name: kubeplay
 namespace: default
spec:
 selector:
   matchLabels:
     run: kubeplay
 replicas: 1
 template:
   metadata:
     labels:
       run: kubeplay
   spec:
     containers:
     - name: kubeplay
       image: yeasy/simple-web:latest
       ports:
       - containerPort: 80
       resources:
         limits:
           cpu: 500m
         requests:
           cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
 name: kubeplay
 namespace: default
 labels:
   run: kubeplay
spec:
 ports:
 - port: 80
 selector:
   run: kubeplay
---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
 name: kubeplay
 namespace: default
spec:
 scaleTargetRef:
   apiVersion: apps/v1
   kind: Deployment
   name: kubeplay
 minReplicas: 1
 maxReplicas: 10
 targetCPUUtilizationPercentage: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web
  namespace: default
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: "/"
spec:
  rules:
  - http:
      paths:
      - path: "/"
        pathType: Prefix
        backend:
          service:
            name: kubeplay
            port:
              number: 80
  • Посмотрите результат работы манифеста, введя в строку браузера адрес:

http://[внешний IP-адрес кластера]:80

Примечание. Статус развёрнутых реплик приложения можно посмотреть с помощью следующей команды:

root@rke01:~# kubectl get pods -o wide