ConfigMap与Secret:K8s配置管理的正确姿势

举报
数字扫地僧 发表于 2025/03/27 18:37:00 2025/03/27
【摘要】 一、项目背景在容器化应用开发与部署的过程中,配置管理一直是一个关键环节。Kubernetes(K8s)作为领先的容器编排平台,提供了 ConfigMap 和 Secret 两种资源来管理应用的配置参数和敏感信息。合理使用这两种资源,不仅可以使应用的配置更加灵活、安全,还能有效提升应用的可维护性和可扩展性。本文将深入探讨如何在 Kubernetes 中使用 ConfigMap 和 Secre...

一、项目背景

在容器化应用开发与部署的过程中,配置管理一直是一个关键环节。Kubernetes(K8s)作为领先的容器编排平台,提供了 ConfigMap 和 Secret 两种资源来管理应用的配置参数和敏感信息。合理使用这两种资源,不仅可以使应用的配置更加灵活、安全,还能有效提升应用的可维护性和可扩展性。本文将深入探讨如何在 Kubernetes 中使用 ConfigMap 和 Secret 进行配置管理,结合实战部署和实例分析,帮助读者掌握这一核心技能。

二、前期准备

环境准备

确保已搭建好 Kubernetes 集群,并且可以使用 kubectl 进行操作。如果尚未搭建集群,可以使用 Minikube 或 Kind 等工具快速创建一个本地测试环境。

工具安装

安装 Kubernetes 命令行工具 kubectl:

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/

验证安装是否成功:

kubectl version --client

三、实战部署

ConfigMap 的使用

创建 ConfigMap

可以通过以下几种方式创建 ConfigMap:

  1. 使用 kubectl create configmap 命令
kubectl create configmap my-config --from-literal=KEY1=value1 --from-literal=KEY2=value2
  1. 从文件创建 ConfigMap

假设有一个配置文件 config.properties

app.name=My App
app.version=1.0.0

可以使用以下命令创建 ConfigMap:

kubectl create configmap my-config --from-file=config.properties
  1. 使用 YAML 文件定义 ConfigMap

创建 configmap.yaml 文件:

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  KEY1: value1
  KEY2: value2
  config.properties: |
    app.name=My App
    app.version=1.0.0

应用配置:

kubectl apply -f configmap.yaml

在 Pod 中使用 ConfigMap

可以通过以下几种方式在 Pod 中使用 ConfigMap:

  1. 作为环境变量
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    env:
    - name: KEY1
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: KEY1
    - name: KEY2
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: KEY2
  1. 作为卷挂载
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
      items:
      - key: config.properties
        path: config.properties

Secret 的使用

创建 Secret

类似于 ConfigMap,Secret 也可以通过多种方式创建:

  1. 使用 kubectl create secret 命令
kubectl create secret generic my-secret --from-literal=KEY1=value1 --from-literal=KEY2=value2
  1. 从文件创建 Secret

假设有一个敏感信息文件 secret.properties

db.username=admin
db.password=secret

可以使用以下命令创建 Secret:

kubectl create secret generic my-secret --from-file=secret.properties
  1. 使用 YAML 文件定义 Secret

创建 secret.yaml 文件:

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  KEY1: dmFsdWUx  # value1 的 base64 编码
  KEY2: dmFsdWUy  # value2 的 base64 编码
  secret.properties: |
    ZGIudXNlcm5hbWU9YWRtaW4KZGIucGFzc3dvcmQ9c2VjcmV0

注意:Secret 的值需要进行 base64 编码。可以使用以下命令进行编码:

echo -n "value" | base64

应用配置:

kubectl apply -f secret.yaml

在 Pod 中使用 Secret

同样,Secret 也可以通过环境变量或卷挂载的方式在 Pod 中使用:

  1. 作为环境变量
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    env:
    - name: KEY1
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: KEY1
    - name: KEY2
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: KEY2
  1. 作为卷挂载
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    volumeMounts:
    - name: secret-volume
      mountPath: /etc/secret
  volumes:
  - name: secret-volume
    secret:
      secretName: my-secret
      items:
      - key: secret.properties
        path: secret.properties

四、实例分析

实例一:Web 应用的配置管理

假设我们有一个 Web 应用,需要管理其配置参数和数据库连接信息。

创建 ConfigMap 和 Secret

# 创建 ConfigMap
kubectl create configmap webapp-config \
  --from-literal=APP_ENV=production \
  --from-literal=LOG_LEVEL=info

# 创建 Secret
kubectl create secret generic webapp-secret \
  --from-literal=DB_HOST=mydb-host \
  --from-literal=DB_PORT=3306 \
  --from-literal=DB_USER=admin \
  --from-literal=DB_PASSWORD=secret

部署应用

创建 deployment.yaml 文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: webapp-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: webapp
  template:
    metadata:
      labels:
        app: webapp
    spec:
      containers:
      - name: webapp
        image: my-webapp-image:latest
        ports:
        - containerPort: 80
        env:
        - name: APP_ENV
          valueFrom:
            configMapKeyRef:
              name: webapp-config
              key: APP_ENV
        - name: LOG_LEVEL
          valueFrom:
            configMapKeyRef:
              name: webapp-config
              key: LOG_LEVEL
        - name: DB_HOST
          valueFrom:
            secretKeyRef:
              name: webapp-secret
              key: DB_HOST
        - name: DB_PORT
          valueFrom:
            secretKeyRef:
              name: webapp-secret
              key: DB_PORT
        - name: DB_USER
          valueFrom:
            secretKeyRef:
              name: webapp-secret
              key: DB_USER
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: webapp-secret
              key: DB_PASSWORD

应用部署:

kubectl apply -f deployment.yaml

实例二:分布式系统的环境配置

对于一个分布式系统,不同的环境(开发、测试、生产)需要不同的配置。

创建不同环境的 ConfigMap 和 Secret

# 创建开发环境 ConfigMap
kubectl create configmap myapp-config-dev \
  --from-literal=API_URL=http://dev-api.example.com \
  --from-literal=FEATURE_FLAGS=dev-features

# 创建测试环境 ConfigMap
kubectl create configmap myapp-config-test \
  --from-literal=API_URL=http://test-api.example.com \
  --from-literal=FEATURE_FLAGS=test-features

# 创建生产环境 ConfigMap
kubectl create configmap myapp-config-prod \
  --from-literal=API_URL=http://prod-api.example.com \
  --from-literal=FEATURE_FLAGS=prod-features

# 创建 Secret(假设所有环境使用相同的 Secret)
kubectl create secret generic myapp-secret \
  --from-literal=JWT_SECRET=super-secret \
  --from-literal=ADMIN_TOKEN=admin-token

部署应用

创建 deployment.yaml 文件,使用环境变量指定当前环境:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp-image:latest
        env:
        - name: ENV
          value: "production"
        - name: API_URL
          valueFrom:
            configMapKeyRef:
              name: myapp-config-prod
              key: API_URL
        - name: FEATURE_FLAGS
          valueFrom:
            configMapKeyRef:
              name: myapp-config-prod
              key: FEATURE_FLAGS
        - name: JWT_SECRET
          valueFrom:
            secretKeyRef:
              name: myapp-secret
              key: JWT_SECRET
        - name: ADMIN_TOKEN
          valueFrom:
            secretKeyRef:
              name: myapp-secret
              key: ADMIN_TOKEN

五、项目发展

随着应用的复杂性和需求的增长,可能需要对配置管理进行扩展和优化。

使用 Helm 管理配置

Helm 是 Kubernetes 的包管理工具,可以简化应用的部署和配置管理。

# 安装 Helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

# 创建 Helm Chart
helm create myapp

# 编辑 Helm Chart 的 values.yaml 文件,定义 ConfigMap 和 Secret 的值

# 使用 Helm 部署应用
helm install myapp ./myapp

配置管理的自动化

通过 CI/CD 管道自动化配置的更新和部署。

# 在 CI/CD 脚本中更新 ConfigMap 和 Secret
kubectl apply -f configmap.yaml
kubectl apply -f secret.yaml

# 部署应用
kubectl apply -f deployment.yaml

敏感信息的加密存储

使用工具如 SOPS 和 Helm Secrets 对敏感信息进行加密存储和管理。

# 安装 SOPS
brew install sops

# 加密 Secret 文件
sops --encrypt secrets.yaml.enc secrets.yaml

# 在部署时解密并应用
sops --decrypt secrets.yaml.enc | kubectl apply -f -

六、总结

本文深入探讨了 Kubernetes 中 ConfigMap 和 Secret 的使用方法,结合实战部署和实例分析,展示了如何有效地管理容器化应用的配置和敏感信息。从创建 ConfigMap 和 Secret、在 Pod 中使用它们,到结合 Helm 和 CI/CD 实现自动化配置管理,Kubernetes 提供了强大的功能和灵活的配置选项,满足企业多样化的配置管理需求。通过合理规划和持续优化,企业可以构建一个既安全又高效的配置管理系统,为业务的持续发展提供坚实的技术保障。

七、参考文献

  • [Kubernetes官方文档]

八、常见问题解答

问题 解答
ConfigMap和Secret的区别是什么 ConfigMap用于存储非敏感的配置信息,Secret用于存储敏感信息如密码、令牌等。Secret的数据会以base64编码存储,并且可以设置访问控制
如何更新ConfigMap或Secret并使应用自动重新加载 Kubernetes本身不会自动触发应用重新加载配置。需要在应用中实现对配置文件变更的监听,或者使用支持热加载的配置机制
ConfigMap和Secret的大小限制是多少 ConfigMap和Secret的大小限制为1MB。对于较大的配置数据,可以考虑使用ConfigMap和Secret的卷挂载方式,或者外部配置存储
如何在多个命名空间中共享ConfigMap和Secret 可以通过创建跨命名空间的ConfigMap和Secret,或者使用工具如Kubed进行同步
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。