如何在kubernetes中使用statefulset设置pvc?
在GKE上,我将statefulset资源设置为如何在kubernetes中使用statefulset设置pvc?,kubernetes,google-kubernetes-engine,persistent-volumes,kubernetes-statefulset,kubernetes-pvc,Kubernetes,Google Kubernetes Engine,Persistent Volumes,Kubernetes Statefulset,Kubernetes Pvc,在GKE上,我将statefulset资源设置为 --- apiVersion: apps/v1 kind: StatefulSet metadata: name: redis spec: serviceName: "redis" selector: matchLabels: app: redis updateStrategy: type: RollingUpdate replicas: 3 template: me
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
spec:
serviceName: "redis"
selector:
matchLabels:
app: redis
updateStrategy:
type: RollingUpdate
replicas: 3
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis
resources:
limits:
memory: 2Gi
ports:
- containerPort: 6379
volumeMounts:
- name: redis-data
mountPath: /usr/share/redis
volumes:
- name: redis-data
persistentVolumeClaim:
claimName: redis-data-pvc
想用pvc做这个。(此步骤在statefulset部署之前执行)
当检查kubernetes中的资源时
kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
redis-data-pvc Bound pvc-6163d1f8-fb3d-44ac-a91f-edef1452b3b9 10Gi RWO standard 132m
默认存储类别为标准
kubectl get storageclass
NAME PROVISIONER
standard (default) kubernetes.io/gce-pd
但当检查statafulset的部署状态时。它总是错的
# Describe its pod details
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 22s default-scheduler persistentvolumeclaim "redis-data-pvc" not found
Warning FailedScheduling 17s (x2 over 20s) default-scheduler pod has unbound immediate PersistentVolumeClaims (repeated 2 times)
Normal Created 2s (x2 over 3s) kubelet Created container redis
Normal Started 2s (x2 over 3s) kubelet Started container redis
Warning BackOff 0s (x2 over 1s) kubelet Back-off restarting failed container
为什么它找不到redis data pvc的名称呢?你所做的应该是可行的。确保PersistentVolumeClaim
和StatefulSet
位于同一命名空间中
也就是说,这是一个更简单的解决方案,可以让您更轻松地扩展到更多副本:
使用StatefulSet和PersistentVolumeClaim时,请改用中的volumeClaimTemplates:
字段
volumeClaimTemplates:
将用于为每个副本创建唯一的PVC,并且它们具有唯一的命名结尾,例如-0
,其中编号是状态集中副本使用的序号
因此,请改为使用如下所示的SateSetManifest:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
spec:
serviceName: "redis"
selector:
matchLabels:
app: redis
updateStrategy:
type: RollingUpdate
replicas: 3
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis
resources:
limits:
memory: 2Gi
ports:
- containerPort: 6379
volumeMounts:
- name: redis-data
mountPath: /usr/share/redis
volumeClaimTemplates: // this will be used to create PVC
- metadata:
name: redis-data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 10Gi
添加kubectl get pv-A的输出
您的注释对于Redis StatefulSet是正确的,但对于任何StatefulSet都不一定正确。实际上,根据您的需要,您可以使用这两个选项。如果每个pod需要单独的PV,那么确实应该使用VolumeClaim模板。但是,如果您的POD需要共享卷装载,在ReadOnlyMany/ReadWriteMany模式下使用普通PVC是完全合法的(考虑到您的存储驱动器支持这种访问)。谢谢。它起作用了。但我还有一个问题。在这种情况下怎么办?如果我想在安装容器时执行安装命令。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
spec:
serviceName: "redis"
selector:
matchLabels:
app: redis
updateStrategy:
type: RollingUpdate
replicas: 3
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis
resources:
limits:
memory: 2Gi
ports:
- containerPort: 6379
volumeMounts:
- name: redis-data
mountPath: /usr/share/redis
volumeClaimTemplates: // this will be used to create PVC
- metadata:
name: redis-data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 10Gi