简要介绍
本文介绍的是k8s集群从1.13升级到1.16的过程。依照官方文档进行升级,在实际实践的时候,遇到了一些官方文档没有描述到的问题,故记录于此。主要的问题有:

  • 国外镜像问题
  • 安装后节点Not Ready问题以及相关排查技巧
  • 遇到的其他问题导致集群无法起来。

收获

  • 一定要学会看kubelet的日志,这样才能清楚的知道到底是哪个步骤出了问题,大厂的项目日志记录还是非常详细的,有助于解决问题。

1.13升级至1.14

主要流程

主要步骤和过程

  • 更新master节点上的kubelet,kubeadm,kubectl等组件。
  • 手动查看并拉取所需镜像。
  • 升级master节点
  • 升级工作节点

master节点升级

1.master节点上升级kubeadm

# 查看软件包的版本
yum list --showduplicates kubeadm --disableexcludes=kubernetes
# 安装最新版本kubeadm和kubectl

yum install -y kubeadm-1.14.0-0 --disableexcludes=kubernetes

# 查看kubeadm version 
kubeadm version  
# 查看更新计划
kubeadm upgrade plan
# 通过更新计划和version 判断kubeadm 是否更新成功

查看所需镜像并通过脚本拉取。

# 查看所需镜像
kubeadm config images list
# 根据镜像名称编辑脚本,并使用脚本拉取镜像。脚本编写见后文
# 执行脚本拉取镜像

./pull_images.sh

926329751cadbbc22f769179080c69cf43bfc0e5

升级master节点

sudo kubeadm upgrade apply v1.14.0

yum install -y kubelet-1.14.0-0 kubectl-1.14.0-0 --disableexcludes=kubernetes

sudo systemctl restart kubelet

升级worker

# 先下载相关镜像,主要是proxy和coredns

#升级kubeadm
yum install -y kubeadm-1.14.0-0 --disableexcludes=kubernetes
# 驱逐工作负载,master上执行
kubectl drain $NODE --ignore-daemonsets
# 更新kubelet
sudo kubeadm upgrade node
yum install -y kubelet-1.14.0-0 kubectl-1.14.0-0 --disableexcludes=kubernetes
sudo systemctl restart kubelet
kubectl uncordon $NODE

验证是否成功

kubectl get nodes

后续升级步骤类似,只需要注意里面的坑就好,坑我已经放在关键问题里面了,升级的步骤建议按照官方的步骤来走。

关键问题

  • 镜像拉取问题。需要用脚本提前拉取好镜像。此处为1.14版本的镜像,如果要使用其他版本的只需要替换镜像名字即可。镜像脚本放在最后了。镜像问题还有两方面的问题
    • control pladn的镜像问题。指k8s升级所需要的所有组件问题。
    • node节点的镜像问题,node节点上的proxy镜像和coredns镜像也需要下载。
  • 操作步骤问题。一定要按照官方文档的升级方式来,不然很容易出现BUG。worker上的workload需要进行驱逐,不驱逐的话,后面会形成双份的工作负载,导致系统启动失败。我最终把node节点上运行的容器全部停止并删除了,然后依靠k8s自己去维护新的工作负载,保证了不会出现遗留版本的问题,但最好的方式还是按照官方升级指南一步一步来做。
  • 节点Not Ready问题。需要排查相关日志。
    • 排查kube-system下的pod是否都在运行。
    • 排查kubelet的日志,看是否有问题。journalctl -f -u kubelet
  • 经过排查,发现flannel的网络一直是不通的,解决方法同最后一个文献,增加CNI的版本号,每个节点都修改。
vim /etc/cni/net.d/10-flannel.conflist 

{
  "name": "cbr0",
  "cniVersion": "0.3.1",
  "plugins": [
    {
      "type": "flannel",
      "delegate": {
        "hairpinMode": true,
        "isDefaultGateway": true
      }
    },
    {
      "type": "portmap",
      "capabilities": {
        "portMappings": true
      }
    }
  ]
}
  • 最后查看kubelet日志,出现了一个新的问题。英文描述如下.这个错误每次升级都会出现。

Worker start to fail CSINodeIfo: error updating CSINode annotation

解决方法:在/var/lib/kubelet/config.yaml文件末尾追加两行文字。

featureGates:
	CSIMigration: false
  • 1.14升级到1.15的时候,发现了一个死环。因为3个节点都not ready-》所以无法执行调度,因为无法执行调度所以无法部署系统组件到合适的节点上去-》因为节点安装不全,所以集群not ready。。。。最终解决办法是去掉了taint。
kubectl taint node $NODE node.kubernetes.io/not-ready-  
  • 1.15升级到1.16。upgrade plan发生错误。通过 github 上 的 相关 issue 知道这个问题没有影响,可以忽略。把那个错误忽略即可。sudo kubeadm upgrade apply v1.16.0 --ignore-preflight-errors=CoreDNSUnsupportedPlugins
  • 升级后有一些namespace出问题了,需要把这些出问题的namespace删掉。
kubectl get namespace cattle-prometheus -o json > tmp.json
# 删除掉spec里面的内容。
curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/cattle-prometheus/finalize

  • 升级后通过kubectl get nodes命令发现version为1.18。但实际上我最多也就升级到了1.16。在github上有个类似的issue解决了此问题,通过kubectl get nodes查看到的版本实际上是kubelet的版本,需要对kubelet进行降级处理即可。降级命令yum -y downgrade kubelet-1.16.0-0

镜像下载脚本

1.14镜像脚本下载

vim pull_images1.14.sh

# 设置国内镜像源
MY_REGISTRY=registry.cn-hangzhou.aliyuncs.com/google_containers

# 拉取镜像
docker pull ${MY_REGISTRY}/kube-apiserver:v1.14.0
docker pull ${MY_REGISTRY}/kube-controller-manager:v1.14.0
docker pull ${MY_REGISTRY}/kube-scheduler:v1.14.0
docker pull ${MY_REGISTRY}/kube-proxy:v1.14.0
docker pull ${MY_REGISTRY}/pause:3.1
docker pull ${MY_REGISTRY}/etcd:3.3.0
docker pull ${MY_REGISTRY}/coredns:1.3.1

# 添加tag
docker tag ${MY_REGISTRY}/kube-apiserver:v1.14.0 k8s.gcr.io/kube-apiserver:v1.14.0
docker tag ${MY_REGISTRY}/kube-controller-manager:v1.14.0 k8s.gcr.io/kube-controller-manager:v1.14.0
docker tag ${MY_REGISTRY}/kube-scheduler:v1.14.0 k8s.gcr.io/kube-scheduler:v1.14.0
docker tag ${MY_REGISTRY}/kube-proxy:v1.14.0 k8s.gcr.io/kube-proxy:v1.14.0
docker tag ${MY_REGISTRY}/pause:3.1 k8s.gcr.io/pause:3.1
docker tag ${MY_REGISTRY}/etcd:3.3.0 k8s.gcr.io/etcd:3.3.0
docker tag ${MY_REGISTRY}/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1

# 移除其他tag的镜像

docker rmi ${MY_REGISTRY}/kube-apiserver:v1.14.0
docker rmi ${MY_REGISTRY}/kube-controller-manager:v1.14.0
docker rmi ${MY_REGISTRY}/kube-scheduler:v1.14.0
docker rmi ${MY_REGISTRY}/kube-proxy:v1.14.0
docker rmi ${MY_REGISTRY}/pause:3.1
docker rmi ${MY_REGISTRY}/etcd:3.3.0
docker rmi ${MY_REGISTRY}/coredns:1.3.1

1.15镜像脚本下载

vim pull_image1.15.sh 
# 设置国内镜像源
MY_REGISTRY=registry.cn-hangzhou.aliyuncs.com/google_containers

# 拉取镜像
docker pull ${MY_REGISTRY}/kube-apiserver:v1.15.0
docker pull ${MY_REGISTRY}/kube-controller-manager:v1.15.0
docker pull ${MY_REGISTRY}/kube-scheduler:v1.15.0
docker pull ${MY_REGISTRY}/kube-proxy:v1.15.0
docker pull ${MY_REGISTRY}/pause:3.1
docker pull ${MY_REGISTRY}/etcd:3.3.0
docker pull ${MY_REGISTRY}/coredns:1.3.1

# 添加tag
docker tag ${MY_REGISTRY}/kube-apiserver:v1.15.0 k8s.gcr.io/kube-apiserver:v1.15.0
docker tag ${MY_REGISTRY}/kube-controller-manager:v1.15.0 k8s.gcr.io/kube-controller-manager:v1.15.0
docker tag ${MY_REGISTRY}/kube-scheduler:v1.15.0 k8s.gcr.io/kube-scheduler:v1.15.0
docker tag ${MY_REGISTRY}/kube-proxy:v1.15.0 k8s.gcr.io/kube-proxy:v1.15.0
docker tag ${MY_REGISTRY}/pause:3.1 k8s.gcr.io/pause:3.1
docker tag ${MY_REGISTRY}/etcd:3.3.0 k8s.gcr.io/etcd:3.3.0
docker tag ${MY_REGISTRY}/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1

# 移除其他tag的镜像

docker rmi ${MY_REGISTRY}/kube-apiserver:v1.15.0
docker rmi ${MY_REGISTRY}/kube-controller-manager:v1.15.0
docker rmi ${MY_REGISTRY}/kube-scheduler:v1.15.0
docker rmi ${MY_REGISTRY}/kube-proxy:v1.15.0
docker rmi ${MY_REGISTRY}/pause:3.1
docker rmi ${MY_REGISTRY}/etcd:3.3.0
docker rmi ${MY_REGISTRY}/coredns:1.3.1

1.16镜像脚本下载

vim pull_image_1.16.sh

# 设置国内镜像源
MY_REGISTRY=registry.cn-hangzhou.aliyuncs.com/google_containers

# 拉取镜像
docker pull ${MY_REGISTRY}/kube-apiserver:v1.16.0
docker pull ${MY_REGISTRY}/kube-controller-manager:v1.16.0
docker pull ${MY_REGISTRY}/kube-scheduler:v1.16.0
docker pull ${MY_REGISTRY}/kube-proxy:v1.16.0
docker pull ${MY_REGISTRY}/pause:3.1
docker pull ${MY_REGISTRY}/etcd:3.3.15-0
docker pull ${MY_REGISTRY}/coredns:1.6.2

# 添加tag
docker tag ${MY_REGISTRY}/kube-apiserver:v1.16.0 k8s.gcr.io/kube-apiserver:v1.16.0
docker tag ${MY_REGISTRY}/kube-controller-manager:v1.16.0 k8s.gcr.io/kube-controller-manager:v1.16.0
docker tag ${MY_REGISTRY}/kube-scheduler:v1.16.0 k8s.gcr.io/kube-scheduler:v1.16.0
docker tag ${MY_REGISTRY}/kube-proxy:v1.16.0 k8s.gcr.io/kube-proxy:v1.16.0
docker tag ${MY_REGISTRY}/pause:3.1 k8s.gcr.io/pause:3.1
docker tag ${MY_REGISTRY}/etcd:3.3.15-0 k8s.gcr.io/etcd:3.3.15-0
docker tag ${MY_REGISTRY}/coredns:1.6.2 k8s.gcr.io/coredns:1.6.2

# 移除其他tag的镜像

docker rmi ${MY_REGISTRY}/kube-apiserver:v1.16.0
docker rmi ${MY_REGISTRY}/kube-controller-manager:v1.16.0
docker rmi ${MY_REGISTRY}/kube-scheduler:v1.16.0
docker rmi ${MY_REGISTRY}/kube-proxy:v1.16.0
docker rmi ${MY_REGISTRY}/pause:3.1
docker rmi ${MY_REGISTRY}/etcd:3.3.15-0
docker rmi ${MY_REGISTRY}/coredns:1.6.2

参考文献

https://my.oschina.net/u/2306127/blog/309587

https://blog.51cto.com/foxhound/2490073

https://v1-15.docs.kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade-1-14/

k8s 节点 not ready原因排查

k8s升级出现问题

删除掉namespace

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐