在 Kubernetes 中,ConfigMapSecret 是用于管理配置数据和敏感信息的两种资源。ConfigMap 用于存储非机密数据,Secret 用于存储敏感数据,如密码、OAuth 令牌等。以下是详细介绍和示例。

 

ConfigMap

ConfigMap 用于存储非机密的键值对配置数据,这些数据可以在 Pod 中使用。

 

创建 ConfigMap

你可以通过 YAML 文件创建一个 ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: example-config
data:
  # 配置数据以键值对的形式存在
  database_url: "mongodb://db.example.com:27017"
  feature_flag: "true"

 

应用此配置:

kubectl apply -f configmap.yaml

 

使用 ConfigMap

在 Pod 中使用 ConfigMap 有两种常见的方法:作为环境变量或挂载为文件。

 

作为环境变量

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
  - name: example-container
    image: myapp:latest
    env:
    - name: DATABASE_URL
      valueFrom:
        configMapKeyRef:
          name: example-config
          key: database_url
    - name: FEATURE_FLAG
      valueFrom:
        configMapKeyRef:
          name: example-config
          key: feature_flag

 

挂载为文件

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
  - name: example-container
    image: myapp:latest
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config
  volumes:
  - name: config-volume
    configMap:
      name: example-config

 

Secret

Secret 用于存储敏感信息,例如密码、密钥、令牌等。这些数据在存储和传输过程中都会进行编码。

 

创建 Secret

你可以通过 YAML 文件创建一个 Secret,数据需要进行 Base64 编码。

apiVersion: v1
kind: Secret
metadata:
  name: example-secret
type: Opaque
data:
  # 数据需要进行 Base64 编码
  password: cGFzc3dvcmQ=
  api-key: YXBpa2V5

 

或者通过命令直接创建:

kubectl create secret generic example-secret --from-literal=password=my-password --from-literal=api-key=my-api-key

 

使用 Secret

在 Pod 中使用 Secret也有两种常见的方法:作为环境变量或挂载为文件。

作为环境变量
apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
  - name: example-container
    image: myapp:latest
    env:
    - name: PASSWORD
      valueFrom:
        secretKeyRef:
          name: example-secret
          key: password
    - name: API_KEY
      valueFrom:
        secretKeyRef:
          name: example-secret
          key: api-key

 

挂载为文件

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
  - name: example-container
    image: myapp:latest
    volumeMounts:
    - name: secret-volume
      mountPath: /etc/secret
  volumes:
  - name: secret-volume
    secret:
      secretName: example-secret

 

总结

这两种资源帮助将配置与代码分离,提升了应用的灵活性和安全性。