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: value21
2
3
4
5
6
7Pod内的环境变量会包含:key1=value1 key2=value21
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.com1
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
|