最近正在制定将团队生产环境的Kubernetes集群从1.6升级1.7的计划。 Kubernetes 1.8已经发布,所以准备考虑从1.6到1.7的升级。

准备

当前1.7的最新版本是1.7.8。在做准备之前需要仔细读一遍官方的Kubernetes 1.7 - Action Required Before Upgrading

使用ansible升级k8s的核心组件

目前我们总共有两个高可用的Kubernetes集群,分别是测试环境和生产环境,版本都是1.6.10。 这两套环境的Kubernetes集群都是基于ansible自动部署,在1.6.x的每个小版本的升级也都是使用ansible完成。

这里准备的升级步骤是本地VM环境 => 测试环境 => 生产环境。 先使用ansible在本地VM中部署k8s 1.6.10的集群,然后再使用ansible将本地1.6升级到1.7并做一些验证,再升级测试环境,测试环境稳定运行一段时间后完成生产环境的升级。

本地VM环境中的ansible play的十分顺利,集群的各个核心组件已经成功的升级到1.7.8。

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

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

  • flannel 0.9.0
  • kube-dns 1.14.5
  • dashboard 1.7.1

升级kube-dns的注意事项

kube-dns 1.14.5部署文件的地址在gitlab中发生了变化,在内容上使用Deployment替换了Replication Controller。

1wget https://raw.githubusercontent.com/kubernetes/kubernetes/e1d6bcc22736a15ce662b3bd1009a16cdde5cd86/cluster/addons/dns/kube-dns.yaml.base
2wget https://raw.githubusercontent.com/kubernetes/kubernetes/e1d6bcc22736a15ce662b3bd1009a16cdde5cd86/cluster/addons/dns/transforms2sed.sed

查看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

升级dashboard的注意事项

因为之前部署Dashboard 1.6时创建了ServiceAccount kubernetes-dashboard,并分配了cluster-admin的权限。 所以在升级前应该先删除掉这个ServiceAccount:

1kubectl delete  serviceaccount kubernetes-dashboard -n kube-system
2kubectl delete  clusterrolebinding kubernetes-dashboard

1.7.x版本的dashboard对安全做了增强,默认需要以https的方式访问,增加了登录的页面,同时增加了一个gcr.io/google_containers/kubernetes-dashboard-init-amd64的init容器。

另外需要注意dashboard调整了部署文件的源码目录结构:

1mkdir -p ~/k8s/
2wget https://raw.githubusercontent.com/kubernetes/dashboard/b44f7cc5fde4dbe2a884b1e32a2b363d8031e4ca/src/deploy/recommended/kubernetes-dashboard.yaml
3kubectl create -f kubernetes-dashboard.yaml

kubernetes-dashboard.yaml文件中的ServiceAccount kubernetes-dashboard只有相对较小的权限,因此我们创建一个kubernetes-dashboard-admin的ServiceAccount并授予集群admin的权限,创建kubernetes-dashboard-admin.rbac.yaml:

 1---
 2apiVersion: v1
 3kind: ServiceAccount
 4metadata:
 5  labels:
 6    k8s-app: kubernetes-dashboard
 7  name: kubernetes-dashboard-admin
 8  namespace: kube-system
 9  
10---
11apiVersion: rbac.authorization.k8s.io/v1beta1
12kind: ClusterRoleBinding
13metadata:
14  name: kubernetes-dashboard-admin
15  labels:
16    k8s-app: kubernetes-dashboard
17roleRef:
18  apiGroup: rbac.authorization.k8s.io
19  kind: ClusterRole
20  name: cluster-admin
21subjects:
22- kind: ServiceAccount
23  name: kubernetes-dashboard-admin
24  namespace: kube-system
1kubectl create -f kubernetes-dashboard-admin.rbac.yaml
2serviceaccount "kubernetes-dashboard-admin" created
3clusterrolebinding "kubernetes-dashboard-admin" created

查看kubernete-dashboard-admin的token:

 1kubectl -n kube-system get secret | grep kubernetes-dashboard-admin
 2kubernetes-dashboard-admin-token-mrngz   kubernetes.io/service-account-token   3         18m
 3
 4kubectl describe -n kube-system secret kubernetes-dashboard-admin-token-mrngz
 5Name:           kubernetes-dashboard-admin-token-mrngz
 6Namespace:      kube-system
 7Labels:         <none>
 8Annotations:    kubernetes.io/service-account.name=kubernetes-dashboard-admin
 9                kubernetes.io/service-account.uid=906d3aa6-b06d-11e7-afdd-080027d9d784
10
11Type:   kubernetes.io/service-account-token
12
13Data
14====
15ca.crt:         1302 bytes
16namespace:      11 bytes
17token:          ......

在dashboard的登录窗口使用上面的token登录。

参考