Etcd数据库备份与恢复


需要先安装etcd备份工具



yum install etcd -y



按不同安装方式执行不同备份与恢复



kubeadm部署方式:


备份:


ETCDCTL_API=3 etcdctl  snapshot save snap.db  --endpoints=https://127.0.0.1:2379  --cacert=/etc/kubernetes/pki/etcd/ca.crt  --cert=/etc/kubernetes/pki/etcd/server.crt  --key=/etc/kubernetes/pki/etcd/server.key


恢复:


1、先暂停kube-apiserver和etcd容器 mv /etc/kubernetes/manifests /etc/kubernetes/manifests.bak mv /var/lib/etcd/ /var/lib/etcd.bak 
2、恢复 ETCDCTL_API=3 etcdctl snapshot restore snap.db --data-dir=/var/lib/etcd
3、启动kube-apiserver和etcd容器 mv /etc/kubernetes/manifests.bak /etc/kubernetes/manifests


二进制部署方式:


备份:


ETCDCTL_API=3 etcdctl \ snapshot save snap.db \ --endpoints=https://192.168.31.71:2379 \ --cacert=/opt/etcd/ssl/ca.pem \ --cert=/opt/etcd/ssl/server.pem \ --key=/opt/etcd/ssl/server-key.pem


恢复:


1、先暂停kube-apiserver和etcd systemctl stop kube-apiserver systemctl stop etcd mv /var/lib/etcd/default.etcd /var/lib/etcd/default.etcd.bak 
2、在每个节点上恢复 ETCDCTL_API=3 etcdctl snapshot restore snap.db \ --name etcd-1 \ --initial-cluster="etcd-1=https://192.168.31.71:2380,etcd2=https://192.168.31.72:2380,etcd-3=https://192.168.31.73:2380" \ --initial-cluster-token=etcd-cluster \ --initial-advertise-peer-urls=https://192.168.31.71:2380 \ --data-dir=/var/lib/etcd/default.etcd
3、启动kube-apiserver和etcd systemctl start kube-apiserver systemctl start etcd



K8s集群版本升级



Kubernetes集群维护—备份恢复与升级_运维


注意事项:

• 升级前必须备份所有组件及数据,例如etcd

• 千万不要跨多个小版本进行升级,例如从1.16升级到1.19

• 在测试环境经过多次演练,实操,才能上生产环境

升级管理节点:


1、查找最新版本号


yum list --showduplicates kubeadm


2、升级kubeadm


yum install -y kubeadm-1.23.0-0


3、驱逐node上的pod,且不可调度


kubectl drain k8s-master --ignore-daemonsets


4、检查集群是否可以升级,并获取可以升级的版本(升级计划)


kubeadm upgrade plan


5、执行升级(按照升级计划给出的版本作为参考进行升级)


kubeadm upgrade apply v1.23.0


6、升级kubelet和kubectl


yum install -y kubelet-1.23.0-0 kubectl-1.23.0-0


7、重启kubelet

systemctl daemon-reload
systemctl restart kubelet


8、取消不可调度,重新上线


kubectl uncordon k8s-master


升级工作节点:


1、升级kubeadm


yum install -y kubeadm-1.23.0-0


2、驱逐node上的pod,且不可调度


kubectl drain k8s-node1 --ignore-daemonsets


3、升级kubelet配置


kubeadm upgrade node


4、升级kubelet和kubectl


yum install -y kubelet-1.23.0-0 kubectl-1.23.0-0


5、重启kubelet

systemctl daemon-reload
systemctl restart kubelet


6、取消不可调度,重新上线


kubectl uncordon k8s-node1



K8s集群节点正确下线流程

维护某个节点或者删除节点, 正确流程如下:
1、获取节点列表
kubectl get node
2、驱逐节点上的Pod并设置不可调度(cordon)
kubectl drain <node_name> --ignore-daemonsets
3、 设置可调度或者移除节点
kubectl uncordon <node_name>
kubectl delete node <node_name>


K8s集群故障排查




Kubernetes集群维护—备份恢复与升级_k8s升级_02


应急处理流程



排查思路



Kubernetes集群维护—备份恢复与升级_docker_03


K8s 故障排查: 案例1


故障现象:


kubectl get node节点处于NotReady


排查思路:


查看kubelet和docker服务是否正常

分析kubelet日志



K8s 故障排查: 案例2


故障现象:


Pod运行不正常


排查思路:


• 根据Pod状态假设:


https://kubernetes.io/zh/docs/concepts/workloads/pods/pod-lifecycle/


• 查看资源详情:


kubectl describe TYPE/NAME


• 查看容器日志:


kubectl logs TYPE/NAME [-c CONTAINER]


K8s 故障排查: 案例3


故障现象:


互联网用户无法访问应用(Ingress或者Service无法访问)


排查思路:


• Pod正常工作吗?

• Service是否关联Pod?

• Service指定target-port端口是否正确?

• 如果用名称访问, DNS是否正常工作?

• kube-proxy正常工作吗? 是否正常写iptables规则?

• CNI网络插件是否正常工作?