章工运维 章工运维
首页
  • linux
  • windows
  • 中间件
  • 监控
  • 网络
  • 存储
  • 安全
  • 防火墙
  • 数据库
  • 系统
  • docker
  • 运维工具
  • other
  • elk
  • K8S
  • ansible
  • Jenkins
  • GitLabCI_CD
  • 随笔
  • 面试
  • 工具
  • 收藏夹
  • Shell
  • python
  • golang
友链
  • 索引

    • 分类
    • 标签
    • 归档
    • 首页 (opens new window)
    • 关于我 (opens new window)
    • 图床 (opens new window)
    • 评论 (opens new window)
    • 导航栏 (opens new window)
周刊
GitHub (opens new window)

章工运维

业精于勤,荒于嬉
首页
  • linux
  • windows
  • 中间件
  • 监控
  • 网络
  • 存储
  • 安全
  • 防火墙
  • 数据库
  • 系统
  • docker
  • 运维工具
  • other
  • elk
  • K8S
  • ansible
  • Jenkins
  • GitLabCI_CD
  • 随笔
  • 面试
  • 工具
  • 收藏夹
  • Shell
  • python
  • golang
友链
  • 索引

    • 分类
    • 标签
    • 归档
    • 首页 (opens new window)
    • 关于我 (opens new window)
    • 图床 (opens new window)
    • 评论 (opens new window)
    • 导航栏 (opens new window)
周刊
GitHub (opens new window)
  • ansible系列文章

  • Kubernetes笔记

    • 安装篇-kubeadm
    • k8s入门
    • k8s安装篇二进制
    • k8s面试题
    • kubernetes(k8s)yaml文件详解
    • k8s报错小结
    • Kubernetes 安装配置ingress controller
    • cka考试真题
    • ingress配置证书
    • cka考试作业
    • k8s部署java项目
    • jenkins脚本式流水线部署k8s项目实例一
    • helm v3安装并创建例子
    • 使用helm将本地部署文件上传到harbor chart上
    • helm公共仓库创建
    • helm适应minio作为私有仓库
    • helm release使用说明
    • kubernetes核心概念
    • kubectl使用技巧
    • kubernetes卷的几种类型
    • kubernetes安全框架
    • 云原生-什么是HPA和PDB、VPA
    • k8s部署php项目示例
    • 配置kubeconfig 文件访问 Kubernetes 集群
    • configmap配置的几种方式
    • k8s配置go服务
    • k8s部署java项目
    • kubernetes部署prometheus监控
    • kubernetes部署elk日志系统
    • kubernetes环境devops流水线
    • kubernetes高阶技能必备的工具
    • deployment中使用configmap、secret的方式
      • 1. 作为环境变量(Environment Variables)
        • 示例 YAML
        • 解析
      • 2. 挂载 `ConfigMap` 为 Volume
        • 示例 YAML
        • 解析
        • 挂载后的效果
      • 3. 作为命令行参数(Command Arguments)
        • 示例 YAML
        • 解析
      • 4. 作为 InitContainer 预处理配置
        • 示例 YAML
        • 解析
      • 5. 通过 `ConfigMap` 配置 `ConfigMap` 类型的环境变量
        • 示例 YAML
        • 解析
      • 总结
      • 1. 作为环境变量(Environment Variables)
        • 示例 YAML
        • 解析
      • 2. 挂载 `Secret` 为 Volume
        • 示例 YAML
        • 解析
        • 挂载后的效果
      • 3. 作为 `ImagePullSecrets` 用于拉取私有镜像
        • 示例 YAML
        • 解析
      • 4. 作为 `ServiceAccount` 关联 Secret
        • 示例 YAML
        • 解析
      • 总结
    • 业务pod 飘移pending排查分析
  • elk

  • jenkins

  • GitLabCI_CD

  • 专题
  • Kubernetes笔记
章工运维
2025-04-03
目录

deployment中使用configmap、secret的方式

在 Kubernetes 中,Deployment 资源对象使用 ConfigMap 主要有以下几种方式:


# 1. 作为环境变量(Environment Variables)

可以将 ConfigMap 中的值作为环境变量提供给 Pod 内的容器。

# 示例 YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-container
          image: nginx
          env:
            - name: CONFIG_VALUE
              valueFrom:
                configMapKeyRef:
                  name: my-config
                  key: key1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 解析

  • valueFrom.configMapKeyRef.name:指定 ConfigMap 的名称(这里是 my-config)。
  • valueFrom.configMapKeyRef.key:指定 ConfigMap 中的键(key1)。

# 2. 挂载 ConfigMap 为 Volume

可以将 ConfigMap 挂载到容器的文件系统中,以文件形式提供给应用程序。

# 示例 YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-container
          image: nginx
          volumeMounts:
            - name: config-volume
              mountPath: "/etc/config"
      volumes:
        - name: config-volume
          configMap:
            name: my-config
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 解析

  • volumeMounts:
    • mountPath: "/etc/config":将 ConfigMap 挂载到 /etc/config 目录。
  • volumes:
    • configMap.name: my-config:指定要挂载的 ConfigMap。

# 挂载后的效果

  • my-config 里的 key1=value1 会成为 /etc/config/key1 文件,内容是 value1。

# 3. 作为命令行参数(Command Arguments)

可以将 ConfigMap 的值作为命令行参数传递给容器。

# 示例 YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-container
          image: busybox
          command: ["sh", "-c", "echo $(MY_CONFIG)"]
          env:
            - name: MY_CONFIG
              valueFrom:
                configMapKeyRef:
                  name: my-config
                  key: key1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 解析

  • command: ["sh", "-c", "echo $(MY_CONFIG)"] 运行时会解析 ConfigMap 里的值。

# 4. 作为 InitContainer 预处理配置

在 InitContainer 中使用 ConfigMap 预处理应用程序配置。

# 示例 YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      initContainers:
        - name: init-config
          image: busybox
          command: ['sh', '-c', 'cat /etc/config/key1']
          volumeMounts:
            - name: config-volume
              mountPath: "/etc/config"
      containers:
        - name: my-container
          image: nginx
      volumes:
        - name: config-volume
          configMap:
            name: my-config
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

# 解析

  • InitContainer 读取 ConfigMap 内容,并执行初始化逻辑。

# 5. 通过 ConfigMap 配置 ConfigMap 类型的环境变量

可以一次性将 ConfigMap 中所有的键作为环境变量导入,而不是单独指定每个 key。

# 示例 YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-container
          image: nginx
          envFrom:
            - configMapRef:
                name: my-config
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 解析

  • envFrom.configMapRef.name: my-config 会将 my-config 中所有键作为环境变量。
  • 假设 ConfigMap 结构如下:
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: my-config
    data:
      key1: value1
      key2: value2
    
    1
    2
    3
    4
    5
    6
    7
    则 Pod 内的环境变量会包含:
    key1=value1
    key2=value2
    
    1
    2

# 总结

方式 使用方法 适用场景
作为环境变量 env.valueFrom.configMapKeyRef 适用于小型配置(如单个键值对)
挂载为 Volume volumeMounts + volumes.configMap 适用于文件类型配置(如应用配置文件)
作为命令行参数 command + env.valueFrom.configMapKeyRef 适用于动态传递参数
用于 InitContainer initContainers + volumeMounts 适用于应用程序启动前的初始化
envFrom 方式 envFrom.configMapRef 适用于一次性导入多个环境变量

一般情况下:

  • 单个键值对(如 APP_ENV=production)推荐环境变量。
  • 文件型配置(如 .conf、.json)推荐Volume 挂载。
  • 命令行动态参数推荐命令行传递。
  • 需要 InitContainer 预处理时,可以使用 InitContainer。
  • 一次性导入多个环境变量可以使用 envFrom。

这样可以根据不同的应用场景选择合适的 ConfigMap 使用方式。

在 Kubernetes 中,Deployment 资源对象使用 Secret 主要有以下几种方式:


# 1. 作为环境变量(Environment Variables)

可以将 Secret 的值作为环境变量提供给 Pod 内的容器。

# 示例 YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-container
          image: nginx
          env:
            - name: DB_USER
              valueFrom:
                secretKeyRef:
                  name: my-secret
                  key: username
            - name: DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: my-secret
                  key: password
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

# 解析

  • valueFrom.secretKeyRef.name:指定 Secret 的名称(这里是 my-secret)。
  • valueFrom.secretKeyRef.key:指定 Secret 中的键(username 和 password)。

# 2. 挂载 Secret 为 Volume

可以将 Secret 挂载到容器的文件系统中,以文件形式提供给应用程序。

# 示例 YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-container
          image: nginx
          volumeMounts:
            - name: secret-volume
              mountPath: "/etc/secret"
              readOnly: true
      volumes:
        - name: secret-volume
          secret:
            secretName: my-secret
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# 解析

  • volumeMounts:
    • mountPath: "/etc/secret":将 Secret 挂载到 /etc/secret 目录。
    • readOnly: true:保证 Secret 只读,防止容器修改数据。
  • volumes:
    • secretName: my-secret:指定要挂载的 Secret。

# 挂载后的效果

  • my-secret 里的 username 和 password 会分别成为 /etc/secret/username 和 /etc/secret/password 文件,其内容就是 Secret 里的值。

# 3. 作为 ImagePullSecrets 用于拉取私有镜像

如果 Pod 需要从私有 Docker 镜像仓库拉取镜像,可以使用 Secret 作为 imagePullSecrets。

# 示例 YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      imagePullSecrets:
        - name: my-docker-secret
      containers:
        - name: my-container
          image: myregistry.com/myimage:latest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 解析

  • imagePullSecrets 指定用于认证 Docker 镜像仓库的 Secret。
  • my-docker-secret 是一个 docker-registry 类型的 Secret,创建方式如下:
    kubectl create secret docker-registry my-docker-secret \
      --docker-username=myuser \
      --docker-password=mypassword \
      --docker-server=myregistry.com
    
    1
    2
    3
    4

# 4. 作为 ServiceAccount 关联 Secret

在 Deployment 中使用 ServiceAccount 进行 API 访问时,可以通过 Secret 存储 API 访问令牌,并在 Pod 运行时自动挂载。

# 示例 YAML

apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-service-account
secrets:
  - name: my-secret
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      serviceAccountName: my-service-account
      containers:
        - name: my-container
          image: nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# 解析

  • serviceAccountName: my-service-account:让 Pod 运行时使用 my-service-account。
  • ServiceAccount 绑定了 Secret,所以 Pod 运行时可访问该 Secret。

# 总结

方式 使用方法 适用场景
作为环境变量 env.valueFrom.secretKeyRef 适用于存储用户名、密码等环境变量
挂载为 Volume volumeMounts + volumes.secret 适用于存储证书、密钥等文件
imagePullSecrets imagePullSecrets 适用于拉取私有仓库镜像
关联 ServiceAccount serviceAccountName 适用于访问 Kubernetes API

一般情况下:

  • 如果是小型的配置(如数据库密码),推荐环境变量。
  • 如果是文件类型的 Secret(如 TLS 证书),推荐Volume 挂载。
  • 如果是私有镜像仓库,则必须使用 imagePullSecrets。
  • 如果 Pod 需要访问 Kubernetes API,则使用 ServiceAccount 关联 Secret。

这样可以根据不同的应用场景选择合适的 Secret 使用方式。

微信 支付宝
上次更新: 2025/04/03, 17:28:29

← kubernetes高阶技能必备的工具 业务pod 飘移pending排查分析→

最近更新
01
shell脚本模块集合
05-13
02
生活小技巧(认知版)
04-29
03
生活小技巧(防骗版)
04-29
更多文章>
Theme by Vdoing | Copyright © 2019-2025 | 点击查看十年之约 | 鄂ICP备2024072800号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式