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 中的容器:
- 在容器命令和参数内
- 容器的环境变量
- 在只读卷里面添加一个文件,让应用来读取
- 编写代码在 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 和加密插件提供额外的安全保障。