План установки:
- Разворачивание мастер-ноды Kubernetes
- Создание шаблона CloudInit с Ubuntu 20.04
- Создание шаблона для Kubernetes нод
- Создание и настройка Master-ноды
- Создание и подключение Worker-нод к Master-ноде
- Настройка кластера
- Установка MetalLB
- Установка ingress-контролера Nginx
- Установить менеджера сертификатов cert-manager
- Установка Rancher
- Установка 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.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
|
И убеждаемся что наша мастер-нода готова:
Мастер-нода должна иметь статус 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 Настройка кластера
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 кластера можно считать законченной