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