Эта статья является свободной интерпретацей официального руководства 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
celebrate
И это все (и даже гораздо больше) одной командой делает Ansible Kubespray