Pod被挂载的ConfigMap会被动态更新吗?

文章详细阐述了Kubernetes中ConfigMap的工作原理,包括当ConfigMap被更新时,如何影响挂载它的Pod。Kubelet通过周期性同步检查ConfigMap的更新,但环境变量方式的ConfigMap数据不会自动更新,需重启Pod。此外,文章还介绍了使用subPath挂载时的动态更新情况以及如何创建不可变的ConfigMap以防止意外更新并提升集群性能。
摘要由CSDN通过智能技术生成

概述

当Pod挂载的ConfigMap被更新时,所投射的键最终也会被更新。

Kubelet组件会每次周期性同步时检查所挂载的ConfigMaps是否更新。 不过,kubelet 使用的是其本地的高速缓存来获得 ConfigMap 的当前值 。

ConfigMap 既可以通过 watch 操作实现内容传播(默认形式),也可实现基于 TTL 的缓存,还可以直接经过所有请求重定向到 API 服务器。 因此,从 ConfigMap 被更新的那一刻算起,到新的主键被投射到 Pod 中去,这一 时间跨度可能与 kubelet 的同步周期加上高速缓存的传播延迟相等。 这里的传播延迟取决于所选的高速缓存类型 (分别对应 watch 操作的传播延迟、高速缓存的 TTL 时长或者 0)。

以环境变量方式使用的 ConfigMap 数据不会被自动更新。 更新这些数据需要重新启动 Pod。

案例

创建一个configmap

[root@k8s-master01 ~]# cat myconfigmap.yml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap
data:
  # 类属性键;每一个键都映射到一个简单的值
  player_initial_lives: "6"
  ui_properties_file_name: "user-interface.properties"

  # 类文件键
  game.properties: |
    enemy.types=aliens,monsters
    player.maximum-lives=5    
  user-interface.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true 
    

[root@k8s-master01 ~]# kubectl apply -f myconfigmap.yml  -n kubesre 
configmap/myconfigmap created

创建一个Pod(挂载configmap)

[root@k8s-master01 ~]# cat mypod.yml 
apiVersion: 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
      
[root@k8s-master01 ~]# kubectl apply -f mypod.yml -n kubesre
pod/mypod created

查看挂载数据

[root@k8s-master01 ~]# kubectl exec -it -n kubesre mypod bash
root@mypod:/data# cat /etc/foo/player_initial_lives 
6

更新ConfigMap数据

更新ConfigMap数据为了检测,Pod挂载后configmap是否会动态更新

[root@k8s-master01 ~]# cat myconfigmap.yml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap
data:
  # 类属性键;每一个键都映射到一个简单的值 
  player_initial_lives: "7"   # 已更新7
  ui_properties_file_name: "user-interface.properties"

  # 类文件键
  game.properties: |
    enemy.types=aliens,monsters
    player.maximum-lives=5    
  user-interface.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true 
[root@k8s-master01 ~]# kubectl apply -f myconfigmap.yml -n kubesre 
configmap/myconfigmap configured

验证

可以看到数据已动态更新到7了

[root@k8s-master01 ~]# kubectl exec -it -n kubesre mypod bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use 
root@mypod:/data# cat /etc/foo/player_initial_lives 

使用subPath禁止动态更新

使用 ConfigMap 作为 subPath卷挂载的容器将不会收到 ConfigMap 的更新。

不可变更的ConfigMap

Kubernetes 特性 不可变更的 Secret 和 ConfigMap 提供了一种将各个 Secret 和 ConfigMap 设置为不可变更的选项。对于大量使用 ConfigMap 的 集群(至少有数万个各不相同的 ConfigMap 给 Pod 挂载)而言,禁止更改 ConfigMap 的数据有以下好处:

  • 保护应用,使之免受意外(不想要的)更新所带来的负面影响。
  • 通过大幅降低对 kube-apiserver 的压力提升集群性能,这是因为系统会关闭 对已标记为不可变更的 ConfigMap 的监视操作。

可以通过 immutable 字段设置为 true 创建不可变更的 ConfigMap

修改配置

root@k8s-master01 ~]# cat myconfigmap.yml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap
data:
  # 类属性键;每一个键都映射到一个简单的值
  player_initial_lives: "7"
  ui_properties_file_name: "user-interface.properties"

  # 类文件键
  game.properties: |
    enemy.types=aliens,monsters
    player.maximum-lives=5    
  user-interface.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true 
immutable: true
[root@k8s-master01 ~]# kubectl apply -f myconfigmap.yml -n kubesre 
configmap/myconfigmap configured

修改数据

[root@k8s-master01 ~]# cat myconfigmap.yml                        
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap
data:
  # 类属性键;每一个键都映射到一个简单的值
  player_initial_lives: "8"
  ui_properties_file_name: "user-interface.properties"

  # 类文件键
  game.properties: |
    enemy.types=aliens,monsters
    player.maximum-lives=5    
  user-interface.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true 
immutable: true
[root@k8s-master01 ~]# kubectl apply -f myconfigmap.yml -n kubesre 
The ConfigMap "myconfigmap" is invalid: data: Forbidden: field is immutable when `immutable` is set

一旦某 ConfigMap 被标记为不可变更,则 无法 逆转这一变化,,也无法更改 databinaryData 字段的内容。你只能删除并重建 ConfigMap。 因为现有的 Pod 会维护一个对已删除的 ConfigMap 的挂载点,建议重新创建 这些 Pods。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云原生运维社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值