Kubernetes 從1.10到1.11升級記錄
Kubernetes 1.12已經發布。我們線上的版本升級都是按照比官方低一個版本的節奏。 因此可以開始考慮將團隊線上環境的Kubernetes叢集從1.10升級到1.11了。 本文記錄了在測試環境中的演練過程。
1.準備
當前Kubernetes 1.11的小版本是1.11.3。 在升級之前一定要多讀幾遍官方的升級須知ofollow,noindex" target="_blank">Kubernetes 1.11 - Action Required Before Upgrading 。
其中針對我們對Kubernetes的使用情況,有幾個需要我們注意的地方:
- 基於IPVS的負載均衡進入GA,當不滿足IPVS的條件時,kube-proxy會使用iptables Proxier。(本次升級演練將不開啟IPVS。)
- 可使用CoreDNS作為Kubernetes的DNS外掛進入GA。(本次升級演練將不做從kube-dns到CoreDNS的切換)
- heapster已經廢棄,推薦使用metrics-server
Kubernetes 1.11所需的外部依賴和一些元件的版本:
- etcd 3.2.18
- 以下docker版本在Kubernetes 1.11(和Kubernetes 1.10一樣)上進行過驗證:docker 1.11.2, 1.13.1, 17.03.x (支援的最小docker版本是1.11.2)
- CNI 0.6.0和Kubernetes 1.10依賴的版本相同
- CSI 0.3.0
- dashboard 1.8.3
- kube-dns 1.14.10
- flannel 0.10.0
- kube-state-metrics 1.4.0
- metrics-server 0.3.1
2.使用ansible升級Kubernetes
2.1 master節點
我們的叢集有3個master節點,在使用ansible升級master節點(kube-apiserver
,kube-scheduler
,kube-controller-manager
)時,通過修改ansible role的inventory檔案,只先升級第一個master節點,當測試沒有問題後再升級剩餘兩個master節點。
master節點升級完成後,kube-controller-manager
啟動後出現訪問API Server許可權問題:
error retrieving resource lock kube-system/kube-controller-manager: endpoints "kube-controller-manager" is forbidden: User "system:kube-controller-manager" cannot get endpoints in the namespace "kube-system"
應該是新版本需要system:kube-controller-manager
這個ClusterRole需要更多的許可權,因為這個ClusterRole是系統預設的。 所以這裡懷疑某處除了問題,Annotations: rbac.authorization.kubernetes.io/autoupdate=true
表明每次重啟API Server時是可以被Auto-reconciliation
,詳見這裡Default Roles and Role Bindings Auto-reconciliation
。 所以嘗試刪掉它,重啟apiserver讓其重新建立新的,之後重啟kube-controller-manager問題解決。
kubectl delete clusterrole system:kube-controller-manager systemctl restart kube-apiserver kubectl get clusterrole | grep controller-manager system:kube-controller-manager1m systemctl restart kube-controller-manager kubectl describe clusterrole system:kube-controller-manager Name:system:kube-controller-manager Labels:kubernetes.io/bootstrapping=rbac-defaults Annotations:rbac.authorization.kubernetes.io/autoupdate=true PolicyRule: ResourcesNon-Resource URLsResource NamesVerbs --------------------------------------------- secrets[][][create delete get update] endpoints[][][create get update] serviceaccounts[][][create get update] events[][][create patch update] tokenreviews.authentication.k8s.io[][][create] namespaces[][][get] *.*[][][list watch]
2.2 node節點
同樣也是先選擇一個node節點升級做測試,如果這個節點上有業務Pod正在執行,可以先將這個節點排幹(drain),將業務容器轉移到其他的node節點上。 測試環境中的升級十分順利,各個核心元件成功升級到了1.11.3。
注意提前準備–pod-infra-container-image到k8s.gcr.io/pause:3.1
從kube-proxy的啟動日誌來看,因為本次演練沒有開啟ipvs proxyier,所以還是使用的iptables Proxier。
Flag proxy-mode="" unknown, assuming iptables proxy Using iptables Proxier.
3.其他元件
3.1 移除Heapster
heapster已經廢棄,需要將heapster及其相關內容從Kubernetes叢集中移除:
kubectl delete ClusterRoleBinding heapster kubectl delete ServiceAccount heapster -n kube-system kubectl delete Deployment heapster-n kube-system kubectl delete Service heapster-n kube-system kubectl delete Deployment monitoring-influxdb-n kube-system kubectl delete Service monitoring-influxdb-n kube-system kubectl delete Deployment monitoring-grafana-n kube-system kubectl delete Service monitoring-grafana-n kube-system
3.2 部署metrics-server
heapster已經廢棄,推薦使用metrics-server。 metrics-server的部署可以使用helm,[官方的chart在這裡](https://github.com/helm/charts/tree/master/stable/metrics-server;也可以參考和定製官方給的yamldeploy metrics-server