服务器运行一段时间网站打不开,天河做网站设计,教育网站建设 飞沐,网站怎么做维护前言
Kubernetes 中的 Secret#xff08;提供加密模式#xff09;和 ConfigMap#xff08;提供配置#xff09;是关键的资源#xff0c;用于安全地存储和管理敏感信息和配置数据。它们在应用程序开发和部署过程中扮演着重要的角色。本文将介绍如何有效地配置和管理这些资…前言
Kubernetes 中的 Secret提供加密模式和 ConfigMap提供配置是关键的资源用于安全地存储和管理敏感信息和配置数据。它们在应用程序开发和部署过程中扮演着重要的角色。本文将介绍如何有效地配置和管理这些资源以便更好地利用 Kubernetes 的强大功能。
目录
一、Secret
1. 概述
2. Secret 类型
2.1 kubernetes.io/service-account-token
2.2 Opaque
2.3 kubernetes.io/dockerconfigjson
2.4 kubernetes.io/tls
2.5 secrets 可选参数
3. Secret 使用方式
4. 创建 Secret
4.1 使用 kubectl create secret 命令陈述式创建 Secret
4.2 使用 yaml 文件声明式创建 Secret
5. 使用 Secret
5.1 以 Volume 的形式挂载
5.2 使用环境变量的方式创建
5.3 小结
二、ConfigMap
1. 概述
2. ConfigMap 作用
3. ConfigMap 和 Secret 对比
4. 创建 ConfigMap
4.1 使用目录创建
4.2 使用文件创建
4.3 使用字面值创建
5. 使用 ConfigMap
5.1 使用 ConfigMap 来替代环境变量
5.2 用 ConfigMap 设置命令行参数
5.3 通过数据卷插件使用 ConfigMap
5.4 ConfigMap 的热更新
5.4.1 更新 ConfigMap 中的配置数据
5.4.2 subPath 字段热更新
5.5 ConfigMap 更新后滚动更新 Pod
三、总结
1. Secret 四种类型
2. 创建 Secret
3. 创建ConfigMap
4. 查看资源中的数据是以明文的格式去显示key的值
5. ConfigMap使用
6. ConfigMap 的热更新有两种方式 一、Secret
1. 概述
在 K8s 中Secret 是用于存储敏感信息的对象如密码、token 令牌和 SSH 密钥。这类数据虽然也可以存放在 Pod 或者镜像中但是放在 Secret 中是为了更方便的控制如何使用数据并减少暴露的风险这些信息以加密形式存储并且只能被授权的 Pod 访问。通过使用 Secret可以更安全地管理应用程序所需的敏感数据。
也就是说 K8s 解决了我们和 Docker 使用的一些弊端比如环境变量、存储问题都要去重新编辑 Dockerfile而且密码还是明文的。
2. Secret 类型
2.1 kubernetes.io/service-account-token
由 Kubernetes 自动创建用来加载 service-account 文件、访问 APIServer 的 SecretPod 会默认使用这个 Secret 与 APIServer 通信 并且会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中。
[rootmaster01 ~]# kubectl describe pod nginx-daemonset-bqmtgMounts:/var/run/secrets/kubernetes.io/serviceaccount from default-token-n27bv (ro)
# /v……t 是容器内的路径表示该容器可以在此路径下访问 Kubernetes 提供的服务账户相关的凭据信息
# default-token-n27bv 是挂载的名称用于标识挂载点的来源
# (ro) 表示这个挂载是以只读read-only方式进行的
每一个容器启动的时候都会使用 secrets 下面的账号来进行挂载的而且权限为只读不可能让所有的 pod 都有权限访问 api-server。
2.2 Opaque
base64 编码格式的 Secret用来存储用户自定义的密码、密钥等默认的 Secret 类型这是默认的 Secret 类型用于存储任意类型的密钥-值对。
2.3 kubernetes.io/dockerconfigjson
用来存储私有 docker registry标识符的认证信息这种类型的 Secret 主要用于存储 Docker 镜像仓库的认证信息包括服务器地址、用户名和密码等。这种 Secret 类型通常用于在 Kubernetes 中拉取私有 Docker 镜像时进行身份验证。
2.4 kubernetes.io/tls
用于为 ssl 通信模式存储证书和私钥文件、存储与 TLS传输层安全相关的证书和密钥命令创建时类型标识符为 tls。这种类型的 Secret 通常用于安全地存储与 HTTPS 或其他加密通信相关的证书、私钥和 CA证书颁发机构证书等敏感信息。
2.5 secrets 可选参数
① docker-registry镜像
当创建用于拉取私有 Docker 镜像的 Secret 时可以指定该类型。这种 Secret 类型存储用于访问私有 Docker 镜像仓库所需的认证信息包括服务器地址、用户名和密码等
② tls证书
用于存储与 TLS传输层安全相关的证书和密钥
③ generic
这是默认的 Secret 类型用于存储任意类型的密钥-值对。它可以包含任何需要保密的信息如用户名/密码、API 令牌等。
3. Secret 使用方式
① 作为挂载到一个或多个容器上的卷 中的文件
② 作为容器的环境变量
③ 由 kubelet 在为 Pod 拉取镜像时使用。
应用场景官网
https://kubernetes.io/docs/concepts/configuration/secret/
4. 创建 Secret
4.1 使用 kubectl create secret 命令陈述式创建 Secret
① 指定用户名和密码文件信息
[rootmaster01 ~]# mkdir secrets;cd secrets
[rootmaster01 secrets]# echo -n lisi username.txt
[rootmaster01 secrets]# echo -n 1234 password.txt
② 使用 kubectl 工具在 K8s 中创建一个名为 mysecret 的通用类型 Secret
[rootmaster01 secrets]# kubectl create secret generic mysecret --from-fileusername.txt --from-filepassword.txt
secret/mysecret created# kubectl create secret generic mysecret
这部分指定了要创建一个名为 mysecret 的通用类型的 Secret
# --from-fileusername.txt
这表示将 username.txt 文件的内容作为一个键值对添加到 Secret 中键是文件名值是文件的内容
# --from-filepassword.txt
同样地这表示将 password.txt 文件的内容作为另一个键值对添加到 Secret 中
③ 列出当前 K8s 集群中的所有 Secret
[rootmaster01 secrets]# kubectl get secret
NAME TYPE DATA AGE
mysecret Opaque 2 77s
# Opaque类型用于存储任意类型的密钥-值对
④ 获取名为 mysecret 的 Secret 的详细信息
[rootmaster01 secrets]# kubectl describe secret mysecret
Name: mysecret
Namespace: default
Labels: none
Annotations: noneType: OpaqueDatapassword.txt: 4 bytes # 保密的数据包含4字节的数据
username.txt: 4 bytes
注get 或 describe 指令都不会展示 secret 的实际内容这是出于对数据的保护的考虑 。
4.2 使用 yaml 文件声明式创建 Secret
虽然 base64 编码并不等同于加密但它确实提供了一种简单有效的方式来存储和传输敏感信息同时也有助于保护这些信息不被轻易泄露。
① 将输入的文本内容进行 base64 编码
[rootmaster01 secrets]# echo -n lisi | base64 # 进行base64编码
bGlzaQ
[rootmaster01 secrets]# echo -n 1234 | base64
MTIzNA② 使用 yaml 文件创建
apiVersion: v1
kind: Secret # 这是一个 Secret 对象
metadata: # 包含有关对象的元数据name: mysecret1 # Secret 的名称
type: Opaque # Secret 的类型
data: # 包含了实际的密钥-值对数据username: bGlzaQ # 经过 base64 编码的值password: MTIzNA③ 创建 mysecret1 的 Secret 对象
[rootmaster01 secrets]# kubectl create -f secret.yaml
④ 列出当前 K8s 集群中的所有 Secret
[rootmaster01 secrets]# kubectl get secrets
NAME TYPE DATA AGE
mysecret Opaque 2 20m
mysecret1 Opaque 2 33s④ 获取名为 mysecret1 的 Secret 的详细信息
[rootmaster01 secrets]# kubectl describe secret mysecret1
Name: mysecret1
Namespace: default
Labels: none
Annotations: noneType: OpaqueDatapassword: 4 bytes
username: 4 bytes
# 两种格式基本一样
⑤ yaml 输出显示 Secret 对象的详细信息
[rootmaster01 secrets]# kubectl get secret mysecret1 -o yaml
# 包括它的类型、元数据以及经过 base64 编码的用户名和密码信息
5. 使用 Secret
上文介绍了陈述式和声明式简便的创建 Secret 的方法当然了我们还可以通过挂载存储的方式来去挂载到 Pod 内部或者导出到环境变量中。
5.1 以 Volume 的形式挂载
将 Secret 挂载到 Volume 中以 Volume 的形式挂载到 Pod 的某个目录下
① 定义 yaml 文件
[rootmaster01 secrets]# vim secret-test.yaml
apiVersion: v1
kind: Pod
metadata:name: mypod
spec: # Pod 的规格containers: # 列出了 Pod 中的容器- name: nginx # 容器的名称image: nginx # 镜像volumeMounts: # 将卷挂载到容器中- name: secrets # 将volumeMount与名为secrets的卷相关联mountPath: /etc/secrets # 指定容器内卷将被挂载的路径Volume将在这个路径下可见readOnly: true # 该卷将以只读方式挂载volumes: # 定义可以由容器挂载的卷- name: secrets # 卷名需与volumeMounts中的name一致secret: # 卷的类型secretName: mysecret # 引用将作为卷挂载到Pod内部的Kubernetes Secret资源的名称
② 启动 pod
[rootmaster01 secrets]# kubectl create -f secret-test.yaml
[rootmaster01 secrets]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mypod 1/1 Running 0 18s③ 进入容器查看用户名和密码文件信息
[rootmaster01 secrets]# kubectl exec -it mypod sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
# cd /etc/secrets/
# ls
password.txt username.txt
# cat username.txt
lisi#
# cat password.txt
1234#
5.2 使用环境变量的方式创建
将 Secret 导出到环境变量中
① 定义 yaml 文件
[rootmaster01 secrets]# vim secret-test1.yaml
apiVersion: v1
kind: Pod
metadata:name: mypod1
spec:containers:- name: nginximage: nginxenv: # 将环境变量传递给容器- name: TEST_USER # 设置一个名为 TEST_USER 的环境变量valueFrom: # 环境变量的值来源secretKeyRef: # 该值来自于一个 Secret 中的特定键name: mysecret1 # 包含该值的 Secret 的名称为 mysecret1key: username # 要使用的 Secret 中的键名为 username- name: TEST_PASSWORD # 设置一个名为 TEST_PASSWORD 的环境变量valueFrom: # 指定该环境变量的值来源secretKeyRef: # 该值来自于一个 Secret 中的特定键name: mysecret1 # 包含该值的 Secret 的名称为 mysecret1key: password # 要使用的 Secret 中的键名为 password② 启动 pod
[rootmaster01 secrets]# kubectl apply -f secret-test1.yaml[rootmaster01 secrets]# kubectl get pods
mypod1 1/1 Running 0 21s③ 进入容器查看用户名和密码文件信息
[rootmaster01 secrets]# kubectl exec -it mypod1 bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
rootmypod1:/# echo $TEST_USER
lisi
rootmypod1:/# echo $TEST_PASSWORD
1234
rootmypod1:/# env | grep TEST # 使用env指令查看系统所有内置变量
TEST_USERlisi
TEST_PASSWORD12345.3 小结
挂载的方式
volumes 定义类型 secret 的存储卷volumeMounts 把存储卷挂载到容器目录secret 资源数据中的键将以文件名的形式显示值文件内容
容器环境变量的方式
env 定义容器的环境变量名使用 valueFrom.secretKeyRef.name 指定 secret 资源的名称valueFrom.secretKeyRef.name 指定这个 secret 资源数据的键名从而确定引用那个键的值
二、ConfigMap
1. 概述
ConfigMap 是 K8s 中的一种资源对象用于存储非敏感数据的配置信息例如环境变量、命令行参数、配置文件等。ConfigMap 可以被挂载到 Pod 中供应用程序使用其中的配置数据。这样做的好处是可以将配置信息与应用程序代码分离使得配置更易管理和更新。
与Secret类似区别在于 ConfigMap 保存的是不需要加密配置的信息。ConfigMap 功能在 Kubernetes1.2 版本中引入许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API 给我们提供了向容器中注入配置信息的机制ConfigMap 可以被用来保存单个属性也可以用来保存整个配置文件或者JSON二进制大对象。应用场景应用配置。
2. ConfigMap 作用
配置数据的集中管理
ConfigMap 允许将配置数据集中存储在 Kubernetes 集群中而不是分散在各个 Pod 中。这样可以简化配置管理提高可维护性。
与Pod解耦
将配置信息存储在 ConfigMap 中可以使应用程序与配置数据解耦使得配置可以独立于应用程序进行更新和修改而无需修改应用程序本身。
动态配置更新
通过使用 ConfigMap可以实现动态更新应用程序的配置信息而无需重新部署 Pod。这样可以减少应用程序 downtime提高系统的可用性。
跨环境配置
可以为不同的环境例如开发、测试、生产环境创建不同的 ConfigMap从而实现跨环境的配置管理方便在不同环境中部署应用程序。
3. ConfigMap 和 Secret 对比
① 数据类型
ConfigMap: 用于存储非敏感的配置数据如环境变量、命令行参数、配置文件等。Secret: 用于存储敏感数据如密码、API密钥、证书等。Secret会对存储的数据进行Base64编码但并不提供加密功能。
② 安全性
ConfigMap: 存储的数据是明文的适用于不敏感的配置信息。不建议将敏感数据存储在ConfigMap中。Secret: 存储的数据会被Base64编码但并不提供加密功能。虽然Secret中的数据相对于ConfigMap更安全但仍然需要注意敏感数据的保护。
③ 用途
ConfigMap: 用于存储应用程序的配置信息如环境变量、配置文件等。Secret: 用于存储敏感数据如密码、密钥等以便应用程序安全地访问这些数据。
④ 访问方式
ConfigMap: 可以通过环境变量、命令行参数或卷挂载的方式访问其中的数据。Secret: 可以通过环境变量、命令行参数或卷挂载的方式访问其中的数据但需要注意敏感数据的保护和访问权限控制。
4. 创建 ConfigMap
4.1 使用目录创建
① 创建配置文件
[rootmaster01 ~]# mkdir /opt/configmap/
[rootmaster01 ~]# cd /opt/configmap/
[rootmaster01 configmap]# vim /opt/configmap/game.properties
enemiesaliens
lives3
enemies.cheattrue
enemies.cheat.levelnoGoodRotten
secret.code.passphraseUUDDLRLRBABAS
secret.code.allowedtrue
secret.code.lives30[rootmaster01 configmap]# vim /opt/configmap/ui.properties
color.goodpurple
color.badyellow
allow.textmodetrue
how.nice.to.lookfairlyNice
② 使用命令行创建
[rootmaster01 configmap]# kubectl create configmap game-config --from-file/opt/configmap/
configmap/game-config created
# --from-file 指定在目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对键的名字就是文件名值就是文件的内容
③ 获取 ConfigMap 资源的信息
[rootmaster01 configmap]# kubectl get cm
NAME DATA AGE
game-config 2 7s④ 以 yaml 格式查看了 game-config 的详细信息
[rootmaster01 configmap]# kubectl get cm game-config -o yaml
4.2 使用文件创建
只要指定为一个文件就可以从单个文件中创建 ConfigMap--from-file 这个参数可以使用多次即可以使用两次分别指定上个实例中的那两个配置文件效果就跟指定整个目录是一样的。
① 创建 ConfigMap
[rootmaster01 configmap]# kubectl create configmap game-config-2 --from-file/opt/configmap/game.properties --from-file/opt/configmap/ui.properties② 列出所有在 Kubernetes 中创建的 ConfigMap
[rootmaster01 configmap]# kubectl get cm
NAME DATA AGE
game-config 2 7m26s
game-config-2 2 2m15s③ 以 yaml 格式查看了 game-config-2 的详细信息
[rootmaster01 configmap]# kubectl get configmaps game-config-2 -o yaml
④ 获取名为 game-config-2 的 ConfigMap 的详细描述信息
[rootmaster01 configmap]# kubectl describe cm game-config-2
4.3 使用字面值创建
使用文字值创建利用 --from-literal 参数传递配置信息该参数可以使用多次格式如下
kubectl create configmap special-config --from-literalspecial.howvery --from-literalspecial.typegood查看ConfigMap详情:
kubectl get configmaps special-config -o yaml删除所有ConfigMap和Pod:
kubectl delete cm --all
kubectl delete pod --all
示例
[rootmaster01 configmap]# kubectl create configmap special-config --from-literalnamewangwu --from-literalage10
configmap/special-config created[rootmaster01 configmap]# kubectl get configmaps special-config -o yaml
apiVersion: v1
data:age: 10name: wangwu
kind: ConfigMap
metadata:creationTimestamp: 2024-06-02T16:00:51ZmanagedFields:- apiVersion: v1fieldsType: FieldsV1fieldsV1:f:data:.: {}f:age: {}f:name: {}manager: kubectl-createoperation: Updatetime: 2024-06-02T16:00:51Zname: special-confignamespace: defaultresourceVersion: 231163selfLink: /api/v1/namespaces/default/configmaps/special-configuid: cfc5fbe1-52f6-43d0-9d7d-8dc87d72dd4f5. 使用 ConfigMap
5.1 使用 ConfigMap 来替代环境变量
① 定义环境变量
[rootmaster01 configmap]# vim env.yaml
apiVersion: v1
kind: ConfigMap # 是一个ConfigMap对象
metadata: name: special-confignamespace: default
data:special.how: very # 存储了一个名为special.how的键值对其值为veryspecial.type: good # 存储了一个名为special.type的键值对其值为good
---
apiVersion: v1
kind: ConfigMap
metadata:name: env-confignamespace: default
data:log_level: INFO # 存储了一个名为log_level的键值对其值为INFO
② 创建资源
[rootmaster01 configmap]# kubectl delete configmaps --all
# 删除之前创建的configmaps[rootmaster01 configmap]# kubectl create -f env.yaml
[rootmaster01 configmap]# kubectl get cm
NAME DATA AGE
env-config 1 24s
special-config 2 24s③ 定义 Pod
[rootmaster01 configmap]# vim test-pod.yaml
apiVersion: v1
kind: Pod
metadata:name: test-pod
spec:containers:- name: busyboximage: busybox:1.28.4command: [ /bin/sh, -c, env ]env: # 容器内的环境变量- name: SPECIAL_HOW_KEY # 定义了一个名为SPECIAL_HOW_KEY的环境变量 valueFrom: # 指定了该环境变量的值来源configMapKeyRef: # 表明该值来自ConfigMap的特定键name: special-config # 指定了所使用的ConfigMap的名称key: special.how # 指定了要使用的ConfigMap中的键- name: SPECIAL_TYPE_KEY # 定义了另一个名为SPECIAL_TYPE_KEY的环境变量valueFrom: # 指定了该环境变量的值来源configMapKeyRef: # 表明该值来自ConfigMap的特定键name: special-config # 指定了所使用的ConfigMap的名称key: special.type # 指定了要使用的ConfigMap中的键envFrom: # 从ConfigMap中注入所有键值对作为环境变量- configMapRef: # 指定了要引用的ConfigMap对象name: env-config # 指定了要使用的ConfigMap的名称restartPolicy: Never # 指定了Pod的重启策略为Never
④ 启动 Pod
[rootmaster01 configmap]# kubectl create -f test-pod.yam[rootmaster01 configmap]# kubectl get pod
test-pod 0/1 Completed 0 10s
⑤ 获取日志信息
[rootmaster01 configmap]# kubectl logs test-pod
KUBERNETES_SERVICE_PORT443
KUBERNETES_PORTtcp://10.96.0.1:443
HOSTNAMEtest-pod
SHLVL1
SPECIAL_HOW_KEYvery
# 赋值变量 SPECIAL_HOW_KEY 的值为 special-config 的 special.how: very
HOME/root
NGINX_PORT_80_TCPtcp://10.96.75.23:80
NGINX_SERVICE_PORT_80_TCPtcp://10.96.193.207:80
SPECIAL_TYPE_KEYgood
# 赋值变量 SPECIAL_TYPE_KEY 的值为 special-config 的 special.type: good
KUBERNETES_PORT_443_TCP_ADDR10.96.0.1
PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NGINX_SERVICE_HOST10.96.75.23
NGINX_SERVICE_SERVICE_HOST10.96.193.207
KUBERNETES_PORT_443_TCP_PORT443
KUBERNETES_PORT_443_TCP_PROTOtcp
NGINX_DEPLOYMENT_PORT_30000_TCP_ADDR10.96.101.251
NGINX_DEPLOYMENT_PORT_30000_TCP_PORT30000
NGINX_DEPLOYMENT_PORT_30000_TCP_PROTOtcp
NGINX_DEPLOYMENT_SERVICE_HOST10.96.101.251
NGINX_PORTtcp://10.96.75.23:80
NGINX_SERVICE_PORTtcp://10.96.193.207:80
NGINX_SERVICE_SERVICE_PORT80
log_levelINFO
# 引入 env-config 的变量 log_level: INFO
KUBERNETES_SERVICE_PORT_HTTPS443
KUBERNETES_PORT_443_TCPtcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST10.96.0.1
PWD/
NGINX_PORT_80_TCP_ADDR10.96.75.23
NGINX_DEPLOYMENT_PORTtcp://10.96.101.251:30000
NGINX_SERVICE_PORT_80_TCP_ADDR10.96.193.207
NGINX_DEPLOYMENT_SERVICE_PORT30000
NGINX_DEPLOYMENT_PORT_30000_TCPtcp://10.96.101.251:30000
NGINX_PORT_80_TCP_PORT80
NGINX_SERVICE_PORT_80_TCP_PORT80
NGINX_PORT_80_TCP_PROTOtcp
NGINX_SERVICE_PORT_80_TCP_PROTOtcp5.2 用 ConfigMap 设置命令行参数
① 定义环境变量的值
[rootmaster01 configmap]# vim test-pod2.yaml
apiVersion: v1
kind: Pod
metadata:name: test-pod2
spec:containers:- name: busyboximage: busybox:1.28.4command: - /bin/sh- -c- echo $(SPECIAL_HOW_KEY) $(SPECIAL_TYPE_KEY)
# 在容器内部执行的命令。这个命令会打印环境变量SPECIAL_HOW_KEY和SPECIAL_TYPE_KEY的值env: # 设置了容器内的环境变量- name: SPECIAL_HOW_KEY # 定义了一个名为SPECIAL_HOW_KEY的环境变量 valueFrom: # 指定了该环境变量的值来源configMapKeyRef: # 表明该值来自ConfigMap的特定键name: special-config # 指定了所使用的ConfigMap的名称key: special.how # 指定了要使用的ConfigMap中的键- name: SPECIAL_TYPE_KEY # 定义了另一个名为SPECIAL_TYPE_KEY的环境变量valueFrom: # 指定了该环境变量的值来源configMapKeyRef: # 表明该值来自ConfigMap的特定键name: special-config # 指定了所使用的ConfigMap的名称key: special.type # 指定了要使用的ConfigMap中的键envFrom: # 从ConfigMap中注入所有键值对作为环境变量- configMapRef: # 指定了要引用的ConfigMap对象name: env-config # 指定了要使用的ConfigMap的名称restartPolicy: Never # 指定了Pod的重启策略为Never
② 启动 Pod
kubectl create -f test-pod2.yaml
③ 查看 Pod 信息
kubectl get pods
④ 获取日志信息
kubectl logs test-pod2
5.3 通过数据卷插件使用 ConfigMap
在数据卷里面使用 ConfigMap就是将文件填入数据卷在这个文件中键就是文件名键值就是文件内容。创建一个名为 test-pod3 的 Pod该 Pod 使用 ConfigMapspecial-config 作为数据卷并将 ConfigMap 中的键值对作为文件内容挂载到容器的文件系统中。
① 定义 Pod
[rootmaster01 configmap]# vim test-pod3.yaml
apiVersion: v1
kind: Pod
metadata:name: test-pod3
spec:containers:- name: busyboximage: busybox:1.28.4command: [ /bin/sh, -c, sleep 36000 ] # 定义了容器的启动命令volumeMounts: # 挂载路径到容器内部- name: config-volume # 挂载的卷的名称mountPath: /etc/config # 将卷挂载到容器内的路径 /etc/configvolumes: # 定义了Pod中的卷- name: config-volume # 卷的名称configMap: # 表明这是一个ConfigMap类型的卷name: special-config # 指定了要挂载的ConfigMap的名称restartPolicy: Never # 指定了Pod的重启策略为Never② 启动 Pod
[rootmaster01 configmap]# kubectl create -f test-pod3.yaml [rootmaster01 configmap]# kubectl get pods
test-pod3 1/1 Running 0 7s
③ 进入容器
[rootmaster01 configmap]# kubectl exec -it test-pod3 sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # cd /etc/config/
/etc/config # ls
special.how special.type
/etc/config # cat special.how
very/etc/config # 示例
① 准备挂载文件
[rootmaster01 configmap]# echo 123 index.html② 创建 configmap
[rootmaster01 configmap]# kubectl create configmap web123 --from-file/opt/configmap/index.html[rootmaster01 configmap]# kubectl describe configmaps web123
Name: web123
Namespace: default
Labels: none
Annotations: noneDataindex.html:
----
123Events: none③ 数据挂载
[rootmaster01 configmap]# vim web123.yaml
apiVersion: v1
kind: Pod
metadata:name: web-nginx
spec:volumes:- name: cm-webconfigMap:name: web123containers:- name: web-nginximage: nginx:1.14ports:- containerPort: 80volumeMounts:- name: cm-webmountPath: /usr/share/nginx/html④ 启动 Pod
[rootmaster01 configmap]# kubectl apply -f web123.yaml [rootmaster01 configmap]# kubectl get pod
[rootmaster01 configmap]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-nginx 1/1 Running 0 61s 10.244.2.53 node02 none none⑤ 访问页面
[rootmaster01 configmap]# curl 10.244.2.53
1235.4 ConfigMap 的热更新
5.4.1 更新 ConfigMap 中的配置数据
ConfigMap 的热更新指的是在不重启 Pods 的情况下更新 ConfigMap 中的配置数据从而实现应用程序的动态配置更新。这种热更新的方式可以帮助避免应用程序重启所带来的服务中断提高了系统的可用性。
① 编辑名为web123的 ConfigMap 资源
[rootmaster01 configmap]# kubectl edit configmap web123 ② 访问页面
[rootmaster01 configmap]# curl 10.244.2.53
welcome
# 等大概10秒左右使用该 ConfigMap 挂载的 Volume 中的数据同步更新
③ 查询容器内、宿主机文件
[rootmaster01 configmap]# kubectl exec -it web-nginx -- cat /usr/share/nginx/html/index.html
welcome
# 可以看到容器内的文件会修改
[rootmaster01 configmap]# cat index.html
123
# 宿主机的文件未被修改它只是将宿主机的文件当作键文件名值文件内容,设置为configmap
# 而后通过挂载的方式将键值同步到容器当中 只有修改configmap的键值容器中的内容才会同步更新
可以将配置文件等信息使用陈述式命令指定文件创建ConfigMap可以做到在宿主机上实时更新 pod 的配置信息以及其它有关信息。
5.4.2 subPath 字段热更新
通过使用 subPath可以实现对特定文件的热更新而不影响 Pod 中其他文件或配置。
① 创建 ConfigMap将当前目录下的 nginx.conf 文件作为配置数据导入到 ConfigMap 中
[rootmaster01 configmap]# kubectl create configmap nginx-config --from-filenginx.conf [rootmaster01 configmap]# kubectl get cm
NAME DATA AGE
nginx-config 1 12s
web123 1 12h② 定义两个 ConfigMap 来提供应用程序的配置和静态文件
指定 Pod 中的容器这里定义了一个名为 web-nginx 的容器使用了 nginx:1.14 镜像。容器暴露了 80 端口并且使用了之前定义的两个卷 cm-web 和 cm-nginx。其中 cm-web 卷被挂载到了容器的 /usr/share/nginx/html 目录cm-nginx 卷被挂载到了容器的 /etc/nginx/nginx.conf 目录并且使用了 subPath 字段来指定了 nginx.conf 文件的名称。
[rootmaster01 configmap]# vim web-nginx.yaml
apiVersion: v1
kind: Pod
metadata:name: web-nginx
spec: # 描述 Pod 的规范volumes: # 列出可以由此 Pod 中的容器挂载的卷- name: cm-web # 定义名为 cm-web 的卷configMap: # 指定此卷与 ConfigMap 相关联name: web123 # 将此卷与名为 web123 的 ConfigMap 关联- name: cm-nginx # 定义另一个名为 cm-nginx 的卷configMap: # 表明此卷与 ConfigMap 相关联name: nginx-config # 将此卷与名为 nginx-config 的 ConfigMap 关联containers: # 列出构成此 Pod 的容器- name: web-nginx # 将容器命名为 web-nginximage: nginx:1.14 # 指定要在此容器中使用的 Docker 镜像及其版本ports: # 列出此容器暴露的端口- containerPort: 80 # 指定此容器监听端口 80volumeMounts: # 列出要挂载到此容器中的卷- name: cm-web # 将 cm-web 卷挂载到容器中mountPath: /usr/share/nginx/html # 指定要将卷挂载到容器中的路径- name: cm-nginx # 将 cm-nginx 卷挂载到容器中mountPath: /etc/nginx/nginx.conf # 指定要将卷挂载到容器中的路径subPath: nginx.conf # 表示只应挂载 ConfigMap 中的 nginx.conf 文件③ 启动 Pod
[rootmaster01 configmap]# kubectl apply -f web-nginx.yaml [rootmaster01 configmap]# kubectl get pod -o wide | grep web-nginx
web-nginx 1/1 Running 0 3s 10.244.1.208 node01 none none④ 访问页面
[rootmaster01 configmap]# curl 10.244.1.208
html
headtitle404 Not Found/title/head
body bgcolorwhite
centerh1404 Not Found/h1/center
hrcenternginx/1.14.2/center
/body
/html[rootmaster01 configmap]# kubectl edit cm nginx-config
……location / {root /usr/share/nginx/html; # 修改web页面路径index index.html index.htm;}
……[rootmaster01 configmap]# kubectl delete -f web-nginx.yaml
pod web-nginx deleted
[rootmaster01 configmap]# kubectl apply -f web-nginx.yaml
pod/web-nginx created
[rootmaster01 configmap]# kubectl get pod -o wide | grep web-nginx
web-nginx 1/1 Running 0 4s 10.244.1.209 node01 none none
[rootmaster01 configmap]# curl 10.244.1.209
welcome5.5 ConfigMap 更新后滚动更新 Pod
更新 ConfigMap 目前并不会触发相关 Pod 的滚动更新可以通过在 .spec.template.metadata.annotations 中添加 version/config 每次通过修改 version/config 来触发滚动更新。
① 定义 yaml
[rootmaster01 configmap]# vim nginx-d.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginxname: nginx
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginx:1.14imagePullPolicy: IfNotPresentname: nginxports:- containerPort: 80protocol: TCPrestartPolicy: Always[rootmaster01 configmap]# kubectl apply -f nginx-d.yaml
[rootmaster01 configmap]# kubectl get pod -o wide | grep nginx
nginx-d9d8cf5c7-q8mmn 1/1 Running 0 4s 10.244.1.216 node01 none none[rootmaster01 configmap]# curl 10.244.1.216 -I
HTTP/1.1 200 OK
Server: nginx/1.14.2② 修改 Deployment 对象的 Pod 模板
[rootmaster01 configmap]# kubectl patch deployment nginx --patch {spec: {template: {metadata: {annotations: {version/config: 202406 }}}}}
deployment.apps/nginx patchednginx-78dc66b55c-7sllr 0/1 ContainerCreating 0 1s
nginx-78dc66b55c-7sllr 1/1 Running 0 2s
nginx-d9d8cf5c7-q8mmn 1/1 Terminating 0 2m30s注意更新 ConfigMap 后
使用该 ConfigMap 挂载的 Env 不会同步更新使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间实测大概10秒才能同步更新。
三、总结
1. Secret 四种类型
1Opaque 通用类型可以通过文件 目录、变量创建默认类型 2kubernetes.io/service-account-token k8s自动创建的给serviceaccount服务账号pod在k8s集群内部的专属服务用户访问APiserver使用 3kubernetes.io/dockerconfigjson 给k8s从harbor私有镜像仓库取镜像认证使用的 4kubernetes.io/tls 通过TLS证书来认证的私有文件、秘钥
2. 创建 Secret
1陈述式创建Secret格式 ① kubectl cerate secret generic “secret名字” --from-file“文件/指定文件名” --from-file选项可以多次使用也可以指定多个文件目录 ② kubectl cerate secret generic “secret名字” --from-literal“键值对key-value” --from-literal选项可以引用一个键值对也可以多次
2挂载的方式 ① volumes定义类型secret的存储卷 ② volumeMounts把存储卷挂载到容器目录secret资源数据中的键将以文件名的形式显示值是文件内容
3容器环境变量的方式 ① env定义容器的环境变量名 ② valueFrom.configMapKeyRef.name指定这个secret资源数据的键名从而确定引用那个键的值
搭载K8s时 k8s从hatbor私有仓库拉取镜像的时使用imagePullsecret指定kubernetes.io/dockerconfigjson类型的secret来作为连接私有仓库的认证信息
3. 创建ConfigMap kubectl create configmap “configmap名字” --from-file文件/目录 --from-literal“键值对key-value引用 4. 查看资源中的数据是以明文的格式去显示key的值 kubectl descrbe cm “configmap名字” kubectl get cm “configmap名字” -o yaml 5. ConfigMap使用
1容器环境变量的方式 env 需要另外自定义环境变量名通过cm资源名称和key名称来给这个变量赋值 envFrom 不需要另外自定义环境变量名直接使用cm资源的key作为容器中的环境变量名,value作为这个环境变量的值
2挂载的方式用的最多的方式 volumes 定义类型为configmap的存储卷 volumeMounts 把存储卷挂载到容器目录cm资源数据中的键将以文件的形式显示值为文件内容 如果把存储卷挂载到容器中的文件subPath指定的文件nginx.conf参考5.4.2 subPath 字段热更新
6. ConfigMap 的热更新有两种方式
CorfigMap挂载的Volume中的数据同步更新你修改当中配置他会更新策略
1可以根据kubectl edit修改当中配置来去做热更新(在线更新) {apiversion: apps/vl, kind.Deployment, ………………name: cm-nginx)]}}}}
2根据kubectl patch deployment “控制器名字” --patch 对应层级 和列表的方式 来完成热更新 示例kubectl patch deployment my-nginx --patch {spec: {template: {metadata: {annotations: {version/config: 202406 }}}}}