Kubernetes配置与存储卷详解:数据持久化的艺术

为什么需要配置和存储?

在容器化环境中,应用需要处理两种关键数据:

  1. 配置数据:应用设置、环境变量、密钥等

  2. 持久化数据:数据库文件、用户上传内容、日志文件等

Kubernetes提供了强大的机制来管理这些数据,确保应用的可配置性数据持久性

配置管理:ConfigMap与Secret

ConfigMap:管理应用配置

创建ConfigMap

yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  # 键值对配置
  app.properties: |
    server.port=8080
    logging.level=INFO
    cache.enabled=true
    
  # 单个属性
  database.url: jdbc:mysql://db-host:3306/mydb
  
  # 文件内容
  config.xml: |
    <?xml version="1.0"?>
    <config>
        <feature enabled="true"/>
    </config>

在Pod中使用ConfigMap

yaml

apiVersion: v1
kind: Pod
metadata:
  name: configmap-pod
spec:
  containers:
  - name: app
    image: my-app:1.0.0
    env:
    # 使用单个值
    - name: DB_URL
      valueFrom:
        configMapKeyRef:
          name: app-config
          key: database.url
          
    # 挂载为环境变量
    envFrom:
    - configMapRef:
        name: app-config
        
    # 挂载为文件
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config
      
  volumes:
  - name: config-volume
    configMap:
      name: app-config

Secret:管理敏感信息

创建Secret

bash

# 通过命令行创建
kubectl create secret generic db-secret \
  --from-literal=username=admin \
  --from-literal=password=secret123

# 通过文件创建
kubectl create secret generic tls-secret \
  --from-file=tls.crt=server.crt \
  --from-file=tls.key=server.key

YAML定义Secret

yaml

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  username: YWRtaW4=  # base64编码
  password: c2VjcmV0MTIz

在Pod中使用Secret

yaml

apiVersion: v1
kind: Pod
metadata:
  name: secret-pod
spec:
  containers:
  - name: app
    image: my-app:1.0.0
    env:
    - name: DB_USERNAME
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: username
    - name: DB_PASSWORD
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: password
    volumeMounts:
    - name: secret-volume
      mountPath: /etc/secrets
      readOnly: true
  volumes:
  - name: secret-volume
    secret:
      secretName: my-secret

存储卷(Volume)类型详解

1. emptyDir:临时存储

yaml

apiVersion: v1
kind: Pod
metadata:
  name: empty-dir-pod
spec:
  containers:
  - name: writer
    image: busybox
    command: ["/bin/sh", "-c", "echo hello > /data/test; sleep 3600"]
    volumeMounts:
    - name: shared-data
      mountPath: /data
      
  - name: reader
    image: busybox
    command: ["/bin/sh", "-c", "cat /data/test; sleep 3600"]
    volumeMounts:
    - name: shared-data
      mountPath: /data
      
  volumes:
  - name: shared-data
    emptyDir: {}

2. hostPath:节点本地存储

yaml

volumes:
- name: host-path-volume
  hostPath:
    path: /var/local/data
    type: DirectoryOrCreate  # 可选类型

3. 网络存储卷(云提供商)

yaml

# AWS EBS
volumes:
- name: ebs-volume
  awsElasticBlockStore:
    volumeID: vol-123456
    fsType: ext4

# Azure Disk
volumes:
- name: azure-volume
  azureDisk:
    diskName: test.vhd
    diskURI: https://test.blob.core.windows.net/vhds/test.vhd

# GCE Persistent Disk
volumes:
- name: gce-volume
  gcePersistentDisk:
    pdName: my-data-disk
    fsType: ext4

持久化存储:PersistentVolume (PV) 和 PersistentVolumeClaim (PVC)

PV:集群存储资源

yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-volume
spec:
  capacity:
    storage: 10Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: slow
  hostPath:
    path: /mnt/data

PVC:应用存储请求

yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-claim
spec:
  storageClassName: slow
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

在Pod中使用PVC

yaml

apiVersion: v1
kind: Pod
metadata:
  name: pvc-pod
spec:
  containers:
  - name: app
    image: nginx
    volumeMounts:
    - name: storage-volume
      mountPath: /usr/share/nginx/html
  volumes:
  - name: storage-volume
    persistentVolumeClaim:
      claimName: pvc-claim

动态存储配置:StorageClass

yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp3
  iops: "3000"
  throughput: "125"
  encrypted: "true"
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete
allowVolumeExpansion: true

高级存储特性

1. 存储卷快照

yaml

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: mysql-snapshot
spec:
  volumeSnapshotClassName: csi-aws-vsc
  source:
    persistentVolumeClaimName: mysql-data

2. 存储卷扩容

yaml

# 修改PVC容量
kubectl patch pvc my-pvc -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'

3. 多Pod共享存储

yaml

accessModes:
- ReadWriteMany  # 支持多节点读写

调试与故障排除

常用命令

bash

# 查看PV和PVC状态
kubectl get pv,pvc

# 查看StorageClass
kubectl get storageclass

# 查看ConfigMap和Secret
kubectl get configmaps,secrets

# 查看Pod挂载信息
kubectl describe pod my-pod

# 进入Pod检查文件
kubectl exec -it my-pod -- ls /path/to/mount

常见问题解决

bash

# PVC处于Pending状态
kubectl describe pvc my-pvc

# 挂载失败检查
kubectl get events --sort-by=.metadata.creationTimestamp

# Secret解码检查
kubectl get secret my-secret -o jsonpath='{.data.password}' | base64 -d

总结

Kubernetes提供了完整的配置和存储解决方案:

配置管理

  • ConfigMap:管理应用配置

  • Secret:管理敏感信息

  • 环境变量注入:灵活配置应用

存储管理

  • 临时存储:emptyDir用于容器间共享

  • 持久化存储:PV/PVC用于数据持久化

  • 动态配置:StorageClass自动创建存储

关键优势

  1. 解耦应用与配置:配置外部化管理

  2. 数据持久化:确保关键数据不丢失

  3. 动态扩展:按需分配存储资源

  4. 多环境支持:轻松切换不同配置

  5. 安全可靠:敏感信息加密管理

掌握Kubernetes的配置和存储机制,是构建可靠、可扩展云原生应用的关键技能。合理设计存储架构,可以显著提高应用的稳定性和可维护性。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐