ConfigMap和Secret:配置应用程序

更改容器的主进程

我们需要一个可以用配置控制进程的服务,例如配置不同参数,程序表现不一样,我们看下这个程序

# cat fortuneloop.sh
#!/bin/bash
trap "exit" SIGINT

INTERVAL=$1   #默认值来自命令行参数
echo Configured to generate new fortune every $INTERVAL seconds

mkdir -p /var/htdocs

while :
do
  echo $(date) Writing fortune to /var/htdocs/index.html
  /usr/games/fortune > /var/htdocs/index.html
  sleep $INTERVAL
done

里面有个环境变量INTERVAL可以控制休眠的时间长短(默认值来自命令行参数),也就控制了fortune财富“鸡汤“的变化速度,我们来用Dockerfile制作这个服务

# cat Dockerfile
FROM ubuntu:latest

RUN apt-get update ; apt-get -y install fortune
ADD fortuneloop.sh /bin/fortuneloop.sh

ENTRYPOINT ["/bin/fortuneloop.sh"]
CMD ["10"]

大家看懂服务逻辑就行了,镜像已经制作好了的。我们直接进入kubernetes部署环节

将命令行选项传递给应用程序

见pod描述文件

create试试看(可以跳过),因为上面的INTERVAL是来自命令行,所以结果可想而知频率是固定的2秒。

设置暴露给应用程序的环境变量

create试试,我们继续使用port-forward代理访问pod端口

然后在另一个控制台访问,观察是否设定的环境变量秒数

通过ConfigMap配置应用程序

我们现在为财富鸡汤服务创建一个配置文件

ConfigMap还有其他方式创建,不过yaml方式是我们推荐经常使用的,其他方式不做练习了。

create并get,使用-o yaml配合get可以获得最全的yaml描述

上述data部分就是我们的配置了,现在我们使用这个配置来为服务设置环境变量(这个操作和传统开发不一样吧)

同样使用port-forward看下调用下服务吧,这里不贴出结果

从上面的实例可以看出ConfigMap是一个含有数据的资源,它能借助kubernetes转为容器所使用的环境变量、参数、甚至是文件。

将ConfigMap暴露为pod中的文件

拿上述服务中的nginx做这个实验,先看看它的配置文件,我们尝试控制它是否开启压缩

可以将这个文件直接创建成ConfigMap,见

出现命名冲突,记得清理自己空间以前部署的资源

我们使用的是文件夹,里面含有两个文件,从configmap中能看出

有my-nginx-config.conf和sleep-interval两个,那我们使用他们

后面yaml文件都可能都会有点大,大家能理解大概就可以了,不过这个文件比较典型,先努力读懂它

部署上,看看效果

在另外一个控制台,curl能看到开启了gzip

Well!现在我们体验了如何在kubernetes中为自己的应用使用配置文件,这样一来我们发版管理配置是不是更方便了呢?

通过Secret传递敏感配置信息

有时我们有一些账号密码不能明文,kubernetes提供了Secret资源和ConfigMap使用非常相似,只是对文本加密了而已。

我们常见的是给阿里云、亚马逊的密钥做加密处理,这些密钥是用来控制权限访问云商资源的。

首先创建一个secret

查看已经创建的secret

我们现在就可以使用secret了,写一个yaml

将它保存到文件 package-test.yaml,执行

它是一个cronjob,每两分钟运行一次作业(启动一个pod),我们的作业就是简单的打印环境变量 key和secret。

思考题

  • 请谈谈都有哪几种配置应用的方式,和传统开发的区别

最后更新于

这有帮助吗?