
使用 Kubeadm 更新 Kubernetes 集群
作者 阳明
来源 | k8s技术圈(ID:kube100)
由于 Kubernetes 进阶课程 中的集群版本是 v1.10.0,这个版本相对有点旧了,最新版本都已经 v1.14.x了,为了尽量保证课程内容的新鲜度,我们需要将集群版本更新。我们的集群是使用的 kubeadm 搭建的,我们知道使用 kubeadm 搭建的集群来更新是非常方便的,但是由于我们这里版本跨度太大,不能直接从 1.10.x 更新到 1.14.x,kubeadm 的更新是不支持跨多个主版本的,所以我们现在是 1.10,只能更新到 1.11 版本了,然后再从 1.11 更新到 1.12...... 不过版本更新的方式方法基本上都是一样的,所以后面要更新的话也挺简单了,下面我们就先将集群更新到 v1.11.0 版本。
更新集群
首先我们保留 kubeadm config 文件:
将上面的imageRepository值更改为:gcr.azk8s.cn/google_containers,然后保存内容到文件 kubeadm-config.yaml 中(当然如果你的集群可以获取到 grc.io 的镜像可以不用更改)。
然后更新 kubeadm:
因为 kubeadm upgrade plan 命令执行过程中会去 dl.k8s.io 获取版本信息,这个地址是需要科学方法才能访问的,所以我们可以先将 kubeadm 更新到目标版本,然后就可以查看到目标版本升级的一些信息了。
执行 upgrade plan 命令查看是否可以升级:
我们可以先使用 dry-run 命令查看升级信息:
注意要通过 --config指定上面保存的配置文件,该配置文件信息包含了上一个版本的集群信息以及修改搞得镜像地址。
查看了上面的升级信息确认无误后就可以执行升级操作了:
隔一段时间看到如下信息就证明集群升级成功了:
由于上面我们已经更新过 kubectl 了,现在我们用 kubectl 来查看下版本信息:
可以看到现在 Server 端和 Client 端都已经是 v1.11.0 版本了,然后查看下 Pod 信息:
更新 kubelet
可以看到我们之前的 kube-dns 服务已经被 coredns 取代了,这是因为在 v1.11.0 版本后就默认使用 coredns 了,我们也可以访问下集群中的服务看是否有影响,然后查看下集群的 Node 信息:
可以看到版本并没有更新,这是因为节点上的 kubelet 还没有更新的,我们可以通过 kubelet 查看下版本:
这个时候我们去手动更新下 kubelet:
注意事项:
- 如果节点上 swap 没有关掉重启 kubelet 服务会报错,所以最好是关掉 swap,执行命令: swapoff-a 即可。
- 1.11.0 版本的 kubelet 默认使用的 pod-infra-container-image镜像名称为: k8s.gcr.io/pause:3.1,所以最好先提前查看下集群节点上是否有这个镜像,因为我们之前 1.10.0 版本的集群默认的名字为 k8s.gcr.io/pause-amd64:3.1,所以如果节点上还是之前的 pause 镜像的话,需要先重新打下镜像 tag:
没有的话可以提前下载到节点上也可以通过配置参数进行指定,在文件 /var/lib/kubelet/kubeadm-flags.env中添加如下参数信息:
可以看到我们更新了 kubelet 的节点版本信息已经更新了,同样的方式去把另外两个节点 kubelet 更新即可。
另外需要注意的是最好在节点上的 kubelet 更新之前将节点设置为不可调度,更新完成后再设置回来,可以避免不必要的错误。
最后看下升级后的集群:
到这里我们的集群就升级成功了,我们可以用同样的方法将集群升级到 v1.12.x、v1.13.x、v1.14.x 版本,而且升级过程中是不会影响到现有业务的。
