← 返回首页
🔧

Kubernetes ConfigMap 配置管理

📂 devops ⏱ 2 min 295 words

Kubernetes ConfigMap 配置管理

什么是 ConfigMap

ConfigMap 是 Kubernetes 中用于存储非机密配置数据的 API 对象。它允许将配置与容器镜像解耦,使应用配置更加灵活和可维护。ConfigMap 可以存储键值对、配置文件或完整的目录结构。

创建 ConfigMap

从字面值创建

kubectl create configmap app-config \
  --from-literal=DB_HOST=mysql \
  --from-literal=DB_PORT=3306 \
  --from-literal=DB_NAME=mydb

从文件创建

# 单个文件
kubectl create configmap app-config --from-file=config.properties

# 多个文件
kubectl create configmap app-config \
  --from-file=config1.properties \
  --from-file=config2.properties

# 指定键名
kubectl create configmap app-config --from-file=app-config=config.properties

从目录创建

kubectl create configmap app-config --from-file=config-dir/

通过 YAML 文件创建

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
  namespace: default
data:
  DB_HOST: "mysql"
  DB_PORT: "3306"
  DB_NAME: "mydb"
  config.properties: |
    database.url=jdbc:mysql://mysql:3306/mydb
    database.pool.size=10
    log.level=INFO
kubectl apply -f configmap.yaml

查看 ConfigMap

# 列出所有 ConfigMap
kubectl get configmap

# 查看详情
kubectl describe configmap app-config

# 查看内容
kubectl get configmap app-config -o yaml
kubectl get configmap app-config -o json

# 输出指定键值
kubectl get configmap app-config -o jsonpath='{.data.DB_HOST}'

使用 ConfigMap

作为环境变量

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: my-app
      env:
        - name: DB_HOST
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: DB_HOST
        - name: DB_PORT
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: DB_PORT
      envFrom:
        - configMapRef:
            name: app-config

作为文件挂载

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: my-app
      volumeMounts:
        - name: config-volume
          mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: app-config

挂载单个文件

volumes:
  - name: config-volume
    configMap:
      name: app-config
      items:
        - key: "config.properties"
          path: "config.properties"

更新 ConfigMap

# 编辑 ConfigMap
kubectl edit configmap app-config

# 替换配置文件
kubectl create configmap app-config --from-file=config.properties --dry-run=client -o yaml | kubectl apply -f -

ConfigMap 与 Secret 的区别

ConfigMap 适合存储非机密配置,Secret 适合存储敏感数据(如密码、密钥)。Secret 的值以 Base64 编码存储。

实践案例

Spring Boot 应用配置

apiVersion: v1
kind: ConfigMap
metadata:
  name: spring-config
data:
  application.yml: |
    server:
      port: 8080
    spring:
      datasource:
        url: jdbc:mysql://mysql:3306/mydb
        username: root
        password: ${DB_PASSWORD}

Nginx 配置

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  nginx.conf: |
    server {
        listen 80;
        server_name localhost;
        location / {
            root /usr/share/nginx/html;
            index index.html;
        }
    }

最佳实践

总结

ConfigMap 是 Kubernetes 配置管理的核心工具,通过将配置与应用解耦,实现了配置的灵活管理和动态更新。合理使用 ConfigMap 可以显著提升应用的可维护性。