ConfigMap 与 Secret

1. ConfigMap

ConfigMap 用于将非机密性的配置数据保存到键值对中,使用时可以将其作为环境变量、命令行参数或存储卷中的配置文件挂载到 Pod 中。

Shellkubectl create configmap -h

创建 ConfigMap

YAMLkind: ConfigMap
apiVersion: v1
metadata:
  name: cm-demo
  namespace: default
data:
  data.1: hello
  data.2: world
  config: |
    property.1=value-1
    property.2=value-2
    property.3=value-3

ConfigMap 的四种使用方式

你可以使用四种方式来使用 ConfigMap 配置 Pod 中的容器:

  1. 在容器命令和参数内
  2. 容器的环境变量
  3. 在只读卷里面添加一个文件,让应用来读取
  4. 编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap

2. 环境变量形式

通过 valueFrom.configMapKeyRef 引用 ConfigMap 中的单个键,或通过 envFrom.configMapRef 将整个 ConfigMap 的所有键导入为环境变量。

YAMLapiVersion: v1
kind: Pod
metadata:
  name: testcm1-pod
spec:
  containers:
    - name: testcm1
      image: busybox
      command: [ "/bin/sh", "-c", "env" ]
      env:
        - name: DB_HOST
          valueFrom:
            configMapKeyRef:
              name: cm-demo3
              key: db.host
        - name: DB_PORT
          valueFrom:
            configMapKeyRef:
              name: cm-demo3
              key: db.port
      envFrom:
        - configMapRef:
            name: cm-demo1

3. 卷形式

将 ConfigMap 挂载为卷,ConfigMap 中的每个键会变成文件,值会变成文件内容。

YAMLapiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    configMap:
      name: myconfigmap

4. Secret

Secret 用来保存敏感信息,例如密码、OAuth 令牌和 SSH key 等等,将这些信息放在 Secret 中比放在 Pod 的定义中或者 Docker 镜像中要更加安全和灵活。

Secret 内置类型

内置类型用法
Opaque 用户定义的任意数据
kubernetes.io/service-account-token 服务账号令牌
kubernetes.io/dockercfg ~/.dockercfg 文件的序列化形式
kubernetes.io/dockerconfigjson ~/.docker/config.json 文件的序列化形式
kubernetes.io/basic-auth 用于基本身份认证的凭据
kubernetes.io/ssh-auth 用于 SSH 身份认证的凭据
kubernetes.io/tls 用于 TLS 客户端或者服务器端的数据
bootstrap.kubernetes.io/token 启动引导令牌数据

5. Secret 以环境变量形式使用

创建好 Secret 对象后,有两种方式来使用它。第一种是以环境变量的形式,通过 secretKeyRef 引用 Secret 中的键:

YAMLapiVersion: v1
kind: Pod
metadata:
  name: secret1-pod
spec:
  containers:
  - name: secret1
    image: busybox
    command: [ "/bin/sh", "-c", "env" ]
    env:
    - name: USERNAME
      valueFrom:
        secretKeyRef:
          name: mysecret
          key: username
    - name: PASSWORD
      valueFrom:
        secretKeyRef:
          name: mysecret
          key: password

6. Secret 以 Volume 形式挂载

第二种方式是以 Volume 的形式挂载,Secret 中的每个键会变成文件,值会变成文件内容:

YAMLapiVersion: v1
kind: Pod
metadata:
  name: secret2-pod
spec:
  containers:
  - name: secret2
    image: busybox
    command: ["/bin/sh", "-c", "ls /etc/secrets"]
    volumeMounts:
    - name: secrets
      mountPath: /etc/secrets
  volumes:
  - name: secrets
    secret:
     secretName: mysecret

💡 ConfigMap vs Secret:ConfigMap 用于非敏感配置,Secret 用于敏感数据。Secret 的数据以 Base64 编码存储,使用时自动解码。虽然 Base64 不是加密,但 Secret 在传输和存储时可以配合 RBAC 和加密插件提供额外的安全保障。

目录