Цель

Заметки ИТ которые я не хочу потерять

menu_navigation

Kubernetes cluster recovery

Восстановление кластера kubernetes

Kubernetes имеет 3 различных роли: master ноды, ноды etcd и worker ноды.
Часто роли masters и etcd объединены, и имеют репликацию в HA кластерах.
Отказы отдельных нод не приведут к катастрофическим последствиям, но необходимо как можно быстрее восстановить работоспособность кластера, чтобы предотвратить дальнейшие отказы.

Нода с ролью etcd не работоспособна

Проверим статус компонентов с помощью утилиты kubectl

kubectl get cs
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, но не запускайте его.

yum -y install etcd

Следующий шаг, на одной из рабочих нод etcd удалите отказавший узел etcd из кластера и добавьте IP-адрес нового узла, проверьте пути к сертификатам, и обратите внимание на добавление префикса "member" перед именем ноды в названии сертификата

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
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
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
etcdctl member add k8s-01-node04 --peer-urls=http://10.0.0.4:2380

после чего на новой ноде исправьте конфигурационный файл и запустите etcd

vi /etc/etcd/etcd.conf
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
systemctl enable etcd
systemctl start etcd

теперь на каждой master ноде введите команду

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

kubectl get nodes
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 и запретим принимать пользовательские поды

kubectl label nodes kube-master-4 node-role.kubernetes.io/master=
kubectl taint nodes kube-master-4 node-role.kubernetes.io/master=:NoSchedule

далее необходимо скопировать с рабочей master ноды каталог /etc/kubernetes
если в каталоге /etc/kubernetes/manifests пусто, то установите службы для master

yum install -y kube-apiserver kube-controller-manager kube-scheduler

удалите старый master

kubectl delete nodes k8s-01-node02

Комментариев нет:

Отправить комментарий