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

ioo*_*ooi 10 kubernetes google-kubernetes-engine persistent-volumes kubernetes-pvc kubernetes-statefulset

在 GKE 上,我将有状态集资源设置为

---
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
Run Code Online (Sandbox Code Playgroud)

想要使用 PVC 所以创建了这个。(这一步是在statefulset部署之前完成的)

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: redis-data-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
Run Code Online (Sandbox Code Playgroud)

当检查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
Run Code Online (Sandbox Code Playgroud)

默认存储类别是standard.

kubectl get storageclass
NAME                 PROVISIONER
standard (default)   kubernetes.io/gce-pd
Run Code Online (Sandbox Code Playgroud)

但是当检查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
Run Code Online (Sandbox Code Playgroud)

为什么找不到名字redis-data-pvc

Jon*_*nas 17

你所做的,应该有效。确保 和PersistentVolumeClaim位于StatefulSet同一命名空间中。


也就是说,这是一个更简单的解决方案,可以让您更轻松地扩展到更多副本:

当使用 StatefulSet 和 PersistentVolumeClaim 时,请使用StatefulSetvolumeClaimTemplates:中的字段。

volumeClaimTemplates:用于为每个副本创建唯一的 PVC,并且它们具有以例如结尾的唯一命名,-0其中数字是用于 StatefulSet 中的副本的序数。

因此,请使用如下所示的 SatefuleSet 清单:

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
Run Code Online (Sandbox Code Playgroud)

  • 您的评论对于 Redis StatefulSet 来说是正确的,但对于 ***any*** StatefulSet 来说不一定正确。实际上,您可以根据需要使用这两个选项。如果您需要为每个 Pod 分配一个单独的 PV,那么您确实应该使用volumeClaimTemplates。但是,如果您的 pod 需要***共享***卷挂载,那么在 ReadOnlyMany / ReadWriteMany 模式下使用常规 PVC 是完全合法的(假设您的存储驱动器支持这种访问)。 (7认同)