Kubernetes 1.6到1.7升级记录
文章目录
[隐藏]
- 准备
- 使用ansible升级k8s的核心组件
- 以容器形式运行组件的升级
- 升级kube-dns的注意事项
- 升级dashboard的注意事项
最近正在制定将团队生产环境的Kubernetes集群从1.6升级1.7的计划。 Kubernetes 1.8已经发布,所以准备考虑从1.6到1.7的升级。
准备
当前1.7的最新版本是1.7.8。在做准备之前需要仔细读一遍官方的Kubernetes 1.7 (https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.7.md#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。
wget https://raw.githubusercontent.com/kubernetes/kubernetes/e1d6bcc22736a15ce662b3bd1009a16cdde5cd86/cluster/addons/dns/kube-dns.yaml.base wget https://raw.githubusercontent.com/kubernetes/kubernetes/e1d6bcc22736a15ce662b3bd1009a16cdde5cd86/cluster/addons/dns/transforms2sed.sed
查看transforms2sed.sed:
s/__PILLAR__DNS__SERVER__/$DNS_SERVER_IP/g s/__PILLAR__DNS__DOMAIN__/$DNS_DOMAIN/g s/__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参数一致
执行:
cd ~/k8s/kube-dns sed -f transforms2sed.sed kube-dns.yaml.base > kube-dns.yaml
- 上面的变量DNS_SERVER要和kubelet设置的–cluster-dns参数一致。
kubectl create -f kube-dns.yaml
查看kube-dns的Pod,确认所有Pod都处于Running状态:
kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system kube-dns-3468831164-chjw5 3/3 Running 0 3m
测试一下DNS功能是否好用:
kubectl run curl --image=radial/busyboxplus:curl -i --tty nslookup kubernetes.default Server: 10.96.0.10 Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local Name: kubernetes Address 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=
-
使用DNS Horizontal Autoscaler
升级dashboard的注意事项
因为之前部署Dashboard 1.6时创建了ServiceAccount kubernetes-dashboard,并分配了cluster-admin的权限。 所以在升级前应该先删除掉这个ServiceAccount:
kubectl delete serviceaccount kubernetes-dashboard -n kube-system kubectl delete clusterrolebinding kubernetes-dashboard
1.7.x版本的dashboard对安全做了增强,默认需要以https的方式访问,增加了登录的页面,同时增加了一个gcr.io/google_containers/kubernetes-dashboard-init-amd64的init容器。
另外需要注意dashboard调整了部署文件的源码目录结构:
mkdir -p ~/k8s/ wget https://raw.githubusercontent.com/kubernetes/dashboard/b44f7cc5fde4dbe2a884b1e32a2b363d8031e4ca/src/deploy/recommended/kubernetes-dashboard.yaml kubectl create -f kubernetes-dashboard.yaml
kubernetes-dashboard.yaml文件中的ServiceAccount kubernetes-dashboard只有相对较小的权限,因此我们创建一个kubernetes-dashboard-admin的ServiceAccount并授予集群admin的权限,创建kubernetes-dashboard-admin.rbac.yaml:
--- apiVersion: v1 kind: ServiceAccount metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard-admin namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: kubernetes-dashboard-admin labels: k8s-app: kubernetes-dashboard roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: kubernetes-dashboard-admin namespace: kube-system
kubectl create -f kubernetes-dashboard-admin.rbac.yaml serviceaccount "kubernetes-dashboard-admin" created clusterrolebinding "kubernetes-dashboard-admin" created
查看kubernete-dashboard-admin的token:
kubectl -n kube-system get secret | grep kubernetes-dashboard-admin kubernetes-dashboard-admin-token-mrngz kubernetes.io/service-account-token 3 18m kubectl describe -n kube-system secret kubernetes-dashboard-admin-token-mrngz Name: kubernetes-dashboard-admin-token-mrngz Namespace: kube-system Labels: <none> Annotations: kubernetes.io/service-account.name=kubernetes-dashboard-admin kubernetes.io/service-account.uid=906d3aa6-b06d-11e7-afdd-080027d9d784 Type: kubernetes.io/service-account-token Data ==== ca.crt: 1302 bytes namespace: 11 bytes token: ......
在dashboard的登录窗口使用上面的token登录。
原文出处:frognew -> http://blog.frognew.com/2017/10/upgrade-kubernetes-from-1.6-to-1.7.html