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

Original author: kvaps
  • Translation
  • Tutorial

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


UPD: Эта статья писалась для v1.12 и несмотря на то, что она была адаптирована под v1.13, теперь процедура развертывания кластера выглядит намного проще и логичнее.
Посмотрите на это более простое руковоство.

на данный момент все может быть намного проще сейчас


Убедитесь, что на всех нодах установлены последние пакеты 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/v1beta1
kind: ClusterConfiguration
kubernetesVersion: stable
apiServer:
  certSANs:
  - "${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 init phase preflight
$kubeadm init phase certs all
$kubeadm init phase kubelet-start 
$kubeadm init phase kubeconfig kubelet
$kubeadm init phase etcd local
$kubeadm init phase kubeconfig admin
systemctl start kubelet

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


NODES="node2 node3"
CERTS=$(find /etc/kubernetes/pki/ -maxdepth 1 -name '*ca.*' -o -name '*sa.*')
ETCD_CERTS=$(find /etc/kubernetes/pki/etcd/ -maxdepth 1 -name '*ca.*')

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 init phase preflight
$kubeadm init phase certs all
$kubeadm init phase kubelet-start 
$kubeadm init phase kubeconfig kubelet
$kubeadm init 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 init phase kubeconfig all
$kubeadm init phase control-plane all
$kubeadm init phase mark-control-plane
$kubeadm init phase upload-config kubeadm

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


systemctl start keepalived
Share post

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 3

    +1
    И это все (и даже гораздо больше) одной командой делает Ansible Kubespray
      0
      +
        0
        Только тут ещё нет health check'ов. На случай, если сдохнет процесс apiserver на сервере, который будет выберется keepalived.

        Only users with full accounts can post comments. Log in, please.