集群框架:
172.30.0.81 k8s-master1
172.30.0.109 k8s-master2
172.30.0.89 k8s-node1
172.30.2.60 nginx vip
K8S master高可用配置 方便升级集群的流量切换:
K8S集群初始化安装的版本为1.10.1,后续考虑到集群平滑升级方案,再次做了一系列测试,方案适用于1.10.1升级至1.11.0,1.11.0升级至1.12.0亲测,整个升级过程不影响正常业务容器,需要提前设置后master负载均衡,摘除准备升级的master节点,将master节点上的容器“排干”,在升级node节点的时候如是,对容器“排干”操作,避免业务容器出现中断的可能。
注意:kubeadm 集群升级,只能按阶梯升级,不能跨两级从1.10直接升级至1.12
准备工作:
1.准备版本升级所需要的master,node节点的容器镜像,可以到官网下载指定版本,或者通过获取kubeadm默认版本的配置文件,拉取指定的镜像,如
# kubeadm config print init-defaults > init-default.yaml
更换镜像拉取地址为阿里云的,默认是k8s官网的,需要×××
imageRepository: registry.aliyuncs.com/google_containers
# kubeadm upgrade image pull --config=init-default.yaml
镜像拉取到之后,需要修改标签,要不然在升级部署的过程k8s会报镜像拉取失败,如
升级过程:
1.切换master节点的流量,将需要升级的master节点下掉
2.升级kubeadm到指定版本
# yum update kubeadm-1.12.0 --disableexcludes=kubernetes
查看是否为预期版本
# kubeadm version
输出升级版本的config.yaml
# kubeadm config migrate --old-config /app/config.yaml-1.11 --new-config /app/kubeadm-config-1.11.yaml
PS:158行添加
kubeletExtraArgs:
pod-infra-container-image: registry.aliyuncs.com/google_containers/pause:3.1
kubeadm config print-default > kubeadm-config-default.yaml
(对比 kubeadm-config-default.yaml kubeadm-config-1.11.yaml,补全kubeadm-config-1.11.yaml)
3.查看升级计划是否正常
# kubeadm upgrade plan
正常则返回success
4.kubeadm upgrade apply --config=/app/kubeadm-config-1.11.yaml
注意:升级过程中若遇到阻塞,可以查看控制台的master相关pod,一般是因为标签不对拉不到镜像,需要更改镜像标签
此时这台升级的master的kube-apiserver,controller-manager,scheduler,kube-proxy组件均已升级完毕,可以通过kubectl describe pod查看版本
(若卡住:kubeadm reset;tar -xf /etc/kubernetes/kubeconf.tar.gz -C /etc/kubernetes/;kubeadm init --config /app/kubeadm-config-1.11.yaml)
5.升级kubelet,修改kubelet配置文件,升级为升级版本的配置
# yum upgrade kubelet-1.12.0 kubectl-1.12.0 -y
# kubeadm upgrade node config --kubelet-version 1.12.0
重启kubelet
# systemctl daemon-reload && systemctl restart kubelet
查看系统日志看节点是否正常
# tail -F /var/log/message
查看节点是否升级成功
# kubectl get node 节点已升级至1.12.0
6.切换nginx流量,下掉另一台没有升级的master'
7.升级第二台master的kubelet至1.12.0,重新加载kubelet配置
# yum upgrade kubelet-1.12.0 -y
# kubeadm upgrade node config --kubelet-version 1.12.0
重启kubelet
# systemctl daemon-reload && systemctl restart kubelet
查看系统日志看节点是否正常
# tail -F /var/log/message
查看节点是否升级成功
# kubectl get node 节点已升级至1.12.0
8.node worker节点升级,升级kubelet,加载新版本配置,重新启动kubelet即可
9.升级完成
注意:在1.10升级至1.11后 worker节点的kubelet会缺少一段cni网络配置,会导致worker节点上的pod ip变为当前docker服务的ip地址从而无法通信
解决方式:
worker 1.10.1-->1.11.0
sudo yum install kubelet-1.11.0 kubeadm-1.11.0 -y
sudo kubeadm upgrade node config --kubelet-version v1.11.0
从master复制/var/lib/kubelet/kubeadm-flags.env到worker节点的/var/lib/kubelet/目录
sudo systemctl daemon-reload && sudo systemctl restart kubelet && sudo systemctl enable kubelet.service