Kubernetes 1.2版本添加了一个叫ConfigMap的新功能。这个功能提供给容器注入应用程序数据的方式。注入配置文件对于大部分应用程序来讲很强大,可是新的ConfigMap功能不只能够在容器开启时提供初始配置功能,还有在容器运行时更新自身配置的功能。在这篇帖子里,我将会给你们展现如何编写微服务来利用更新好的配置,而且在fly上面重构你的service。git
让咱们来看看监控配置文件变化的简单网页app是怎么样的。github
这个app有趣部分是ConfigManager
和 WatchFile
.golang
ConfigManager
的工做就是提供访问咱们的 Config{}
的路径结构,这样的话当Kubernetes ConfigMap
给咱们一个新的配置文件版本或者咱们更新 Config{}
对象时候,竞争冲突不存在。数据库
WatchFile
的工做就是为做出的修改查看咱们的配置文件,而且运行读取配置文件的新版本回调函数,使用ConfigManager
设置新的 Config{}
。网络
让咱们看一下ConfigManager
的安装启用。app
这里是咱们使用一个简单的Mutex用来避免竞争冲突的例子。一般你想要避免使用Mutex,而后使用创建在channel里面的golang。可是既然管理员的工做是保护配置对象的实例,那么使用Mutex也仍是能够接受的。curl
怀着好奇心,我建立了一个这个对象的golang channel安装启用,而后运行一些基准点。你能够点击(点我)找到代码和基准点测试。函数
Mutex版本没有死锁的风险,很高效。而 FileWatcher
的实施会较复杂一点。它的目标是使任意额外的fsnotify events成为一个单独更新的event,这样咱们只要执行一次回调函数。查看完整代码请点击这里(点我)
有意思的部分是 run()函数执行在线程中,而后运行回调函数。微服务
你可能会以为代码应该寻找 fsnotify.Writeevents而不是fsnotify.Remove,然而……ConfigMap所呈现给应用程序的配置文件事实上是一个链接到咱们配置文件的符号连接,而不是一个文件。当ConfigMap更新时,Kubernetes AtomicWriter()就能够实现强大的ConfigMap更新。测试
为了作到这样,AtomicWriter()建立了一个新的目录;编写更新好的ConfigMap内容到新的目录。一旦编写完成,那么它就会移动原始配置文件符号连接,而后用新的指向最新建立目录符号连接替换它。
咱们的代码处理方式理论上应该是监控咱们的配置文件符号连接,而不是为events的真实文件。然而,fsnotify.v1并不容许咱们提交IN_DONT_FOLLOW标志到inotify,inotify容许咱们为修改监控符号连接。可是fsnotify取消引用符号连接,而后为events监控真实文件。这不太可能做出修改,由于fsnotify是为跨平台设计的,并且不是全部的平台都支持符号连接。
我继续使用fsnotify函数库,由于对于我来讲,用它在osx上开发,在容器上部署都比较方便。以Linux为中心的实施应该直接使用"golang.org/x/exp/inotify"数据库。
如今咱们有了咱们的代码,咱们能够建立一个Docker镜像而后更新到Docker hub,为部署在咱们Kubernetes集群作好准备。
假设你已经创建起了一个Kubernetes集群;让咱们来建立一个ConfigMap配置,而后用咱们的容器来使用它。
首先,咱们建立一个密钥清单文件
这个定义了一个新的叫作configmap-microservice-demo的ConfigMap,它包括了 data:配置文件名字叫作configmap-microservice-demo.yaml
它的内容是message: Hello World。
使用 kubectl来建立ConfigMap。
你能够检测到最新的建立好的ConfigMap
接下来咱们来定义一个Replication Controller密钥清单来运行咱们的应用程序容器。
有趣的地方就是volumes:和volumeMounts:,这二者告诉运行在节点上的kubelet哪里能够安装咱们的配置文件。当咱们的容器运行的时候;数据卷插件会在咱们的容器中安装一个叫作/etc/config的目录,而后在这里面替换咱们的配置文件configmap-microservice-demo.yaml。
从咱们的容器观点角度看,咱们的配置文件完整途径将会是:/etc/config/configmap-microservice-demo.yaml
如今让咱们来建立Replication Controller。
咱们如今能够检查咱们正在运行的pods来寻找咱们新pod的IP地址。
如今若是你登陆到咱们集群中的一个节点,咱们在集群里能够用pod的IP地址从任何地方来访问应用程序。
若是这个部分让你很困惑,你能够点击这篇博客(点我),它对于Kubernetes网络是如何运行的有很深层次的指导意义。这个是官方文档(点我)。
如今为了有趣的部分,让咱们来更新咱们的配置,部署修改到ConfigMap。
让咱们打开原始的ConfigMap密钥清单文件,而后修改咱们的message: Hello World到message:Hello Grandma。
用咱们更新的版本替代目前的ConfigMap
咱们能够验证到,经过在configmap资源上执行get,更新很成功。
咱们的应用程序很快获得了更新后的配置,咱们能够经过看日志就来验证。
如今咱们能够在集群里面curl咱们的应用程序,咱们应该看到更新的配置反应在咱们的应用程序里。
你能够登陆到咱们的容器正在运行的节点,而后检查直接检查配置文件。Kubernetes将目录安装在/var/lib/kubelet/pods/<pod-id>/volumes/kubernetes.io~configmap/config-volume。
查看完整代码点击这里:点我
(若是须要转载,请联系咱们哦,尊重知识产权人人有责)