在Kubernetes中,有ConfigMap和Secret两种对象来做配置管理。
ConfigMap
首先我们来讲一下 ConfigMap 这个对象,它主要用来保存一些非敏感数据,可以用作环境变量、命令行参数或者挂载到存储卷中。
ConfigMap 通过键值对来存储信息,是个 namespace 级别的资源。在 kubectl 使用时,我们可以简写成 cm。
例子
创建study_cm_demo_mix.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-demo-mix # 对象名字
namespace: demo # 所在的命名空间
data: # 这是跟其他对象不太一样的地方,其他对象这里都是spec
# 每一个键都映射到一个简单的值
player_initial_lives: "3" # 注意这里的值如果数字的话,必须用字符串来表示
ui_properties_file_name: "user-interface.properties"
# 也可以来保存多行的文本
game.properties: |
enemy.types=aliens,monsters
player.maximum-lives=5
user-interface.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true
创建 ConfigMap,也可以通过kubectl create cm
基于目录、文件或者字面值来创建,详细可参考官方文档。
使用ConfigMap的例子
apiVersion: v1
kind: Pod
metadata:
name: cm-demo-pod
namespace: demo
spec:
containers:
- name: demo
image: busybox:1.28
command:
- "bin/sh"
- "-c"
- "echo PLAYER_INITIAL_LIVES=$PLAYER_INITIAL_LIVES && sleep 10000"
env:
# 定义环境变量
- name: PLAYER_INITIAL_LIVES # 请注意这里和 ConfigMap 中的键名是不一样的
valueFrom:
configMapKeyRef:
name: cm-demo-mix # 这个值来自 ConfigMap
key: player_initial_lives # 需要取值的键
- name: UI_PROPERTIES_FILE_NAME
valueFrom:
configMapKeyRef:
name: cm-demo-mix
key: ui_properties_file_name
envFrom: # 可以将 configmap 中的所有键值对都通过环境变量注入容器中
- configMapRef:
name: cm-demo-all-env
volumeMounts:
- name: full-config # 这里是下面定义的 volume 名字
mountPath: "/config" # 挂载的目标路径
readOnly: true
- name: part-config
mountPath: /etc/game/
readOnly: true
volumes: # 您可以在 Pod 级别设置卷,然后将其挂载到 Pod 内的容器中
- name: full-config # 这是 volume 的名字
configMap:
name: cm-demo-mix # 提供你想要挂载的 ConfigMap 的名字
- name: part-config
configMap:
name: cm-demo-mix
items: # 我们也可以只挂载部分的配置
- key: game.properties
path: properties
注
- Pod 必须和 ConfigMap 在同一个 namespace 下面
- 在创建 Pod 之前,请务必保证 ConfigMap 已经存在,否则 Pod 创建会报错。
Secret
用 Secret 来保存一些敏感的数据信息,比如密码、密钥、token 等。在使用的时候, 跟 ConfigMap 的用法基本保持一致,都可以用来作为环境变量或者文件挂载。可以用来保存私有镜像中心的身份信息,这样 kubelet 可以拉取到镜像。
例子
创建一个Secret来保存访问私有仓库的身份信息
kubectl create secret -n demo docker-registry regcred \
--docker-server=yourprivateregistry.com \
--docker-username=allen \
--docker-password=mypassw0rd \
--docker-email=allen@example.com
# secret/regcred created
其中 demo
是命名空间, regcred
是名称
在yaml中使用
apiVersion: v1
kind: Pod
metadata:
name: private-reg
spec:
containers:
- name: private-reg-container
image: <your-private-image>
imagePullSecrets:
- name: regcred
使用命令
docker create secret -h
查看更多kubectl支持创建的类型