У меня есть собственный кластер Kubernetes, работающий на голом железе, и он состоит из 5 узлов (1 мастер и 4 рабочих). Я изначально настроил NFS-сервер на главном сервере и запустил nfs-client в K8s, чтобы иметь динамический провайдер nfs. Все работает правильно, и я могу использовать свои приложения, просто определив требование постоянного тома, НО я не могу найти свои данные на диске.
Каждый раз, когда я запускаю приложение, nfs-клиент создает новый каталог на пути к моему серверу nfs с правильным именем, но все эти каталоги пусты. Итак, мой вопрос: где мои данные?
Я использую карта управления клиента nfs. Это пример созданного, но пустого каталога на моем пути к серверу nfs:
/var/nfs/general$ tree
.
├── 166-postgres-claim-pvc-37146254-db50-4293-a9f7-13097689610a
│ └── data
├── 166-registry-claim-pvc-fe337e34-d9a5-4266-8178-f67973894584
├── 166-registry-slave-claim-registry-slave-0-pvc-b18d430b-e1fc-4eeb-bd12-cab9340bed69
├── 166-rtspdata-claim-pvc-bf9bc1e3-412f-4627-ade4-50817478308e
├── 172-postgres-claim-pvc-087538cf-5b67-4789-8d8b-117d41c3fe02
│ └── data
├── 172-registry-claim-pvc-7b7d9bb6-a636-4f78-b2fe-924473cb47ab
├── 172-registry-slave-claim-registry-slave-0-pvc-34e62524-fca0-48dd-ba29-b4cf178ca028
├── 172-rtspdata-claim-pvc-211a1aac-409f-431c-b78d-5b87b9017625
├── 173-postgres-claim-pvc-b901449a-0ce7-4ecf-8dfc-e6371dd3a9b4
│ └── data
├── 173-registry-claim-pvc-cd842cde-a3f7-4d54-94d6-c018e42ec495
├── 173-rtspdata-claim-pvc-a95c5748-ebed-4045-98b2-a04e534e0cf6
├── archived-161-postgres-claim-pvc-01cc1ff2-8cc8-4161-8d85-00cb6562e10e
│ └── data
├── archived-161-registry-claim-pvc-9b626e01-a565-4214-b94e-b7ba1e206a5e
├── archived-161-rtspdata-claim-pvc-b079c7e2-248e-4245-b243-5ff7dc3afa82
├── archived-162-postgres-claim-pvc-188af7ca-106d-4f2f-8905-9d7b391e9dce
│ └── data
├── archived-162-postgres-claim-pvc-356e4632-19e2-4ac9-8400-e00d39621b7c
│ └── data
├── archived-162-postgres-claim-pvc-45372032-979f-4ced-be35-15ec67a322b7
│ └── data
├── archived-162-postgres-claim-pvc-6d5e1f01-ad5b-45cc-9eef-654275e3ecd2
│ └── data
├── archived-162-postgres-claim-pvc-cbf4d4ca-b9d1-4d1c-88be-621eeb3680fb
│ └── data
├── archived-162-postgres-claim-pvc-eaa32a4c-9768-469a-ad85-1e1b682c376d
│ └── data
├── archived-162-postgres-claim-pvc-f517586b-e132-4a38-8ec9-18f6d5ca000e
│ └── data
├── archived-162-registry-claim-pvc-1796642a-d639-4ede-8204-1779c029aa4e
│ └── rethinkdb_data
Я воспроизвел этот сценарий в своей тестовой среде, и я мог нормально найти свои данные. Чтобы воспроизвести его, я выполнил следующие шаги.
Убедитесь, что вы выполняете все шаги. Для редактирования этого файла необходим root-доступ; поэтому вам нужно будет использовать sudo с вашей командой. Вы также можете открыть файл в любом из ваших любимых текстовых редакторов.
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
Вернитесь к своему главному узлу и проверьте, находятся ли эти файлы в папке / mnt / nfs_server_files.
3 - Установите NFS Client Provisioner.
Установите Provider с помощью 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 -- bash
Перечислим все смонтированные тома в нашем модуле:
root@pod0:/# df -h
Filesystem Size Used Avail Use% Mounted on
overlay 9.8G 6.1G 3.3G 66% /
tmpfs 64M 0 64M 0% /dev
tmpfs 7.4G 0 7.4G 0% /sys/fs/cgroup
kubemaster:/mnt/nfs_server_files/nfs-test-claim-pvc-4550f9f0-694d-46c9-9e4c-7172a3a64b12 9.8G 5.8G 3.6G 62% /mnt
/dev/sda1 9.8G 6.1G 3.3G 66% /etc/hosts
shm 64M 0 64M 0% /dev/shm
tmpfs 7.4G 12K 7.4G 1% /run/secrets/kubernetes.io/serviceaccount
tmpfs 7.4G 0 7.4G 0% /proc/acpi
tmpfs 7.4G 0 7.4G 0% /sys/firmware
Как мы видим, у нас есть том NFS, смонтированный на / mnt. (Важно отметить путь kubemaster:/mnt/nfs_server_files/nfs-test-claim-pvc-4550f9f0-694d-46c9-9e4c-7172a3a64b12
)
Проверим:
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 4 5 6; 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
-rw-r--r-- 1 nobody nogroup 0 Nov 5 08:58 file4
-rw-r--r-- 1 nobody nogroup 0 Nov 5 08:58 file5
-rw-r--r-- 1 nobody nogroup 0 Nov 5 08:58 file6
Теперь давайте посмотрим, где находятся эти файлы на нашем сервере 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
-rw-r--r-- 1 nobody nogroup 0 Nov 5 09:11 file4
-rw-r--r-- 1 nobody nogroup 0 Nov 5 09:11 file5
-rw-r--r-- 1 nobody nogroup 0 Nov 5 09:11 file6
А вот файлы, которые мы только что создали внутри нашего модуля!