0%

一键更新Kubernetes集群

每次使用手动升级集群总是很难受,重复地机械地搬砖是没有意义的。因此,我尝试着将升级过程脚本化。

在分享我的脚本之前,我先说一下我的集群情况:

  • 3个master节点+3个worker节点
  • 每个节点都是基于同一样的vm template创建的,均使用CentOS。
  • 每个节点均使用 ssh key pair 登录

更新master节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash -e

is_first=true
for ip in $(kubectl get nodes --no-headers=true -o wide | grep master | awk '{print $6}');
do
node_name=$(kubectl get nodes --no-headers=true -o wide | grep ${ip} | awk '{print $1}')
kubectl drain ${node_name} --ignore-daemonsets
ssh -i "ssh/${node_name}" root@$ip 'yum update -y'
if ${is_first};
then
ssh -i "ssh/${node_name}" root@$ip <<'ENDSSH'
kubeadm upgrade plan
kubeadm upgrade apply v1.19.4 -y
ENDSSH
is_first=false
else
ssh -i "ssh/${node_name}" root@$ip 'kubeadm upgrade node'
fi
ssh -i "ssh/${node_name}" root@$ip <<-ENDSSH
systemctl daemon-reload
systemctl restart kubelet
ENDSSH
kubectl uncordon ${node_name}
done

更新worker节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash -e

for ip in $(kubectl get nodes --no-headers=true -o wide | grep -v master | awk '{print $6}');
do
node_name=$(kubectl get nodes --no-headers=true -o wide | grep ${ip} | awk '{print $1}')
kubectl drain ${node_name} --ignore-daemonsets --delete-local-data --force
ssh -i "ssh/${node_name}" root@$ip <<'ENDSSH'
yum update -y
kubeadm upgrade node
systemctl daemon-reload
systemctl restart kubelet
ENDSSH
kubectl uncordon ${node_name}
done

Q & A

为什么不用Ansible? 因为没有使用过,以及这个逻辑很简单。