Эта статья является свободной интерпретацей официального руководства 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 BACKUP
interface eth0
virtual_router_id 1
priority 100
advert_int 1
nopreempt
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