<返回目录     Powered by claud/xia兄

第5课:配置管理和Secret

掌握Kubernetes中的配置管理和敏感信息保护机制

🎯 学习目标

5.1 配置管理基础

🎯 为什么需要配置管理?

在Kubernetes中,应用程序的配置需要与代码分离,以便于:

🏗️ 配置管理架构图

ConfigMap
非敏感配置
Secret
敏感配置
Pod
应用程序

通过环境变量或挂载卷的方式将配置注入到Pod中

5.2 ConfigMap详解

🔍 什么是ConfigMap?

ConfigMap是Kubernetes中用于存储非敏感配置数据的API对象,它可以将配置数据与应用程序代码分离。

📝 ConfigMap创建方式

# 1. 从字面量创建 kubectl create configmap my-config --from-literal=key1=value1 --from-literal=key2=value2 # 2. 从文件创建 kubectl create configmap my-config --from-file=config.properties # 3. 从目录创建 kubectl create configmap my-config --from-file=./configs/ # 4. 从YAML文件创建 kubectl apply -f configmap.yaml

📋 ConfigMap YAML配置

apiVersion: v1 kind: ConfigMap metadata: name: nginx-config namespace: default data: nginx.conf: | user nginx; worker_processes auto; events { worker_connections 1024; } http { server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html; } } } index.html: |

Hello from ConfigMap!

🔧 ConfigMap使用方式

1. 作为环境变量注入

apiVersion: v1 kind: Pod metadata: name: app-pod spec: containers: - name: app image: nginx env: - name: DATABASE_URL valueFrom: configMapKeyRef: name: app-config key: database.url

2. 通过挂载卷使用

apiVersion: v1 kind: Pod metadata: name: nginx-pod spec: containers: - name: nginx image: nginx volumeMounts: - name: nginx-config mountPath: /etc/nginx/conf.d volumes: - name: nginx-config configMap: name: nginx-config

5.3 Secret详解

🔒 什么是Secret?

Secret是Kubernetes中用于存储敏感信息的API对象,如密码、令牌、证书等。与ConfigMap类似,但提供了额外的安全保护。

⚠️ Secret的安全注意事项

📝 Secret创建方式

# 1. 从字面量创建 kubectl create secret generic my-secret --from-literal=username=admin --from-literal=password=secret # 2. 从文件创建 kubectl create secret generic my-secret --from-file=./secret.txt # 3. 从环境变量文件创建 kubectl create secret generic my-secret --from-env-file=./secrets.env # 4. 手动base64编码创建 kubectl apply -f secret.yaml # 5. 创建TLS Secret kubectl create secret tls tls-secret --key=key.pem --cert=cert.pem

📋 Secret YAML配置

apiVersion: v1 kind: Secret metadata: name: app-secret type: Opaque data: username: YWRtaW4= # base64编码的admin password: c2VjcmV0 # base64编码的secret stringData: api-key: my-api-key-123 # 自动编码

🔧 Secret使用方式

1. 作为环境变量注入

apiVersion: v1 kind: Pod metadata: name: app-pod spec: containers: - name: app image: nginx env: - name: DB_USERNAME valueFrom: secretKeyRef: name: app-secret key: username - name: DB_PASSWORD valueFrom: secretKeyRef: name: app-secret key: password

2. 通过挂载卷使用

apiVersion: v1 kind: Pod metadata: name: app-pod spec: containers: - name: app image: nginx volumeMounts: - name: secret-volume mountPath: /etc/secrets readOnly: true volumes: - name: secret-volume secret: secretName: app-secret

5.4 ConfigMap与Secret的对比

📄 ConfigMap

  • 存储非敏感配置
  • 明文存储(base64编码)
  • 无大小限制(建议<1MB)
  • 适用于配置文件、环境变量

🔒 Secret

  • 存储敏感配置
  • base64编码存储
  • 大小限制1MB
  • 适用于密码、令牌、证书
  • 支持多种类型(Opaque、TLS等)

5.5 配置更新策略

🔄 配置热更新

Kubernetes支持配置的热更新,但需要注意:

5.6 实战操作示例

# 1. 创建ConfigMap kubectl create configmap app-config --from-literal=DATABASE_URL=mysql://db:3306/app --from-literal=DEBUG=false # 2. 创建Secret kubectl create secret generic app-secret --from-literal=DB_USER=admin --from-literal=DB_PASS=password123 # 3. 查看配置 kubectl get configmap app-config -o yaml kubectl get secret app-secret -o yaml kubectl get secret app-secret -o jsonpath='{.data.DB_USER}' | base64 --decode # 4. 创建使用配置的Pod cat > app-pod.yaml << EOF apiVersion: v1 kind: Pod metadata: name: app-pod spec: containers: - name: app image: nginx env: - name: DATABASE_URL valueFrom: configMapKeyRef: name: app-config key: DATABASE_URL - name: DB_USER valueFrom: secretKeyRef: name: app-secret key: DB_USER - name: DB_PASS valueFrom: secretKeyRef: name: app-secret key: DB_PASS volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: app-config EOF kubectl apply -f app-pod.yaml # 5. 验证配置 kubectl exec app-pod -- env | grep DATABASE kubectl exec app-pod -- ls /etc/config kubectl exec app-pod -- cat /etc/config/DATABASE_URL # 6. 更新ConfigMap kubectl edit configmap app-config # 或 kubectl create configmap app-config --from-literal=DATABASE_URL=mysql://db:3306/prod --from-literal=DEBUG=true --dry-run=client -o yaml | kubectl apply -f - # 7. 清理 kubectl delete pod app-pod kubectl delete configmap app-config kubectl delete secret app-secret

5.7 最佳实践和安全建议

💡 配置管理最佳实践

🔒 Secret安全最佳实践

5.8 进阶概念

🚀 外部配置管理

🔧 配置注入工具