rancher-desktop with k3s 如何做基于hostpath的本地持久化?-灵析社区

莫克先森

## rancher-desktop with k3s 如何做基于hostpath的本地持久化? 我希望用rancher-desktop,搭配k3s,在我的mac上部署一个postgres,并且创建数据库所需的文件我希望持久化到一个我指定的路径`/Users//Workspaces/postgres/pg_data` 但持久化到我的Mac上这个需求始终不能解决,每次rancher-desktop都是自己创建了一个映射到lima虚拟机内的`/var/lib/rancher/k3s/storage/`pv,但是我如果把rancher-desktop with k3s换成Docker-desktop with k8s,就没有问题,可以顺利完成,yaml文件是一样的: # 安装postgres # 定义一个命名空间 apiVersion: v1 kind: Namespace metadata: name: postgresd --- # 定义配置 apiVersion: v1 kind: ConfigMap metadata: name: postgres-config namespace: postgresd data: POSTGRES_DB: postgres MAX_CONNECTIONS: "10000" LOG_MIN_DURATION_STATEMENT: "500ms" --- # 定义存储卷 apiVersion: v1 kind: PersistentVolume metadata: name: postgres-data-pv spec: capacity: storage: 10Gi # 根据实际需求设置存储容量 accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Delete # storageClassName: local-path hostPath: path: "/Users/hulei/Workspaces/postgres/pg_data" # nodeAffinity: # required: # nodeSelectorTerms: # - matchExpressions: # - key: kubernetes.io/hostname # operator: In # values: # - lima-rancher-desktop --- # 定义用户名、密码等敏感信息 apiVersion: v1 kind: Secret metadata: name: postgres-secret namespace: postgresd type: Opaque data: postgres-user: cG9zdGdyZXM= # Base64编码的用户名,这里是"postgres" postgres-password: U2VjdXJlUGFzc3dvcmQ= # Base64编码的密码,这里是"SecurePassword" --- apiVersion: apps/v1 kind: StatefulSet metadata: name: postgres-statefulset namespace: postgresd spec: replicas: 1 selector: matchLabels: app: postgres serviceName: postgres-serive template: metadata: labels: app: postgres spec: containers: - name: postgresd image: postgres:16.2-alpine3.19 ports: - containerPort: 5432 name: postgresd-port env: - name: POSTGRES_USER valueFrom: secretKeyRef: name: postgres-secret key: postgres-user - name: POSTGRES_PASSWORD valueFrom: secretKeyRef: name: postgres-secret key: postgres-password - name: POSTGRES_DB valueFrom: configMapKeyRef: name: postgres-config key: POSTGRES_DB volumeMounts: - name: postgres-data mountPath: /var/lib/postgresql/data subPath: data volumeClaimTemplates: - metadata: name: postgres-data spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 5Gi # storageClassName: local-path --- # 定义将5432端口映射到kind cluster 5432端口的service apiVersion: v1 kind: Service metadata: namespace: postgresd name: postgres-service spec: selector: app: postgres ports: - port: 5432 targetPort: 5432 type: ClusterIP 我想知道如何在rancher-desktop中实现基于hostpath的本地持久化? 在我的mac上运行上述yaml文件后,`kubectl get pv` 总是得到如下结果: ![image.png](https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241002/505ec739119cb7782cece189834cb696.png) k3s会自己创建一个pv,不会用我创建的pv,这是为什么?

阅读量:167

点赞量:0

问AI
本地测试了一下,使用MacOS上的OrbStack模拟的k8s环境,实现应该和rancher-desktop差不多。 具体测试了一下,主要修改 1. 这里取消注释了 storageClassName ,指定了之后,后面的pve才能工作apiVersion: v1 kind: PersistentVolume metadata: name: postgres-data-pv spec: capacity: storage: 10Gi # 根据实际需求设置存储容量 accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Delete storageClassName: local-path hostPath: path: "/Users/hy/Projects/kubernetes/sf/data" 2. 这里指定一下 volumeNameapiVersion: apps/v1 kind: StatefulSet metadata: name: postgres-statefulset namespace: postgresd spec: replicas: 1 selector: matchLabels: app: postgres serviceName: postgres-serive template: ... volumeClaimTemplates: - metadata: name: postgres-data spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 5Gi volumeName: postgres-data-pv 持久化正常: "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241002/ecb3f0e0764f37c4afe0f323ed47dff5.png) *** 补充一下可能的原因,我猜测原因可能是两个k8s环境的storageClass实现不一样,看了一下用了local-path的storageClass默认就是会自动创建出pv。 这里OrbStack默认使用的也是rancher.io/local-path,所以直接就能复现一样的问题。 *** OrbStack默认使用的是 local-path ,完整的yaml: # 定义一个命名空间 apiVersion: v1 kind: Namespace metadata: name: postgresd --- # 定义配置 apiVersion: v1 kind: ConfigMap metadata: name: postgres-config namespace: postgresd data: POSTGRES_DB: postgres MAX_CONNECTIONS: "10000" LOG_MIN_DURATION_STATEMENT: "500ms" --- # 定义存储卷 apiVersion: v1 kind: PersistentVolume metadata: name: postgres-data-pv spec: capacity: storage: 10Gi # 根据实际需求设置存储容量 accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Delete storageClassName: local-path hostPath: path: "/Users/hy/Projects/kubernetes/sf/data" --- # 定义用户名、密码等敏感信息 apiVersion: v1 kind: Secret metadata: name: postgres-secret namespace: postgresd type: Opaque data: postgres-user: cG9zdGdyZXM= # Base64编码的用户名,这里是"postgres" postgres-password: U2VjdXJlUGFzc3dvcmQ= # Base64编码的密码,这里是"SecurePassword" --- apiVersion: apps/v1 kind: StatefulSet metadata: name: postgres-statefulset namespace: postgresd spec: replicas: 1 selector: matchLabels: app: postgres serviceName: postgres-serive template: metadata: labels: app: postgres spec: containers: - name: postgresd image: postgres:16.2-alpine3.19 ports: - containerPort: 5432 name: postgresd-port env: - name: POSTGRES_USER valueFrom: secretKeyRef: name: postgres-secret key: postgres-user - name: POSTGRES_PASSWORD valueFrom: secretKeyRef: name: postgres-secret key: postgres-password - name: POSTGRES_DB valueFrom: configMapKeyRef: name: postgres-config key: POSTGRES_DB volumeMounts: - name: postgres-data mountPath: /var/lib/postgresql/data subPath: data volumeClaimTemplates: - metadata: name: postgres-data spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 5Gi volumeName: postgres-data-pv # storageClassName: local-path --- # 定义将5432端口映射到kind cluster 5432端口的service apiVersion: v1 kind: Service metadata: namespace: postgresd name: postgres-service spec: selector: app: postgres ports: - port: 5432 targetPort: 5432 type: ClusterIP