Kubernetes 1.6到1.7升级记录
2017-10-13
最近正在制定将团队生产环境的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登录。