【云原生】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:  OpaqueData
====
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: nginximage: nginx:1.18.0volumeMounts:                 #定义挂载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: nginximage: nginx:1.18.0env:- name: USER_SCT         #环境变量的名称valueFrom:secretKeyRef:        #指定环境变量的值来自于Secret中的某个键name: secret-v1    #使用的Secret名称,需要与之前创建的Secret相匹配key: username      #从Secret中提取的键名,对应的值将会被设置为环境变量USER_SCT的值- name: PASSWD_SCT       #另一个环境变量的名称valueFrom:secretKeyRef:name: secret-v1key: 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 configmapEvents:  <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 test01test02.txt:
----
this is test02Events:  <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,值为chinaNAME: 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: busyboximage: busybox:1.28command: [ "/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: configmap01key: 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: busyboximage: busybox:1.28command: [ "/bin/sh", "-c", "env" ]envFrom:                   #从整个ConfigMap中导入环境变量- configMapRef:            #指定ConfigMap的名称。name: configmap02restartPolicy: 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-podEvents:  <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: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.18.0ports:- containerPort: 80volumeMounts:- name: config-mountmountPath: /usr/share/nginx/html/volumes:- name: config-mountconfigMap:              #表明这个卷的内容来源于一个ConfigMapname: 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秒)才能同步更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/20868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解智慧互联网医院系统源码:开发医院小程序教学

本篇文章&#xff0c;笔者将详细介绍智慧互联网医院系统的源码结构&#xff0c;并提供开发医院小程序的详细教学。 一、智慧互联网医院系统概述 智慧互联网医院系统涵盖了预约挂号、在线咨询、电子病历、药品管理等多个模块。 二、系统源码结构解析 智慧互联网医院系统的源码…

OpenShift 4 - OpenShift Service Mesh 3 预览

《OpenShift / RHEL / DevSecOps 汇总目录》 了解 OpenShift Service Mesh 3 的变化 OpenShift Service Mesh 是一套在 OpenShift 上安装部署、跟踪监控 Istio 运行环境的实现。红帽在 2023 年底推出了技术预览版的 OpenShift Service Mesh 3&#xff0c;它和目前的 OpenShif…

IP代理池是什么?

从事跨境行业的朋友们总会有一个疑问&#xff0c;为什么自己所合作的IP代理商的IP在使用的过程中账号会有莫名封禁的问题&#xff0c;会不会是自己在使用的过程中错误的操作违反了平台的规则&#xff0c;其实不然有可能会是IP代理池纯净度不高的问题&#xff0c;有可能自己在使…

UI线程和工作线程

引用&#xff1a;windows程序员面试指南 工作线程 只处理逻辑的线程&#xff0c;例如&#xff1a;启动一个线程&#xff0c;用来做一个复杂的计算&#xff0c;计算完成之后&#xff0c;此线程就自动退出&#xff0c;这种线程称为工作线程 UI线程 Windows应用程序一般由窗口…

Ansible05-Ansible进阶(流程控制、Roles角色、加密优化调优等)

目录 写在前面7 Ansible 进阶7.1 流程控制7.1.1 handlers触发器与notify7.1.1.1 未使用handlers7.1.1.2 使用handlers 7.1.2 when判断7.1.2.1 when的语法7.1.2.2 when判断主机名选择模块输出7.1.2.3 when结合register变量 7.1.3 loop/with_items循环7.1.3.1 with_items案例7.1.…

本地公网IP是什么?

本地公网IP&#xff08;Public IP Address&#xff09;是指分配给计算机或设备的可在互联网上直接访问的唯一标识符。每个连接到互联网的设备都会被分配一个公网IP&#xff0c;用于与其他设备进行通信。本地公网IP在网络通信中起到了非常重要的作用&#xff0c;为用户提供了方便…

单实例11.2.0.3迁移到RAC11.2.0.4_使用RMAN 异机恢复

保命法则&#xff1a;先备份再操作&#xff0c;磁盘空间紧张无法备份就让满足&#xff0c;给自己留退路。 场景说明&#xff1a; 1.本文档的环境为同平台、不同版本&#xff08;操作系统版本可以不同&#xff0c;数据库小版本不同&#xff09;&#xff0c;源机器和目标机器部…

[数据集][目标检测]手枪检测数据集VOC+YOLO格式3000张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3000 标注数量(xml文件个数)&#xff1a;3000 标注数量(txt文件个数)&#xff1a;3000 标注…

STM32作业实现(七)OLED显示数据

目录 STM32作业设计 STM32作业实现(一)串口通信 STM32作业实现(二)串口控制led STM32作业实现(三)串口控制有源蜂鸣器 STM32作业实现(四)光敏传感器 STM32作业实现(五)温湿度传感器dht11 STM32作业实现(六)闪存保存数据 STM32作业实现(七)OLED显示数据 STM32作业实现(八)触摸按…

hadoop配置nfs,window映射nfs

1.修改hadoop配置如下内容,并同步到其它节点 core-site.xml新增配置项 <!-- 允许hadoop用户代理任何其它用户组 --><property><name>hadoop.proxyuser.hadoop.groups</name><value>*</value></property><!-- 允许代理任意服务器…

如何使用KolorPanotourPro制作全景图像网页

目录 前言 KolorPanotourPro是什么 如何制作全景网页 1.拥有全景图 2.导入图片 3.在多张全景图中跳转 4.查看制作的全景网页 结束语 前言 今天是坚持写博客的第十五天&#xff0c;继续为努力和坚持的大家点赞和鼓掌。 书接上文&#xff0c;我们讲了如何使用如何使用A…

【Vulhub】Fastjson 1.2.24_rce复现

文章目录 一&#xff0c;Fastjson是什么&#xff1f;二&#xff0c;fastjson漏洞原理三&#xff0c;判断是否有fastjson反序列化四&#xff0c;复现Fastjson 1.2.24_rce(vulhub)环境配置1.判断是否存在Fastjson反序列化2.反弹shell3.启动RMI服务器4.构造恶意POST请求 一&#x…

[数据集][目标检测]老鼠检测数据集VOC+YOLO格式4107张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4107 标注数量(xml文件个数)&#xff1a;4107 标注数量(txt文件个数)&#xff1a;4107 标注…

linux tomcat版本漏洞升级

Tomcat Session 反序列化代码执行漏洞(CVE-2020-9484) Tomcat 安全限制绕过漏洞(CVE-2018-8034) Tomcat远程代码执行漏洞(CVE-2017-12615) 以上均可以升级版本处理&#xff0c;小版本升级方法 tomcat安装请查看https://blog.csdn.net/qq_42250832/article/details/139015573 1、…

制作ChatPDF之Elasticsearch8.13.4搭建(一)

Elasticsearch8.x搭建 在Windows系统上本地安装Elasticsearch的详细步骤如下&#xff1a; 1. 下载Elasticsearch 访问 Elasticsearch下载页面。选择适用于Windows的版本8.13.4&#xff0c;并下载ZIP文件。 2. 解压文件 下载完成后&#xff0c;找到ZIP文件&#xff08;例如…

AI预测体彩排3采取888=3策略+和值012路一缩定乾坤测试6月1日预测第8弹

今天继续基于8883的大底进行测试&#xff0c;今天继续测试&#xff0c;好了&#xff0c;直接上结果吧~ 首先&#xff0c;888定位如下&#xff1a; 百位&#xff1a;8,9,7,6,4,3,2,0 十位&#xff1a;4,5,3,2,7,8,0,9 个位&#xff1a;3,4,5,2,…

Centos 7部署NTP

介绍 NTP是Network Time Protocol&#xff08;网络时间协议&#xff09;的简称&#xff0c;它是用来通过互联网或局域网将计算机时钟同步到世界协调时间&#xff08;UTC&#xff09;的协议。 安装 # yum安装 yum install -y ntp# 离线安装 #下载地址&#xff1a;https://mir…

Golang | Leetcode Golang题解之第126题单词接龙II

题目&#xff1a; 题解&#xff1a; //bfsdfs(如果是双向bfs&#xff0c;效果会更好) func findLadders(beginWord string, endWord string, wordList []string) [][]string {//字典表&#xff08;将wordList中的单词放入hash表中&#xff0c;方便查找&#xff09;dict:make(m…

接口测试之XML响应断言

目录 XPath 基本语法XML 响应结果解析XML 响应结果断言 XML 响应数据 如何提取 AddResult 中的值&#xff1f; <soap:Body><AddResponse xmlns"http://tempuri.org/"><AddResult>4</AddResult></AddResponse> </soap:Body> …

【创作活动】如何让大模型更聪明:提升智能的技术策略

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…