Kubernetes 从1.7到1.8升级记录
2017-12-16
Kubernetes 1.9已经发布,可以开始考虑将团队线上环境的Kubernetes集群从1.7升级到1.8了。 本文记录了在测试环境中的演练过程。
准备 #
当前Kubernetes 1.8的小版本是1.8.5。 在升级之前一定要多读几遍官方的升级须知Kubernetes 1.8 - Action Required Before Upgrading。其中和我们相关的:
- 从Kubernetes 1.8开始如果Node上开启了swap,kubelet会启动失败。所以如果服务器是专门用作k8s Node节点的话需要将系统的swap关闭。因为我们测试环境中k8s的Node上还部署了一些遗留服务,为了稳定性,这里不会关闭Swap,需要kubelet加上启动参数
--fail-swap-on=false
。这个需要在我们的ansible role中做更新。 - CronJob API进入beta阶段,现在的版本是v1beta1,但v2alpha1在Kubernetes 1.8中仍然可用。可以在完成集群的升级后,将集群中部署的CronJob统一修改到v1beta1。最后才可以移除apiserver的
--runtime-config=batch/v2alpha1=true
。 - rbac/v1alpha1, settings/v1alpha1, and scheduling/v1alpha1 APIs在Kubernetes 1.8中默认被禁用。
- 在Kubernetes 1.8中工作负载API版本升级到了apps/v1beta2,可以在集群升级到1.8后对集群中部署的DaemonSet,Deployment,ReplicaSet做修改。
使用ansible升级Kubernetes核心组件 #
接下来尝试使用ansible将Kubernetes的核心组件从1.7升级到1.8。
ansible role中的主要修改是针对测试环境中kubelet加上启动参数--fail-swap-on=false
,而对线上环境中的对Kubernetes Node需要增加关闭swap及相关配置的task。
测试环境中的升级十分顺利,算上下载二进制文件,半个小时就完成了集群的升级,各个核心组件成功升级到了1.8.5。
以容器形式运行组件的升级 #
接下来要对一些以容器形式运行的组件升级,对应版本如下:
- flannel 0.9.1
- kube-dns 1.14.7
- dashboard 1.8.1
- heapster 1.4.2
升级kube-dns的注意事项 #
查看transforms2sed.sed:
1s/__PILLAR__DNS__SERVER__/$DNS_SERVER_IP/g
2s/__PILLAR__DNS__DOMAIN__/$DNS_DOMAIN/g
3s/__MACHINE_GENERATED_WARNING__/Warning: This is a file generated from the base underscore template file: __SOURCE_FILENAME__/g
将$DNS_SERVER_IP
替换成10.96.0.10
,将DNS_DOMAIN
替换成cluster.local
。
注意$DNS_SERVER_IP
要和kubelet设置的--cluster-dns
参数一致
执行:
1cd ~/k8s/kube-dns
2sed -f transforms2sed.sed kube-dns.yaml.base > kube-dns.yaml
- 上面的变量
DNS_SERVER
要和kubelet设置的--cluster-dns
参数一致。
1kubectl create -f kube-dns.yaml
查看kube-dns的Pod,确认所有Pod都处于Running状态:
1kubectl get pods --all-namespaces
2NAMESPACE NAME READY STATUS RESTARTS AGE
3kube-system kube-dns-3468831164-chjw5 3/3 Running 0 3m
测试一下DNS功能是否好用:
1kubectl run curl --image=radial/busyboxplus:curl -i --tty
2
3nslookup kubernetes.default
4Server: 10.96.0.10
5Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
6
7Name: kubernetes
8Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
kube-dns是Kubernetes实现服务发现的重要组件之一,默认情况下只会创建一个DNS Pod,在生产环境中我们可能需要对kube-dns进行扩容。 有两种方式:
- 手动扩容
kubectl --namespace=kube-system scale deployment kube-dns --replicas=<NUM_YOU_WANT>
- 使用DNS Horizontal Autoscaler