10-k8s集群维护

摘要

本文内容转自网络,个人学习记录使用,请勿传播

Etcd数据库备份与恢复

kubeadm方式部署

备份

1
2
3
4
5
6
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
2
3
4
5
6
7
8
9
10
11
# 先暂停kube-apiserver和etcd容器
mv /etc/kubernetes/manifests /etc/kubernetes/manifests.bak
mv /var/lib/etcd/ /var/lib/etcd.bak

# 恢复
ETCDCTL_API=3 etcdctl \
snapshot restore snap.db \
--data-dir=/var/lib/etcd

# 启动kube-apiserver和etcd容器
mv /etc/kubernetes/manifests.bak /etc/kubernetes/manifests

二进制方式部署

备份

1
2
3
4
5
6
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 先暂停kube-apiserver和etcd
systemctl stop kube-apiserver
systemctl stop etcd
mv /var/lib/etcd/default.etcd /var/lib/etcd/default.etcd.bak

# 在每个节点上恢复
ETCDCTL_API=3 etcdctl snapshot restore snap.db \
--name etcd-1 \
--initial-cluster="etcd-1=https://192.168.31.71:2380,etcd-2=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


ETCDCTL_API=3 /home/work/k8s/etcd/etcdctl snapshot restore etcd-snapshot.db --data-dir=/home/work/k8s/etcd_data/ \
--name infra2 \
--initial-cluster="infra0=https://10.252.32.67:2380,infra1=https://10.252.32.68:2380,infra2=https://10.252.32.69:2380" \
--initial-cluster-token=etcd-cluster-dxm \
--initial-advertise-peer-urls=https://10.252.32.69:2380

# 启动kube-apiserver和etcd
systemctl start kube-apiserver
systemctl start etcd

kubeadm对k8s集群进行版本升级

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

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

image-20210922200148514

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

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

参考文档

升级管理节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 查找最新版本号
yum list --showduplicates kubeadm --disableexcludes=kubernetes

# 升级kubeadm
yum install -y kubeadm-1.21.0-0 --disableexcludes=kubernetes

# 驱逐node上的pod,且不可调度
kubectl drain k8s-master --ignore-daemonsets

# 检查集群是否可以升级,并获取可以升级的版本
kubeadm upgrade plan

# 执行升级
kubeadm upgrade apply v1.21.0

# 取消不可调度
kubectl uncordon k8s-master

# 升级kubelet和kubectl
yum install -y kubelet-1.21.0-0 kubectl-1.21.0-0 --disableexcludes=kubernetes

# 重启kubelet
systemctl daemon-reload
systemctl restart kubelet

升级工作节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 升级kubeadm
yum install -y kubeadm-1.21.0-0 --disableexcludes=kubernetes

# 驱逐node上的pod,且不可调度
kubectl drain k8s-node1 --ignore-daemonsets

# 升级kubelet配置
kubeadm upgrade node

# 升级kubelet和kubectl
yum install -y kubelet-1.21.0-0 kubectl-1.21.0-0 --disableexcludes=kubernetes

# 重启kubelet
systemctl daemon-reload
systemctl restart kubelet

# 取消不可调度,节点重新上线
kubectl uncordon k8s-node1

k8s集群节点正确下线流程

1
2
3
4
5
6
7
8
9
# 获取节点列表
kubectl get node

# 驱逐节点上的Pod并设置不可调度(cordon)
kubectl drain <node_name> --ignore-daemonsets

# 设置可调度或者移除节点
kubectl uncordon <node_name>
kubectl delete node <node_name>

k8s集群故障排查思路

应用部署异常排查

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

组件不能正常工作

image-20210922200552540

  • 需要先区分部署方式
    • kubeadm:除kubelet外,其他组件均采用静态Pod启动
    • 二进制:所有组件均采用systemd管理
  • 常见问题
    • 网络不通
    • 启动失败,一般配置文件或者依赖服务
    • 平台不兼容

service访问异常

image-20210922200728595

Service一般是访问不通,有以下可能性:

  • Service是否关联Pod?
  • Service指定target-port端口是否正常?
  • Pod正常工作吗?
  • Service是否通过DNS工作?
  • kube-proxy正常工作吗?
  • kube-proxy是否正常写iptables规则?
  • cni网络插件是否正常工作?