10.1 etcd备份恢复

k8s使用etcd数据库实时存储集群中的数据,安全起见,一定要备份

1、kubeadm部署方式

备份:

  1. yum -y install etcd
  2. ETCDCTL_API=3 etcdctl \
  3. snapshot save snap.db \
  4. --endpoints=https://127.0.0.1:2379 \
  5. --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  6. --cert=/etc/kubernetes/pki/etcd/server.crt \
  7. --key=/etc/kubernetes/pki/etcd/server.key

恢复

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

2、二进制部署方式

备份

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

恢复

  • 1、先暂停kube-apiserver和etcd
  • 2、在每个节点上恢复
  • 3、启动kube-apiserver和etcd
  1. 1、先暂停kube-apiserveretcd
  2. systemctl stop kube-apiserver
  3. systemctl stop etcd
  4. mv /var/lib/etcd/default.etcd /var/lib/etcd/default.etcd.bak
  5. 2、在每个节点上恢复
  6. ETCDCTL_API=3 etcdctl snapshot restore snap.db \
  7. --name etcd-1 \
  8. --initial-cluster="etcd-1=https://192.168.31.71:2380,etcd-
  9. 2=https://192.168.31.72:2380,etcd-3=https://192.168.31.73:2380" \
  10. --initial-cluster-token=etcd-cluster \
  11. --initial-advertise-peer-urls=https://192.168.31.71:2380 \
  12. --data-dir=/var/lib/etcd/default.etcd
  13. 3、启动kube-apiserveretcd
  14. systemctl start kube-apiserver
  15. systemctl start etcd

10.2 kubeadm进行k8s集群版本升级

Kubernetes每隔3个月发布一个小版本。

升级策略

  • 始终保持最新
  • 每半年升级一次,这样会落后社区1~2个小版本
  • 一年升级一次,或者更长,落后版本太多

升级流程

画板

注意事项:

  • 升级前必须备份所有组件及数据,例如etcd
  • 千万不能跨多个小节点升级,例如从1.16升级到1.19

版本升级

升级管理节点

  1. 查找最新版本号
  2. 升级kubeadm
  3. 驱逐node上的pod,且不可调度
  4. 检查集群是否可以升级,并获取可以升级的版本
  5. 执行升级
  6. 取消不可调度
  7. 升级kubectl和kubelet
  8. 重启kubelet
  1. 1、查找最新版本号
  2. yum list --showduplicates kubeadm --disableexcludes=kubernetes
  3. 2、升级kubeadm
  4. yum install -y kubeadm-1.22.1 --disableexcludes=kubernetes
  5. 3、驱逐node上的pod,且不可调度
  6. kubectl drain k8s-master --ignore-daemonsets
  7. 4、检查集群是否可以升级,并获取可以升级的版本
  8. kubeadm upgrade plan
  9. 5、执行升级
  10. kubeadm upgrade apply v1.22.1
  11. 6、取消不可调度
  12. kubectl uncordon k8s-master
  13. 7、升级kubeletkubectl
  14. yum install -y kubelet-1.22.1 kubectl-1.22.1 --disableexcludes=kubernetes
  15. 8、重启kubelet
  16. systemctl daemon-reload
  17. systemctl restart kubelet

升级工作节点

  1. 1、升级kubeadm
  2. yum install -y kubeadm-1.22.1 --disableexcludes=kubernetes
  3. 2、驱逐node上的pod,且不可调度
  4. kubectl drain k8s-node1 --ignore-daemonsets
  5. 3、升级kubelet配置
  6. kubeadm upgrade node
  7. 4、升级kubeletkubectl
  8. yum install -y kubelet-1.22.1 kubectl-1.22.1 --disableexcludes=kubernetes
  9. 5、重启kubelet
  10. systemctl daemon-reload
  11. systemctl restart kubelet
  12. 6、取消不可调度,节点重新上线
  13. kubectl uncordon k8s-node1

<font style="color:rgb(204, 204, 204);background-color:rgb(80, 85, 107);">kubectl drain node02 </font><font style="color:rgb(103, 205, 204);background-color:rgb(80, 85, 107);">--</font><font style="color:rgb(204, 153, 205);background-color:rgb(80, 85, 107);">delete</font><font style="color:rgb(103, 205, 204);background-color:rgb(80, 85, 107);">-</font><font style="color:rgb(204, 204, 204);background-color:rgb(80, 85, 107);">local</font><font style="color:rgb(103, 205, 204);background-color:rgb(80, 85, 107);">-</font><font style="color:rgb(204, 204, 204);background-color:rgb(80, 85, 107);">data </font><font style="color:rgb(103, 205, 204);background-color:rgb(80, 85, 107);">--</font><font style="color:rgb(204, 204, 204);background-color:rgb(80, 85, 107);">ignore</font><font style="color:rgb(103, 205, 204);background-color:rgb(80, 85, 107);">-</font><font style="color:rgb(204, 204, 204);background-color:rgb(80, 85, 107);">daemonsets </font><font style="color:rgb(103, 205, 204);background-color:rgb(80, 85, 107);">--</font><font style="color:rgb(204, 204, 204);background-color:rgb(80, 85, 107);">force</font>

参数说明:

  • —delete-local-data 即使pod使用了emptyDir也删除
  • —ignore-daemonsets 忽略deamonset控制器的pod,如果不忽略,deamonset控制器控制的pod被删除后可能马上又在此节点上启动起来,会成为死循环;
  • --force 不加force参数只会删除该NODE上由ReplicationController, ReplicaSet, DaemonSet,StatefulSet or Job创建的Pod,加了后还会删除’裸奔的pod’(没有绑定到任何replication controller)

CoreDNS镜像拉取失败

10、k8s集群维护 - 图2

  1. docker pull coredns/coredns:1.8.4
  2. docker tag coredns/coredns:1.8.4 registry.aliyuncs.com/google_containers/coredns:v1.8.4

10.3 k8s集群节点正确下线流程

如果你想维护某个节点或者删除节点,正确流程如下:

1、获取节点列表

kubectl get node

2、驱逐节点上的Pod并设置不可调度(cordon)

kubectl drain —ignore-daemonsets

3、设置可调度或者移除节点

kubectl uncordon

kubectl delete node

10.4 k8s故障排查

应用部署

  1. kubectl describe TYPE/NAME
  2. kubectl logs TYPE/NAME [-c CONTAINER]
  3. kubectl exec POD [-c CONTAINER] -- COMMAND [args...]

组件不能正常工作

需要先区分部署方式:

1、kubeadm

除kubelet外,其他组件均采用静态Pod启动

2、二进制

所有组件均采用systemd管理

常见问题:

  • 网络不通
  • 启动失败,一般配置文件或者依赖服务
  • 平台不兼容