Разворачиваем Kubernetes HA-кластер на Baremethal с помощью Kubeadm и Keepalived (простое руководство)

от автора

Эта статья является свободной интерпретацей официального руководства Creating Highly Available Clusters with kubeadm для Stacked control plane nodes. Мне не нравятся сложный язык и примеры использованные в нем, поэтому я написал свое руководство.

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

Вводные данные

У нас есть 3 ноды:

  • node1 (10.9.8.11)
  • node2 (10.9.8.12)
  • node3 (10.9.8.13)

Мы сделаем для них один отказоустойчивый IP-адрес:

  • 10.9.8.10

Затем установим кластер etcd и Kubernetes на них.

Настройка балансировщика

Первым делом нам нужно установить Keepalived на все три ноды:

apt-get -y install keepalived

Теперь запишем конфиг /etc/keepalived/keepalived.conf:

vrrp_instance VI_1 {     state MASTER     interface eth0     virtual_router_id 1     priority 100     advert_int 1     authentication {         auth_type AH         auth_pass iech6peeBu6Thoo8xaih     }     virtual_ipaddress {         10.9.8.10     } }

Активируем и запустим Keepalived на всех трех нодах:

systemctl start keepalived systemctl enable keepalived

Теперь мы можем проверить, что одна из нод получила адрес 10.9.8.10 на интерфейсе eth0.

Разворачиваем Kubernetes кластер.

Убедитесь, что на всех нодах установлены последние пакеты Kubernetes:

apt-get -y install kubeadm kubelet kubectl

Так же остановите Keepalived демон на всех нодах кроме последней.

systemctl stop keepalived

Первая нода

Теперь мы сгенерируем конфиг для kubeadm:

CLUSTER_IP=10.9.8.10 NODES=(node1 node2 node3) IPS=(10.9.8.11 10.9.8.12 10.9.8.13) POD_SUBNET="192.168.0.0/16"  for i in "${!NODES[@]}"; do   HOST=${IPS[$i]}   NAME=${NODES[$i]}   INITIAL_CLUSTER=$(     for j in "${!NODES[@]}"; do       echo "${NODES[$j]}=https://${IPS[$j]}:2380"     done | xargs | tr ' ' ,   )  cat > kubeadm-config-${NODES[$i]}.yaml <<EOT apiVersion: kubeadm.k8s.io/v1alpha3 kind: ClusterConfiguration kubernetesVersion: stable apiServerCertSANs: - "${CLUSTER_IP}" controlPlaneEndpoint: "${CLUSTER_IP}:6443" etcd:   local:     extraArgs:       initial-cluster: "${INITIAL_CLUSTER}"       initial-cluster-state: new       name: ${NODES[$i]}       listen-peer-urls: "https://${IPS[$i]}:2380"       listen-client-urls: "https://127.0.0.1:2379,https://${IPS[$i]}:2379"       advertise-client-urls: "https://${IPS[$i]}:2379"       initial-advertise-peer-urls: "https://${IPS[$i]}:2380"     serverCertSANs:       - "${NODES[$i]}"       - "${IPS[$i]}"     peerCertSANs:       - "${NODES[$i]}"       - "${IPS[$i]}" networking:     podSubnet: "${POD_SUBNET}" EOT done

Инициируем etcd на первой ноде, сгенерируем сертификаты и admin-config

kubeadm="kubeadm --config=kubeadm-config-${HOSTNAME}.yaml" $kubeadm alpha phase preflight master $kubeadm alpha phase certs all $kubeadm alpha phase kubelet config write-to-disk $kubeadm alpha phase kubelet write-env-file $kubeadm alpha phase kubeconfig kubelet $kubeadm alpha phase etcd local $kubeadm alpha phase kubeconfig admin systemctl start kubelet

Скопируем сгенерированные сертификаты и kubeadm конфиги на остальные control plane ноды.

NODES="node1 node2" CERTS=$(find /etc/kubernetes/pki/ -maxdepth 1 -name '*ca.*' -o -name '*sa.*') ETCD_CERTS=$(find /etc/kubernetes/pki/etcd/ -maxdepth 1 -name '*ca.*' -o -name '*sa.*')  for NODE in $NODES; do   ssh $NODE mkdir -p /etc/kubernetes/pki/etcd   scp $CERTS $NODE:/etc/kubernetes/pki/   scp $ETCD_CERTS $NODE:/etc/kubernetes/pki/etcd/   scp /etc/kubernetes/admin.conf $NODE:/etc/kubernetes   scp kubeadm-config-$NODE.yaml $NODE: done

Вторая нода

Инициируем etcd на второй ноде:

kubeadm="kubeadm --config=kubeadm-config-${HOSTNAME}.yaml" $kubeadm alpha phase preflight master $kubeadm alpha phase certs all $kubeadm alpha phase kubelet config write-to-disk $kubeadm alpha phase kubelet write-env-file $kubeadm alpha phase kubeconfig kubelet $kubeadm alpha phase etcd local systemctl start kubelet

Третья нода

Инициируем Kubernetes master с etcd на последней ноде.

(убедитесь что IP балансировщика установлен и указывает на эту ноду)

kubeadm init --config kubeadm-config-${HOSTNAME}.yaml

Первая и вторая ноды

Теперь мы можем инициировать Kubernetes master на первых двух нодах:

kubeadm="kubeadm --config=kubeadm-config-${HOSTNAME}.yaml" $kubeadm alpha phase kubeconfig all $kubeadm alpha phase controlplane all $kubeadm alpha phase kubelet config annotate-cri $kubeadm alpha phase mark-master

А также запустить демон Keepalived:

systemctl start keepalived


ссылка на оригинал статьи https://habr.com/post/427941/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *