如何在kubernetes中使用statefulset设置pvc?

如何在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

在GKE上,我将statefulset资源设置为

---
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