天天看點

利用Helm驅動Kubernetes workload跟随ConfigMap/Secret關聯更新

在我們使用kubernetes的過程中,通常都會将應用的配置檔案放到ConfigMap或/和Secret中,但是也經常碰到配置檔案更新後如何讓其生效的問題,今天我們就來示範如何利用Helm來解決這個問題

環境準備

建立Kubernetes叢集

阿裡雲容器服務Kubernetes 1.11.2目前已經上線,叢集安裝後會自動部署Helm Tiller,具體過程可以

參考這裡

安裝Helm Client

Helm Client是我們後續操作的基礎,安裝方法請

參照這裡

擷取RabbitMQ Chart

為了後面示範Helm的功能,需要擷取Chart至本地,可以使用Helm指令擷取然後解壓

helm fetch stable/rabbitmq
tar xvf rabbitmq-2.2.0.tgz           

如果網絡受限,可以從

github

上擷取

部署RabbitMQ

helm upgrade --install rabbitmq rabbitmq \
--set-string rabbitmq.password=123456 \
--set ingress.enabled=true           

檢視Ingress Controller的EXTERNAL-IP

~ kubectl -n kube-system get svc nginx-ingress-lb
NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                      AGE
nginx-ingress-lb       LoadBalancer   172.19.5.242    47.xxx.61.xxx   80:30544/TCP,443:31608/TCP   11d           

然後用浏覽器通路EXTERNAL-IP位址,可以看到RabbitMQ管理背景的登入頁面,使用下面的指令檢視在secret中儲存的密碼,配合user使用者即可登入管理背景

echo "Password      : $(kubectl get secret --namespace default rabbitmq -o jsonpath="{.data.rabbitmq-password}" | base64 --decode)"
Password      : 123456           

更新RabblitMQ

如果我們現在希望更将RabbitMQ的密碼做一下修改,執行下面的指令

helm upgrade --install rabbitmq rabbitmq \
--set-string rabbitmq.password=1234567 \
--set ingress.enabled=true           

檢視更新後的密碼

echo "Password      : $(kubectl get secret --namespace default rabbitmq -o jsonpath="{.data.rabbitmq-password}" | base64 --decode)"
Password      : 1234567           

可以發現secret已經更新,但是使用新的密碼登入卻會失敗,這便是我們在利用ConfigMap和Secret來管理配置檔案時常常碰到的問題,ConfigMqp和Secret更新後,使用它們内容的Deployment/Statefulset等workload不能關聯更新,下面我們通過對官方的RabbitMQ Chart做一點修改,來實作解決這個問題

修改RabbitMQ Chart

rabbitmq/templates/statefulset.yaml

的spec.template.metadata下加入這一段

annotations:
    checksum/config: {{ include (print $.Template.BasePath "/secrets.yaml") . | sha256sum }}           

如下圖所示

利用Helm驅動Kubernetes workload跟随ConfigMap/Secret關聯更新

添加這一節的效果就是,在

rabbitmq/templates/secrets.yaml

中有任何内容改變,都會導緻statefulset的sepc下的annotation被更新,進而驅動重建pod,達到我們想要的效果

重新執行上面的更新指令,pod重建後即可使用我們制定的密碼登入管理背景

總結

本文示範了利用Helm内置Go Template函數和變量來實作kubernetes workload跟随配合自動更新效果

歡迎大家使用阿裡雲上的容器服務,利用kubernetes叢集上自動部署的Helm快速部署和釋出應用