第一章:✨ k8s入门:裸机部署 k8s 集群
第二章:✨ k8s入门:部署应用到 k8s 集群
第三章:✨ k8s入门:service 简单使用
第四章:✨ k8s入门:StatefulSet 简单使用
第五章:✨ k8s入门:存储(storage)
第六章:✨ K8S 配置 storageclass 使用 nfs 动态申领本地磁盘空间
第七章:✨ k8s入门:配置 ConfigMap & Secret
文章目录
- 系列文章
- 一、ConfigMap
- 1、概念
- 2、通过命令行创建
- 3、通过 yaml 文件创建
- 4、不可变更的 ConfigMap
- 5、 Pod 使用 ConfigMap
- ①、命令行参数(容器环境变量)
- ②、volume 挂载
- 二、Secret
- 1、概念
- 2、命令行创建 Secret
- 3、配置文件创建 Secret
- 4、pod 使用 Secret
- ①、以环境变量的方式使用 Secret
- ②、volume 挂载方式使用 Secret
- ③、Secret 为 Pod 拉取镜像时使用
- 四、kustomize 来创建 ConfigMap & SecretSecret
- 1、概述
- 2、configMapGenerator
- ①、创建 ConfigMap
- ②、pod 使用 kustomize 生成的 ConfigMap
- 3、secretGenerator
- 4、修改已存在的 ConfigMap & Secret
一、ConfigMap 1、概念
-
ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。
-
ConfigMap 将你的环境配置信息和容器镜像 解耦,便于应用配置的修改。
-
很多应用在其初始化或运行期间要依赖一些配置信息, 存在要调整配置参数所设置的数值的需求,ConfigMap 可以向 Pod 中注入配置数据。
-
ConfigMap 不提供保密或者加密功能,加密数据可以使用 Secret 或其他第三方工具。
-
ConfigMap 中保存的数据不可超过 1 MiB。
-
ConfigMap 使用 data 和 binaryData 字段。这些字段能够接收键-值对作为其取值。data 和 binaryData 字段都是可选的。data 字段设计用来保存 UTF-8 字符串,而 binaryData 则被设计用来保存二进制数据作为 base64 编码的字串。
详细用法参考:https://kubernetes.io/zh-cn/docs/concepts/configuration/configmap/
2、通过命令行创建 使用 `kubectl create configmap --help` 查看命令行详细参数例子:
- 通过文件夹创建:其中文件名为 key,文件内容为 value
# /root/configmap/dir 为文件夹 kubectl create configmap dir-config --from-file=/root/configmap/dir # /root/configmap/file/test.txt 为文件名 kubectl create configmap file-config --from-file=/root/configmap/file/test.txt
- 通过文件创建:其中 key 为 key1、key2,value 为文件内容
kubectl create configmap file-config --from-file=key1=/root/configmap/file/file1.txt --from-file=key2=/root/configmap/file/file2.txt
- 通过键值对创建:key1=config1 、 key2=config2,特殊字符($,,* 等)需要转义,最简单方法使用单引号
kubectl create configmap key-config --from-literal=key1=config1 --from-literal=key2=config2
- env 文件本身就是键值对形式文件,所以 configmap 的 key 对应 env 文件的 key,value 对应 env 文件的 value
kubectl create configmap env-config --from-env-file=/root/configmap/file/config1.env --from-env-file=/root/configmap/file/config2.env
简单测试:利用 env 创建 configmap
[root@master configmap]# cat file/config1.env id=1 name=admin [root@master configmap]# cat file/config2.env password=123456 [root@master configmap]# kubectl create configmap env-config --from-env-file=/root/configmap/file/config1.env --from-env-file=/root/configmap/file/config2.env configmap/env-config created [root@master configmap]# kubectl get cm NAME DATA AGE env-config 3 25s [root@master configmap]# kubectl describe cm/env-config Name: env-config Namespace: default Labels:3、通过 yaml 文件创建Annotations: Data ==== name: ---- admin password: ---- 123456 id: ---- 1 BinaryData ==== Events:
配置文件 /root/configmap/yaml/config.yaml,注意: data 字段类型 UTF-8 字符串, binaryData 二进制数据作为 base64 编码的字串
apiVersion: v1 kind: ConfigMap metadata: name: yaml-config data: id: "001" name: admin password: "123456" binaryData: address: 6KW/5a6J # 西安 date: MjAyMi82LzIx # 2022/6/21
部署 configmap
[root@master configmap]# kubectl apply -f yaml/config.yaml configmap/yaml-config created [root@master configmap]# kubectl describe cm/yaml-config Name: yaml-config Namespace: default Labels:4、不可变更的 ConfigMapAnnotations: Data ==== id: ---- 001 name: ---- admin password: ---- 123456 BinaryData ==== address: 6 bytes date: 9 bytes Events:
Kubernetes v1.21 新增特性 Immutable=true 设置 Secret 和 ConfigMap 为不可变更的选项,禁止更改 ConfigMap 的数据有以下好处
- 保护应用,使之免受意外(不想要的)更新所带来的负面影响。
- 通过大幅降低对 kube-apiserver 的压力提升集群性能, 这是因为系统会关闭对已标记为不可变更的 ConfigMap 的监视操作。
配置文件 /root/configmap/yaml/immutable-config.yaml
apiVersion: v1 kind: ConfigMap metadata: name: immutable-config data: id: "002" name: admin password: "123456" immutable: true
创建 configmap
[root@master configmap]# vi yaml/immutable-config.yaml [root@master configmap]# kubectl apply -f yaml/immutable-config.yaml configmap/immutable-config created [root@master configmap]# kubectl get cm NAME DATA AGE immutable-config 3 11s [root@master configmap]# vi yaml/immutable-config.yaml # 修改配置文件的值 [root@master configmap]# kubectl apply -f yaml/immutable-config.yaml # 重新创建包如下错误,保证不可变更 The ConfigMap "immutable-config" is invalid: data: Forbidden: field is immutable when `immutable` is set
一旦 ConfigMap 被标记为不可变更,则无法逆转这一变化,也无法更改 data 或 binaryData 字段的内容,只能删除并重建 ConfigMap。
5、 Pod 使用 ConfigMap有以下四种方式来使用 ConfigMap 配置 Pod 中的容器:
- 在容器命令行参数内
- 容器的环境变量
- 使用 volume 挂载
- 编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap
前三个方法,kubelet 使用 ConfigMap 中的数据在 Pod 中启动容器。第四种方法意味着你必须编写代码才能读取 ConfigMap 和它的数据,只要 ConfigMap 发生更改, 你的应用就能够通过订阅来获取更新。
①、命令行参数(容器环境变量)/root/configmap/yaml/alpine-config.yaml
apiVersion: v1
kind: Pod
metadata:
name: alpine-configmap-pod
spec:
containers:
- name: alpine-configmap-pod-container
image: alpine
# linux 获取某个环境变量值 echo ${环境变量}
# sleep 20 保证存活 20 s
command: [ "/bin/sh","-c","echo $(KEY1) $(KEY2) && sleep 20"]
env:
# 定义环境变量
- name: KEY1 # 请注意这里和 ConfigMap 中的键名是不一样的
valueFrom:
configMapKeyRef:
name: alpine-config # 这个值来自 ConfigMap
key: text1 # 需要取值的键
- name: KEY2
valueFrom:
configMapKeyRef:
name: alpine-config
key: text2
restartPolicy: Never # 重启策略(restartPolicy)
三个重启策略(restartPolicy)
- 1、Always:当容器终止退出后,总是重启容器,默认策略。
- 2、OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。
- 3、Never:当容器终止退出,从不重启容器。
查看上面 pod/alpine-configmap-pod 指定的 ConfigMap/alpine-config
[root@master configmap]# kubectl describe cm/alpine-config Name: alpine-config Namespace: default Labels:Annotations: Data ==== text1: ---- 1.在容器命令行参数内 text2: ---- 2.容器的环境变量 BinaryData ==== Events:
查看结果
[root@master configmap]# kubectl apply -f yaml/alpine-config.yaml pod/alpine-configmap-pod created [root@master configmap]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES alpine-configmap-pod 1/1 Running 0 12s 10.244.2.51 node2②、volume 挂载[root@master configmap]# kubectl logs -f pod/alpine-configmap-pod 1.在容器命令行参数内 2.容器的环境变量
新建配置文件 /root/configmap/yaml/redis.yaml,volume 挂载 configmap,会将 configmap 的每个 key 新建文件,value 为文件内容,可通过 items 将 Secret 键投射到特定目录
apiVersion: v1
kind: Pod
metadata:
name: redis-configmap-pod
spec:
containers:
- name: redis-configmap-pod-container
image: redis:latest
volumeMounts:
- name: redis-configmap-storage
mountPath: "/etc/foo" # 容器内部目录
readOnly: true
volumes:
- name: redis-configmap-storage
configMap:
name: yaml-config # 对应 configmap 名字
# 来自 ConfigMap 的一组键,如果不指定则 items ,则将 configmap 每个 key 新建文件存放在容器内部目录 /etc/foo,value 为文件内容
#items:
#- key: "id"
# path: "/root" 将 configmap 中的 id 键,存放在文件 /root/id
#- key: "name"
# path: "name" 将 configmap 中的 name 键,存放在文件 /etc/foo/name
创建 pod
[root@master configmap]# kubectl describe cm/yaml-config # 查看上面 pod 中指定的 configmap Name: yaml-config Namespace: default Labels:Annotations: Data ==== id: ---- 001 name: ---- admin password: ---- 123456 BinaryData ==== address: 6 bytes date: 9 bytes Events: [root@master configmap]# kubectl apply -f yaml/redis.yaml pod/redis-configmap-pod created [root@master configmap]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES redis-configmap-pod 1/1 Running 0 9s 10.244.2.53 node2 [root@master configmap]# kubectl exec -it pod/redis-configmap-pod /bin/bash # 进入 pod kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. root@redis-configmap-pod:/data# cd /etc/foo/ root@redis-configmap-pod:/etc/foo# ls address date id name password root@redis-configmap-pod:/etc/foo# cat address 西安
通过 Volume 将 configmap 挂载到容器内部时,当该 configmap 发生变化时,容器内部同步更新,但是通过环境变量设置到容器内部该值不具备自动更新的能力。
二、Secret 1、概念Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 Secret 类似于 ConfigMap 但专门用于保存机密数据。
为了安全地使用 Secret,请至少执行以下步骤:
- 为 Secret 启用静态加密;
- 启用或配置 RBAC 规则来限制读取和写入 Secret 的数据(包括通过间接方式)。需要注意的是,被准许创建 Pod 的人也隐式地被授权获取 Secret 内容。
- 在适当的情况下,还可以使用 RBAC 等机制来限制允许哪些主体创建新 Secret 或替换现有 Secret。
详细介绍参考:https://kubernetes.io/zh-cn/docs/concepts/configuration/secret/
2、命令行创建 Secret参考官方文档:https://kubernetes.io/zh-cn/docs/tasks/configmap-secret/managing-secret-using-kubectl/
-n 标志确保生成的文件在文本末尾不包含额外的换行符,当 kubectl 读取文件并将内容编码为 base64 字符串时,多余的换行符也会被编码。
echo -n 'admin' > ./username.txt echo -n '123456' > ./password.txt
kubectl create secret 创建对象 Secret,命令行创建可以指定三种类型的 Secret
- docker-registry 创建一个给 Docker registry 使用的 secret
- generic 使用文件,文件夹,键值对创建公共的 secret,注意:不支持 env 文件类型
- tls 创建一个 TLS secret
[root@master secret]# kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt secret/db-user-pass created [root@master secret]# kubectl get secret NAME TYPE DATA AGE db-user-pass Opaque 2 50s [root@master secret]# kubectl describe secret/db-user-pass Name: db-user-pass Namespace: default Labels:Annotations: Type: Opaque Data ==== password.txt: 6 bytes username.txt: 5 bytes
命令 kubectl get 和 kubectl describe 默认不显示 Secret 的内容,如果要查看数据实际内容,使用 base64 解码即可,实际解码数据后面不带换行,换行为了美观
[root@master secret]# kubectl get secret db-user-pass -o jsonpath='{.data}' # 要查看创建的 Secret 的内容
{"password.txt":"MTIzNDU2","username.txt":"YWRtaW4="}
[root@master secret]# echo "MTIzNDU2" | base64 -d # 解码 password 的数据
123456
[root@master secret]# echo "YWRtaW4=" | base64 -d # 解码 username 的数据
admin
上面是使用文件创建 generic 类型的 secret,键值对方法如下
[root@master secret]# kubectl create secret generic db --from-literal=mysql-username=root --from-literal=mysql-password=123456
secret/db created
[root@master secret]# kubectl get secret db -o jsonpath='{.data}'
{"mysql-password":"MTIzNDU2","mysql-username":"cm9vdA=="}
3、配置文件创建 Secret
参考官方文档:https://kubernetes.io/zh-cn/docs/tasks/configmap-secret/managing-secret-using-config-file/
Secret 资源包含2个键值对: data 和 stringData,data 和 stringData 的键必须由字母、数字、-,_ 或 . 组成
- data 字段用来存储 base64 编码的任意数据。
- stringData 字段是为了方便,它允许 Secret 使用未编码的字符串。
如果在 data 和 stringData 中都指定了一个字段,比如 host,字段值来自 stringData
apiVersion: v1 kind: Secret metadata: name: mysql-secret type: Opaque data: username: cm9vdA== # root password: MTIzNDU2 # 123456 host: MTkyLjE2OC4xLjE= # 192.168.1.1 stringData: host: 127.0.0.1 dbName: test
[root@master secret]# kubectl apply -f mysql.yaml secret/mysql-secret created [root@master secret]# kubectl get secret NAME TYPE DATA AGE mysql-secret Opaque 4 11s [root@master secret]# kubectl describe secret/mysql-secret Name: mysql-secret Namespace: default Labels:Annotations: Type: Opaque Data ==== dbName: 4 bytes host: 9 bytes password: 6 bytes username: 4 bytes
命令 kubectl get 和 kubectl describe 默认不显示 Secret 的内容,如果要查看数据实际内容,使用 base64 解码即可,实际解码数据后面不带换行,换行为了美观
[root@master secret]# kubectl get secret mysql-secret -o jsonpath='{.data}'
{"dbName":"dGVzdA==","host":"MTI3LjAuMC4x","password":"MTIzNDU2","username":"cm9vdA=="}
[root@master secret]# echo "MTI3LjAuMC4x"|base64 -d
127.0.0.1
[root@master secret]# echo "cm9vdA=="|base64 -d
root
4、pod 使用 Secret
Pod 可以用三种方式之一来使用 Secret:
- 作为挂载到一个或多个容器上的卷中的文件。
- 作为容器的环境变量。
- 由 kubelet 在为 Pod 拉取镜像时使用。
Kubernetes 控制面也使用 Secret; 例如,引导令牌 Secret 是一种帮助自动化节点注册的机制
下面用得到 secret/mysql-secret 对应上面
①、以环境变量的方式使用 Secretenv-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: secret-env-pod-container
image: alpine
# sleep 120 保证存活 120 s,打印 /config 目录下的文件
command: [ "/bin/sh","-c","echo ${SECRET_USERNAME} ${SECRET_PASSWORD}" ]
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysql-secret
key: username
optional: false # 此值为默认值;mysql-secret必须存在且名为 username 的值
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
optional: false # 此值为默认值;mysql-secret必须存在且名为 password的键
restartPolicy: Never
创建 pod,可以看到值已解码
[root@master secret]# kubectl apply -f env-pod.yaml pod/secret-env-pod created [root@master secret]# kubectl logs -f pod/secret-env-pod root 123456②、volume 挂载方式使用 Secret
apiVersion: v1
kind: Pod
metadata:
name: secret-pod
spec:
containers:
- name: secret-pod
image: alpine
# sleep 120 保证存活 120 s,打印 /config 目录下的文件
command: [ "/bin/sh","-c","ls -lah /config && sleep 120" ]
volumeMounts:
- name: config
mountPath: "/config"
volumes:
- name: config
secret:
secretName: mysql-secret
defaultMode: 0644 # 默认访问权限
③、Secret 为 Pod 拉取镜像时使用
可以参考我的另一篇文章,https://blog.csdn.net/qq_41538097/article/details/124884400 中的:六、私人镜像部署
四、kustomize 来创建 ConfigMap & SecretSecret参考官方文档:https://kubernetes.io/zh-cn/docs/tasks/manage-kubernetes-objects/kustomization/
从 kubernetes v1.14 开始,kubectl 支持使用 Kustomize 管理对象。 Kustomize 提供了资源生成器(Generators)来创建 Secret 和 ConfigMap。 Kustomize 生成器应该在某个目录的 kustomization.yaml 文件中指定。
- 查看目录中的 kustomization 资源,执行下面的命令:
kubectl kustomize
- 创建这些资源,使用参数 --kustomize 或 -k 标志来执行 kubectl apply:
kubectl apply -k1、概述
Kustomize 是一个用来定制 Kubernetes 配置的工具。它提供以下功能特性来管理 应用配置文件:
- 从其他来源生成资源
- 为资源设置贯穿性(Cross-Cutting)字段
- 组织和定制资源集合
Kustomize 提供 secretGenerator 和 configMapGenerator,可以基于文件或字面 值来生成 Secret 和 ConfigMap。
2、configMapGenerator ①、创建 ConfigMapconfigMapGenerator 可以基于文件、.env、键值对创建 ConfigMap
application.propertiesserver.port=8080 spring.application.name=k8s
config.env
OS=Window Type=ConfigMap
kustomization.yaml,生成的 ConfigMap 和 Secret 都会包含内容哈希值后缀,这是为了确保内容发生变化时,所生成的是新的 ConfigMap 或 Secret,要禁止自动添加后缀的行为,可以使用 generatorOptions。
configMapGenerator:
- name: kustomize-configmap-1
files: # 基于文件来生成 ConfigMap
- application.properties
envs: # .env 文件的数据生成 ConfigMap
- config.env
literals: # 基于键值偶对来生成 ConfigMap
- name=admin
- phone="123456"
- name: kustomize-configmap-2
literals:
- name=root
- phone="654321"
# 禁止自动添加后缀
#generatorOptions:
# disableNameSuffixHash: true
创建 kustomize
[root@master configMap]# kubectl apply -k /root/kustomize/configMap/ configmap/kustomize-configmap-1-mtbhb7gftg created configmap/kustomize-configmap-2-2tdm525ftc created [root@master configMap]# kubectl describe configmap/kustomize-configmap-2-2tdm525ftc Name: kustomize-configmap-2-2tdm525ftc Namespace: default Labels:Annotations: Data ==== name: ---- root phone: ---- 654321 BinaryData ==== Events:
查看目录中的 kustomization 资源,注意:通过 files 创建,则 key 为文件名,value 对应文件内容
[root@master configMap]# kubectl kustomize /root/kustomize/configMap/ apiVersion: v1 data: OS: Window Type: ConfigMap application.properties: "server.port=8080rnspring.application.name=k8s" name: admin phone: "123456" kind: ConfigMap metadata: name: kustomize-configmap-1-mtbhb7gftg --- apiVersion: v1 data: name: root phone: "654321" kind: ConfigMap metadata: name: kustomize-configmap-2-2tdm525ftc②、pod 使用 kustomize 生成的 ConfigMap
要在 Pod 中使用生成的 ConfigMap,使用 configMapGenerator 的名称对其进行引用。 Kustomize 将自动使用生成的名称替换该名称。
pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: kustomize-configmap-pod
spec:
containers:
- name: kustomize-configmap-pod-container
image: alpine
# sleep 120 保证存活 120 s,打印 /config 目录下的文件
command: [ "/bin/sh","-c","ls -lah /config && sleep 120" ]
volumeMounts:
- name: config
mountPath: /config
volumes:
- name: config
configMap:
name: kustomize-configmap-1
kustomization.yaml ,application.properties、config.env 文件内容和上面相同
注意:
- 如果你的 configmap 没有禁止自动添加后缀(默认),则必须在 kustomization.yaml 文件添加 resources ,使用 kubectl apply -k ./ 命令创建
- 如果你禁止自动添加后缀(disableNameSuffixHash: true),则可以使用 kubectl apply -k ./ 先创建 configmap,再使用 kubectl apply -f pod.yaml 创建 pod
resources:
- pod.yaml # 上面 pod 文件名
configMapGenerator:
- name: kustomize-configmap-1
files: # 基于文件来生成 ConfigMap
- application.properties
envs: # .env 文件的数据生成 ConfigMap
- config.env
literals: # 基于键值偶对来生成 ConfigMap
- name=admin
- phone="123456"
- name: kustomize-configmap-2
literals:
- name=root
- phone="654321"
#禁止自动添加后缀
generatorOptions:
disableNameSuffixHash: true
创建 pod 和 configmap,configmap 挂载到容器内是以文件形式存在,如下可以看到 /config 目录下生成的文件
[root@master configMap]# kubectl apply -k ./ configmap/kustomize-configmap-1 created configmap/kustomize-configmap-2 created pod/kustomize-configmap-pod created [root@master configMap]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kustomize-configmap-pod 0/1 Completed 4 (3m21s ago) 12m 10.244.2.76 node23、secretGenerator[root@master configMap]# kubectl get cm NAME DATA AGE kustomize-configmap-1 5 13s kustomize-configmap-2 2 13s [root@master configMap]# kubectl logs -f pod/kustomize-configmap-pod total 0 drwxrwxrwx 3 root root 137 Jun 23 08:17 . drwxr-xr-x 1 root root 31 Jun 23 08:17 .. drwxr-xr-x 2 root root 83 Jun 23 08:17 ..2022_06_23_08_17_19.2013437377 lrwxrwxrwx 1 root root 32 Jun 23 08:17 ..data -> ..2022_06_23_08_17_19.2013437377 lrwxrwxrwx 1 root root 9 Jun 23 08:17 OS -> ..data/OS lrwxrwxrwx 1 root root 11 Jun 23 08:17 Type -> ..data/Type lrwxrwxrwx 1 root root 29 Jun 23 08:17 application.properties -> ..data/application.properties lrwxrwxrwx 1 root root 11 Jun 23 08:17 name -> ..data/name lrwxrwxrwx 1 root root 12 Jun 23 08:17 phone -> ..data/phone
基于文件或者键值偶对来生成 Secret。
cat <./password.txt username=admin password=123456 EOF cat < ./kustomization.yaml secretGenerator: - name: kustomize-secret-1 files: - password.txt literals: - id=1 - name: kustomize-secret-2 literals: - address=xian - phone=12581 #禁止自动添加后缀 generatorOptions: disableNameSuffixHash: true EOF
查看资源:kubectl kustomize ./
创建资源:kubectl apply -k ./
pod 中使用 kustomize 生成的 secret 和使用 configmap 类似,都是通过 volume 形式实现,只需要改挂载部分
apiVersion: v1
kind: Pod
metadata:
name: kustomize-secret-pod
spec:
containers:
- name: kustomize-secret-pod-container
image: alpine
# sleep 120 保证存活 120 s,打印 /config 目录下的文件
command: [ "/bin/sh","-c","ls -lah /config && sleep 120" ]
volumeMounts:
- name: config
mountPath: /config
volumes:
- name: config
# 主要修改下面两行
secret:
secretName: kustomize-secret-1
查看 secret 数据
[root@master secret]# kubectl get secret kustomize-secret-1 -o jsonpath='{.data}'
{"id":"MQ==","password.txt":"dXNlcm5hbWU9YWRtaW4KcGFzc3dvcmQ9MTIzNDU2Cg=="}[root@master secret]# echo "dXNlcm5hbWU9YWRtaW4KcGFzc3dvcmQ9MTIzNDU2Cg=="|base64 -d
username=admin
password=123456
4、修改已存在的 ConfigMap & Secret
kubectl edit configmap my-config kubectl edit secrets my-config
这一命令会启动你的默认编辑器,允许你更新 data 字段中的值,secrets 中存放的是 base64 编码的值



