ConfigMap
ConfigMap
是 Kubernetes 中用于配置管理的资源对象。它允许你将配置信息从容器镜像中解耦,使得配置可以独立于应用程序进行管理和更新。以下是 ConfigMap
的详细介绍,包括其主要功能、用法以及常见的场景。
1. ConfigMap 基本概念
ConfigMap
是 Kubernetes 用来存储非机密的配置信息的对象。你可以将配置数据存储在 ConfigMap
中,然后将这些数据挂载到容器内,或者将其以环境变量的形式注入到容器中。这使得你可以在无需重新构建镜像的情况下更新配置。
2. ConfigMap 的主要功能
- 存储配置数据:将配置数据存储在 Kubernetes 集群中。
- 注入配置数据:通过挂载到容器内的文件、目录或环境变量的方式将配置数据提供给容器。
- 动态更新:
ConfigMap
的数据可以在运行时更新,应用程序可以根据需要获取最新的配置数据。
3. ConfigMap 的创建和管理
创建 ConfigMap
可以通过 YAML 文件、kubectl
命令行工具或者从文件中创建 ConfigMap
。
1. 从 YAML 文件创建:
apiVersion: v1
kind: ConfigMap
metadata:
name: my-configmap
data:
key1: value1
key2: value2
示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: my-configmap
data:
SIMPLE_KEY: simple_value
nginx_d: /usr/local/nginx
config.yaml: |
server:
port: 8080
host: localhost
db.properties: |
db.user=root
db.password=secret
db.url=jdbc:mysql://localhost:3306/mydb
---
apiVersion: v1
kind: Pod
metadata:
name: pod-with-config-files
labels:
app: nginx
spec:
containers:
- name: my-container
image: harbor.hiuiu.com/nginx/nginx:1.21.5
env:
- name: NGINX
valueFrom:
configMapKeyRef:
name: my-configmap
key: nginx_d
volumeMounts:
- name: config-volume
mountPath: "/etc/config"
readOnly: true
volumes:
- name: config-volume
configMap:
name: my-configmap
items:
- key: "config.yaml"
path: "config.yaml"
- key: "db.properties"
path: "db.properties"
restartPolicy: Never
使用 kubectl apply -f configmap.yaml
创建 ConfigMap
。
2. 从命令行创建:
kubectl create configmap my-config --from-literal=key1=value1 --from-literal=key2=value2
示例:
将一个包含 Tomcat 相关配置信息的 ConfigMap 引入到一个 Pod 中
kubectl create configmap tomcat-config --from-literal=tomcat_dir=/usr/local/tomcat --from-literal=server_name=tomcat.com
apiVersion: v1
kind: Pod
metadata:
name: tomcat-pod
spec:
containers:
- name: tomcat-container
image: c7-tomcat:9.0.16
imagePullPolicy: Never
command: ["/bin/sh"]
args: ["-c","while true; do echo hello; sleep 10; done"]
env:
- name: TOMCAT_DIR
valueFrom:
configMapKeyRef:
name: tomcat-config
key: tomcat_dir
- name: SERVER_NAME
valueFrom:
configMapKeyRef:
name: tomcat-config
key: server_name
ports:
- containerPort: 8080
kubectl apply -f cm.yaml
kubectl exec tomcat-pod -- env | grep TOMCAT_DIR
输出结果// TOMCAT_DIR=/usr/local/tomcat
kubectl exec tomcat-pod -- env | grep SERVER_NAME
输出结果// SERVER_NAME=tomcat.com
3. 从文件创建:
kubectl create configmap my-config --from-file=path/to/config/file
示例:
创建一个 Kubernetes Pod,并将 default.conf
文件作为 NGINX 配置文件挂载到 Pod 中
vim default.conf
server {
listen 8080;
listen [::]:8080;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50.html;
location = /50.html{
root /usr/share/nginx/html;
}
}
kubectl create configmap apps-config --from-file=default.conf
apiVersion: v1
kind: Pod
metadata:
name: app-pod-with-config
spec:
containers:
- name: app-container
image: harbor.hiuiu.com/nginx/nginx:1.21.5
volumeMounts:
- name: config-volume
mountPath: "/etc/nginx/conf.d"
readOnly: true
volumes:
- name: config-volume
configMap:
name: apps-config
将一个包含环境变量的 ConfigMap
加载到 Kubernetes Pod 的容器中
ConfigMap是通过--from-env-file
选项从环境变量文件生成的
cat env.list
DATABASE_HOST=localhost
DATABASE_POST=3006
DATABASE_USER=root
DATABASE_PASSWORD=secret
kubectl create configmap my-configmap --from-env-file=env.list
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: harbor.hiuiu.com/nginx/nginx:1.21.5
envFrom:
- configMapRef:
name: my-configmap
kubectl exec -it my-pod -- bash
env
4.从目录创建:
kubectl create configmap my-config --from-file=path/to/dir/
查看和编辑 ConfigMap
-
查看
ConfigMap
:kubectl get configmap my-config -o yaml
-
编辑
ConfigMap
:kubectl edit configmap my-config
删除 ConfigMap
kubectl delete configmap my-config
4. 使用 ConfigMap
ConfigMap
可以通过以下方式使用:
1. 作为环境变量
在 Pod 的 YAML 配置中,将 ConfigMap
的数据作为环境变量注入到容器中:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
env:
- name: CONFIG_KEY
valueFrom:
configMapKeyRef:
name: my-config
key: key1
2. 作为挂载卷
将 ConfigMap
挂载到容器内的文件系统中:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: my-config
挂载后,ConfigMap
的数据将被以文件的形式写入到指定的挂载路径(例如 /etc/config
)。
3. 作为命令行参数
可以将 ConfigMap
的数据作为命令行参数传递给容器:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
command: ["/bin/sh", "-c"]
args:
- echo $(CONFIG_KEY);
env:
- name: CONFIG_KEY
valueFrom:
configMapKeyRef:
name: my-config
key: key1
5. ConfigMap 的注意事项
- 非机密数据:
ConfigMap
主要用于存储非机密的配置数据。对于敏感数据,建议使用Secret
对象。 - 数据更新:如果
ConfigMap
的数据被更新,挂载到 Pod 中的数据不会自动更新,除非重新创建 Pod 或者容器。 - 大小限制:单个
ConfigMap
的大小有上限限制,通常为 1MB,但这个限制可能会因 Kubernetes 版本和实现而异。