Kubernetes 1.10已经发布,可以开始考虑将团队线上环境的Kubernetes集群从1.8升级到1.9了。 本文记录了在测试环境中的演练过程。

准备

当前Kubernetes 1.9的小版本是1.9.6。 在升级之前一定要多读几遍官方的升级须知Kubernetes 1.9 - Action Required Before Upgrading

使用ansible升级Kubernetes核心组件

接下来尝试使用ansible将Kubernetes的核心组件从1.8升级到1.9。 ansible role中的主要修改如下:

  • kube-apiserver的启动参数--experimental-bootstrap-token-auth=true替换为--enable-bootstrap-token-auth=true,这个在Kubernetes 1.8中就应该替换的,在1.9中已经完全移除了--experimental-bootstrap-token-auth,这里不做替换kube-apiserver将无法启动。
  • cni升级到0.6.0,需要注意从cni 0.6.0开始分成两个项目https://github.com/containernetworking/cnihttps://github.com/containernetworking/plugins,需对原来的ansible role做修改

测试环境中的升级十分顺利,算上下载二进制文件,半个小时就完成了集群的升级,各个核心组件成功升级到了1.9.6。

以容器形式运行组件的升级

接下来要对一些以容器形式运行的组件升级,对应版本如下:

  • flannel 0.10.0
  • kube-dns 1.14.8
  • dashboard 1.8.3
  • kube-state-metrics 1.3.0

其中kube-state-metrics必须从1.1.0升级到1.3.0,因为1.1.0不支持Kubernetes 1.9

升级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