几乎所有的应用程序都需要配置(实例的配置信息,外部系统的访问信息等),而这些配置显然不应该被打包到应用程序本身中。
本篇文章看看如何在Kubernetes中配置应用程序的信息。
1.配置容器应用的方式
命令行 最简单的应用配置方式,是使用命令行。
配置文件
随着配置信息增多,考虑到维护成本,可以将配置信息存储到配置文件中。但对于容器而言,使用配置文件的方式需要将配置项打包到镜像中,而且每次配置信息的变更都会导致重新生成镜像,重新部署,维护和变更成本较高。
- 环境变量
在容器应用中,使用环境变量来实现配置,也是较普遍的一种做法,通过将参数传递给容器中的应用,变更容器运行期的配置信息,如MySQL官方的镜像就使用环境变量MYSQL_ROOT_PASSWORD 来修改超级用户root的密码。
- volume
另外,基于volume的方式获取配置信息也是一种可行的方式,如使用Git Repo存储配置信息,能有效的做到版本化管理会随时回退。
在K8S中,存储配置信息的资源被称ConfigMap,本部分将介绍ConfigMap、Secret的使用。
2.从命令行传递参数
在Docker容器中,通常使用如下方式传递参数:
- 使用
ENTRYPOINT定义可执行命令 - 使用
CMD传递参数
在ENTRYPOINT中,可以使用如下两种方式启动应用:
- Shell方式,如
ENTRYPOINT node app.js - exec方式,如
ENTRYPOINT ["node", "app.js"]
注意: 这两种方式的区别在于前者是先启动Shell,由Shell调用node,而后者直接启动node应用。
在K8S中,可以通过配置文件中的command和args来设置容器中的ENTRYPOINT和CMD
譬如
kind: Pod
spec:
containers:
- image: some/image
command: ["/bin/command"]
args: ["arg1", "arg2", "arg3"]
它们之间的区别如下图所示:
| Docker | Kubernetes | 描述 |
|---|---|---|
| ENTRYPOINT | command | 在容器中执行命令 |
| CMD | args | 给命令传递参数 |
3.使用环境变量
在K8S中,使用env设置镜像中定义的环境变量。
譬如,容器中存在如下脚本,其中的INTERVAL使用环境变量进行设置:
#!/bin/bash
while :
do
echo $(date)
sleep $INTERVAL
done
在K8S中,其配置文件类似如下:
kind: Pod
spec:
containers:
- image: xxxxx
env:
- name: INTERVAL
value: "30"
...
4.使用CONFIGMAP解耦配置
Kubernetes允许将配置项分离到一个称为ConfigMap的单独对象中,它包含若干键/值对,并且值的范围可以从文本到整个配置文件。