如何平滑優雅地在Rancher 2.x中升級cert-manager?

做者:linux

Nassos Michas丨European Dynamics SA, CTOnginx

 
若是你正在使用由Rancher提供的Helm Chart在Rancher管理的Kubernetes集羣中安裝cert-manager,那麼你最近也許收到了Let’s Encrypt發給你的提醒:
 
如何平滑優雅地在Rancher 2.x中升級cert-manager?
 
在集羣中檢查cert-manager的日誌,你能夠看到Let’s Encrypt拒絕更新證書的請求,由於「你的ACME客戶端版本過舊,請升級到更新的版本」。那麼,咱們如今就開始吧!
 git

使用Rancher提供的Helm Chart進行更新

 

我想你腦海裏的第一想法應該和個人相似:使用相關的最新版本的Helm Chart升級cert-manager。你們能夠不用考慮這個選項,由於Rancher提供的cert-manager Helm Chart目前最新的是0.5.2版本,因此別想着一鍵式升級啦!
 
如何平滑優雅地在Rancher 2.x中升級cert-manager?
 github

使用官方Helm Chart升級

 

參考連接:https://forums.rancher.com/t/update-on-cert-manager-application-in-the-catalog/15598web

 

計劃十分簡單:只須要將Rancher提供的cert-manager的Helm Chart移除,並使用Helm中由Jetstack維護的chart替換便可。json

 

在開始以前,咱們須要保持謹慎。從v0.5.2到目前stable的版本v0.11.0,許多內容都有所更改。新引入的CRDs和相應的配置格式將深入地影響你的部署。所以,更新升級後,你須要將資源定義更新爲新格式。幸運的是,cert-manager爲咱們提供了升級腳本,咱們會在下文中用到它。api

 

移除Rancher提供的Helm Chart
 瀏覽器

一、 登陸你的Rancher UIapp

二、 切換到最初安裝cert-manager的項目(多是System)ide

三、 點擊「APPs」

四、 點擊垂直省略號按鈕,而後選擇「刪除」。
 
如何平滑優雅地在Rancher 2.x中升級cert-manager?
 
如今,你已經移除了最開始安裝的cert-manager。請注意,這一操做不會影響此前已經建立的證書,而且你的ingress配置應該像以前同樣工做。

 

安裝Tiller

 

Tiller是Helm的服務端組件,因此爲了能在咱們的CLI中使用Helm,咱們須要在Kubernetes集羣中安裝Tiller。你能夠經過運行如下命令來驗證Tiller是否已經安裝:
 

helm version

 
如何平滑優雅地在Rancher 2.x中升級cert-manager?
 
若是你的輸出結果與以上結果相似,那麼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:

 
如何平滑優雅地在Rancher 2.x中升級cert-manager?
 
安裝cert-manager

 

在安裝cert-manager以前,咱們須要作如下準備:
 

一、 禁用資源驗證,以容許cert-manager的webhook組件正常工做

二、 安裝新的(v0.11.1)的CRDs

三、 添加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

 
如何平滑優雅地在Rancher 2.x中升級cert-manager?
 
此時,咱們就準備好安裝而且驗證cert-manager
 

helm install \
  --name cert-manager \
  --namespace cert-manager \
  --version v0.11.0 \
  jetstack/cert-manager
kubectl get pods --namespace cert-manager

 
如何平滑優雅地在Rancher 2.x中升級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") )  ))"'

 
如何平滑優雅地在Rancher 2.x中升級cert-manager?
 
根據你的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: example@example.com
    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: example@example.com
    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年有效期的自簽名證書。

 

今天晚上20:30,最後一期在線培訓課程《Rancher 2.3集羣模板及新特性》將準時開播!集羣模板功能、Google認證、與k8s解耦、k8s1.16的支持……一節課統統解鎖!複製如下地址到瀏覽器報名吧:

http://www.itdks.com/Home/Live/detail?id=28601

相關文章
相關標籤/搜索