Как использовать объем хранилища nfs в кластере kubernetes — с помощью самодельного сервера nfs

Kubernetes

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

Эта статья включает в себя:

  • Установить и настроить nfs-сервер
  • Подключите общую папку NFS с помощью клиента NFS
  • Создание объемов NFS в кластере K8S

В этой статье в качестве экспериментальной среды используется Ubuntu/Debian, для таких систем, как Centos, единственное отличие заключается в установке и настройке nfs.

Установить и настроить nfs-сервер

Справочное руководство:viimage.com/install-NFS…

sudo apt-get update
sudo apt install nfs-kernel-server
sudo mkdir -p /mnt/sharedfolder
sudo chown nobody:nogroup /mnt/sharedfolder
sudo chmod 777 /mnt/sharedfolder
sudo nano /etc/exports

Шаг 1: Установите nfs-kernel-server

sudo apt-get update
sudo apt install nfs-kernel-server

Шаг 2: Создайте каталог экспорта

Каталог экспорта — это каталог для совместного использования с клиентами nfs, этот каталог может быть любым каталогом в Linux. Здесь мы используем созданный новый каталог.

sudo mkdir -p /mnt/sharedfolder

Шаг 3: Назначьте доступ к серверу клиентам через выходной файл nfs

редактировать/etc/exportsдокумент

sudo vi /etc/exports

Добавляя конфигурацию в файл, можно назначать разные типы прав доступа:

  • Формат конфигурации для назначения прав доступа отдельным клиентам:
/mnt/sharedfolder clientIP(rw,sync,no_subtree_check)
  • Формат конфигурации для назначения прав доступа нескольким клиентам:
/mnt/sharedfolder client1IP(rw,sync,no_subtree_check)
/mnt/sharedfolder client2IP(rw,sync,no_subtree_check)
  • Формат конфигурации для назначения доступа нескольким клиентам путем указания полного подмножества клиентов:
/mnt/sharedfolder subnetIP/24(rw,sync,no_subtree_check)

Пример:

Вот пример конфигурации с разрешениями на чтение и запись, назначенными клиенту 192.168.0.101.

/mnt/sharedfolder 192.168.0.101(rw,sync,no_subtree_check)

Шаг 4: Выведите общий каталог

Выполните команду для вывода общего каталога:

sudo exportfs -a

Перезапустите службу nfs-kernel-server, чтобы все настройки вступили в силу.

sudo systemctl restart nfs-kernel-server

подключить общую папку nfs с помощью клиента nfs

Вы можете использовать менеджер ресурсов win10 для подключения к серверу nfs для тестирования, или вы можете использовать linux для подключения для тестирования.

Вот еще один Ubuntu в локальной сети, чтобы установить совместный каталог NFS для тестирования:

Шаг 1: Установите nfs-common

nfs-common содержит программное обеспечение, необходимое клиенту nfs.

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

Шаг 2. Создайте точку монтирования для общего каталога nfs.

sudo mkdir -p /mnt/sharedfolder_client

Шаг 3: Подключите общий каталог к ​​клиенту

Формат команды монтирования:

sudo mount serverIP:/exportFolder_server /mnt/mountfolder_client

Согласно предыдущей конфигурации, команда Mount выглядит следующим образом:

sudo mount 192.168.100.5:/mnt/sharedfolder /mnt/sharedfolder_client

При настройке вам необходимо заполнить в соответствии с фактическими IP-адресом сервера NFS.

Шаг 4. Проверьте соединение

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

Вручную создайте том nfs в кластере k8s

Справочное руководство:medium.com/@no special/крутой звонок…

Создать pv на основе nfs

nfs.yaml:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
  labels:
    name: mynfs # name can be anything
spec:
  storageClassName: manual # same storage class as pvc
  capacity:
    storage: 200Mi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.1.7 # ip addres of nfs server
    path: "/srv/nfs/mydata2" # path to directory

Разверните nfs.yaml:

$ kubectl apply -f nfs.yaml
$ kubectl get pv,pvc
persistentvolume/nfs-pv   100Mi      RWX            Retain           Available

создать пвх

Создайте файл объявления постоянного тома и разверните его.Следует отметить, что accessModes должны быть согласованы с ранее созданным pv

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteMany #  must be the same as PersistentVolume
  resources:
    requests:
      storage: 50Mi

развертывать

$ kubectl apply -f nfs_pvc.yaml
$ kubectl get pvc,pv
persistentvolumeclaim/nfs-pvc   Bound    nfs-pv   100Mi      RWX

создать модуль

Создайте простое развертывание nginx, используя этот pvc,nfs-pod.yaml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nfs-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      volumes:
      - name: nfs-test
        persistentVolumeClaim:
          claimName: nfs-pvc # same name of pvc that was created
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: nfs-test # name of volume should match claimName volume
          mountPath: /usr/share/nginx/html # mount inside of contianer

Разверните Nginx:

$ kubectl apply -f nfs_pod.yaml 
$ kubectl get po
nfs-nginx-6cb55d48f7-q2bvd   1/1     Running

Часто задаваемые вопросы: Не удалось создать POD - причина в отсутствии драйвера NFS

Ошибка создания пода с использованием тома nfs в k8s:

Причина: на узле не установлены пакеты, необходимые для монтирования клиента nfs.

root@k8s0:~# kubectl describe pod/nfs-nginx-766d4bf45f-n7dlt
Name:         nfs-nginx-766d4bf45f-n7dlt
Namespace:    default
Priority:     0
Node:         k8s2/172.16.2.102
Start Time:   Fri, 10 Jul 2020 18:04:58 +0800
Labels:       app=nginx
              pod-template-hash=766d4bf45f
Annotations:  cni.projectcalico.org/podIP: 192.168.109.86/32
Status:       Running
IP:           192.168.109.86
IPs:
  IP:           192.168.109.86
Controlled By:  ReplicaSet/nfs-nginx-766d4bf45f
Containers:
  nginx:
    Container ID:   docker://88299398d40ead29e991e57c6bad5d0e6d0396c21c2e69b0d2afb4ab7cce6044
    Image:          nginx
    Image ID:       docker-pullable://nginx@sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Fri, 10 Jul 2020 18:17:00 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /usr/share/nginx/html from nfs-test (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-mhtqt (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  nfs-test:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  nfs-pvc
    ReadOnly:   false
  default-token-mhtqt:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-mhtqt
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason       Age        From               Message
  ----     ------       ----       ----               -------
  Normal   Scheduled    <unknown>  default-scheduler  Successfully assigned default/nfs-nginx-766d4bf45f-n7dlt to k8s2
  Warning  FailedMount  21m        kubelet, k8s2      MountVolume.SetUp failed for volume "nfs-pv" : mount failed: exit status 32
Mounting command: systemd-run
Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/9c0b53d9-581c-4fc4-a286-7c4a8d470e74/volumes/kubernetes.io~nfs/nfs-pv --scope -- mount -t nfs 172.16.100.105:/mnt/sharedfolder /var/lib/kubelet/pods/9c0b53d9-581c-4fc4-a286-7c4a8d470e74/volumes/kubernetes.io~nfs/nfs-pv
Output: Running scope as unit run-r3892d691a70441eb975bc53bb7aeca72.scope.
mount: wrong fs type, bad option, bad superblock on 172.16.100.105:/mnt/sharedfolder,
       missing codepage or helper program, or other error
       (for several filesystems (e.g. nfs, cifs) you might
       need a /sbin/mount.<type> helper program)

       In some cases useful info is found in syslog - try
       dmesg | tail or so.
  Warning  FailedMount  21m  kubelet, k8s2  MountVolume.SetUp failed for volume "nfs-pv" : mount failed: exit status 32
Mounting command: systemd-run
Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/9c0b53d9-581c-4fc4-a286-7c4a8d470e74/volumes/kubernetes.io~nfs/nfs-pv --scope -- mount -t nfs 172.16.100.105:/mnt/sharedfolder /var/lib/kubelet/pods/9c0b53d9-581c-4fc4-a286-7c4a8d470e74/volumes/kubernetes.io~nfs/nfs-pv
Output: Running scope as unit run-r8774f015f759436d843d408eb6c941ec.scope.

Решение:

Ubuntu/debian выполняется на узле k8s, и установлена ​​поддержка клиента nfs.

sudo apt-get install nfs-common

Через некоторое время после завершения установки вы можете обнаружить, что модуль может работать нормально.

Проверьте, правильно ли k8s использует том nfs

Создайте тестовую веб-страницу в модуле nginx с именем файла index.html:

$ kubectl exec -it nfs-nginx-6cb55d48f7-q2bvd bash
#填入index.html内容用于测试
$ sudo vi /usr/share/nginx/html/index.html
this should hopefully work

Вы можете убедиться, что тот же файл теперь существует на сервере nfs и что nginx может его прочитать:

$ ls /srv/nfs/mydata$
$ cat /srv/nfs/mydata/index.html
this should hopefully work
# 将nginx pod通过nodeport暴露为服务,以使可通过浏览器访问
$ kubectl expose deploy nfs-nginx --port 80 --type NodePort
$ kubectl get svc
$ nfs-nginx    NodePort    10.102.226.40   <none>        80:32669/TCP

Откройте браузер и введите :

Этот пример: 192.168.99.157:32669

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

$ kubectl delete deploy nfs-nginx
$ kubectl delete pvc nf-pvc
--> kubectl delete svc nfs-nginx
$ ls /srv/nfs/mydata/
index.html