【问题标题】:How to let Kubernetes PetSet use existing Persistent Volumes?如何让 Kubernetes PetSet 使用现有的 Persistent Volumes?
【发布时间】:2019-10-14 18:19:28
【问题描述】:

作为 PetSet 定义的一部分,volumeClainTemplates 是为 Kubernetes 定义的,用于动态生成 Persistent Volume Claims。例如:

  volumeClaimTemplates:
  - metadata:
      name: datadir
      annotations:
        volume.alpha.kubernetes.io/storage-class: anything
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 24Gi

但是,我已经定义了一些持久卷:

#kubectl get pv    
NAME      CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS    CLAIM                 REASON    AGE 
pv-1-rw   24Gi       RWO           Retain          Bound     rnd/pvc-1-rw             1h
pv-2-rw   24Gi       RWO           Retain          Bound     rnd/pvc-2-rw             6d
pv-3-rw   24Gi       RWO           Retain          Bound     rnd/pvc-3-rw             6d
...

我希望 Kubernetes 从现有卷中选择持久卷,而不是动态创建新卷。

我使用的是 Kubernetes 1.4.3。有人知道怎么做吗?

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    volumeClaimTemplatesPersistentVolumeClaim 的数组。您可以尝试使用selector 定义它们并以某种方式标记现有卷,即:

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: pv0001
      labels:
        foo: foo
        bar: bar
    spec:
      accessModes:
        - ReadWriteOnce
      capacity:
        storage: 5Gi
      hostPath:
        path: /data/pv0001/
    ---
    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: pv0002
      labels:
        foo: foo
        bar: bar
    spec:
      accessModes:
        - ReadWriteOnce
      capacity:
        storage: 5Gi
      hostPath:
        path: /data/pv0002/
    ---
    kind: Service
    apiVersion: v1
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      ports:
        - port: 80
      selector:
        app: nginx
    ---
    kind: PetSet
    apiVersion: apps/v1alpha1
    metadata:
      name: nginx
    spec:
      serviceName: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
            - name: nginx
              image: gcr.io/google_containers/nginx-slim:0.8
              ports:
                - containerPort: 80
              volumeMounts:
                - name: html
                  mountPath: /usr/share/nginx/html
      volumeClaimTemplates:
        - metadata:
            name: html
          spec:
            accessModes:
              - ReadWriteOnce
            resources:
              requests:
                storage: 5Gi
            selector:
              matchLabels:
                foo: foo
                bar: bar
    

    当然,体积必须可用于边界。

    $ kubectl get pvc html-nginx-0
    NAME           STATUS    VOLUME    CAPACITY   ACCESSMODES   AGE
    html-nginx-0   Bound     pv0002    5Gi        RWO           1m
    $ kubectl get pv
    NAME      CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS      CLAIM                  REASON    AGE
    pv0001    5Gi        RWO           Retain          Available                                    2m
    pv0002    5Gi        RWO           Retain          Bound       default/html-nginx-0             2m
    

    【讨论】:

    • 我试过这个,它适用于 k8s v1.4.4。我必须创建一个带有标签的 PV,以便稍后用于 petset 中的选择器。 PVC 是由 petset 自动创建的。
    • 您也可以手动创建 PVC,以便卷声明模板使用它们而不是创建新的。它们需要与自动创建的名称和storageClass 相同。这种技术使您能够以您想要的方式管理您的 PVC 和您的 PV 之间的映射。您可以使用 kind kind.sigs.k8s.io,其中启用了动态卷配置,以便获取 PV 和 PVC 的 yaml 示例。然后让 PV 适应你的存储。
    【解决方案2】:

    这里是如何使用按标签选择卷

    volumeClaimTemplates:
    - metadata:
        name: data
    spec:
        accessModes: [ "ReadWriteOnce" ]
        selector: 
        matchLabels:
            data-label: database-1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-17
      • 2015-08-12
      • 2021-08-29
      相关资源
      最近更新 更多