跳转至

Kubernetes ConfigMap 实时通知 Pod

在 K8s 中,官方说明 ConfigMap 整体作为卷被 Pod 挂载时,会自动更新。从 ConfigMap 更新到新键映射到 Pod 的总延迟可能与 kubelet 同步周期(默认为1分钟)+ kubelet 中 ConfigMap 缓存的 TTL(默认为1分钟)一样长。

官方说明可以通过更新 Pod 的一个注解来触发立即刷新

K8s 更新 ConfigMap 的过程

创建 ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: test
data:
  mount.info: |
    This is a mount info.
  aa: |
    This is test.

并将其挂载到 Pod 中

apiVersion: v1
kind: Pod
metadata:
  name: test
spec:
  containers:
    - name: nginx
      image: nginx
      volumeMounts:
        - mountPath: /etc/cm
          name: test-cm
  volumes:
    - name: test-cm
      configMap:
        name: test

前后两次进入Pod中查看挂载信息:

  • aa等文件是软链接,不会变;
  • configmap 更新时会自动创建新的目录,最后再重命名。
# 通过 ls -all -i 命令查看
total 4
  2273784 drwxrwxrwx 3 root root   87 Oct 31 10:25 .
132645053 drwxr-xr-x 1 root root 4096 Oct 31 10:25 ..
100673916 drwxr-xr-x 2 root root   34 Oct 31 10:25 ..2023_10_31_10_25_13.340959843
  2335458 lrwxrwxrwx 1 root root   31 Oct 31 10:25 ..data -> ..2023_10_31_10_25_13.340959843
  2273789 lrwxrwxrwx 1 root root    9 Oct 31 10:25 aa -> ..data/aa
  2317395 lrwxrwxrwx 1 root root   17 Oct 31 10:25 mount.info -> ..data/mount.info

# aa 是软链,inode 号不变
root@test:/etc/cm# ll 
total 4
  2273784 drwxrwxrwx 3 root root   87 Oct 31 10:26 .
132645053 drwxr-xr-x 1 root root 4096 Oct 31 10:25 ..
 69055409 drwxr-xr-x 2 root root   34 Oct 31 10:26 ..2023_10_31_10_26_40.305784968
  2339165 lrwxrwxrwx 1 root root   31 Oct 31 10:26 ..data -> ..2023_10_31_10_26_40.305784968
  2273789 lrwxrwxrwx 1 root root    9 Oct 31 10:25 aa -> ..data/aa
  2317395 lrwxrwxrwx 1 root root   17 Oct 31 10:25 mount.info -> ..data/mount.info

如果通过 fsnotity 监控整个 /etc/cm目录的变化,发生的时间如下:

2023-10-31T10:23:26.098Z    INFO    filewatch/filewatch.go:49   file changed    {"op": "CREATE", "file": "/etc/cm/..2023_10_31_10_23_26.701606162"}
2023-10-31T10:23:26.098Z    INFO    filewatch/filewatch.go:49   file changed    {"op": "CHMOD", "file": "/etc/cm/..2023_10_31_10_23_26.701606162"}
2023-10-31T10:23:26.098Z    INFO    filewatch/filewatch.go:49   file changed    {"op": "CREATE", "file": "/etc/cm/..data_tmp"}
2023-10-31T10:23:26.098Z    INFO    filewatch/filewatch.go:49   file changed    {"op": "RENAME", "file": "/etc/cm/..data_tmp"}
2023-10-31T10:23:26.098Z    INFO    filewatch/filewatch.go:49   file changed    {"op": "CREATE", "file": "/etc/cm/..data"}
2023-10-31T10:23:26.098Z    INFO    filewatch/filewatch.go:49   file changed    {"op": "REMOVE", "file": "/etc/cm/..2023_10_31_10_19_52.153989162"}

K8s 更新 ConfigMap 的延迟

kubelet 是用于处理 Master 节点下发到本节点的任务,管理 Pod及Pod 中的容器。

  • 宿主机进程:注册到/etc/systemd/system/kubelet.service
  • syncFrequency:默认1min,表示在运行中的容器与其配置之间执行同步操作的最长时间间隔

kubelet 中通过配置configMapAndSecretChangeDetectionStrategy指定内部管理器(ConfigMap、Secret) 用来发现对象变化的模式

  • Watch:默认,使用 watch 操作来观察所关心的对象的变更,最大延迟为 watch propagation delay
  • whenever a pod is created or updated, we start individual watches for all referenced objects that aren't referenced from other registered pods

  • Cache:使用 TTL 缓存来管理来自 API 服务器的对象,最大延迟为 ttl of cache

  • 但当 pod 创建或更新时,其所有的缓存的configmaps都会失效,即保证获取到最新的 configmap;
  • 通过node.alpha.kubernetes.io/ttl来控制
  • Get:从 API 服务器直接取回必要的对象,延迟为 0

当触发 Pod 修改时,Api Server 给 Kubelet 发通知,kubelet 会 reconcile pod,然后获取最新的 ConfigMap 去挂载;

通过注解Pod实时更新ConfigMap

通过打开三个 Shell窗口:

  • Pod 中执行ls -all,通过显示的时间查看 ConfigMap 是否更新;
  • kubectl edit configmap,修改 ConfigMap 的内容;
  • kubectl edit pod,修改 Pod 的注解;

保存完 ConfigMap 的修改之后,立即保存对 Pod 的注解,可以查看到 ConfigMap 会立即更新。