Here infrastructure template for kubeadm task. Uses Vagrant and ubuntu.

Deploy multi-masters HA cluster with kubeadm, vagrant and ubuntu.

Скрипты из этого репозитория облегчают процесс установления кластера производственного уровня.

Итак, в курсе мы выяснили, что самый простой сетап с высокой доступностью состоит из 6 элементов:

  • балансировщика
  • 3 мастер-нод
  • 2 рабочих узлов

Склонируй этот репо

В корне лежит Vagrantfile.

По умолчанию он настроен на создание 2 мастеров, 1 воркера и 1 лоадбаленсера.

git clone https://github.com/rotoro-cloud/kubeadm-cluster.git
cd kubeadm-cluster
vagrant up

Поднимутся VMs. Их адреса:

  • 192.168.66.1X - для мастеров
  • 192.168.66.2X - для рабочих
  • 192.168.66.30 - для балансировщика

Т.е. controlplane01 будет 192.168.66.11, controlplane02 будет 192.168.66.12 и т.д.

Но сачала давай познакомимся с окружением

Окружение

Ты можешь подключиться прямо к виртуальной машине с помощью

vagrant ssh node01

Или сделай команду:

vagrant ssh-config

Это покажет тебе адреса VMs, их порты ssh и пути к ключам, чтобы подключиться к ним из твоего любимого ssh-клиента.

Балансировщик

Для сетапа высокой доступности необходимый элемент, без него не будет полноценной HA. В этом сетапе мы используем HAproxy, давай ее настроим.

Выполняется в VM lb

sudo apt update
sudo apt install -y haproxy

Далее внесем правки в /etc/haproxy/haproxy.cfg, добавив в конец следующее:

frontend kubernetes-frontend
    bind 192.168.66.30:6443
    mode tcp
    option tcplog
    default_backend kubernetes-backend

backend kubernetes-backend
    mode tcp
    option tcp-check
    balance roundrobin
    server controlplane01 192.168.66.11:6443 check fall 3 rise 2
    server controlplane02 192.168.66.12:6443 check fall 3 rise 2
    server controlplane03 192.168.66.13:6443 check fall 3 rise 2

Теперь балансировщик будет пересылать трафик на один из трех мастеров. И он достаточно умный не послылать трафик, если мастер в данный момент недоступен.

sudo systemctl restart haproxy

Мы закончили с балансировщиком, он нам больше не понадобится.

Выполняется во всех VMs-нодах, и мастерах и воркерах

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

lsmod | grep br_netfilter

Если пусто, то:

sudo modprobe br_netfilter

После этого

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system

Далее подготовка среды выполнения контейнера. https://kubernetes.io/docs/setup/production-environment/container-runtimes/

У меня docker, поэтому:

wget get.docker.com
bash index.html
sudo systemctl enable docker
sudo usermod -aG docker vagrant

Теперь поставим kubeadm, kubelet и kubectl https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

Добавим нужные утилиты, хотя docker уже их должен был добавить:

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

Добавим ключи репозитория google и сам репо:

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 -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
Выполняется на самом первом мастере

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/ Проинициализируем мастер

sudo kubeadm init --control-plane-endpoint="192.168.66.30" --upload-certs --apiserver-advertise-address=192.168.66.11 --pod-network-cidr=10.244.0.0/16

Сразу сделаем себе доступ для kubectl:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Выполняется на других мастерах

Присоединим остальные матера командой из вывода kubeadm

sudo kubeadm join 192.168.66.30:6443 --apiserver-advertise-address=192.168.66.12...
Выполняется на воркерах

Присоединим остальные матера командой из вывода kubeadm

sudo kubeadm join 192.168.66.30:6443...
Последний шаг

Развернем сетевой плагин:

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"