当前位置: 首页 > article >正文

【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.txt

kubectl 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: nginx
    image: nginx
    volumeMounts:
    - name: secrets
      mountPath: "/etc/secrets"
      readOnly: true
  volumes:
  - name: secrets
    secret:
      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: nginx
    image: nginx
    env:
      - name: TEST_USER
        valueFrom:
          secretKeyRef:
            name: mysecret1
            key: username
      - name: TEST_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret1
            key: password
    envFrom:
    - 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.config

kubectl 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: busybox
    image: busybox:1.28.4
    command: [ "/bin/sh", "-c", "env" ]
    env:
      - name: SPECIAL_HOW_KEY
        valueFrom:
          configMapKeyRef:
            name: special-config  # 引用 ConfigMap
            key: special.how      # 指定键
    envFrom:
      - configMapRef:
          name: env-config        # 注入所有键值对

作为命令行参数

command 中通过环境变量引用。

# test-pod2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-pod2
spec:
  containers:
  - name: busybox
    image: busybox:1.28.4
    command: 
      - "/bin/sh"
      - "-c"
      - "echo $(SPECIAL_HOW_KEY) $(SPECIAL_TYPE_KEY)"  # 使用环境变量
    env:
      - name: SPECIAL_HOW_KEY
        valueFrom:
          configMapKeyRef:
            name: special-config
            key: special.how

挂载为数据卷

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

# test-pod3.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-pod3
spec:
  containers:
  - name: busybox
    image: busybox:1.28.4
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config     # 挂载到容器内的目录
  volumes:
    - name: config-volume
      configMap:
        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


http://www.kler.cn/a/547228.html

相关文章:

  • 数据挖掘智能Agent
  • 机器学习:多项式回归
  • 全面了解HTTP(二)
  • 应对DeepSeek总是服务器繁忙的解决方法
  • docker容器部署jar应用导入文件时候报缺少字体错误解决
  • 已知自动驾驶的一个场景,如变道,如何做好预期功能安全
  • electron下载文件,弹窗选择下载路径,并通知下载进度
  • 故障码循环显示专项--和Deepseek的一次深度交互
  • 第2章:进阶格式与结构化元素
  • MQTT(Message Queuing Telemetry Transport)协议(三)
  • 从VGG到Transformer:深度神经网络层级演进对模型性能的深度解析与技术实践指南
  • 使用PHP爬虫获取1688商品分类:实战案例指南
  • Create Deploy Your Website Quickly - Docusaurus GitHub Pages
  • 力扣100. 相同的树(利用分解思想解决)
  • BPMN.js 与 DeepSeek 集成:打造个性化 Web 培训项目的秘诀
  • (一)获取数据和读取数据
  • [AI.认知]李飞飞团队“50美元”训练出s1-32B,以及研究成果《s1:Simple test- time scaling》,背后的本质?
  • 软考高级《系统架构设计师》知识点(四)
  • 侯捷 C++ 课程学习笔记:C++ 新标准 11/14 的革新与实战应用
  • 2025年02月13日Github流行趋势