存储配置对象
1. ConfigMap
应用在其初始化或运行期间要依赖一些配置信息。多数时候,存在要调整配置参数所设置的数值的需求。ConfigMap 是 Kubernetes 的一种机制,可以将配置数据注入到应用的 Pod 内部。
ConfigMap 允许将配置清单与镜像内容分离,以保持容器化的应用程序的可移植性。例如,可以下载并运行相同的容器镜像来启动容器,分别用于本地开发、系统测试或运行实时终端用户工作负载。
ConfigMap 不用来保存大量数据,如果超出,考虑用挂载存储卷或者用独立的数据库或者文件服务器。
用途
- 用于存储非敏感的配置数据,如应用程序参数、配置文件、命令行参数等。
- 数据以
key-value
形式保存,可供 Pod 挂载或通过环境变量读取。
1.1 创建 ConfigMap
最好使用yaml文件进行创建或修改,这样便于使用git进行管理,团队协作等.
命令行方式
kubectl create configmap my-config \
--from-literal=APP_MODE=production \
--from-literal=TIMEOUT=30
由于多行内容需要转义和保持缩进,直接在命令中写入多行内容非常繁琐,不适合较大配置。
通过文件创建
-
先准备两个配置文件:
echo 'server {
listen 80;
server_name a.example.com;
location / {
proxy_pass http://192.168.1.71:8080;
}
}' > a.confecho 'server {
listen 80;
server_name b.example.com;
location / {
proxy_pass http://192.168.1.71:8081;
}
}' > b.conf -
创建 ConfigMap:
kubectl create configmap nginx-config --from-file=a.conf --from-file=b.conf
YAML 定义方式
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
data:
a.conf: | # 竖杠"|"表示多行文本块
server {
listen 80;
server_name a.example.com;
location / {
proxy_pass http://192.168.1.71:8080;
}
}
b.conf: |
server {
listen 80;
server_name b.example.com;
location / {
proxy_pass http://192.168.1.71:8081;
}
}
1.2 使用 ConfigMap
挂载到容器中
apiVersion: v1
kind: Pod
metadata:
name: nginx-proxy
spec:
containers:
- name: web
image: nginx:1.23
volumeMounts:
- name: config
mountPath: /etc/nginx/conf.d
volumes:
- name: config
configMap:
name: nginx-config
items:
- key: "a.conf"
path: "a.com.conf"
解释: 卷定义及 ConfigMap 挂载
volumes:
- name: config
configMap:
name: nginx-config
items:
- key: "a.conf"
path: "a.com.conf"
volumes
:Pod 使用的卷。configMap.name: nginx-config
:指定使用名为nginx-config
的 ConfigMap。items
:key: "a.conf"
:ConfigMap 中的某个键。path: "a.com.conf"
:在容器文件系统中保存为/etc/nginx/conf.d/a.com.conf
。
运行效果
-
ConfigMap 中
a.conf
对应的值(通常是 nginx 的配置内容)会被写入容器中的/etc/nginx/conf.d/a.com.conf
文件。 -
容器启动时会加载该配置文件,提供对应的代理配置。
通过环境变量注入
在containers.env字段中定义环境变量,如:
env:
- name: WORKER_CONNECTION
valueFrom:
configMapKeyRef:
name: your_configmap_name
key: your_selected_key
所有键值对都会以环境变量的形式注入容器。
2. Secret
Secret 是包含敏感数据的对象,使用 Secret 意味着不需要在代码中包含敏感数据。
Secrets 类似于配置映射,但具体用于保存机密数据,例如:为容器设置环境变量;向 Pod
提供 SSH 密钥或密码等凭证;允许 kubelet 从私有注册表中提取容器镜像等。
用途
-
用于存储敏感数据,如密码、Token、SSH Key、TLS 证书等。
-
数据默认以 Base64 编码存储(非加密),可启用加密存储功能。
2.1 创建 Secret
命令行方式(generic)
kubectl create secret generic my-secret \
--from-literal=username=admin \
--from-literal=password=123456
命令行方式(docker-registry)
kubectl create secret docker-registry my-docker-secret \
--docker-server=https://index.docker.io/v1/ \
--docker-username=myuser \
--docker-password=mypass \
--docker-email=myemail@example.com
命令行方式(tls)
kubectl create secret tls my-tls-secret \
--cert=server.crt \
--key=server.key
YAML 定义方式(generic)
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
username: YWRtaW4= # base64(admin)
password: MTIzNDU2 # base64(123456)
2.2 使用 Secret
挂载到容器中
volumes:
- name: secret-volume
secret:
secretName: my-secret
containers:
- name: app
image: busybox
volumeMounts:
- name: secret-volume
mountPath: /etc/secret
容器内
/etc/secret/username
和/etc/secret/password
文件包含解码后的内容。
通过环境变量注入
containers:
- name: app
image: busybox
envFrom:
- secretRef:
name: my-secret
username
和password
会以环境变量的形式注入容器。
3. 对比总结
特性 | ConfigMap | Secret |
---|---|---|
用途 | 存储非敏感配置数据 | 存储敏感数据(密码、密钥、证书) |
数据存储 | 明文(etcd 中未加密) | Base64 编码,可启用加密 |
使用方式 | 挂载 / 环境变量 | 挂载 / 环境变量 |