我们的k8s集群已经将nginx的配置使用configmap挂载到nginx镜像中,实现了配置的外部注入;
nginx本身支持nginx -s reload重新加载配置文件,但是在k8s集群中不适合进入pod命令行执行这个命令。
这里,我们参考一下如下代码,使用inotify-tools监控配置文件的变化后自动执行reload命令
#!/bin/sh
oldcksum=`cksum /etc/nginx/conf.d/default.conf`
inotifywait -e modify,move,create,delete -mr --timefmt '%d/%m/%y %H:%M' --format '%T' \
/etc/nginx/conf.d/ | while read date time; do
newcksum=`cksum /etc/nginx/conf.d/default.conf`
if [ "$newcksum" != "$oldcksum" ]; then
echo "At ${time} on ${date}, config file update detected."
oldcksum=$newcksum
nginx -s reload
fi
done
将上述脚本生成auto-reload.sh 文件
我的场景是使用openresty代替nginx,基本的使用是一样的,我们需要基于dockerhub中的openresty镜像在定制自己的镜像
开始之前,我们需要准备几个文件:
- inotify-tools-3.14-8.el7.x86_64.rpm,我的镜像是基于centos构建的,inotifywait 命令需要安装inotify-tools
- auto-reload.sh读取配置文件变化并自动执行nginx -s reload命令
- start.sh,openresty镜像中nginx启动命令是前台运行的,增加一个reload脚本,需要让nginx启动命令后台执行,所以写一个启动脚本来实现,内容如下:
#!/bin/bash
/usr/bin/openresty -g "daemon off;" &
/auto-reload.sh
最后,镜像的Dokcerfile如下
FROM openresty/openresty:1.13.6.2-1-centos
ADD auto-reload.sh auto-reload.sh
ADD inotify-tools-3.14-8.el7.x86_64.rpm inotify-tools-3.14-8.el7.x86_64.rpm
RUN rpm -ivh inotify-tools-3.14-8.el7.x86_64.rpm && rm -rf inotify-tools-3.14-8.el7.x86_64.rpm \
&& chmod +x auto-reload.sh
CMD ["./start.sh"]
请注意,这个例子中,我是使用configmap将default.conf挂载到/etc/nginx/conf.d目录下
k8s集群中部署上述镜像后,修改configmap中default.conf的内容,大概需要等待10秒到1分钟的时间,就能看到日志显示配置重新加载完毕
网友评论