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

в 11:38, , рубрики: devops, etcd, high availability, kubernetes, multimaster, кластер, системное администрирование

Эта статья является свободной интерпретацей официального руководства 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

Автор: kvaps

Источник

* - обязательные к заполнению поля