本文超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。
使用容器进行配置管理
编者注:这是我们关于 Kubernetes 1.2 新功能的系列深度文章中的第七篇文章
在编写应用程序时,将应用程序代码与配置分离是一种良好实践。我们希望使应用程序作者能够在 Kubernetes 中轻松地运用这种模式。虽然 Secrets API 允许将凭据和密钥等信息与应用程序分离,但过去不存在用于普通非机密配置的对象。在Kubernetes 1.2中,我们添加了一个名为 ConfigMap 的新 API 资源来处理此类配置数据。
ConfigMap 的基础知识
ConfigMap API 的概念很简单。从数据的角度来看,ConfigMap 类型只是一组键值对。应用程序的配置方式多种多样,因此我们需要灵活地让用户存储和使用配置数据。在 Pod 中使用 ConfigMap 的方法有三种:
- 命令行参数
- 环境变量
- 卷中的文件
这些不同的方法适用于对所使用数据的不同建模方式。为了尽可能灵活,我们使 ConfigMap 能够保存细粒度和/或粗粒度的数据。此外,由于应用程序从环境变量和包含配置数据的文件中读取配置设置,因此我们构建了 ConfigMap 以支持这两种访问方法。让我们来看一个包含这两种类型配置的 ConfigMap 示例。
apiVersion: v1
kind: ConfigMap
metadata:
Name: example-configmap
data:
# property-like keys
game-properties-file-name: game.properties
ui-properties-file-name: ui.properties
# file-like keys
game.properties: |
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
ui.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
使用过 Secrets 的用户会发现很容易开始使用 ConfigMap——它们非常相似。这些 API 的一个主要区别是 Secret 值存储为字节数组,以支持存储 SSH 密钥等二进制文件。在 JSON 和 YAML 中,字节数组被序列化为 base64 编码的字符串。这意味着仅查看序列化形式很难分辨 Secret 的内容。由于 ConfigMap 旨在仅保存配置信息而不是二进制文件,因此值存储为字符串,因此在序列化形式中是可读的。
我们希望创建 ConfigMap 与在其中存储数据一样灵活。为了创建 ConfigMap 对象,我们添加了一个名为 kubectl create configmap
的 kubectl 命令,该命令提供了三种不同的方式来指定键值对:
- 指定文字键和值
- 指定单个文件
- 指定一个目录,为每个文件创建键
这些不同的选项可以在单个命令中混合、匹配和重复使用。
$ kubectl create configmap my-config \
--from-literal=literal-key=literal-value \
--from-file=ui.properties \
--from=file=path/to/config/dir
使用 ConfigMap 很简单,Secrets 的用户也会熟悉。以下是一个 Deployment 的示例,它使用上面的 ConfigMap 来运行一个虚构的游戏服务器。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: configmap-example-deployment
labels:
name: configmap-example-deployment
spec:
replicas: 1
selector:
matchLabels:
name: configmap-example
template:
metadata:
labels:
name: configmap-example
spec:
containers:
- name: game-container
image: imaginarygame
command: ["game-server", "--config-dir=/etc/game/cfg"]
env:
# consume the property-like keys in environment variables
- name: GAME\_PROPERTIES\_NAME
valueFrom:
configMapKeyRef:
name: example-configmap
key: game-properties-file-name
- name: UI\_PROPERTIES\_NAME
valueFrom:
configMapKeyRef:
name: example-configmap
key: ui-properties-file-name
volumeMounts:
- name: config-volume
mountPath: /etc/game
volumes:
# consume the file-like keys of the configmap via volume plugin
- name: config-volume
configMap:
name: example-configmap
items:
- key: ui.properties
path: cfg/ui.properties
- key: game.properties
path: cfg/game.properties
restartPolicy: Never
在上面的示例中,Deployment 通过两种可用机制使用 ConfigMap 的键。ConfigMap 的类属性键用作 Deployment 模板中单个容器的环境变量,而类文件键填充一个卷。有关更多详细信息,请参阅ConfigMap 文档。
我们希望这些基本原语易于使用,并期待看到人们使用 ConfigMap 构建的内容。感谢提供有关此功能反馈的社区成员。还要特别感谢 Tamer Tas,他对 ConfigMap 的提议和实施做出了巨大贡献。
如果您对 Kubernetes 和配置感兴趣,您可能希望参与以下活动:
- 我们的配置Slack 频道
- 我们的Kubernetes 配置特别兴趣小组电子邮件列表
- 配置“特别兴趣小组”,每周三太平洋时间上午 10 点(10h00)在SIG-Config 视频群聊中举行会议
当然,要了解有关该项目的更多常规信息,请访问www.kubernetes.io并在 Twitter 上关注我们@Kubernetesio。