如何平滑優雅地在Rancher 2.x中升級cert-manager?
作者:
Nassos Michas丨European Dynamics SA, CTO
如果你正在使用由Rancher提供的Helm Chart在Rancher管理的Kubernetes叢集中安裝cert-manager,那麼你最近也許收到了Let’s Encrypt發給你的提醒:
在叢集中檢查cert-manager的日誌,你可以看到Let’s Encrypt拒絕更新證書的請求,因為“你的ACME客戶端版本過舊,請升級到更新的版本”。那麼,我們現在就開始吧!
使用Rancher提供的Helm Chart進行更新
我想你腦海裡的第一想法應該和我的類似:使用相關的最新版本的Helm Chart升級cert-manager。大家可以不用考慮這個選項,因為Rancher提供的cert-manager Helm Chart目前最新的是0.5.2版本,所以別想著一鍵式升級啦!
使用官方Helm Chart升級
參考連結:https://forums.rancher.com/t/update-on-cert-manager-application-in-the-catalog/15598
計劃十分簡單:只需要將Rancher提供的cert-manager的Helm Chart移除,並使用Helm中由Jetstack維護的chart替換即可。
在開始之前,我們需要保持謹慎。從v0.5.2到目前stable的版本v0.11.0,許多內容都有所更改。新引入的CRDs和相應的配置格式將深刻地影響你的部署。因此,更新升級後,你需要將資源定義更新為新格式。幸運的是,cert-manager為我們提供了升級指令碼,我們會在下文中用到它。
移除Rancher提供的Helm Chart
1、 登入你的Rancher UI
2、 切換到最初安裝cert-manager的專案(可能是System)
3、 點選“APPs”
4、 點選垂直省略號按鈕,然後選擇“刪除”。
現在,你已經移除了最開始安裝的cert-manager。請注意,這一操作不會影響此前已經建立的證書,並且你的ingress配置應該像之前一樣工作。
安裝Tiller
Tiller是Helm的服務端元件,所以為了能在我們的CLI中使用Helm,我們需要在Kubernetes叢集中安裝Tiller。你可以通過執行以下命令來驗證Tiller是否已經安裝:
helm version
如果你的輸出結果與以上結果類似,那麼Tiller並沒有安裝好。如果你已經完成安裝,那麼請跳過這一部分。
好,現在我們來安裝Tiller。首先,我們需要建立一個服務賬號,授予我們遠端安裝Tiller的許可權,然後再授予安裝Chart的許可權。
kubectl -n kube-system create serviceaccount tiller
kubectl create clusterrolebinding tiller \
--clusterrole=cluster-admin \
--serviceaccount=kube-system:tiller
要啟動安裝Tiller:
helm init --service-account tiller
幾秒鐘之後,你能夠通過重新輸入命令helm version
來驗證Tiller是否已經安裝,或者通過下列命令來驗證你的Kubernetes Tiller部署:
kubectl -n kube-system rollout status deploy/tiller-deploy:
安裝cert-manager
在安裝cert-manager之前,我們需要做以下準備:
1、 禁用資源驗證,以允許cert-manager的webhook元件正常工作
2、 安裝新的(v0.11.1)的CRDs
3、 新增Jetstack repos
kubectl label namespace cert-manager certmanager.k8s.io/disable-validation=true
kubectl apply --validate=false -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.11/deploy/manifests/00-crds.yaml
helm repo add jetstack https://charts.jetstack.io && helm update
此時,我們就準備好安裝並且驗證cert-manager
helm install \
--name cert-manager \
--namespace cert-manager \
--version v0.11.0 \
jetstack/cert-manager
kubectl get pods --namespace cert-manager
cert-manager v0.11.0安裝成功
升級舊的資源參考和配置
參考連結:
https://cert-manager.io/docs/installation/upgrading/upgrading-0.10-0.11/
如果你檢查你的ingress證書,你會發現什麼都沒有改變。這在意料之中,因為之前的版本v0.5.2中使用的ingress定義的配置不適用於v0.11.0。cert-manager為我們提供了簡便的程式碼來查詢哪個叢集資源依舊引用舊的註釋:
kubectl get ingress \
--all-namespaces \
-o json | \
jq '.items[] | select(.metadata.annotations| to_entries | map(.key)[] | test("certmanager")) | "Ingress resource \(.metadata.namespace)/\(.metadata.name) contains old annotations: (\( .metadata.annotations | to_entries | map(.key)[] | select( . | test("certmanager") ) ))"'
根據你的Kubernetes叢集部署數量,以上列表可能會更短也可能會更長。而嘗試去手動更改所有部署的舊註釋可能會花費相當長的時間。以下CLI工具可以自動執行這一過程,但它不會對你的叢集造成任何更改:
# 首先,根據你的平臺下載二進位制檔案
wget -O api-migration https://github.com/jetstack/cert-manager/releases/download/v0.11.0/api-migration-linux
# 或者根據Darwin
wget -O api-migration https://github.com/jetstack/cert-manager/releases/download/v0.11.0/api-migration-darwin
# 將二進位制檔案標記為可執行檔案,然後對叢集執行二進位制檔案
chmod +x api-migration && ./api-migration --kubeconfig /path/to/my/kubeconfig.yaml
# 檢視CLI的輸出結果並且檢查檔案中的差異
diff ingress.yaml ingress-migrated.yaml
# 最後,review了新的ingress資源之後,應用manifest
kubectl apply -f ingress-migrated.yaml --kubeconfig /path/to/my/kubeconfig.yaml
請確保更新所有Ingress資源,以保證您的證書保持最新狀態。
重新引入叢集Issuer
我們現在基本上完成了,最後一步是我們需要重新引入叢集Issuer(如果你只希望將kind註釋更改為Issuer,也可以選擇每個名稱空間的Issuer)。
使用Let’s Encrypt stage和Production以及HTTP01建立兩個叢集Issuer,以下是程式碼摘要:
---
apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
spec:
acme:
email: [email protected]
server: https://acme-staging-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-staging-account-key
solvers:
- http01:
ingress:
class: nginx
---
apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
email: [email protected]
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-prod-account-key
solvers:
- http01:
ingress:
class: nginx
在一兩分鐘之後,你的所有ingress都將更新為指向新頒發的證書。但是請記住,如果你之前的證書不在續訂視窗內,那麼你不會發現任何差異。
PS:針對Rancher本身的應用,cert-manager支援的最高版本是v0.9,如果是自有的應用服務,可以支援最新版本。
PPS:由於眾所周知的原因,在國內不推薦使用cert-manager,建議使用10年有效期的自簽名證書。