在我們使用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 }}
如下圖所示
添加這一節的效果就是,在
rabbitmq/templates/secrets.yaml
中有任何内容改變,都會導緻statefulset的sepc下的annotation被更新,進而驅動重建pod,達到我們想要的效果
重新執行上面的更新指令,pod重建後即可使用我們制定的密碼登入管理背景
總結
本文示範了利用Helm内置Go Template函數和變量來實作kubernetes workload跟随配合自動更新效果
歡迎大家使用阿裡雲上的容器服務,利用kubernetes叢集上自動部署的Helm快速部署和釋出應用