这里绝对是 minikube/kubernetes 新手。
我正在使用 minikube vm-driver = none
(以防万一)来部署一个应用程序,该应用程序使我可以选择指定用于配置卷的 storageClass,并且它默认使用“标准”storageClass。
这是可行的,但这意味着在应用程序中创建的所有数据最终都会进入/tmp/
(/tmp/hostpath_pv
我相信是文件夹)。
这让我很恼火。我意识到 minikube 本身会将这些数据保存在迷你库重新启动,但我担心在正常的 Linux 文件夹清理中丢失数据/tmp
。
我希望能够创建一个新的 storageClass(因为这是我在应用程序配置 YAML 中使用的唯一易于配置的选项),使 minikube 将持久卷粘贴在目录中/data
(或任何其他地方不会被操作系统自动清理的地方)。
有没有简单的方法可以做到这一点?或者将我的卷放入 中是否根本就是个问题/tmp
?
抱歉,我完全不懂。我很感激你的帮助。
答案1
对于数据库等有状态应用程序,我们希望拥有在 Pod 生命周期之外持久保存数据的卷。Kubernetes 通过引入 PersistentVolume 和 PersistentVolumeClaim 资源解决了这个问题,这些资源可在 Kubernetes 集群中启用本机和外部持久存储。使用 minikube,您可以通过将 hostPath 用作 PersistentVolume 来实现这一点。假设您想要拥有 MongoDB 后端。卷声明,以使该卷可供 MongoDB 使用。
mongodb-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: data
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 5Gi
hostPath:
path: /data/mongoData
现在您必须创建本地目录用于存储:
$ mkdir -p /data/mongoData
$ chmod 777 /data/mongoData
然后,您必须创建持久卷声明。使用持久卷声明,您可以发出绑定匹配持久卷的请求。
mongodb-pv-claim.yml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: data-claim
spec:
storageClassName: ""
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
mongodb-deploy.yml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: mongodb
spec:
replicas: 1
template:
metadata:
labels:
app: db
spec:
restartPolicy: Always
volumes:
- name: data-storage
persistentVolumeClaim:
claimName: data-claim
containers:
- name: mongodb-container
image: "de13/mongo-myapp"
volumeMounts:
- name: data-storage
mountPath: /var/lib/mongo
ports:
- containerPort: 27017
应用文件:
$ kubectl apply -f mongodb-pv.yml
$ kubectl apply -f mongodb-pv-claim.yml
$ kubectl apply -f mongodb-deploy.yml
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
data-claim Bound data 5Gi RWO 20s <unset>
我们已经可以看到声明已经得到满足(绑定),并且它与最近创建的名为“数据”的卷相连。
您可以检查本教程和Kubernetes 文档如果您想了解有关持久存储的更多信息。
答案2
另一个解决方案是首先创建存储类(不提供),然后创建 pv、pvc,最后创建 Pod。下面是我如何在 Minikube 中使其工作:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: datacache-sc
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
然后创建PV:
apiVersion: v1
kind: PersistentVolume
metadata:
name: datacachepv-1
labels:
name: datacache
spec:
storageClassName: datacache-sc
persistentVolumeReclaimPolicy: Delete
accessModes:
- ReadWriteMany
capacity:
storage: 100Mi
hostPath:
path: /var/Cachebackup
type: DirectoryOrCreate
然后是 PVC:
apiVersion: v1
metadata:
name: datacachepvc-1
spec:
storageClassName: datacache-sc
accessModes:
- ReadWriteMany
resources:
requests:
storage: 100Mi
selector:
matchLabels:
name: "datacache"
最后将此 PVC 挂载到 Pod 中:
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
app: testrunner
name: datacache
spec:
containers:
- image: abc.se/sandbox/xyz/myimage:0.1.2
name: datacache
ports:
- containerPort: 3645
hostPort: 3645
resources: {}
volumeMounts:
- name: datacache-conf
mountPath: /bin/datacache.conf
subPath: datacache.conf
readOnly: true
- name: datacache-volume
mountPath: /DBbackup
volumes:
- name: datacache-conf
configMap:
name: datacache-conf
items:
- key: datacache.conf
path: datacache.conf
- name: datacache-volume
persistentVolumeClaim:
claimName: datacachepvc-1