Общий каталог для развертывания Kubernetes между его репликами

У меня простое развертывание с 2 репликами.

Я бы хотел, чтобы в каждой из реплик была одна и та же папка для хранения (общая папка для загрузки приложений)

Я играл с претензиями и объемами, но все еще не получил преимущества, поэтому прошу быстрой помощи / примера.

apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: 'test-tomcat'
      labels:
        app: test-tomcat
    spec:
      selector:
        matchLabels:
          app: test-tomcat
      replicas: 3
      template:
        metadata:
          name: 'test-tomcat'
          labels:
            app: test-tomcat
        spec:
          volumes:
          - name: 'data'
            persistentVolumeClaim:
              claimName: claim
          containers:
          - image: 'tomcat:9-alpine'
            volumeMounts:
            - name: 'data'
              mountPath: '/app/data'
            imagePullPolicy: Always
            name: 'tomcat'
            command: ['bin/catalina.sh', 'jpda', 'run']


kind: PersistentVolume
apiVersion: v1
metadata:
  name: volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 2Gi
  accessModes:
  - ReadWriteMany
  hostPath:
    path: "/mnt/data"


kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: claim
spec:
  storageClassName: manual
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

person user3077014    schedule 03.09.2018    source источник


Ответы (1)


Прежде всего, вам нужно решить, какой тип постоянного тома использовать. Вот несколько примеров локального кластера:

  • HostPath - локальный путь на узле. Следовательно, если первый модуль расположен на узле 1, а второй - на узле 2, хранилища будут разными. Чтобы решить эту проблему, вы можете использовать один из следующих вариантов. Пример HostPath:

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: example-pv
      labels:
        type: local
    spec:
      storageClassName: manual
      capacity:
        storage: 3Gi
      accessModes:
        - ReadWriteOnce
      hostPath:
        path: "/mnt/data"
    
  • NFS - PersistentVolume этого типа использует сетевую файловую систему. NFS - это протокол распределенной файловой системы, который позволяет монтировать удаленные каталоги на ваших серверах. Перед использованием NFS в Kubernetes необходимо установить сервер NFS; вот пример Как настроить монтирование NFS в Ubuntu. Пример в Kubernetes:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: example-pv
    spec:
      capacity:
        storage: 3Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Recycle
      storageClassName: slow
      mountOptions:
        - hard
        - nfsvers=4.1
      nfs:
        path: /tmp
        server: 172.17.0.2
    
  • GlusterFS. GlusterFS - это масштабируемая распределенная файловая система, которая объединяет ресурсы дискового хранилища с нескольких серверов в единое глобальное пространство имен. Что касается NFS, вам необходимо установить GlusterFS, прежде чем использовать его в Kubernetes; вот ссылка с инструкциями и еще один с образцом. Пример в Kubernetes:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: example-pv 
      annotations:
        pv.beta.kubernetes.io/gid: "590" 
    spec:
      capacity:
        storage: 3Gi 
      accessModes: 
        - ReadWriteMany
      glusterfs:
        endpoints: glusterfs-cluster 
        path: myVol1 
        readOnly: false
      persistentVolumeReclaimPolicy: Retain
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: glusterfs-cluster 
    spec:
      ports:
      - port: 1
    ---
    apiVersion: v1
    kind: Endpoints
    metadata:
      name: glusterfs-cluster 
    subsets:
      - addresses:
          - ip: 192.168.122.221 
        ports:
          - port: 1 
      - addresses:
          - ip: 192.168.122.222 
        ports:
          - port: 1 
      - addresses:
          - ip: 192.168.122.223 
        ports:
          - port: 1 
    

После создания PersistentVolume необходимо создать PersistaentVolumeClaim. PersistaentVolumeClaim - это ресурс, используемый модулями Pods для запроса томов из хранилища. После создания PersistentVolumeClaim плоскость управления Kubernetes ищет PersistentVolume, удовлетворяющий требованиям утверждения. Пример:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: example-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

И последний шаг, вам нужно настроить Pod для использования PersistentVolumeClaim. Вот пример:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: 'test-tomcat'
  labels:
    app: test-tomcat
spec:
  selector:
    matchLabels:
      app: test-tomcat
  replicas: 3
  template:
    metadata:
      name: 'test-tomcat'
      labels:
        app: test-tomcat
    spec:
      volumes:
      - name: 'data'
        persistentVolumeClaim:
          claimName: example-pv-claim #name of the claim should be the same as defined before
      containers:
      - image: 'tomcat:9-alpine'
        volumeMounts:
        - name: 'data'
          mountPath: '/app/data'
        imagePullPolicy: Always
        name: 'tomcat'
        command: ['bin/catalina.sh', 'jpda', 'run']
person Artem Golenyaev    schedule 04.09.2018
comment
Спасибо, многому научился. ClusterFS казалась действительно крутой, хотя для нашего собственного тестового кластера я решил использовать решение NFS. Оба работали хорошо, спасибо - person user3077014; 07.09.2018