Как я могу определить общий постоянный том между двумя разными развертываниями в k8s?

#kubernetes #google-cloud-platform #google-kubernetes-engine #persistent-storage #kubernetes-pvc

#kubernetes #google-облачная платформа #google-kubernetes-engine #постоянное хранилище #kubernetes-pvc

Вопрос:

Я пытаюсь определить общий постоянный том в k8s между двумя разными развертываниями, и я столкнулся с некоторыми проблемами:

У меня есть 2 модуля для каждого развертывания, и между развертываниями я пытаюсь настроить общий том — это означает, что если я создам текстовый файл в deplyment1 / pod1 и посмотрю в deplyment1 / pod2 — я не смогу увидеть файл.

Вторая проблема заключается в том, что я не вижу файлы в другом развертывании (deplyment2) — в настоящее время происходит то, что каждый модуль создал свой собственный отдельный том вместо того, чтобы использовать один и тот же том.

В конечном итоге моя цель — создать общий том между модулями и развертываниями. Важно отметить, что я работаю на GKE.

Ниже приведены мои текущие конфигурации

Развертывание 1:

 apiVersion: apps/v1
kind: Deployment
metadata:
  name: app1
  namespace: test
spec:
  selector:
    matchLabels:
      app: app1
  template:
    metadata:
      labels:
        app: app1
    spec:
      containers:
        - name: server
          image: app1
          ports:
            - name: grpc
              containerPort: 11111
          resources:
            requests:
              cpu: 300m
            limits:
              cpu: 500m
          volumeMounts:
            - name: test
              mountPath: /etc/test/configs
      volumes:
        - name: test
          persistentVolumeClaim:
            claimName: my-claim
  

Развертывание 2:

     apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: app2
      namespace: test
    spec:
      selector:
        matchLabels:
          app: app2
      template:
        metadata:
          labels:
            app: app2
        spec:
          containers:
            - name: server
              image: app2
              ports:
                - name: http
                  containerPort: 22222
              resources:
                requests:
                  cpu: 300m
                limits:
                  cpu: 500m
              volumeMounts:
                - name: test
                  mountPath: /etc/test/configs
          volumes:
            - name: test
              persistentVolumeClaim:
                claimName: my-claim
  

Постоянный том:

     apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: test-pv
      namespace: test
    spec:
      capacity:
        storage: 5Gi
      volumeMode: Filesystem
      accessModes:
      - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      storageClassName: fast
      local:
        path: /etc/test/configs
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: cloud.google.com/gke-nodepool
              operator: In
              values:
              - default-pool
  
     kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: my-claim
      namespace: test
      annotations:
        volume.beta.kubernetes.io/storage-class: fast
    spec:
      accessModes:
      - ReadWriteMany
      storageClassName: fast
      resources:
        requests:
          storage: 5Gi
  
     apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: fast
    provisioner: kubernetes.io/gce-pd
    parameters:
      type: pd-ssd
      fstype: ext4
      replication-type: regional-pd
  

и опишите pv и pvc:

      $ kubectl describe pvc -n test
        Name:          my-claim
        Namespace:     test
        StorageClass:  fast
        Status:        Bound
        Volume:        test-pv
        Labels:        <none>
        Annotations:   pv.kubernetes.io/bind-completed: yes
                       pv.kubernetes.io/bound-by-controller: yes
                       volume.beta.kubernetes.io/storage-class: fast
        Finalizers:    [kubernetes.io/pvc-protection]
        Capacity:      5Gi
        Access Modes:  RWX
        VolumeMode:    Filesystem
        Mounted By:    <none>
        Events:        <none>
  
       $ kubectl describe pv -n test
        Name:              test-pv
        Labels:            <none>
        Annotations:       pv.kubernetes.io/bound-by-controller: yes
        Finalizers:        [kubernetes.io/pv-protection]
        StorageClass:      fast
        Status:            Bound
        Claim:             test/my-claim
        Reclaim Policy:    Retain
        Access Modes:      RWX
        VolumeMode:        Filesystem
        Capacity:          5Gi
        Node Affinity:
          Required Terms:
            Term 0:        cloud.google.com/gke-nodepool in [default-pool]
        Message:
        Source:
            Type:  LocalVolume (a persistent volume backed by local storage on a node)
            Path:  /etc/test/configs
        Events:    <none>
  

Комментарии:

1. AFAIK, это невозможно. Вы можете настроить контейнер, настроенный с помощью NFS, и создать экспорт, который могут использовать другие контейнеры mount.github.com/kubernetes/examples/tree/master/staging/volumes/nfs

Ответ №1:

Драйвер хранилища CSI GCE-PD не поддерживает ReadWriteMany . Вам нужно использовать ReadOnlyMany . Для ReadWriteMany вас необходимо использовать монтирование GFS.

Из документации о том, как использовать постоянные диски с несколькими устройствами чтения

Создание PersistentVolume и PersistentVolumeClaim

 apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-readonly-pv
spec:
  storageClassName: ""
  capacity:
    storage: 10Gi
  accessModes:
    - ReadOnlyMany
  claimRef:
    namespace: default
    name: my-readonly-pvc
  gcePersistentDisk:
    pdName: my-test-disk
    fsType: ext4
    readOnly: true
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-readonly-pvc
spec:
  # Specify "" as the storageClassName so it matches the PersistentVolume's StorageClass.
  # A nil storageClassName value uses the default StorageClass. For details, see
  # https://kubernetes.io/docs/concepts/storage/persistent-volumes/#class-1
  storageClassName: ""
  accessModes:
    - ReadOnlyMany
  resources:
    requests:
      storage: 10Gi
  

Использование PersistentVolumeClaim в модуле

 apiVersion: v1
kind: Pod
metadata:
  name: pod-pvc
spec:
  containers:
  - image: k8s.gcr.io/busybox
    name: busybox
    command:
      - "sleep"
      - "3600"
    volumeMounts:
    - mountPath: /test-mnt
      name: my-volume
      readOnly: true
  volumes:
  - name: my-volume
    persistentVolumeClaim:
      claimName: my-readonly-pvc
      readOnly: true
  

Теперь у вас может быть несколько модулей на разных узлах, которые могут монтировать это PersistentVolumeClaim в режиме только для чтения. Однако вы не можете подключать постоянные диски в режиме записи на нескольких узлах одновременно

Комментарии:

1. когда я попытался это сделать, я столкнулся с проблемами. « — test: pod / app1-69f499c8d-srff2: доступно 0/9 узлов: 3 недостаточно процессора, у 6 узлов был конфликт привязки к узлу тома. и это моя проблема. когда модули подключаются, первые модули улавливают громкость, а другие модули из других приложений не могут подключиться к объему. можете ли вы подробнее рассказать о способе nfs?