NFS Persistent Volume in Kubernetes Cluster

Делаю:
24.10.2019


$ kubectl version --short
Client Version: v1.16.2
Server Version: v1.16.2


По материалам индуса:

https://www.youtube.com/watch?v=to14wmNmRCI&list=PL34sAs7_26wNBRWM6BDhnonoA5FMERax0&index=21


Подготовили кластер и окружение как здесь.


Добавляю еще 1 виртуалку на которой будет смонтирован NFS раздел.

$ rm -rf ~/vagrant-kubernetes-nfs-serv && mkdir ~/vagrant-kubernetes-nfs-serv && cd ~/vagrant-kubernetes-nfs-serv


// Создаем Vagrantfile для виртуалки

$ cat <<EOF >> Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

ENV['VAGRANT_NO_PARALLEL'] = 'yes'

Vagrant.configure(2) do |config|
  config.vm.box = "centos/7"
  config.hostmanager.enabled = true
  config.hostmanager.include_offline = true

  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048"
    vb.cpus = 2
  end

  config.vm.define "nfs-serv.k8s" do |c|
    c.vm.hostname = "nfs-serv.k8s"
    c.vm.network "private_network", ip: "192.168.0.6"
  end
end
EOF


$ vagrant up


$ vagrant status
Current machine states:

nfs-serv.k8s              running (virtualbox)


$ vagrant ssh nfs-serv.k8s


Подготавливаем NFS сервер. Настраиваем экспорт. (На nfs-serv.k8s)

// пинг master ноды кластера
$ ping 192.168.0.10
ok

$ sudo yum install -y nfs-utils

$ sudo systemctl enable nfs-server
$ sudo systemctl start nfs-server

$ sudo mkdir -p /srv/nfs/kubedata

$ sudo chmod -R 777 /srv/nfs
$ sudo chown nobody: /srv/nfs/kubedata


Для демо, не для продуктового использования! Мне сейчас не до правильных настроек на тестовом сервере.

$ sudo vi /etc/exports
/srv/nfs/kubedata *(rw,sync,no_subtree_check,no_root_squash,no_all_squash,insecure)
$ sudo exportfs -rav

Посмотреть результаты:

$ sudo exportfs -v
$ sudo showmount -e


Подготовка закончена!


Изучаем всевозможные варианты использования

$ sudo vi /srv/nfs/kubedata/index.html

<h1>NFS Server</h1>


На хост машине. Проверка что nfs монтируется на узлах

// пароль kubeadmin
$ ssh root@node1

# showmount -e 192.168.0.6
Export list for 192.168.0.6:
/srv/nfs/kubedata *

# mount -t nfs 192.168.0.6:/srv/nfs/kubedata /mnt/

# mount | grep kubedata

# ls /mnt/
index.html

// kubernetes может сам смонтировать разделы
# umount /mnt


$ mkdir ~/tmp && cd ~/tmp/

$ curl -LJO https://bitbucket.org/sysadm-ru/kubernetes/raw/faf2f86a2c1bb82053c5aba9ea7c96463e4e61b0/yamls/4-pv-nfs.yaml


$ vi 4-pv-nfs.yaml

server: 192.168.0.6

$ kubectl create -f 4-pv-nfs.yaml


$ kubectl get pv
NAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS   REASON   AGE
pv-nfs-pv1   1Gi        RWX            Retain           Bound    default/pvc-nfs-pv1   manual                  18s


$ kubectl create -f https://bitbucket.org/sysadm-ru/kubernetes/raw/faf2f86a2c1bb82053c5aba9ea7c96463e4e61b0/yamls/4-pvc-nfs.yaml


$ kubectl get pv,pvc
NAME                          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS   REASON   AGE
persistentvolume/pv-nfs-pv1   1Gi        RWX            Retain           Bound    default/pvc-nfs-pv1   manual                  34s

NAME                                STATUS   VOLUME       CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/pvc-nfs-pv1   Bound    pv-nfs-pv1   1Gi        RWX            manual         22s


$ kubectl create -f https://bitbucket.org/sysadm-ru/kubernetes/raw/faf2f86a2c1bb82053c5aba9ea7c96463e4e61b0/yamls/4-nfs-nginx.yaml


$ kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-69bd64468b-w9zmv   1/1     Running   0          17s


$ kubectl exec -it nginx-deploy-69bd64468b-w9zmv -- /bin/sh

$ cd  /usr/share/nginx/html
$ cat index.html
<h1>NFS Server</h1>

$ exit


$ kubectl expose deploy nginx-deploy --port 80 --type NodePort


$ kubectl get svc nginx-deploy
NAME           TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
nginx-deploy   NodePort   10.100.31.163   <none>        80:30133/TCP   103s


$ curl node1:30133
<h1>NFS Server</h1>


Удаление созданного на кластере

$ kubectl delete svc nginx-deploy
$ kubectl delete deploy nginx-deploy
$ kubectl delete pvc pvc-nfs-pv1
$ kubectl delete pv pv-nfs-pv1