Kubernetes配置管理#
Secret#
Secret 是 Kubernetes 中用于存储敏感信息(如密码、Token、证书)的资源对象,支持以环境变量或文件挂载的方式注入到 Pod 中使用。
场景:用户名 和 密码进行加密
一般场景的是对某个字符串进行base64编码 进行加密
1
2
3
4
| echo -n 'admin' | base64
# 还原
echo YWRtaW4= | base64 -d
|

变量形式挂载到Pod#
示例 YAML
1
2
3
4
5
6
7
8
| apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
username: YWRtaW4=
password: MTIzNDU2
|
然后使用下面命令创建一个pod
1
| kubectl create -f secret.yaml
|
1
2
3
4
5
6
7
8
9
10
11
| env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: my-secret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: my-secret
key: password
|
通过get命令查看
然后我们通过下面的命令,进入到我们的容器内部
1
| kubectl exec -it mypod bash
|
然后我们就可以输出我们的值,这就是以变量的形式挂载到我们的容器中
1
2
3
4
| # 输出用户
echo $SECRET_USERNAME
# 输出密码
echo $SECRET_PASSWORD
|

最后如果我们要删除这个Pod,就可以使用这个命令
1
| kubectl delete -f secret-val.yaml
|
==缺点:环境变量容易被泄露(ps / 日志)==
数据卷形式挂载#
首先我们创建一个 secret-val.yaml 文件

1
2
3
4
5
6
7
8
| volumeMounts:
- name: secret-vol
mountPath: /etc/secret
volumes:
- name: secret-vol
secret:
secretName: my-secret
|
然后创建我们的 Pod
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # 创建 Secret
kubectl apply -f secret.yaml
# 查看
kubectl get secret
# 创建 Pod
kubectl apply -f pod.yaml
# 进入容器
kubectl exec -it mypod -- bash
# 查看
ls /etc/foo
|

优点:
总结:
Secret 是 Kubernetes 中用于存储敏感信息的资源对象,支持以环境变量或文件挂载的方式注入到 Pod 中使用。其数据通常以 Base64 编码存储,但安全性主要依赖于 etcd 加密和访问控制机制。在生产环境中,推荐使用 Volume 挂载方式以提高安全性。
ConfigMap#
ConfigMap 是 Kubernetes 中用于存储非敏感配置数据的资源对象,可以以环境变量或文件的形式注入到 Pod 中使用,实现配置与应用解耦。
应用场景:配置文件
创建配置文件#
首先我们需要创建一个配置文件 redis.properties
1
2
3
| redis.host=127.0.0.1
redis.port=6379
redis.password=123456
|
创建ConfigMap#
我们使用命令创建configmap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # 方式一 从文件创建
kubectl create configmap redis-config --from-file=redis.properties
# 方式二 从字面值创建
kubectl create configmap redis-config \
--from-literal=redis.host=127.0.0.1 \
--from-literal=redis.port=6379
# 方式三 使用 YAML(推荐生产)
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-config
data:
redis.host: "127.0.0.1"
redis.port: "6379"
redis.password: "123456"
|
然后查看详细信息
1
| kubectl describe cm redis-config
|

Volume数据卷形式挂载#
首先我们需要创建一个 cm.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| apiVersion: v1
kind: Pod
metadata:
name: cm-pod
spec:
containers:
- name: test
image: busybox
command: ["sleep", "3600"]
volumeMounts:
- name: config-vol
mountPath: /etc/config
volumes:
- name: config-vol
configMap:
name: redis-config
|
然后使用该yaml创建我们的pod
1
2
3
4
| # 创建
kubectl apply -f cm.yaml
# 查看
kubectl get pods
|

最后我们通过命令就可以查看结果输出了

优点:
以变量的形式挂载Pod#
首先我们也有一个 myconfig.yaml文件,声明变量信息,然后以configmap创建

然后我们就可以创建我们的配置文件
1
2
3
4
| # 创建pod
kubectl apply -f myconfig.yaml
# 获取
kubectl get cm
|

然后我们创建完该pod后,我们就需要在创建一个 config-var.yaml 来使用我们的配置信息

最后我们查看输出

ConfigMap vs Secret#
| 特性 | ConfigMap | Secret |
|---|
| 数据类型 | 普通配置 | 敏感数据 |
| 是否加密 | ❌ | ✔(可选) |
| 用途 | 配置文件 | 密码/证书 |