当 StatefulSet 或 Deployment 重新启动并且创建新 Pod 时,我的持久卷中的内容将被删除。
我认为拥有持久卷的想法是让它的内容持久化。所以我想知道我的配置是否有问题。
我有以下 PVC:
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: sftp-pvc
labels:
app: sftp
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
PV 本身是自动创建和管理的。上面由 PVC 创建的示例如下:
然后是以下 StatefulSet:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: sftp-deployment
spec:
serviceName: sftp-statfulset
replicas: 2
selector:
matchLabels:
app: sftp
template:
metadata:
labels:
app: sftp
spec:
volumes:
- name: sftp-storage
persistentVolumeClaim:
claimName: sftp-pvc
containers:
- name: sftp
image: atmoz/sftp
ports:
- containerPort: 22
env:
- name: SFTP_USERS
value: "$(SFTP_USERNAME):$(SFTP_PASSWORD):::$(SFTP_ROOT_DIRECTORY)"
volumeMounts:
- name: ftm-sftp-storage
mountPath: "/home/$(SFTP_USERNAME)/$(SFTP_ROOT_DIRECTORY)"
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
资源是 StatefulSet 还是 Deployment 并不重要。
以上就是在K8s上创建并部署的一台SFTP服务器。例如,如果我使用 FileZilla 连接到它,我可以创建文件或文件夹,并且如果我注销并登录,它们将被保留。
但是一旦 StatefulSet 重新启动并创建新的 Pod,我就会丢失所有文件。
如何确保持久卷的内容无论在什么情况下都保持持久?
事实证明,我发现
mountPath
值不应该通过使用环境变量组合在一起。所以我设置了一个固定值并且它起作用了:
volumeMounts:
- name: sftp-storage
mountPath: "/home/user1/user-directory"