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
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
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
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
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
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
7Pod
内的环境变量会包含: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
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
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
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
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