rancher-desktop with k3s 如何做基于hostpath的本地持久化?
我希望用rancher-desktop,搭配k3s,在我的mac上部署一个postgres,并且创建数据库所需的文件我希望持久化到一个我指定的路径/Users/<username>/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
总是得到如下结果:
k3s会自己创建一个pv,不会用我创建的pv,这是为什么?
本地测试了一下,使用MacOS上的OrbStack模拟的k8s环境,实现应该和rancher-desktop差不多。
具体测试了一下,主要修改
这里取消注释了 storageClassName ,指定了之后,后面的pve才能工作
这里指定一下 volumeName
持久化正常:
补充一下可能的原因,我猜测原因可能是两个k8s环境的storageClass实现不一样,看了一下用了local-path的storageClass默认就是会自动创建出pv。
这里OrbStack默认使用的也是rancher.io/local-path,所以直接就能复现一样的问题。
OrbStack默认使用的是 local-path ,完整的yaml: