在上一节中,我们创建了默认 StorageClass,然后配置了 catalog
服务使用它为 MySQL 数据库创建 PV。
我们创建的默认 StorageClass 使用 KMS 密钥加密卷,并使用默认的 gp3 设置的 IOPS(我们已验证为 3000)。
现在假设我们预期 orders
数据库的流量会更高,需要相应地增加 IOPS。
在本节中,我们将创建第二个 StorageClass,它配置一个加密的 gp3 卷,IOPS 为 6000,然后明确配置 orders
PostgreSQL StatefulSet
使用基于此 StorageClass 的 PV。
➤ 使用上一节中的相同 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
orders
PostgreSQL 数据库的 PVC 已创建➤ 列出所有 PVC:
kubectl get pvc
我们应该看到:
data-orders-postgresql-0
是为 PostgreSQL DB 创建的 PVC。
➤ 使用以下命令检查它:
kubectl describe pvc data-orders-postgresql-0
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 加密:
在本节中,我们执行了以下步骤:
gp3
卷,配置了 6000 的预置 IOPS。orders
服务的配置,使用这个新的 StorageClass 创建ebs。