在我们使用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快速部署和发布应用