将存储连接到 StatefulSet
学习目标
将存储连接到 StatefulSet
使用场景
作为开发者,您被指派在 Kubernetes 中创建一个 PostgreSQL 数据库,将数据持久保存在 PersistentVolume 上。
任务流程
在本练习中,您将执行以下步骤:
创建 PersistentVolume。
创建 PersistentVolumeClaim。
使用 StatefulSet 部署 Postgres 数据库。
验证 PersistentVolumeClaim 已绑定。
前提条件
在开始之前,请确保满足以下前提条件:
您已在 SAP BTP 子账户中创建了 SAP BTP, Kyma runtime 实例。请参阅 使用 Kyma 在 SAP BTP 上部署 Kubernetes 集群 。
您已配置 kubectl 以便与您的 SAP BTP, Kyma runtime 实例进行交互。请参阅 为 Kyma 设置和配置 Kubectl 。
任务 1:创建 PersistentVolume
步骤
为 Postgres 数据库创建 PersistentVolume。 在此任务中,您将扮演集群管理员角色,并为集群创建一个
PersistentVolume。创建一个名为
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"
将该文件应用到集群:
kubectl apply -f pv.yaml
检查
PersistentVolume是否已创建:
kubectl get pv my-persistent-volume
如果成功,PersistentVolume my-persistent-volume 的状态为 Available。
2. 为 Postgres 数据库创建 PersistentVolumeClaim
让我们切换回开发者角色。现在您需要从集群的 PersistentVolume 中申请一块存储。为此,请创建一个 PersistentVolumeClaim。
创建一个名为
pvc.yaml的文件,内容如下:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-claim
spec:
storageClassName: default
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
将该文件应用到集群:
kubectl apply -f pvc.yaml
检查
PersistentVolumeClaim是否已创建:
kubectl get pvc postgres-claim
PersistentVolumeClaim postgres-claim 的状态被设置为 Pending 。这是因为它正在等待第一个消费者来绑定它。您将在下一个任务中创建这个第一个消费者。 3. 为 Postgres 数据库创建 StatefulSet。
创建一个名为
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
应用该文件以创建 StatefulSet。
kubectl apply -f postgres.yaml
检查 StatefulSet 是否已成功创建。
kubectl get statefulset postgres
检查 Pod
postgres-0是否已成功创建。
kubectl get pod postgres-0
验证 PersistentVolumeClaim 已绑定。
检查 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 存储原语持久保存数据。