【问题标题】:How do I statically provision a volume for a StatefulSet?如何为 StatefulSet 静态配置卷?
【发布时间】:2018-06-24 13:19:20
【问题描述】:

我正在使用 Google Kubernetes Engine,并希望我的 StatefulSet 使用我之前创建的磁盘 my-app-disk,而不是为集合中的每个副本动态创建新的永久性磁盘。我的配置如下:

PersistentVolumeyaml:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-app-data
  labels:
    app: my-app
spec:
  capacity:
    storage: 60Gi
  accessModes:
    - ReadWriteOnce
  gcePersistentDisk:
    pdName: my-app-disk
    fsType: ext4

PersistentVolumeClaimyaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-app-data
  labels:
    app: my-app
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 60Gi
  selector:
    matchLabels:
      app: my-app

StatefulSetyaml:

apiVersion: apps/v1beta2
kind: StatefulSet
metadata:
  name: my-stateful-set
spec:
  serviceName: my-stateful-set
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: gcr.io/projectname/my-app:0.0.3
        ports:
        - containerPort: 80
          name: http
        volumeMounts:
        - name: my-app-data
          mountPath: /data
  volumeClaimTemplates:
  - metadata:
      name: my-app-data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 50Gi

【问题讨论】:

    标签: kubernetes google-cloud-platform google-kubernetes-engine


    【解决方案1】:

    StatefulSet 将为每个 pod 创建它自己的PersistentVolumeClaim,因此您不必自己创建一个。 PersistentVolumePersistentVolumeClaim 将独占绑定 one to one。您的 PVC 已绑定到您的卷,因此StatefulSet 创建的任何 PVC 都无法绑定到您的卷,因此不会被使用。

    在您的情况下,您的PersistentVolume 和下面的StatefulSet 应该可以解决问题。确保删除您创建的PersistentVolumeClaim,这样它就不会绑定到您的PersistentVolume。另外,请确保存储类名称在您的 PV 下方和您的 StatefulSet 下方的 volumeClaimTemplates 中正确设置,否则由 StatefulSet 生成的 PVC 可能无法绑定到您的卷。

    PersistentVolume.yaml:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: my-app-data
      labels:
        app: my-app
    spec:
      capacity:
        storage: 60Gi
      storageClassName: standard
      accessModes:
        - ReadWriteOnce
      gcePersistentDisk:
        pdName: my-app-disk
        fsType: ext4
    

    StatefulSet.yaml:

    apiVersion: apps/v1beta2
    kind: StatefulSet
    metadata:
      name: my-stateful-set
    spec:
      serviceName: my-stateful-set
      replicas: 1
      selector:
        matchLabels:
          app: my-app
      updateStrategy:
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - name: my-app
            image: gcr.io/projectname/my-app:0.0.3
            ports:
            - containerPort: 80
              name: http
            volumeMounts:
            - name: my-app-data
              mountPath: /data
      volumeClaimTemplates:
      - metadata:
          name: my-app-data
        spec:
          selector:
            matchLabels:
              app: my-app
          storageClassName: standard
          accessModes: [ "ReadWriteOnce" ]
          resources:
            requests:
              storage: 50Gi
    

    【讨论】:

    • 这将如何查找 3 个副本和 3 个磁盘?我的应用磁盘 1、我的应用磁盘 2、我的应用磁盘 3?
    • StatefulSet 将只有 3 个副本,并且您将拥有 3 个带有 app=myapp 标签的 PersistentVolume,因为这是用于 PersistentVolumeClaim 标签选择器的内容。
    • 这在 AWS 上不起作用。 ``` 无法使用 StorageClass“gp2-encrypted”预置卷:AWS 上的动态预置不支持claim.Spec.Selector ```
    • 这是完全正确的。在浏览 Kubernetes 文档数小时后,我发现绝对没有任何东西表明这是可能的。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 2018-12-17
    • 2021-02-21
    • 2021-01-12
    相关资源
    最近更新 更多