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

【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

相关文章:

  • Centos修改ip
  • Playwright入门之---命令
  • 【MySQL】 常见数据类型
  • c# 2025/2/17 周一
  • 夜莺监控发布 v8.beta5 版本,优化 UI,新增接口认证方式便于鉴权
  • qt:经典窗口操作与控制
  • 使用 Flask 和 pdfkit 生成带透明 PNG 盖章的 PDF 并上传到阿里云 OSS
  • 【NLP 25、模型训练方式】
  • 数据结构:栈(Stack)及其实现
  • AI与互联网交互的四种技术路线分析
  • Linux在shell中如何提前结束脚本
  • leetcode88.合并两个有序数组
  • springboot021-基于协同过滤算法的个性化音乐推荐系统
  • Java并发编程——锁升级机制
  • SSE:用于流式传输的协议
  • 百度热力图数据获取,原理,处理及论文应用6
  • Java 开发者需要了解的 PDF 基础知识
  • 安全防御综合练习2 nat+智能选路
  • 串的基本操作--数据结构
  • 算法日常刷题笔记(1)
  • 广西鹿寨一水文站“倒刺扶手”存安全隐患,官方通报处理情况
  • 李成钢:近期个别经济体实施所谓“对等关税”,严重违反世贸组织规则
  • 美国将与阿联酋合作建立海外最大的人工智能数据中心
  • 最高检公布一起离婚纠纷典型案例:推动离婚经济补偿制度落实
  • 中国进出口银行:1-4月投放制造业中长期贷款超1800亿元
  • 马上评|中学生被操场地面烫伤,谁的“大课间”?