mybpm!
Скачать в формате: PDF pdf DOCX word

Установка kubernetes с тремя мастерами и "плавающим" IP-мастера (продолжение)

Начало здесь

Структура кластера:

IP-сервера Назначение Название хоста в ssh
192.168.17.137 плавающий IP-адрес
192.168.17.131 первый мастер master1
192.168.17.132 второй мастер master2
192.168.17.133 третий мастер master3
192.168.17.134 первый рабочий worker4
192.168.17.135 второй рабочий worker5
192.168.17.136 третий рабочий worker6

5) Окончательная подготовка серверов

5.1) Настройка доменных имён

Необходимо, чтобы сервера будущего кластера могли обращаться друг к другу не только по IP-адресам, но и по доменам, равным их именам хостов (hostname). Для этого необходимо прописать домены в файле /etc/hosts на всех серверах следующим образом:

192.168.17.130 master0
192.168.17.131 master1
192.168.17.132 master2
192.168.17.133 master3
192.168.17.134 worker4
192.168.17.135 worker5
192.168.17.136 worker6

Пройдитесь по всем серверам и внесите эти строки в конец файла /etc/hosts - текущее содержание файла удалять нельзя.

Должно получиться что-то типа:

user@master1:~$ cat /etc/hosts
127.0.0.1 localhost

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

192.168.17.130 master0
192.168.17.131 master1
192.168.17.132 master2
192.168.17.133 master3
192.168.17.134 worker4
192.168.17.135 worker5
192.168.17.136 worker6

На всех серверах (мастерах и worker-ах).

5.2) Настройка плавающего IP-адреса - keepalived

Плавающий IP-адрес необходимо настраивать ТОЛЬКО на мастерах.

5.2.1) Устанавливаем keepalived

На всех мастерах устанавливаем программу:

sudo apt install -y keepalived
5.2.2) Настраиваем конфиг keepalived

На всех мастерах нужно создать конфиг

cat | sudo tee /etc/keepalived/keepalived.conf > /dev/null

С содержанием:

global_defs {
  enable_script_security
}

vrrp_script myhealth {
  script "/bin/nc -z -w 2 127.0.0.1 22"
  interval 10
  user nobody
}

vrrp_instance VI_1 {
  state MASTER
  interface enp0s3
  virtual_router_id 230
  priority 100
  advert_int 1
  nopreempt
  notify /etc/keepalived/keepalived-notify.sh root
  authentication {
    auth_type PASS
    auth_pass UmvGvLwCZV
  }
  virtual_ipaddress {
    192.168.17.137/16 dev enp0s3 label enp0s3:0
  }
  track_script {
    myhealth
  }
}

(Ctrl+D - чтобы записать файл и выйти)

ВНИМАНИЕ! в этом файле поменяйте IP адрес с маской подсети: 192.168.17.137/16 - на тот который используется у вас.

ВНИМАНИЕ! в этом файле поменяйте интерфейс enp0s3 на тот, который используется у вас

Этот файл на разных мастерах будет немного отличаться. Ниже в таблице указаны отличия

Сервер, на котором нужно поменять Найти строку Заменить её на
master1 MASTER MASTER
master1 priority 100 priority 100
master2 MASTER BACKUP
master2 priority 100 priority 99
master3 MASTER BACKUP
master3 priority 100 priority 98
5.2.3) Настраиваем файл оповещений

На всех мастерах нужно создать файл:

cat | sudo tee /etc/keepalived/keepalived-notify.sh > /dev/null

С содержанием:

#!/bin/sh
umask -S u=rwx,g=rx,o=rx
exec echo "[$(date -Iseconds)]" "$0" "$@" >>"/var/run/keepalived.$1.$2.state"

(Ctrl+D - чтобы записать файл и выйти)

И обеспечить его запуск:

sudo chmod +x /etc/keepalived/keepalived-notify.sh

Перезапустить сервис:

sudo systemctl restart keepalived

5.2) Установка cilium - ТОЛЬКО НА ОДНОМ МАСТЕРЕ: master1

Cilium - это сетевая инфраструктура Kubernetes. Её установка описана на странице:

https://docs.cilium.io/en/stable/gettingstarted/k8s-install-default/

В разделе "Install the Cilium CLI". Нужно выполнить команды от туда - здесь они повторены. Выполните:

CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/master/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/
cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}

Далее проверьте версию установленного клиента, выполнив команду:

cilium version

Должно вылететь что-то типа:

cilium-cli: v0.13.1 compiled with go1.20 on linux/amd64
cilium image (default): v1.13.0
cilium image (stable): v1.13.0
cilium image (running): unknown. Unable to obtain cilium version, no cilium pods found in namespace 
"kube-system"

6) Инициация кластера kubernetes на первом мастере

6.1) Инициализируем первый мастер

Теперь настало время инициировать кластер kubernetes на первом мастере. Заходим на первый мастер:

ssh master1

Создаём файл (в домашней директории):

cat > init-kube.sh

С содержимым:

#!/bin/bash
sudo kubeadm init --upload-certs --control-plane-endpoint=192.168.17.137 --node-name master1 
--pod-network-cidr=10.244.0.0/16

(Ctrl+D - чтобы записать файл и выйти)

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

Далее делаем файл исполняемым:

chmod +x init-kube.sh

И запускаем его:

./init-kube.sh

Данная команда скачает основные образы кластера из интернета и запустит их, в конце должна вылететь информация похожая на это:

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of the control-plane node running the following command on each as root:

kubeadm join 192.168.17.137:6443 --token ivge50.w197dx3p2dtfb84g \
    --discovery-token-ca-cert-hash sha256:48a40932495e2ca93b5042fce15e0109141dab2b40ef0056ff3a62dc7eeb83ee \
    --control-plane --certificate-key 981b3e7f4f5ef40cc15359b2802a5369ee56228acc02e1c9ac2e86061ed94516

Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.17.137:6443 --token ivge50.w197dx3p2dtfb84g \
    --discovery-token-ca-cert-hash sha256:48a40932495e2ca93b5042fce15e0109141dab2b40ef0056ff3a62dc7eeb83ee 

Данную информацию необходимо сохранить в файл

cat > result-init.txt

Далее выделите в терминале выше эту информацию и вставьте в эту команду, и нажмите Ctrl+D, чтобы записать её в файл и выйти.

После этого нужно настроить команду kubectl для этого нужно в терминале запустить команды:

 mkdir -p $HOME/.kube
 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
 sudo chown $(id -u):$(id -g) $HOME/.kube/config

6.2) Инициализируем сеть в кластере

Далее необходимо установить сеть в кластере, для этого нужно создать файл:

cat > cilium_install.bash

И вставить в него содержимое:

#!/bin/bash
cilium install --encryption ipsec

(Ctrl+D - чтобы записать файл и выйти)

Сделать файл запускаемым:

chmod +x cilium_install.bash

И запустить его:

./cilium_install.bash

После можно посмотреть результат установки кластера:

kubectl get pod --all-namespaces

Должно вылететь что-то типа такого:

NAMESPACE     NAME                               READY   STATUS    RESTARTS      AGE
kube-system   cilium-99nwc                       1/1     Running   0             75m
kube-system   cilium-operator-864b7b486c-v8bxm   1/1     Running   1 (65m ago)   105m
kube-system   cilium-rkpjg                       1/1     Running   0             64m
kube-system   coredns-787d4945fb-q8shx           1/1     Running   0             106m
kube-system   etcd-master3                       1/1     Running   0             65m
kube-system   kube-apiserver-master1             1/1     Running   1             107m
kube-system   kube-controller-manager-master1    1/1     Running   2 (65m ago)   107m
kube-system   kube-proxy-56fbm                   1/1     Running   0             75m
kube-system   kube-scheduler-master1             1/1     Running   3 (65m ago)   107m

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

6.3) Инициализация остальных мастеров и worker-ов

После инициализации первого мастера необходимо инициализировать второй мастер, выполнив на нём следующие команды:

ssh master2

kubeadm join 192.168.17.137:6443 --token ivge50.w197dx3p2dtfb84g \
    --discovery-token-ca-cert-hash sha256:48a40932495e2ca93b5042fce15e0109141dab2b40ef0056ff3a62dc7eeb83ee \
    --control-plane --certificate-key 981b3e7f4f5ef40cc15359b2802a5369ee56228acc02e1c9ac2e86061ed94516

exit

Третий мастер:

ssh master3

kubeadm join 192.168.17.137:6443 --token ivge50.w197dx3p2dtfb84g \
    --discovery-token-ca-cert-hash sha256:48a40932495e2ca93b5042fce15e0109141dab2b40ef0056ff3a62dc7eeb83ee \
    --control-plane --certificate-key 981b3e7f4f5ef40cc15359b2802a5369ee56228acc02e1c9ac2e86061ed94516

exit

Также нужно подключить к кластеру все worker-ы:

ssh workerN

kubeadm join 192.168.17.137:6443 --token ivge50.w197dx3p2dtfb84g \
    --discovery-token-ca-cert-hash sha256:48a40932495e2ca93b5042fce15e0109141dab2b40ef0056ff3a62dc7eeb83ee

И так для всех worker-ов.

ВНИМАНИЕ! Команды для подключения нужно брать из файла result-init.txt, который вы создали ранее

После этого можно посмотреть какие ноды подключены к кластеру, выполнив команду:

kubectl get node

Должно вылететь что-то типа:

NAME      STATUS   ROLES           AGE    VERSION
master1   Ready    control-plane   115m   v1.26.2
master2   Ready    control-plane   73m    v1.26.2
master3   Ready    control-plane   74m    v1.26.2
worker4   Ready    <none>          84m    v1.26.2
worker5   Ready    <none>          84m    v1.26.2
worker6   Ready    <none>          84m    v1.26.2

Все ноды должны иметь статус Ready, что обозначает, что они готовы к работе

Ну и команда:

kubectl get pod --all-namespaces -o wide

Должна выводить все ноды:

NAMESPACE   NAME                             READY STATUS  RESTARTS    AGE  IP             NODE    NOMINATED NODE READINESS GATES
kube-system cilium-99nwc                     1/1   Running 0           89m  192.168.17.134 worker4 <none>         <none>
kube-system cilium-hj4nl                     1/1   Running 0           89m  192.168.17.135 worker5 <none>         <none>
kube-system cilium-n2fbk                     1/1   Running 0           89m  192.168.17.136 worker6 <none>         <none>
kube-system cilium-operator-864b7b486c-v8bxm 1/1   Running 1 (79m ago) 119m 192.168.17.131 master1 <none>         <none>
kube-system cilium-psrx9                     1/1   Running 0           119m 192.168.17.131 master1 <none>         <none>
kube-system cilium-r7rnl                     1/1   Running 0           79m  192.168.17.133 master3 <none>         <none>
kube-system cilium-rkpjg                     1/1   Running 0           78m  192.168.17.132 master2 <none>         <none>
kube-system coredns-787d4945fb-j86bc         1/1   Running 0           121m 10.0.0.42      master1 <none>         <none>
kube-system coredns-787d4945fb-q8shx         1/1   Running 0           121m 10.0.0.91      master1 <none>         <none>
kube-system etcd-master1                     1/1   Running 1           121m 192.168.17.131 master1 <none>         <none>
kube-system etcd-master2                     1/1   Running 0           79m  192.168.17.132 master2 <none>         <none>
kube-system etcd-master3                     1/1   Running 0           79m  192.168.17.133 master3 <none>         <none>
kube-system kube-apiserver-master1           1/1   Running 1           121m 192.168.17.131 master1 <none>         <none>
kube-system kube-apiserver-master2           1/1   Running 1 (79m ago) 79m  192.168.17.132 master2 <none>         <none>
kube-system kube-apiserver-master3           1/1   Running 1 (79m ago) 79m  192.168.17.133 master3 <none>         <none>
kube-system kube-controller-manager-master1  1/1   Running 2 (79m ago) 121m 192.168.17.131 master1 <none>         <none>
kube-system kube-controller-manager-master2  1/1   Running 0           78m  192.168.17.132 master2 <none>         <none>
kube-system kube-controller-manager-master3  1/1   Running 0           77m  192.168.17.133 master3 <none>         <none>
kube-system kube-proxy-56fbm                 1/1   Running 0           89m  192.168.17.134 worker4 <none>         <none>
kube-system kube-proxy-9qx9k                 1/1   Running 0           121m 192.168.17.131 master1 <none>         <none>
kube-system kube-proxy-9ttjl                 1/1   Running 0           79m  192.168.17.133 master3 <none>         <none>
kube-system kube-proxy-k48m5                 1/1   Running 0           78m  192.168.17.132 master2 <none>         <none>
kube-system kube-proxy-r4b76                 1/1   Running 0           89m  192.168.17.136 worker6 <none>         <none>
kube-system kube-proxy-wm2qb                 1/1   Running 0           89m  192.168.17.135 worker5 <none>         <none>
kube-system kube-scheduler-master1           1/1   Running 3 (79m ago) 121m 192.168.17.131 master1 <none>         <none>
kube-system kube-scheduler-master2           1/1   Running 0           78m  192.168.17.132 master2 <none>         <none>
kube-system kube-scheduler-master3           1/1   Running 0           79m  192.168.17.133 master3 <none>         <none>

6.4) Необходимо открыть мастера для запуска на них рабочих подов

Для этого необходимо создать файл:

cat > masters-allow-pods.bash

И вставить в него содержимое:

#!/bin/bash
kubectl taint nodes --all node-role.kubernetes.io/control-plane-

Сделать этот файл исполняемым:

chmod +x masters-allow-pods.bash

И запустить его:

./masters-allow-pods.bash

Далее смотрите Развёртка платформы MyBPM на кластере kubernetes