每次使用手动升级集群总是很难受,重复地机械地搬砖是没有意义的。因此,我尝试着将升级过程脚本化。
在分享我的脚本之前,我先说一下我的集群情况:
- 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? 因为没有使用过,以及这个逻辑很简单。