【云原生】Kubernetes----配置资源管理Secrets与ConfigMaps

目录

一、Secrets

(一)Secrets概述

(二)Secrets类型

(三)Secrets使用方式

(四)创建Secrets

1.陈述式命令创建

1.1 定义用户与密码文件

1.2 使用陈述式命令创建

2.使用base64创建

2.1 获取加密信息

2.2 使用yaml文件创建

(五)使用Secrets

1.使用挂载的方式

2.使用环境变量的方式

(六)Secret的作用

(七)注意事项

二、ConfigMap

(一)ConfigMap概述

(二)为什么需要ConfigMap

(三)特点及用途

1.特点

2.用途

(四)ConfigMap的创建方式

1.命令行直接创建

2.通过文件/目录创建

2.1 使用文件创建

2.2 使用目录创建

2.3 YAML创建

(五)使用ConfigMap

1.替代环境变量

1.1 引用值

1.2 引用键值

2.文件挂载

2.1 准备挂载文件

2.2 创建configmap

2.3 数据挂载

3.热更新

4.pod更新


在Kubernetes(k8s)中,应用程序的配置和数据存储是一个重要且敏感的议题。Kubernetes提供了两种主要的资源类型来管理这些敏感信息和配置数据:Secrets和ConfigMaps。本文将深入探讨这两种资源类型,以及如何在Kubernetes集群中有效地使用它们。

一、Secrets

(一)Secrets概述

在Kubernetes(k8s)中,Secrets是一种用于存储敏感信息的对象,如密码、OAuth令牌、SSH密钥等。这些信息在部署应用程序时可能需要,但又不希望直接硬编码在应用程序的代码中或者公开暴露。通过使用Secrets,我们可以将敏感信息与应用程序代码解耦,从而提高安全性。

(二)Secrets类型

1.service-account-token:用于访问API的服务账户令牌。由 Kubernetes 自动创建,用来访问 APIServer 的 Secret,Pod 会默认使用这个 Secret 与 APIServer 通信, 并且会自动挂载到 Pod 的 /var/run/secrets/kubernetes.io/serviceaccount 目录中

[root@master01 ~]#kubectl run nginx --image=nginx:1.18.0
pod/nginx created
[root@master01 ~]#kubectl describe pod nginx |sed -n '/Mounts/{p;n;p}'
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-vgx6f (ro)
-------------------------------------------------------------------------------------
#新建立一个pod,它会自动以挂载的方式,使用serviceaccount来访问,并且权限是只读权限

2.Opaque:Base64 编码格式的Secret,用来存储用户自定义的密码、密钥等/Secrets中的敏感信息在存储之前会先被Base64编码。但是请注意,Base64编码并不提供安全性,它只是用来避免在YAML文件中直接暴露明文信息,是默认的Secret 类型

3.Docker Config:用于认证私有Docker仓库的凭据。存储私有 docker registry 的认证信息,搭建私有仓库时,使用该类型,在客户端登录私有仓库时,可以免密登录

4.TLS:用于存储TLS证书和私钥。

(三)Secrets使用方式

可挂载为卷:Secrets可以挂载到Pod中的容器,以文件的形式提供敏感信息。

可作为环境变量:Secrets中的信息也可以被设置为Pod中容器的环境变量。

(四)创建Secrets

1.陈述式命令创建

1.1 定义用户与密码文件
[root@master01 data]#mkdir -p /data/secret/pass
[root@master01 data]#cd /data/secret
[root@master01 secret]#echo -n 'china' >/data/secret/pass/user.txt
#创建用户名文件
[root@master01 secret]#echo -n '19491001' >/data/secret/pass/passwd.txt
#创建密码文件
1.2 使用陈述式命令创建
[root@master01 secret]#kubectl create secret generic secret01 --from-file=/data/secret/pass/user.txt --from-file=/data/secret/pass/passwd.txt
secret/secret01 created
[root@master01 secret]#kubectl get secrets secret01
NAME                     TYPE                                  DATA   AGE
secret01                 Opaque                                2      11s
[root@master01 secret]#kubectl describe secrets secret01
Name:         secret01
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
user.txt:    5 bytes
passwd.txt:  8 bytes
---------------------------------------------------------------------------------
#kubectl create secret generic secret01
#这一部分命令告诉Kubernetes创建一个新的泛型(generic)类型的Secret对象,命名为secret01。
#使用generic子命令来标明要创建的是一个Opaque类型的Secret

--from-file=/data/secret/pass/user.txt
#此选项指定了一个文件路径/data/secret/pass/user.txt,其内容将被用来创建Secret中的一个键值对。
#键(key)通常是文件名(即user.txt),值(value)是文件的内容。
#这意味着Secret将包含一个条目,其中键为user.txt,值为该文件中的文本内容。

--from-file=/data/secret/pass/passwd.txt
#同理,此选项也指定了另一个文件路径/data/secret/pass/passwd.txt,
#其内容也会被加入到Secret中作为一个独立的条

#不论是使用get命令还是describe查看,都不会显示实际的内容,而是以字节长度的信息显示

2.使用base64创建

上述创建方式,虽然可以创建Secrets,但是它还是属于一种明文创建的方式,可以使用base方式进行加密

2.1 获取加密信息
[root@master01 secret]#echo -n china |base64
Y2hpbmE=
[root@master01 secret]#echo -n 19491001 |base64
MTk0OTEwMDE=
2.2 使用yaml文件创建
[root@master01 secret]#vim secret.yaml
[root@master01 secret]#cat secret.yaml
apiVersion: v1
kind: Secret                   #指定资源的类型为Secret
metadata:
  name: secret-v1              #Secret资源的名称
type: Opaque                   #指定Secret的类型
data:                          #包含实际存储的秘密数据,以base64编码格式给出的键值对
  username: Y2hpbmE=           #base64编码后的“chance”字符串,表示用户名
  password: MTk0OTEwMDE=       #base64编码后的密码
[root@master01 secret]#kubectl apply -f secret.yaml
secret/secret-v1 created
[root@master01 secret]#kubectl get secrets secret-v1 
NAME        TYPE     DATA   AGE
secret-v1   Opaque   2      10s
--------------------------------------------------------------------------------
#使用这个Secret时,Kubernetes会自动处理这些值的base64解码,
#使Pod内的应用程序能够直接使用解码后的原始数据。

(五)使用Secrets

1.使用挂载的方式

1.1 定义文件

在yaml文件中,通过挂载的方式,将指定的Secret资源,挂载到pod的指定目录下

[root@master01 secret]#vim secret-pod01.yaml 
[root@master01 secret]#cat secret-pod01.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: secret-pod01
spec:
  containers:
  - name: nginx
    image: nginx:1.18.0
    volumeMounts:                 #定义挂载Volume到容器内部的配置
    - name: secrets               #引用了在volumes部分定义的Volume名称
      mountPath: "/etc/secrets"   #容器内挂载点的路径,即Volume将在这个路径下可见
      readOnly: true              #以只读方式挂载,不能修改secret-v1的内容
  volumes:
  - name: secrets                 #secrets Volume的名称,需与volumeMounts中的name相匹配
    secret:
      secretName: secret-v1       #指定此Volume将挂载的Secret的名称

1.2 创建pod

[root@master01 secret]#kubectl apply -f secret-pod01.yaml 
pod/secret-pod01 created
[root@master01 secret]#kubectl get pod secret-pod01
NAME                          READY   STATUS              RESTARTS   AGE
secret-pod01                  1/1     Running             0          7s

[root@master01 secret]#kubectl exec -it secret-pod01 bash                      
root@secret-pod01:/# cat /etc/secrets/username 
china
root@secret-pod01:/# cat /etc/secrets/password 
19491001
root@secret-pod01:/# rm -rf /etc/secrets/password 
rm: cannot remove '/etc/secrets/password': Read-only file system
root@secret-pod01:/# echo 1111 > /etc/secrets/password 
bash: /etc/secrets/password: Read-only file system
root@secret-pod01:/# 
#无法进行删除和重写,它是以只读的方式进行挂载的

2.使用环境变量的方式

2.1 定义文件

在yaml文件中定义环境变量的键值信息,其键值可以从Secret中获取

[root@master01 secret]#vim secret-pod02.yaml 
[root@master01 secret]#cat secret-pod02.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: secret-pod02
spec:
  containers:
  - name: nginx
    image: nginx:1.18.0
    env:
    - name: USER_SCT         #环境变量的名称
      valueFrom:
        secretKeyRef:        #指定环境变量的值来自于Secret中的某个键
          name: secret-v1    #使用的Secret名称,需要与之前创建的Secret相匹配
          key: username      #从Secret中提取的键名,对应的值将会被设置为环境变量USER_SCT的值
    - name: PASSWD_SCT       #另一个环境变量的名称
      valueFrom:
        secretKeyRef:
          name: secret-v1
          key: password      #从Secret中提取的另一个键名,其值被设置为环境变量PASSWD_SCT的值

2.2 创建pod

[root@master01 secret]#kubectl apply -f secret-pod02.yaml 
pod/secret-pod02 created
[root@master01 secret]#kubectl get pod secret-pod02 
NAME           READY   STATUS    RESTARTS   AGE
secret-pod02   1/1     Running   0          14s
[root@master01 secret]#kubectl exec -it secret-pod02 bash
root@secret-pod02:/# echo "$USER_SCT"     #查看USER_SCT的值
china
root@secret-pod02:/# echo "$PASSWD_SCT"   #查看PASSWD_SCT的值
19491001
root@secret-pod02:/# env |grep SCT   #使用env指令查看系统所有内置变量,并进行过滤
USER_SCT=china
PASSWD_SCT=19491001

(六)Secret的作用

安全性提升:避免明文存储敏感信息,减少因不当配置导致的数据泄露风险。

简化配置管理:集中管理Pod或服务账户所需的敏感信息,便于更新和复用。

灵活性:支持多种方式使用Secret,包括环境变量、文件挂载或作为命令行参数,满足不同应用的需求。

权限控制:通过RBAC(Role-Based Access Control)限制对Secret的访问,确保只有授权的用户和服务账户能访问敏感数据。

(七)注意事项

保护Secrets:确保你的Secrets在传输和存储过程中都是安全的。避免在不受信任的环境中暴露Secrets。

定期轮换:对于重要的Secrets,如数据库密码或API密钥,定期轮换是一个好的安全实践。

最小权限原则:只将必要的Secrets暴露给需要它们的Pod。避免在不需要的地方暴露Secrets。

不要将Secrets硬编码在代码中:这是非常不安全的做法,因为一旦代码被泄露,Secrets也会被泄露。

使用RBAC:通过Kubernetes的角色和角色绑定(RBAC)来控制对Secrets的访问权限。

二、ConfigMap

(一)ConfigMap概述

ConfigMap 是 Kubernetes 中的一种资源对象,用于将非敏感的配置数据注入 Pod 或其他 Kubernetes 对象。与 Secret 相似,它提供了一种在不直接硬编码配置信息到容器镜像或 Pod 定义中的方式,从而使得配置易于管理和更新。ConfigMap 允许您将配置数据以键值对的形式存储,并可以在 Pod 运行时将这些配置映射为环境变量、命令行参数或是直接挂载为容器内的文件

(二)为什么需要ConfigMap

传统配置管理的问题:在传统架构中,配置文件往往被保存在宿主机上,容器化部署时,由于容器所在的节点不固定,这种方式不再适用。同时,如果配置文件被打包在容器镜像中,那么一旦配置更改,就需要重新构建镜像,这非常不便。

ConfigMap的作用:ConfigMap将环境配置信息和容器镜像解耦,使得在不重新构建镜像的情况下,可以方便地修改和更新配置。ConfigMap也是按Namespace隔离的,不同的Namespace之间ConfigMap的名称可以相同,但不能跨Namespace进行访问。

(三)特点及用途

1.特点

非机密性数据存储:ConfigMap主要用于存储非机密性的配置信息,如数据库连接信息、环境变量等。

键值对形式:ConfigMap的数据可以用key/value键值对的形式保存,也可以通过文件的形式保存。

资源对象:ConfigMap是k8s中的资源对象,可以通过kubectl命令行工具或Kubernetes API进行创建、更新和删除。

与Pod的交互:Pods可以将ConfigMap用作环境变量、命令行参数或存储卷中的配置文件。

动态更新:ConfigMap支持热更新,即在不重启Pods的情况下,可以动态地修改ConfigMap中的数据,Pods会实时地读取新的配置

2.用途

环境变量:将 ConfigMap 中的配置作为环境变量传递给容器中的应用程序。

命令行参数:使用 ConfigMap 中的值填充容器启动命令的参数。

文件挂载:将ConfigMap 数据作为文件或目录挂载到容器的文件系统中,方便应用程序按文件形式读取配置。

(四)ConfigMap的创建方式

1.命令行直接创建

通过kubectl命令行工具,使用--from-literal参数指定键值对来创建ConfigMap。

[root@master01 data]#kubectl create configmap configmap-01 --from-literal=id=001 --from-literal=user=zhangshan
configmap/configmap-01 created
[root@master01 data]#kubectl get configmaps configmap-01
NAME           DATA   AGE
configmap-01   2      19s
[root@master01 data]#kubectl describe configmaps configmap-01
Name:         configmap-01
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
id:         #键名称
----
001         #值
user:       #键名称
----
zhangshan   #值
Events:  <none>

2.通过文件/目录创建

将配置文件放在指定的目录中,然后通过kubectl命令行工具或YAML文件来创建ConfigMap。

2.1 使用文件创建
[root@master01 data]#mkdir /data/configmap
[root@master01 data]#cd  /data/configmap/
[root@master01 configmap]#echo "this is configmap" >index.html
[root@master01 configmap]#kubectl create configmap configmap-02 --from-file=index.html 
configmap/configmap-02 created
[root@master01 configmap]#kubectl get configmaps configmap-02
NAME           DATA   AGE
configmap-02   1      24s
[root@master01 configmap]#kubectl describe configmaps configmap-02
Name:         configmap-02
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
index.html:
----
this is configmap

Events:  <none>
2.2 使用目录创建
[root@master01 configmap]#mkdir /data/test
[root@master01 configmap]#echo "this is test01" >/data/test/test01.txt
[root@master01 configmap]#echo "this is test02" >/data/test/test02.txt
[root@master01 configmap]#kubectl create configmap configmap-03 --from-file=/data/test/
configmap/configmap-03 created
[root@master01 configmap]#kubectl describe configmaps configmap-03
Name:         configmap-03
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
test01.txt:
----
this is test01

test02.txt:
----
this is test02

Events:  <none>
[root@master01 configmap]#kubectl get configmaps configmap-03
NAME           DATA   AGE
configmap-03   2      11s
2.3 YAML创建

编写YAML文件定义ConfigMap,然后使用kubectl apply命令来创建。

[root@master01 configmap]#vim configmap.yaml 
[root@master01 configmap]#cat configmap.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap-04
data:
  APP_SETTING_1: value1              #第一个键:值
  APP_SETTING_2: value2              #第二个键:值
[root@master01 configmap]#kubectl apply -f configmap.yaml 
configmap/configmap-04 created
[root@master01 configmap]#kubectl describe configmaps configmap-04
Name:         configmap-04
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
APP_SETTING_1:
----
value1
APP_SETTING_2:
----
value2
Events:  <none>
[root@master01 configmap]#kubectl get configmaps configmap-04
NAME           DATA   AGE
configmap-04   2      25s

(五)使用ConfigMap

删除之前创建的示例

[root@master01 configmap]#kubectl delete configmaps --all
configmap "configmap-01" deleted
configmap "configmap-02" deleted
configmap "configmap-03" deleted
configmap "configmap-04" deleted
configmap "kube-root-ca.crt" deleted

1.替代环境变量

1.1 引用值

将configmap中定义的值,设置为自定义变量名称的值

首先使用yaml文件,定义configmaps

[root@master01 configmap]#vim configmap.yaml 
[root@master01 configmap]#cat configmap.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap01
data:
  FROM: china        #键名为FROM,值为china
  NAME: ZG           #键名为NAME,值为ZG
[root@master01 configmap]#kubectl apply -f configmap.yaml 
configmap/configmap01 created
[root@master01 configmap]#kubectl describe configmaps configmap01 
Name:         configmap01
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
FROM:
----
china
NAME:
----
ZG
Events:  <none>

定义yaml文件,创建pod,并应用文件configmap对象中的值为自定义变量的值

[root@master01 configmap]#vim pod-cm01.yaml
[root@master01 configmap]#cat pod-cm01.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-cm01
spec:
  containers:
  - name: busybox
    image: busybox:1.28
    command: [ "/bin/sh", "-c", "env" ]  #指令让容器启动时执行env命令,打印所有的环境变量。
    env:
      - name: WHERE_ARE_YOU              #定义变量名称
        valueFrom:                       #指定值的来源
          configMapKeyRef:               #从ConfigMap中引用键的值
            name: configmap01            #指定ConfigMap的名称
            key: FROM                    #指定从configmap01中的FROM键来获取值,即china
      - name: YOU_NAME                   #同上
        valueFrom:
          configMapKeyRef:
            name: configmap01
            key: NAME

创建pod之后,通过查看日志信息,来查看自定的变量

[root@master01 configmap]#kubectl apply -f pod-cm01.yaml 
pod/pod-cm01 created
[root@master01 configmap]#kubectl logs pod-cm01 
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=pod-cm01
SHLVL=1
HOME=/root
WHERE_ARE_YOU=china           #变量值为configmap01对象中FROM的值,即china
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
YOU_NAME=ZG                   #变量值为configmap01对象中NAME的值,即ZG
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
1.2 引用键值

可以将configmap中的键值同时引用

[root@master01 configmap]#vim config-pod.yaml
[root@master01 configmap]#cat config-pod.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap02
data:
 PASSWORD_TEST: abc123     #键值
---                        #第一部分为设置configmap对象
apiVersion: v1
kind: Pod
metadata:
  name: pod-cm02
spec:
  containers:
  - name: busybox
    image: busybox:1.28
    command: [ "/bin/sh", "-c", "env" ]
    envFrom:                   #从整个ConfigMap中导入环境变量
    - configMapRef:            #指定ConfigMap的名称。
      name: configmap02
  restartPolicy: Never

使用kubectl apply 命令创建之后查看日志信息

[root@master01 configmap]#kubectl apply -f config-pod.yaml 
configmap/configmap02 created
pod/pod-cm02 created
[root@master01 configmap]#kubectl logs pod-cm02 
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=pod-cm02
SHLVL=1
HOME=/root
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PASSWORD_TEST=abc123               #引用指定configmap中的所有键值
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/

2.文件挂载

将ConfigMap 数据作为文件或目录挂载到容器的文件系统中,在这个文件中,键就是文件名,键值就是文件内容

2.1 准备挂载文件
[root@master01 configmap]#echo "this is configmap-pod" >/mnt/index.html
[root@master01 configmap]#cat /mnt/index.html 
this is configmap-pod
2.2 创建configmap
[root@master01 configmap]#kubectl create configmap config03 --from-file=/mnt/index.html
configmap/config03 created
[root@master01 configmap]#kubectl describe configmaps config03 
Name:         config03
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
index.html:
----
this is configmap-pod

Events:  <none>
2.3 数据挂载
[root@master01 configmap]#vim deployment-cm.yaml
[root@master01 configmap]#cat deployment-cm.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-pod
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.18.0
        ports:
        - containerPort: 80
        volumeMounts:
        - name: config-mount
          mountPath: /usr/share/nginx/html/
      volumes:
        - name: config-mount
          configMap:              #表明这个卷的内容来源于一个ConfigMap
            name: config03        #指定了ConfigMap的名称为config03

创建pod并进行访问

[root@master01 configmap]#kubectl apply -f deployment-cm.yaml 
deployment.apps/nginx-pod created
[root@master01 configmap]#kubectl get pod -owide
NAME                         READY   STATUS      RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
nginx-pod-6f67db4865-ljsx4   1/1     Running     0          12s   10.244.2.246   node02   <none>           <none>
[root@master01 configmap]#vim deployment-cm.yaml 
[root@master01 configmap]#curl 10.244.2.246
this is configmap-pod

3.热更新

直接修改configmap的信息,保存退出后,就可等待十秒钟左右,使用该ConfigMap挂载的 Volume 中的数据同步更新

[root@master01 configmap]#kubectl edit configmap config03 
configmap/config03 edited    #修改值的信息

[root@master01 configmap]#curl 10.244.2.246
this is configmap-pod-new
[root@master01 configmap]#kubectl exec -it nginx-pod-6f67db4865-ljsx4 -- cat /usr/share/nginx/html/index.html
this is configmap-pod-new
#同时,容器内的文件也同样会修改
[root@master01 configmap]#cat /mnt/index.html 
this is configmap-pod
#宿主机的文件不会更改,它只是将宿主机的文件当作键(文件名)值(文件内容),设置为configmap,
#而后通过挂载的方式,将键值同步到容器当中 ,只有修改configmap的键值,容器中的内容才会同步更新

可以将配置文件等信息,使用陈述式命令指定文件,创建ConfigMap,可以做到在宿主机上,实时更新pod的配置信息以及其它有关信息

4.pod更新

当ConfigMap更新后,Kubernetes默认情况下不会自动触发Pod的滚动更新。但可以通过手动的方式触发更新,比如在.spec.template.metadata.annotations 中添加 version/config ,每次通过修改 version/config 来触发滚动更新

[root@master01 configmap]#kubectl patch deployment nginx-pod --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "202401" }}}}}'
[root@master01 configmap]#kubectl get pod -w
NAME                         READY   STATUS      RESTARTS   AGE
nginx-pod-6f67db4865-ljsx4   1/1     Running     0          4m43s
nginx-pod-69d77c47d-hhlqf    0/1     Pending     0          0s
nginx-pod-69d77c47d-hhlqf    0/1     Pending     0          0s
nginx-pod-69d77c47d-hhlqf    0/1     ContainerCreating   0          0s
nginx-pod-69d77c47d-hhlqf    1/1     Running             0          3s
nginx-pod-6f67db4865-ljsx4   1/1     Terminating         0          5m6s
nginx-pod-6f67db4865-ljsx4   0/1     Terminating         0          5m8s
nginx-pod-6f67db4865-ljsx4   0/1     Terminating         0          5m9s
nginx-pod-6f67db4865-ljsx4   0/1     Terminating         0          5m9s
[root@master01 configmap]#kubectl get pod -owide
NAME                        READY   STATUS      RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
nginx-pod-69d77c47d-hhlqf   1/1     Running     0          88s   10.244.1.199   node01   <none>           <none>
------------------------------------------------------------------------------
patch: kubectl 的一个子命令,用于部分更新资源对象。
deployment nginx-pod: 指定要更新的资源类型和资源的名称
--patch: 指定要应用的补丁(patch)内容。
'{...}': JSON 格式的补丁内容。添加了一个新的注解到 Pod 模板的元数据(metadata)中。

补丁内容的具体解释:
"spec": Deployment 的规范(specification),描述了 Deployment 的期望状态。
"template": 用于创建新 Pod 的模板。
"metadata": Pod 模板的元数据。
"annotations": Pod 模板的注解字段。注解是附加到对象的键值对,可以用来存储非标识信息。
"version/config": "202401": 这是一个新的注解,其中键是version/config,值是202401

同样的,再次更新数据的时候,需要再次修改注解信息触发pod更新

[root@master01 configmap]#kubectl edit configmap config03 
configmap/config03 edited    #修改值的信息

再次手动更新pod

[root@master01 configmap]#kubectl patch deployment nginx-pod --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "202402" }}}}}'
#更换注解信息202401为202402
[root@master01 configmap]#kubectl get pod -w -owide
NAME                        READY   STATUS      RESTARTS   AGE     IP             NODE     NOMINATED NODE   READINESS GATES
nginx-pod-69d77c47d-hhlqf   1/1     Running     0          2m28s   10.244.1.199   node01   <none>           <none>
nginx-pod-5c5cb76b99-86n42   0/1     Pending     0          0s      <none>         <none>   <none>           <none>
nginx-pod-5c5cb76b99-86n42   0/1     Pending     0          0s      <none>         node02   <none>           <none>
nginx-pod-5c5cb76b99-86n42   0/1     ContainerCreating   0          0s      <none>         node02   <none>           <none>
nginx-pod-5c5cb76b99-86n42   1/1     Running             0          3s      10.244.2.247   node02   <none>           <none>
[root@master01 configmap]#curl 10.244.2.247
this is configmap-pod-new-01

更新 ConfigMap 后

使用该 ConfigMap 挂载的 Env 不会同步更新。

使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新。

  • 23
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值