在 Kubernetes 中,ConfigMap 和 Secret 是两种用于存储和管理应用配置信息的重要资源对象。实战中,我们会创建、使用并更新这些资源以向集群中的 Pod 提供配置数据或敏感信息。
创建 ConfigMap
-
从文件创建 ConfigMap:
假设我们有两个配置文件config.properties
和logback.xml
,我们可以这样创建 ConfigMap:kubectl create configmap my-config --from-file=config.properties --from-file=logback.xml
-
从字面量创建 ConfigMap:
如果你想要直接在命令行中创建键值对,可以这样做:kubectl create configmap my-config --from-literal=key1=value1 --from-literal=key2=value2
-
YAML 文件创建 ConfigMap:
也可以通过 YAML 文件定义并创建 ConfigMap:apiVersion: v1 kind: ConfigMap metadata: name: my-config data: config.properties: | property1=value1 property2=value2 logback.xml: | <?xml version="1.0"?> <!-- Logback configuration --> ...
然后应用 YAML 文件:
kubectl apply -f configmap.yaml
使用 ConfigMap
在 Pod 中使用 ConfigMap,可以将其作为环境变量、命令行参数或者挂载到 Pod 的文件系统中。
-
作为环境变量:
在 Pod 的容器定义中,可以引用 ConfigMap 中的键作为环境变量:apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: my-image envFrom: - configMapRef: name: my-config # 或者单独设置环境变量 env: - name: PROPERTY_1 valueFrom: configMapKeyRef: name: my-config key: property1
-
作为文件挂载:
将 ConfigMap 挂载到容器的文件系统中:apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: my-image volumeMounts: - name: config-volume mountPath: /etc/config readOnly: true volumes: - name: config-volume configMap: name: my-config
创建和使用 Secret
Secret 的创建和使用与 ConfigMap 类似,但主要用于存储敏感信息,如密码、密钥等。
-
创建 Secret:
# 从文件创建 Secret kubectl create secret generic my-secret --from-file=password.txt --from-file=private.key # 从字面量创建 Secret kubectl create secret generic my-secret --from-literal=username=admin --from-literal=password=supersecret # 通过 YAML 文件创建 Secret apiVersion: v1 kind: Secret metadata: name: my-secret type: Opaque data: password: c3VwZXJzZWNyZXQ= # 这里的数据是 base64 编码后的字符串
-
在 Pod 中使用 Secret:
-
作为环境变量:
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: my-image env: - name: PASSWORD valueFrom: secretKeyRef: name: my-secret key: password
-
作为文件挂载:
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: my-image volumeMounts: - name: secret-volume mountPath: /etc/secrets readOnly: true volumes: - name: secret-volume secret: secretName: my-secret
-
更新和管理 ConfigMap 和 Secret
要更新 ConfigMap 或 Secret,只需重新创建或应用更改过的 YAML 文件即可。Kubernetes 会自动触发受影响的 Pod 重新加载配置或秘密信息(对于 ConfigMap,取决于应用如何监听配置变化;对于 Secret,容器会立即重新挂载更新的 Secret 数据)。