存储管理II

在上一节中,我们创建了默认 StorageClass,然后配置了 catalog 服务使用它为 MySQL 数据库创建 PV。

我们创建的默认 StorageClass 使用 KMS 密钥加密卷,并使用默认的 gp3 设置的 IOPS(我们已验证为 3000)。

现在假设我们预期 orders 数据库的流量会更高,需要相应地增加 IOPS。

在本节中,我们将创建第二个 StorageClass,它配置一个加密的 gp3 卷,IOPS 为 6000,然后明确配置 orders PostgreSQL StatefulSet 使用基于此 StorageClass 的 PV。

更新 StatefulSet 配置

创建第二个具有 6000 IOPS 的 StorageClass

➤ 使用上一节中的相同 KMS 密钥创建 StorageClass,但同时指定 IOPS 值:

cat >ebs-iops-kms-sc.yaml <<EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: eks-auto-ebs-iops-kms-sc
provisioner: ebs.csi.eks.amazonaws.com
volumeBindingMode: WaitForFirstConsumer
parameters:
  type: gp3
  iops: "6000"
  encrypted: "true"
  kmsKeyId: $KEY_ID
EOF

kubectl apply -f ebs-iops-kms-sc.yaml

注意,这次我们没有包含注解来将其设为默认 StorageClass。这意味着我们需要明确引用此 StorageClass 才能使用它。

更新 orders PostgreSQL 数据库 pod

由于我们无法更新 StatefulSet 的某些字段,如 persistentVolumeClaimRetentionPolicy,我们首先需要删除当前版本的 orders 服务,然后重新安装它。

kubectl delete statefulset orders-postgresql

➤ 创建 postgres.yaml 如下:


apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: orders-postgresql
  labels:
    helm.sh/chart: orders-1.0.0
    app.kubernetes.io/name: orders
    app.kubernetes.io/instance: orders
    app.kubernetes.io/component: postgresql
    app.kubernetes.io/owner: retail-store-sample
    app.kubernetes.io/managed-by: Helm
spec:
  replicas: 1
  serviceName: orders-postgresql
  selector:
    matchLabels:
      app.kubernetes.io/name: orders
      app.kubernetes.io/instance: orders
      app.kubernetes.io/component: postgresql
      app.kubernetes.io/owner: retail-store-sample
  template:
    metadata:
      labels:
        app.kubernetes.io/name: orders
        app.kubernetes.io/instance: orders
        app.kubernetes.io/component: postgresql
        app.kubernetes.io/owner: retail-store-sample
    spec:
      containers:
        - name: postgresql
          image: "public.ecr.aws/docker/library/postgres:16.1"
          imagePullPolicy: IfNotPresent
          env:
            - name: POSTGRES_DB
              value: orders
            - name: POSTGRES_USER
              valueFrom:
                secretKeyRef:
                  name: orders-db
                  key: username
            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: orders-db
                  key: password
            - name: PGDATA
              value: /data/pgdata
          volumeMounts:
            - name: data
              mountPath: /data
          ports:
            - name: postgresql
              containerPort: 5432
              protocol: TCP
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes:
          - ReadWriteOnce
        storageClassName: eks-auto-ebs-iops-kms-sc
        resources:
          requests:
            storage: 20Gi

应用yaml:

kubectl apply -f postgres.yaml

等待 orders 服务再次启动并运行:

kubectl wait --for=condition=Ready pod -l app.kubernetes.io/instance=orders --namespace default --timeout=300s

image-20250228211940340

验证 orders PostgreSQL 数据库的 PVC 已创建

➤ 列出所有 PVC:

kubectl get pvc

我们应该看到:

image-20250228212002076

data-orders-postgresql-0 是为 PostgreSQL DB 创建的 PVC。

➤ 使用以下命令检查它:

kubectl describe pvc data-orders-postgresql-0

image-20250228212038882

验证 orders PostgreSQL 数据库的 EBS 卷已正确创建

让我们验证 IOPS 属性是否已正确设置。按如下方式获取底层 AWS EBS 卷 ID:

PGSQL_PV_NAME=$(kubectl get pvc data-orders-postgresql-0 -o jsonpath="{.spec.volumeName}")
PGSQL_EBS_VOL_ID=$(kubectl get pv $PGSQL_PV_NAME -o jsonpath="{.spec.csi.volumeHandle}")
echo EBS Volume ID: $PGSQL_EBS_VOL_ID

➤ 显示 EBS 卷的详细信息:

aws ec2 describe-volumes --volume-ids $PGSQL_EBS_VOL_ID |jq

注意输出的以下部分,证明 IOPS 设置为 6000,并且使用正确的密钥启用了 KMS 加密:

image-20250228212148821


总结

在本节中,我们执行了以下步骤:

  • 创建了一个配置为使用 KMS 密钥加密的 StorageClass,并使用标准 gp3 卷,配置了 6000 的预置 IOPS。
  • 更新了 orders 服务的配置,使用这个新的 StorageClass 创建ebs。
  • 验证了 EBS 卷已正确创建,使用了正确的 KMS 密钥以及指定的 IOPS 设置。