Содержание

Настройка кластера Kubernetes на виртульных машинах в среде Proxmox VE 7.2

План установки:

  1. Разворачивание мастер-ноды Kubernetes
    1. Создание шаблона CloudInit с Ubuntu 20.04
    2. Создание шаблона для Kubernetes нод
    3. Создание и настройка Master-ноды
    4. Создание и подключение Worker-нод к Master-ноде
  2. Настройка кластера
    1. Установка MetalLB
    2. Установка ingress-контролера Nginx
    3. Установить менеджера сертификатов cert-manager
    4. Установка Rancher
    5. Установка Longhorn

1 Разворачивание мастер-ноды Kubernetes

Собственно мастер-нода мало чем отличается от воркеров в процессе установки, по этому после начальной установки всех необходимых пакетов ее можно будет использовать как шаблон для воркер-нод.

В данной статье не будет описания того как работать с Proxmox, подразумевается что у вас уже есть опыт работы с данным продуктом

1.1 Создание шаблона CloudInit с Ubuntu 20.04

Чтобы не заморачиваться каждый раз с долгой установкой системы создадим CloudInit-шаблон Ubuntu 20.04

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# Скачиваем образ
wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img

# Создаем новую ВМ
qm create 9000 --memory 2048 --cores 4 --net0 virtio,bridge=vmbr0 --name Ubuntu-20.04-CloudInit-template

# Импортируем загруженный образ диска в хранилище local-lvm
qm importdisk 9000 focal-server-cloudimg-amd64.img local-lvm

# Подключаем вновь созданный диск к ВМ
qm set 9000 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-9000-disk-0

# Подключаем CloudInit CD-ROM диск к ВМ
qm set 9000 --ide2 local-lvm:cloudinit

# Дополнительные параметры
qm set 9000 --boot c --bootdisk scsi0
qm set 9000 --serial0 socket --vga serial0

# Преобразуем в шаблон
qm template 9000

1.2 Создание шаблона для Kubernetes нод

Теперь создаем первую ВМ, в которой будет все необходимое для разворачивания ноды Kebernetes, которую мы затем так же преобразуем в шаблон

1
2
3
qm clone 9000 9001 --name kube-template --full --storage local-lvm
qm set 9001 --memory 4096 --agent enabled=1
qm resize 9001 scsi0 3G

Запускаем машину клона - манину 9001 и устанавливаем всё необходимаое, а именно - docker и kubernetes:

Qemu-agent:

1
sudo apt-get install qemu-guest-agent

Docker:

1
2
3
4
5
6
7
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

Kubernetes:

1
2
3
4
5
6
7
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl open-iscsi nfs-common
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install kubeadm=1.23.0-00 kubelet=1.23.0-00 kubectl=1.23.0-00 kubernetes-cni=0.8.7-00 
sudo apt-mark hold kubeadm kubectl kubelet kubernetes-cni

Выключаем нашу машину и делаем из нее шаблон:

1
qm template 9001

1.3 Создание и настройка Master-ноды

Теперь приступаем к созданию мастер-ноды Kubernetes:

1
2
qm clone 9001 100 --name kube-master --full --storage local-lvm
qm resize 100 scsi0 15G

Инициализация кластера:

Создаем файл параметров, заменив <server_ip_address> на свой:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
cat <<EOF >kubeadm-config-master.yaml
# kubeadm-config-master.yaml
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: cgroupfs
featureGates:
  NodeSwap: true
failSwapOn: false
memorySwap:
  SwapBehavior: LimitedSwap
---
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
api:
  advertiseAddress: <server_ip_address>
networking:
  podSubnet: 10.244.0.0/16
EOF

Запускаем процесс создания кластера:

1
sudo kubeadm init --config kubeadm-config-master.yaml --ignore-preflight-errors=swap

После успешной инициализации выполняем рекомендации по добавлению конфига для kubectl в конце вывода

Устанавливаем CNI (Container Network Interface):

1
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

И убеждаемся что наша мастер-нода готова:

1
kubectl get nodes

Мастер-нода должна иметь статус Ready

Для того чтобы работало автодополнение выполняем:

1
kubectl completion bash >/etc/bash_completion.d/kubectl

1.4 Создание и подключение Worker-нод к Master-ноде

Создаем соответствующие виртуальные машины:

1
2
3
4
5
6
7
8
qm clone 9001 101 --name kube-worker1 --full --storage local-lvm
qm resize 101 scsi0 40G

qm clone 9001 102 --name kube-worker2 --full --storage local-lvm
qm resize 102 scsi0 40G

qm clone 9001 103 --name kube-worker3 --full --storage local-lvm
qm resize 103 scsi0 40G

После запуска каждой из гостевых машин выполняем следующие действия:

1
2
3
sudo rm /etc/machine-id
sudo systemd-machine-id-setup
sudo reboot now

На мастер ноде получаем комманду для подключения выполнив:

1
sudo kubeadm token create --print-join-command

И затем используем полученную команду на воркерах:

1
sudo kubeadm join <ip_мастер_ноды>:6443 --token m2aw6a.czbgzvd4bqy2p3ed --discovery-token-ca-cert-hash sha256:537b55a1a82596580ddfcb0a9511b0ae3795e0a2ecfa6f8da44ac24f4da61553

2 Настройка кластера

2.1 Установка MetalLB

MetalLB нужен чтобы ingress-контроллер знал в каком диапазоне IP-адресов он может работать. В моем случае это будет лишь один адрес, но тем ни мение - на всякий случай, лучше чтобы он был. Для его установки, сначала, нам понадобится создать файл конфигурации, где вместо <IP_ingress-node> указать IP мастер-ноды:

1
2
3
4
5
6
7
8
9
cat <<EOF > metallb-values.yaml
# metallb-values.yaml
configInline:
  address-pools:
   - name: default
     protocol: layer2
     addresses:
     - <IP_ingress-node>/32
EOF

затем немного изменить конфигурацию сервиса kube-proxy

1
2
3
kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl apply -f - -n kube-system

после чего можно установить сам MetalLB по средствам helm. Для этого делаем слудующее:

1
2
helm repo add metallb https://metallb.github.io/metallb
helm install metallb metallb/metallb -f metallb-values.yaml --namespace metallb-system --create-namespace

2.2 Установка ingress-контролера Nginx

1
2
3
helm upgrade --install ingress-nginx ingress-nginx \
  --repo https://kubernetes.github.io/ingress-nginx \
  --namespace ingress-nginx --create-namespace

2.3 Установить менеджера сертификатов cert-manager

Данный менеджер упрощает, как следует из названия, процесс создания TLS-сертификатов. И на мой взгляд, просто необходим, если вы планируете публикацию сервисов в интернете с использованием центров сертификации, например - LetsEncrypt.

1
2
3
4
5
6
7
8
helm repo add jetstack https://charts.jetstack.io
helm repo update
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.6.1/cert-manager.crds.yaml
helm install \
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --version v1.6.1

Так же можно сразу создать эмитент для кластера, который будет подписывать наши сертификаты, на примере Let’s Encrypt. Для этого создаем манифест примерно такого содержания:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
cat <<EOF > letsencrypt-issuer.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt
spec:
  acme:
    # URL ACME сервера
    server: https://acme-v02.api.letsencrypt.org/directory
    # Email адрес используемый для ACME регистрации
    email: your@mail.com
    # Имя секрета используемого для хранения приватного ключа ACME-аккаунта
    privateKeySecretRef:
      name: letsencrypt
    # Добавление HTTP-01 challenge provider
    solvers:
    - http01:
        ingress:
          class: nginx
EOF
kubectl apply -f letsencrypt-issuer.yaml

Проверить список эмитентов можно выполнив kubectl get clusterissuers. Результат вывода примерно такой:

1
2
NAME          READY   AGE
letsencrypt   True    1h

2.4 Установка Rancher

1
2
3
4
5
6
helm repo add rancher-latest https://releases.rancher.com/server-charts/latest
helm install rancher rancher-latest/rancher \
  --namespace cattle-system \
  --set hostname=rancher.my.org \
  --set replicas=3 \
  --create-namespace

Как получить пороль будет написано после установки

2.5 Установка Longhorn

Установка Longhorn осуществляется в самом Rancher’e нажатием одной кнопки “Install”

На этом установку MVP Kubernetes кластера можно считать законченной