Как изолировать данные одной заявки на постоянный том от другой - PullRequest
1 голос
/ 07 января 2020

Я создал постоянный том, используя следующий YAML

apiVersion: v1
kind: PersistentVolume
metadata:
  name: dq-tools-volume
  labels:
    name: dq-tools-volume
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: volume-class
  nfs:
    server: 192.168.215.83
    path: "/var/nfsshare"

После создания этого я создал два постоянных тома, используя следующие YAMLS

PVC1:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-volume-1
  labels:
    name: jenkins-volume-1
spec:
  accessMOdes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
  storageClassName: volume-class
  selector:
    matchLabels:
      name: dq-tools-volume

PVC2:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-volume-2
  labels:
    name: jenkins-volume-2
spec:
  accessMOdes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi
  storageClassName: volume-class
  selector:
    matchLabels:
      name: dq-tools-volume

Но я заметил, что оба эти постоянных утверждения тома записывают в один и тот же внутренний сервер.

Как можно изолировать данные одно постоянное громкое требование от другого. Я использую это для нескольких установок Jenkins. Я хочу, чтобы рабочее пространство каждого Дженкинса было изолированным.

Ответы [ 2 ]

1 голос
/ 08 января 2020

Как объясняет @DT, постоянное требование тома связано исключительно с постоянным томом.
Нельзя связать 2 pv c с тем же pv .

Здесь вы можете найти другой случай, где это обсуждалось.

Существует лучшее решение для вашего сценария, которое включает использование nfs-client-provisioner . Для этого сначала нужно установить helm в вашем кластере, а затем выполнить эти шаги, которые я создал для предыдущего ответа на ServerFault.

Я протестировал его, и с помощью этого решения вы можете изолировать один PV C от другого.

1 - Установите и настройте NFS-сервер на моем мастер-узле (Debian Linux, это может измениться в зависимости от вашего Linux дистрибутива):

Перед установкой Сервер ядра NFS, нам нужно обновить индекс репозитория нашей системы:

$ sudo apt-get update

Теперь выполните следующую команду, чтобы установить сервер ядра NFS в вашей системе:

$ sudo apt install nfs-kernel-server

Создать Каталог экспорта

$ sudo mkdir -p /mnt/nfs_server_files

Поскольку мы хотим, чтобы все клиенты обращались к каталогу, мы удалим ограничивающие разрешения для папки экспорта с помощью следующих команд (это может варьироваться в зависимости от настроек в соответствии с политикой безопасности). :

$ sudo chown nobody:nogroup /mnt/nfs_server_files
$ sudo chmod 777 /mnt/nfs_server_files

Назначение доступа к серверу для клиентов через файл экспорта NFS

$ sudo nano /etc/exports

Внутри этого файла добавьте новую строку, чтобы разрешить доступ с других серверов к вашей общей папке.

/mnt/nfs_server_files        10.128.0.0/24(rw,sync,no_subtree_check)

Возможно, вы захотите использовать разные опции в своей акции. 10.128.0.0/24 - это моя внутренняя сеть k8s.

Экспортируйте общий каталог и перезапустите службу, чтобы убедиться в правильности всех файлов конфигурации.

$ sudo exportfs -a
$ sudo systemctl restart nfs-kernel-server

Проверить все активные ресурсы:

$ sudo exportfs
/mnt/nfs_server_files
                10.128.0.0/24

2 - установить клиент NFS на все мои рабочие узлы:

$ sudo apt-get update
$ sudo apt-get install nfs-common

В На этом этапе вы можете проверить, есть ли у вас доступ к вашей папке с рабочих узлов:

$ sudo mkdir -p /mnt/sharedfolder_client
$ sudo mount kubemaster:/mnt/nfs_server_files /mnt/sharedfolder_client

Обратите внимание, что в этот момент вы можете использовать имя вашего главного узла. K8s заботится о DNS здесь. Проверьте, правильно ли смонтирован том, и создайте несколько папок и файлов для мужчин, чтобы убедиться, что все работает нормально.

$ cd /mnt/sharedfolder_client
$ mkdir test
$ touch file

Go вернитесь на свой мастер-узел и проверьте, находятся ли эти файлы в папке / mnt / nfs_server_files.

3 - Установите NFS Client Provisioner .

Установите поставщик с помощью helm:

$ helm install --name ext --namespace nfs --set nfs.server=kubemaster --set nfs.path=/mnt/nfs_server_files stable/nfs-client-provisioner

Обратите внимание, что я указал для него пространство имен , Проверьте, работают ли они:

$ kubectl get pods -n nfs
NAME                                         READY   STATUS      RESTARTS   AGE
ext-nfs-client-provisioner-f8964b44c-2876n   1/1     Running     0          84s

На данный момент у нас есть класс хранилища под названием nfs-client:

$ kubectl get storageclass -n nfs
NAME         PROVISIONER                                AGE
nfs-client   cluster.local/ext-nfs-client-provisioner   5m30s

Нам необходимо создать PersistentVolumeClaim:

$ more nfs-client-pvc.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  namespace: nfs 
  name: test-claim
  annotations:
    volume.beta.kubernetes.io/storage-class: "nfs-client"
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Mi
$ kubectl apply -f nfs-client-pvc.yaml

Проверка состояния (ожидается предел):

$ kubectl get persistentvolumeclaim/test-claim -n nfs
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
test-claim   Bound    pvc-e1cd4c78-7c7c-4280-b1e0-41c0473652d5   1Mi        RWX            nfs-client     24s

4 - создание простого модуля для проверки возможности чтения и записи NFS. Поделиться:

Создайте модуль, используя этот yaml:

apiVersion: v1
kind: Pod
metadata:
  name: pod0
  labels:
    env: test
  namespace: nfs  
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts:
      - name: nfs-pvc
        mountPath: "/mnt"
  volumes:
    - name: nfs-pvc
      persistentVolumeClaim:
        claimName: test-claim
$ kubectl apply -f pod.yaml

Давайте перечислим все подключенные тома на нашем модуле:

$ kubectl exec -ti -n nfs pod0 -- df -h /mnt
Filesystem                                                                               Size  Used Avail Use% Mounted on
kubemaster:/mnt/nfs_server_files/nfs-test-claim-pvc-a2e53b0e-f9bb-4723-ad62-860030fb93b1   99G   11G   84G  11% /mnt

Как мы видим, у нас есть том NFS монтируется на / мн. (Важно отметить путь kubemaster:/mnt/nfs_server_files/nfs-test-claim-pvc-a2e53b0e-f9bb-4723-ad62-860030fb93b1)

Давайте проверим его:

root@pod0:/# cd /mnt
root@pod0:/mnt# ls -la
total 8
drwxrwxrwx 2 nobody nogroup 4096 Nov  5 08:33 .
drwxr-xr-x 1 root   root    4096 Nov  5 08:38 ..

Он пуст. Давайте создадим несколько файлов:

$ for i in 1 2; do touch file$i; done;
$ ls -l 
total 8
drwxrwxrwx 2 nobody nogroup 4096 Nov  5 08:58 .
drwxr-xr-x 1 root   root    4096 Nov  5 08:38 ..
-rw-r--r-- 1 nobody nogroup    0 Nov  5 08:58 file1
-rw-r--r-- 1 nobody nogroup    0 Nov  5 08:58 file2

Теперь давайте рассмотрим, где находятся эти файлы на нашем NFS-сервере (главный узел):

$ cd /mnt/nfs_server_files
$ ls -l 
total 4
drwxrwxrwx 2 nobody nogroup 4096 Nov  5 09:11 nfs-test-claim-pvc-4550f9f0-694d-46c9-9e4c-7172a3a64b12
$ cd nfs-test-claim-pvc-4550f9f0-694d-46c9-9e4c-7172a3a64b12/
$ ls -l 
total 0
-rw-r--r-- 1 nobody nogroup 0 Nov  5 09:11 file1
-rw-r--r-- 1 nobody nogroup 0 Nov  5 09:11 file2

А вот файлы, которые мы только что создали внутри нашего модуля!

1 голос
/ 07 января 2020

Как я понимаю невозможно связать два PV C с одним PV .

Ссылка на эту ссылку> PV C для PV привязка взаимно-однозначное сопоставление

Возможно, вам понадобится Dynami c Параметр обеспечения для вашей настройки.

Протестировано путем создания одного PV 10G и двух PV C с 8Gi и запрос заявки 2Gi PV C -2 переходит в состояние ожидания.

master $ kubectl get persistentvolume
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM         STORAGECLASS   REASON    AGE
pv        10Gi       RWX            Retain           Bound     default/pv1                            7m


master $ kubectl get persistentvolumeclaims
NAME      STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc1       Bound     pv        10Gi       RWX                           3m
pvc2       Pending                                                      8s

Файлы, используемые для создания PV и PV C, как показано ниже

master $ cat pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  hostPath:
    path: /var/tmp/
master $ cat pvc1.ayml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc1
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 8Gi
master $ cat pvc2.ayml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc2
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 2Gi
...