Thank you for reading this post, don't forget to subscribe!
Восстановление кластера kubernetes
Kubernetes имеет 3 различных роли: master ноды, ноды etcd и worker ноды.
Часто роли masters и etcd объединены, и имеют репликацию в HA кластерах.
Отказы отдельных нод не приведут к катастрофическим последствиям, но необходимо как можно быстрее восстановить работоспособность кластера, чтобы предотвратить дальнейшие отказы.
Нода с ролью etcd не работоспособна
Проверим статус компонентов с помощью утилиты kubectl
1 |
kubectl get cs |
1 2 3 4 5 6 |
NAME STATUS MESSAGE scheduler Healthy ok controller-manager Healthy ok etcd-2 Healthy {"health": "true"} etcd-0 Healthy {"health": "true"} etcd-1 Unhealthy Client.Timeout exceeded while awaiting headers |
Видно, что один узел etcd не доступен, при этом количество нод etcd должно быть нечетным, и одна из нод является "лидером".
При этом кластер может продолжать работать в режиме потери одной ноды из трех.
Создайте новую ноду, установите etcd, но не запускайте его.
1 |
yum -y install etcd |
Следующий шаг, на одной из рабочих нод etcd удалите отказавший узел etcd из кластера и добавьте IP-адрес нового узла, проверьте пути к сертификатам, и обратите внимание на добавление префикса "member" перед именем ноды в названии сертификата
1 2 3 |
etcdctl member list --endpoints https://127.0.0.1:2379 --cacert=/etc/ssl/etcd/ssl/ca.pem \ --cert=/etc/ssl/etcd/ssl/member-k8s-01-node01.pem \ --key=/etc/ssl/etcd/ssl/member-k8s-01-node01-key.pem |
1 2 3 |
10b576500ed6ae71: name=k8s-01-node01 peerURLs=https://10.0.0.1:2380 clientURLs=https://10.0.0.1:2379 isLeader=false 30bcb5f2f4c16805: name=k8s-01-node02 peerURLs=https://10.0.0.2:2380 clientURLs=https://10.0.0.2:2379 isLeader=false a908b0f9f06a7127: name=k8s-01-node03 peerURLs=https://10.0.0.3:2380 clientURLs=https://10.0.0.3:2379 isLeader=true |
1 2 3 4 |
etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/ssl/etcd/ssl/ca.pem \ --cert=/etc/ssl/etcd/ssl/member-k8s-01-node01.pem \ --key=/etc/ssl/etcd/ssl/member-k8s-01-node01-key.pem \ member remove 30bcb5f2f4c16805 |
1 |
etcdctl member add k8s-01-node04 --peer-urls=http://10.0.0.4:2380 |
после чего на новой ноде исправьте конфигурационный файл и запустите etcd
1 |
vi /etc/etcd/etcd.conf |
1 2 3 |
ETCD_NAME="k8s-01-node04" ETCD_INITIAL_CLUSTER="k8s-01-node01=https://10.0.0.1:2380,k8s-01-node03=https://10.0.0.3:2380,k8s-01-node04=https://10.0.0.4:2380" ETCD_INITIAL_CLUSTER_STATE=existing |
1 |
systemctl enable etcd |
1 |
systemctl start etcd |
теперь на каждой master ноде введите команду
1 |
kube-apiserver --etcd-servers=https://10.0.0.1:2380,k8s-01-node03=https://10.0.0.3:2380,k8s-01-node04=https://10.0.0.4:2380 |
Нода с ролью masters не работоспособна
проверка, статус всех нод должен быть ready
1 |
kubectl get nodes |
1 2 3 4 5 6 |
NAME STATUS AGE VERSION k8s-01-node01 Ready 21h v1.7.2 k8s-01-node02 NotReady 20h v1.7.2 k8s-01-node03 Ready 20h v1.7.2 k8s-01-node04 Ready 17h v1.7.2 k8s-01-node05 Ready 17h v1.7.2 |
подготовьте новую ноду, настройте ОС, firewall, swap и т.д., установите docker, kubelet, kubeadm, kubectl. И добавьте ее в кластер, как worker ноду (kubeadm join)
после ввода в кластер поставим метку master и запретим принимать пользовательские поды
1 |
kubectl label nodes kube-master-4 node-role.kubernetes.io/master= |
1 |
kubectl taint nodes kube-master-4 node-role.kubernetes.io/master=:NoSchedule |
далее необходимо скопировать с рабочей master ноды каталог /etc/kubernetes
если в каталоге /etc/kubernetes/manifests пусто, то установите службы для master
1 |
yum install -y kube-apiserver kube-controller-manager kube-scheduler |
удалите старый master
1 |
kubectl delete nodes k8s-01-node02 |