集群框架:

    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高可用配置 方便升级集群的流量切换:

    image.png

   

    image.png

    image.png

    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会报镜像拉取失败,如

         image.png

   

         升级过程:

         1.切换master节点的流量,将需要升级的master节点下掉

            image.png

         

         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,一般是因为标签不对拉不到镜像,需要更改镜像标签

         image.png

        此时这台升级的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.升级完成

        image.png


注意:在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