1 - 通过 ConfigMap 更新配置

本页提供了通过 ConfigMap 更新 Pod 中配置信息的分步示例, 本教程的前置任务是配置 Pod 以使用 ConfigMap。 在本教程结束时,你将了解如何变更运行中应用的配置。 本教程以 alpine 和 nginx 镜像为例。

准备开始

你必须拥有一个 Kubernetes 的集群,且必须配置 kubectl 命令行工具让其与你的集群通信。 建议运行本教程的集群至少有两个节点,且这两个节点不能作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面的 Kubernetes 练习环境之一:

你需要有 curl 命令行工具,用于从终端或命令行界面发出 HTTP 请求。 如果你没有 curl,可以安装此工具。请查阅你本地操作系统的文档。

教程目标

  • 通过作为卷挂载的 ConfigMap 更新配置
  • 通过 ConfigMap 更新 Pod 的环境变量
  • 在多容器 Pod 中通过 ConfigMap 更新配置
  • 在包含边车容器的 Pod 中通过 ConfigMap 更新配置

通过作为卷挂载的 ConfigMap 更新配置

使用 kubectl create configmap 命令基于字面值创建一个 ConfigMap:

kubectl create configmap sport --from-literal=sport=football

下面是一个 Deployment 清单示例,其中 ConfigMap sport 作为卷挂载到 Pod 的唯一容器中。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: configmap-volume
  labels:
    app.kubernetes.io/name: configmap-volume
spec:
  replicas: 3
  selector:
    matchLabels:
      app.kubernetes.io/name: configmap-volume
  template:
    metadata:
      labels:
        app.kubernetes.io/name: configmap-volume
    spec:
      containers:
        - name: alpine
          image: alpine:3
          command:
            - /bin/sh
            - -c
            - while true; do echo "$(date) My preferred sport is $(cat /etc/config/sport)";
              sleep 10; done;
          ports:
            - containerPort: 80
          volumeMounts:
            - name: config-volume
              mountPath: /etc/config
      volumes:
        - name: config-volume
          configMap:
            name: sport

创建此 Deployment:

kubectl apply -f https://k8s.io/examples/deployments/deployment-with-configmap-as-volume.yaml

检查此 Deployment 的 Pod 以确保它们已就绪 (通过选择算符进行匹配):

kubectl get pods --selector=app.kubernetes.io/name=configmap-volume

你应该会看到类似以下的输出:

NAME                                READY   STATUS    RESTARTS   AGE
configmap-volume-6b976dfdcf-qxvbm   1/1     Running   0          72s
configmap-volume-6b976dfdcf-skpvm   1/1     Running   0          72s
configmap-volume-6b976dfdcf-tbc6r   1/1     Running   0          72s

在运行这些 Pod 之一的每个节点上,kubelet 获取该 ConfigMap 的数据,并将其转换为本地卷中的文件。 然后,kubelet 按照 Pod 模板中指定的方式将该卷挂载到容器中。 在该容器中运行的代码从文件中加载信息,并使用它将报告打印到标准输出。 你可以通过查看该 Deployment 中其中一个 Pod 的日志来检查此报告:

# 选择一个属于该 Deployment 的 Pod,并查看其日志
kubectl logs deployments/configmap-volume

你应该会看到类似以下的输出:

Found 3 pods, using pod/configmap-volume-76d9c5678f-x5rgj
Thu Jan  4 14:06:46 UTC 2024 My preferred sport is football
Thu Jan  4 14:06:56 UTC 2024 My preferred sport is football
Thu Jan  4 14:07:06 UTC 2024 My preferred sport is football
Thu Jan  4 14:07:16 UTC 2024 My preferred sport is football
Thu Jan  4 14:07:26 UTC 2024 My preferred sport is football

编辑 ConfigMap:

kubectl edit configmap sport

在出现的编辑器中,将键 sport 的值从 football 变更为 cricket。 保存你的变更。kubectl 工具会相应地更新 ConfigMap(如果报错,请重试)。

以下是你编辑后该清单可能的样子:

apiVersion: v1
data:
  sport: cricket
kind