我是从K8s开始的,我不太喜欢使用PV
+PVC
+SC
和volumeClaimTemplates
+ HostPath
场景部署一个带有多个副本绑定到本地磁盘的StatefulSet。我的目标是部署一个带有3个副本的MongoDB StatefulSet (mongo的副本集) ReplicaSet模式,并将每个副本绑定到本地ssd。我做了几个测试,并得到了一些概念,使之直截了当。
( a)使用PV
+PVC
+SC
:If在我的StatefulSet
容器中(与副本一起设置:1)我可以声明一个volumeMounts
和一个Volume
,它可以指向一个PVC,该PVC使用的是一个指向物理本地ssd文件夹的SC。这个概念是直的,所有的映射都很漂亮。如果我将副本增加到更多,然后从第二个容器开始,他们将找不到一卷来绑定to..and,我就会得到1 node(s) didn't find available persistent volumes to bind
错误。
这使我意识到,从PVC上保留的存储容量不会复制为StatefulSet中的POD,并映射到每个创建的PVC上。
场景b) volumeClaimTemplates
+ HostPath
我注释掉了卷,而是使用了volumeClaimTemplates
,它确实如我在场景a中所期望的那样工作,对于每个创建的Pod,都会创建一个相关的声明,并为该pod保留一些存储容量。这里的概念也很简单,但只有在我在storageClassName: hostpath
中使用volumeClaimTemplates
时,它才能起作用。我尝试使用我的SC,结果是相同的1 node(s) didn't find available persistent volumes to bind
错误。
此外,当使用volumeClaimTemplates
创建PV名称时,与PVC开头一样是无用和混乱的。
vincenzocalia@vincenzos-MacBook-Air server-node % kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
mg-pv 3Gi RWO Delete Available mg-sc 64s
pvc-32589cce-f472-40c9-b6e4-dc5e26c2177a 50Mi RWO Delete Bound default/mg-pv-cont-mongo-3 hostpath 36m
pvc-3e2f4e50-30f8-4ce8-8a62-0b923fd6aa79 50Mi RWO Delete Bound default/mg-pv-cont-mongo-1 hostpath 37m
pvc-8f4ff966-c30a-469f-a68d-ed579ef2a96f 50Mi RWO Delete Bound default/mg-pv-cont-mongo-4 hostpath 36m
pvc-9f8c933b-85d6-4024-8bd0-6668feee8757 50Mi RWO Delete Bound default/mg-pv-cont-mongo-2 hostpath 37m
pvc-d6c212f3-2391-4137-97c3-07836c90b8f3 50Mi RWO Delete Bound default/mg-pv-cont-mongo-0 hostpath 37m
vincenzocalia@vincenzos-MacBook-Air server-node % kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mg-pv-cont-mongo-0 Bound pvc-d6c212f3-2391-4137-97c3-07836c90b8f3 50Mi RWO hostpath 37m
mg-pv-cont-mongo-1 Bound pvc-3e2f4e50-30f8-4ce8-8a62-0b923fd6aa79 50Mi RWO hostpath 37m
mg-pv-cont-mongo-2 Bound pvc-9f8c933b-85d6-4024-8bd0-6668feee8757 50Mi RWO hostpath 37m
mg-pv-cont-mongo-3 Bound pvc-32589cce-f472-40c9-b6e4-dc5e26c2177a 50Mi RWO hostpath 37m
mg-pv-cont-mongo-4 Bound pvc-8f4ff966-c30a-469f-a68d-ed579ef2a96f 50Mi RWO hostpath 37m
mg-pvc Pending mg-sc 74s
有没有办法将volumeClaimTemplates
的PV名称设置为在声明PV时更有用的名称?
如何将volumeClaimTemplates
的PV指向ssd,就像我正在为我的方案a所做的那样?
非常感谢
光伏
apiVersion: v1
kind: PersistentVolume
metadata:
name: mg-pv
labels:
type: local
spec:
capacity:
storage: 3Gi
persistentVolumeReclaimPolicy: Delete
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
storageClassName: mg-sc
local:
path: /Volumes/ProjectsSSD/k8s_local_volumes/mongo/mnt/data/unt
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- docker-desktop
SC
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: mg-sc
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete
聚氯乙烯
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mg-pvc
spec:
storageClassName: mg-sc
# volumeName: mg-pv
resources:
requests:
# storage: 1Gi
storage: 50Mi
accessModes:
- ReadWriteOnce
StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongo
spec:
selector:
matchLabels:
role: mongo
environment: test
serviceName: 'mongo'
replicas: 5
template:
metadata:
labels:
role: mongo
environment: test
spec:
terminationGracePeriodSeconds: 10
containers:
- name: mongo
image: mongo
command:
- mongod
- '--bind_ip'
- all
- '--replSet'
- rs0
# - "--smallfiles"
# - "--noprealloc"
ports:
- containerPort: 27017
volumeMounts:
- name: mg-pv-cont
mountPath: /data/db
- name: mongo-sidecar
image: cvallance/mongo-k8s-sidecar
env:
- name: MONGO_SIDECAR_POD_LABELS
value: 'role=mongo,environment=test'
- name: KUBERNETES_MONGO_SERVICE_NAME
value: 'mongo'
### using volumes you have to have one persistent volume for each created pod..useful only for static set of pods
# volumes:
# - name: mg-pv-cont
# persistentVolumeClaim:
# claimName: mg-pvc
## volume claim templates create a claim for each created pos, so if scaling up or down the number of pod they¡ll clame their own space in the persistent volume.
volumeClaimTemplates:
- metadata:
name: mg-pv-cont # this binds
# name: mg-pv-pvc-template # same name as volumeMounts or it won't bind.
### Waiting for deployments to stabilize...
### - statefulset/mongo: Waiting for statefulset spec update to be observed...
spec:
# storageClassName: mg-sc
storageClassName: hostpath
accessModes: ['ReadWriteOnce']
resources:
requests:
storage: 50Mi
发布于 2022-07-28 10:09:59
好的,在更多地修改了它并测试了几个配置之后,我发现PVC
到PV
绑定是以1:1的方式进行的,所以一旦PV
绑定到一个声明( PVC
或volumeClaimTemplates
)之后,就没有其他声明可以绑定到它了。因此,解决方案就是创建许多PV
,就像您期望创建的那样多。和一些额外的,以扩大和下降的副本,你的StatefulSet
。现在,在volumeClaimTemplates: spec: storageClassName:
中,您可以使用您定义的SC
,以便使用这些PV
。如果使用PVC
,就没有用了。它只会制造一个没有人使用的声明。
希望这将有助于其他在库伯奈特世界起步的人。干杯。
https://stackoverflow.com/questions/73115468
复制相似问题