将存储连接到 StatefulSet

学习目标

  • 将存储连接到 StatefulSet

使用场景

作为开发者,您被指派在 Kubernetes 中创建一个 PostgreSQL 数据库,将数据持久保存在 PersistentVolume 上。

任务流程

在本练习中,您将执行以下步骤:

  1. 创建 PersistentVolume。

  2. 创建 PersistentVolumeClaim。

  3. 使用 StatefulSet 部署 Postgres 数据库。

  4. 验证 PersistentVolumeClaim 已绑定。

前提条件

在开始之前,请确保满足以下前提条件:

  • 您已在 SAP BTP 子账户中创建了 SAP BTP, Kyma runtime 实例。请参阅 使用 Kyma 在 SAP BTP 上部署 Kubernetes 集群 。

  • 您已配置 kubectl 以便与您的 SAP BTP, Kyma runtime 实例进行交互。请参阅 为 Kyma 设置和配置 Kubectl 。

任务 1:创建 PersistentVolume

步骤

  1. 为 Postgres 数据库创建 PersistentVolume。 在此任务中,您将扮演集群管理员角色,并为集群创建一个 PersistentVolume

  2. 创建一个名为 pv.yaml 的文件,内容如下:

apiVersion: v1
kind: PersistentVolume
metadata:
name: my-persistent-volume
spec:
storageClassName: default
volumeMode: Filesystem
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
  1. 将该文件应用到集群:

kubectl apply -f pv.yaml
  1. 检查 PersistentVolume 是否已创建:

kubectl get pv my-persistent-volume

如果成功,PersistentVolume my-persistent-volume 的状态为 Available。 2. 为 Postgres 数据库创建 PersistentVolumeClaim 让我们切换回开发者角色。现在您需要从集群的 PersistentVolume 中申请一块存储。为此,请创建一个 PersistentVolumeClaim。

  1. 创建一个名为 pvc.yaml 的文件,内容如下:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-claim
spec:
storageClassName: default
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
  1. 将该文件应用到集群:

kubectl apply -f pvc.yaml
  1. 检查 PersistentVolumeClaim 是否已创建:

kubectl get pvc postgres-claim

PersistentVolumeClaim postgres-claim 的状态被设置为 Pending 。这是因为它正在等待第一个消费者来绑定它。您将在下一个任务中创建这个第一个消费者。 3. 为 Postgres 数据库创建 StatefulSet。

  1. 创建一个名为 postgres.yaml 的新文件,并指定 StatefulSet 来创建一个 postgres 数据库。

apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres
spec:
serviceName: postgres
selector:
matchLabels:
app: postgres
replicas: 1
template:
metadata:
labels:
app: postgres
spec:
containers: # This is the container that runs the postgres image
- name: postgres
image: postgres:15.1
imagePullPolicy: "IfNotPresent"
ports:
- containerPort: 5432
env: # Environment variables that define a user
- name: POSTGRES_DB
value: "postgresdb"
- name: POSTGRES_USER
value: "admin"
- name: POSTGRES_PASSWORD
value: "password"
volumeMounts: # Mount a volume to the path where postgres will store data
- name: data
mountPath: /var/lib/postgresql/data
volumes: # This is the volume mounted to the container
- name: data
persistentVolumeClaim:
claimName: postgres-claim
  1. 应用该文件以创建 StatefulSet。

kubectl apply -f postgres.yaml
  1. 检查 StatefulSet 是否已成功创建。

kubectl get statefulset postgres
  1. 检查 Pod postgres-0 是否已成功创建。

kubectl get pod postgres-0
  1. 验证 PersistentVolumeClaim 已绑定。

  2. 检查 PersistentVolumeClaim 是否已绑定到 PersistentVolume。

kubectl get pvc postgres-claim

现在,PersistentVolumeClaim 的状态为 Bound

注意

您也可以试用 postgres 数据库。您可以通过将 postgres-0 Pod 端口转发到本地机器,从而在本地连接到它。

bourne kubectl port-forward postgres-0 5432:5432 注意 使用您选择的 Postgres 客户端,您现在可以使用 postgres.yaml 文件中指定的凭据连接到该数据库。

向数据库中插入数据,删除该 Pod,等待它被重新创建,然后检查数据是否仍然存在。

结果

您使用 StatefulSet 创建了一个有状态应用程序,并使用 Kubernetes 存储原语持久保存数据。