欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > 【k8s应用管理】kubernetes 配置资源管理

【k8s应用管理】kubernetes 配置资源管理

2025/2/23 19:54:54 来源:https://blog.csdn.net/Karoku/article/details/145615180  浏览:    关键词:【k8s应用管理】kubernetes 配置资源管理

文章目录

  • 配置资源管理
    • Secret 的四种类型
    • 创建 Secret 的两种方式
      • 1. 使用 `kubectl create secret` 命令创建
      • 2. 使用 base64 编码内容创建
    • 使用 Secret 的两种方式
        • 1. 将 Secret 挂载到 Volume 中
      • 2. 将 Secret 导出到环境变量中
      • 总结
    • ConfigMap
      • ConfigMap 概述
    • 创建 ConfigMap 的三种方式
      • 从目录创建
      • 从文件创建
      • 从字面值创建
    • 在 Pod 中使用 ConfigMap
      • 作为环境变量
      • 作为命令行参数
      • 挂载为数据卷
    • ConfigMap 的热更新
      • 1. Volume 自动更新
      • 2. 环境变量不更新
      • 3. 触发滚动更新

配置资源管理

Secret 是一种用于存储敏感信息(如密码、令牌、密钥等)的资源对象。与直接将敏感信息存储在 Pod 或镜像中相比,使用 Secret 可以更好地控制数据的访问权限,减少数据暴露的风险。

Secret 的四种类型

  1. kubernetes.io/service-account-token
    • 由 Kubernetes 自动创建,用于访问 APIServer。
    • Pod 默认使用这个 Secret 与 APIServer 通信。
    • 自动挂载到 Pod 的 /var/run/secrets/kubernetes.io/serviceaccount 目录中。
  2. Opaque
    • 默认的 Secret 类型,使用 base64 编码存储用户自定义的敏感数据(如密码、密钥等)。
  3. kubernetes.io/dockerconfigjson
    • 用于存储私有 Docker Registry 的认证信息。
  4. kubernetes.io/tls
    • 用于存储 TLS 证书和私钥信息。

创建 Secret 的两种方式

1. 使用 kubectl create secret 命令创建

echo -n 'zhangsan' > username.txt
echo -n 'abc1234' > password.txtkubectl create secret generic mysecret --from-file=username.txt --from-file=password.txt

查看 Secret:

kubectl get secrets
kubectl describe secret mysecret

2. 使用 base64 编码内容创建

echo -n zhangsan | base64
echo -n abc1234 | base64

创建 secret.yaml 文件:

apiVersion: v1
kind: Secret
metadata:name: mysecret1
type: Opaque
data:username: emhhbmdzYW4K=password: YWJjMTIzNAo==

应用 YAML 文件:

kubectl create -f secret.yaml

查看 Secret 的详细信息:

kubectl get secret mysecret1 -o yaml

使用 Secret 的两种方式

1. 将 Secret 挂载到 Volume 中

创建 secret-test.yaml 文件:

apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: nginximage: nginxvolumeMounts:- name: secretsmountPath: "/etc/secrets"readOnly: truevolumes:- name: secretssecret:secretName: mysecret

应用 YAML 文件:

kubectl create -f secret-test.yaml

进入 Pod 查看挂载的文件:

kubectl exec -it mypod bash
cd /etc/secrets
ls
cat username.txt
cat password.txt

2. 将 Secret 导出到环境变量中

创建 secret-test1.yaml 文件:

apiVersion: v1
kind: Pod
metadata:name: mypod1
spec:containers:- name: nginximage: nginxenv:- name: TEST_USERvalueFrom:secretKeyRef:name: mysecret1key: username- name: TEST_PASSWORDvalueFrom:secretKeyRef:name: mysecret1key: passwordenvFrom:- secretRef:name: mysecret1

应用 YAML 文件:

kubectl apply -f secret-test1.yaml

进入 Pod 查看环境变量:

kubectl exec -it mypod1 bash
echo $TEST_USER
echo $TEST_PASSWORD

总结

  • Secret 是 Kubernetes 中用于存储敏感信息的资源对象。
  • 可以通过命令行或 YAML 文件创建 Secret。
  • Secret 可以通过挂载 Volume 或环境变量的方式在 Pod 中使用。
  • 使用 Secret 可以有效减少敏感信息的暴露风险,并方便管理。

更多详细信息可以参考 Kubernetes 官方文档:Secrets。


ConfigMap

ConfigMap 概述

  • 作用:存储非加密的配置数据(如应用配置、环境变量),与 Secret 类似,但用于非敏感信息。
  • 应用场景:管理应用的配置参数(如数据库地址、日志级别)。
  • 核心特点
    • 支持从文件、目录或字面值创建。
    • 数据以键值对(key-value)形式存储。
    • 可注入到 Pod 的环境变量、命令行参数或挂载为文件。

创建 ConfigMap 的三种方式

从目录创建

将目录中所有文件作为键值对,键为文件名,值为文件内容。

mkdir /opt/configmap
echo 'enemy.types=aliens,monsters' > /opt/configmap/game.config
echo 'color.good=purple' > /opt/configmap/ui.configkubectl create configmap game-config --from-file=/opt/configmap/

从文件创建

指定多个文件,每个文件对应一个键值对。

kubectl create configmap game-config-2 \--from-file=/opt/configmap/game.config \--from-file=/opt/configmap/ui.config

从字面值创建

直接通过命令行参数定义键值对。

kubectl create configmap special-config \--from-literal=special.how=very \--from-literal=special.type=good

查看 ConfigMap

kubectl get cm
kubectl describe cm game-config
kubectl get cm special-config -o yaml

在 Pod 中使用 ConfigMap

作为环境变量

通过 valueFromenvFrom 注入。

# env.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_KEYvalueFrom:configMapKeyRef:name: special-config  # 引用 ConfigMapkey: special.how      # 指定键envFrom:- configMapRef:name: env-config        # 注入所有键值对

作为命令行参数

command 中通过环境变量引用。

# 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)"  # 使用环境变量env:- name: SPECIAL_HOW_KEYvalueFrom:configMapKeyRef:name: special-configkey: special.how

挂载为数据卷

将 ConfigMap 作为文件挂载到容器目录。

# test-pod3.yaml
apiVersion: v1
kind: Pod
metadata:name: test-pod3
spec:containers:- name: busyboximage: busybox:1.28.4volumeMounts:- name: config-volumemountPath: /etc/config     # 挂载到容器内的目录volumes:- name: config-volumeconfigMap:name: special-config     # 引用的 ConfigMap

验证挂载文件

kubectl exec -it test-pod3 -- cat /etc/config/special.how
# 输出:very

ConfigMap 的热更新

1. Volume 自动更新

  • 修改 ConfigMap 后,挂载为 Volume 的文件会自动更新(约 10 秒延迟)。
  • 示例
    1. 更新 ConfigMap:
      kubectl edit cm log-config  # 将 log_level 从 INFO 改为 DEBUG
      
    2. 查看容器内文件:
      kubectl exec <pod-name> -- cat /etc/config/log_level  # 输出 DEBUG
      

2. 环境变量不更新

  • 环境变量不会自动更新,需重启 Pod 或触发滚动更新。

3. 触发滚动更新

通过修改 Deployment 的注解触发 Pod 重启:

kubectl patch deployment my-nginx \--patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20231101"}}}}}'

注意

  • ConfigMap 与 Secret 的区别:ConfigMap 存储非敏感数据,Secret 存储敏感数据(如密码)。

  • 更新限制

    • Volume 挂载的文件支持热更新,但环境变量需重启 Pod。
    • 更新 ConfigMap 后,已存在的 Pod 需手动触发更新(如滚动部署)。
  • 大小限制:单个 ConfigMap 的 data 字段总大小不超过 1 MiB。

  • ConfigMap 是 Kubernetes 管理非敏感配置的核心组件。

  • 支持从文件、目录或字面值创建,灵活适应不同场景。

  • 通过环境变量、命令行参数或 Volume 挂载将配置注入 Pod。

  • 热更新特性使得配置管理更高效,但需注意环境变量的局限性。

参考文档:Kubernetes ConfigMap

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词