1. 程式人生 > 實用技巧 >樹莓派k8s叢集安裝nfs-client-provisioner

樹莓派k8s叢集安裝nfs-client-provisioner

nfs-client-provisioner簡介

nfs-client-provisioner 可動態為kubernetes提供pv卷,是Kubernetes的簡易NFS的外部provisioner,本身不提供NFS,需要現有的NFS伺服器提供儲存。持久卷目錄的命名規則為:${namespace}-${pvcName}-${pvName}

K8S的外部NFS驅動可以按照其工作方式(是作為NFS server還是NFS client)分為兩類:

nfs-client:

它通過K8S內建的NFS驅動掛載遠端的NFS伺服器到本地目錄;然後將自身作為storage provider關聯storage class。當用戶建立對應的PVC來申請PV時,該provider就將PVC的要求與自身的屬性比較,一旦滿足就在本地掛載好的NFS目錄中建立PV所屬的子目錄,為Pod提供動態的儲存服務。

nfs-server:

與nfs-client不同,該驅動並不使用k8s的NFS驅動來掛載遠端的NFS到本地再分配,而是直接將本地檔案對映到容器內部,然後在容器內使用ganesha.nfsd來對外提供NFS服務;在每次建立PV的時候,直接在本地的NFS根目錄中建立對應資料夾,並export出該子目錄。

本文將介紹使用nfs-client-provisioner這個應用,利用NFS Server給Kubernetes作為持久儲存的後端,並且動態提供PV。前提條件是有已經安裝好的NFS伺服器,並且NFS伺服器與Kubernetes的Slave節點網路能夠連通。將nfs-client驅動做為一個deployment部署到K8S叢集中,然後對外提供儲存服務

安裝準備

  • **樹莓派k8s叢集:**最好3節點,單節點也可以。
root@pi4-master01:~# kubectl get nodes -o wide
NAME      STATUS  ROLES  AGE   VERSION  INTERNAL-IP  EXTERNAL-IP  OS-IMAGE      KERNEL-VERSION   CONTAINER-RUNTIME
pi4-master01  Ready  master  4d18h  v1.15.10  192.168.5.18  <none>    Ubuntu 20.04 LTS  5.4.0-1011-raspi  docker://18.9.9
pi4-node01   Ready  node   4d17h  v1.15.10  192.168.5.19  <none>    Ubuntu 20.04 LTS  5.4.0-1011-raspi  docker://18.9.9
pi4-node02   Ready  node   4d17h  v1.15.10  192.168.5.20  <none>    Ubuntu 20.04 LTS  5.4.0-1011-raspi  docker://18.9.9
  • 樹莓派k8s叢集已安裝helm
root@pi4-master01:~/k8s/cluster-monitoring-0.37.0# helm version
Client: &version.Version{SemVer:"v2.15.0", GitCommit:"c2440264ca6c078a06e088a838b0476d2fc14750", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.15.0+unreleased", GitCommit:"9668ad4d90c5e95bd520e58e7387607be6b63bb6", GitTreeState:"dirty"}

NFS伺服器準備

筆者手裡正好有一臺威聯通TS-251+,可以直接開通NFS服務。讀者可以自行搭建NFS伺服器。比如臨時在master節點上安裝NFS,把master節點作為NFS伺服器。

  • 安裝 NFS 軟體包
apt install nfs-kernel-server  # 安裝 NFS伺服器端
  • 新增 NFS 共享目錄
vim /etc/exports

若需要把 “/nfs-share” 目錄設定為 NFS 共享目錄,請在該檔案末尾新增下面的一行:

/nfs-share *(rw,sync,no_root_squash)

新建“/nfs-share”目錄,併為該目錄設定最寬鬆的許可權:

mkdir /nfs-share
chmod -R 777 /nfs-share
  • 啟動 NFS 服務
systemctl restart nfs-kernel-server
  • 確認NFS服務是否啟動正常
root@pi4-master01:~# showmount -e 192.168.5.18
Export list for 192.168.5.18:
/nfs-share *
  • 叢集所有節點安裝nfs客戶端
apt install -y nfs-common

建議master節點安裝ansible,並和nodes節點配置ssh免密登入,這樣可以在master節點直接執行

ansible pi4k8s -m shell -a 'apt install -y nfs-common'

安裝nfs-client-provisioner

這裡我們選擇用helm安裝,helm有一個預設倉庫stable,指向https://kubernetes-charts.storage.googleapis.com, 國內訪問比較困難,所以網上很多安裝helm的文件都以https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts來代替。但最近發現,這個倉庫也不再更新了,很多chart的最新版本都沒有,這裡提供一個新地址http://mirror.azure.cn/kubernetes/charts經簡單驗證,發現這個倉庫至少比阿里的那個倉庫新,建議切換。

root@pi4-master01:~# helm repo remove stable
"stable" has been removed from your repositories
root@pi4-master01:~# helm repo add stable http://mirror.azure.cn/kubernetes/charts/
"stable" has been added to your repositories
root@pi4-master01:~# helm repo list
NAME   	URL
local  	http://127.0.0.1:8879/charts
stable 	http://mirror.azure.cn/kubernetes/charts/
root@pi4-master01:~# helm search nfs-client
NAME                         	CHART VERSION	APP VERSION	DESCRIPTION
stable/nfs-client-provisioner	1.2.8        	3.1.0      	nfs-client is an automatic provisioner that used your *al...
  • 使用helm安裝
helm install -n nfs-client-provisioner \
stable/nfs-client-provisioner \
--set nfs.server=192.168.5.18 \
--set nfs.path=/nfs-share \
--set storageClass.name=nfs-client \
--set image.repository=quay.io/external_storage/nfs-client-provisioner-arm \
--set image.tag=latest

nfs.server為NFS伺服器的IP地址,在nfsv4中nfs.path直接使用/nfs-share 即可。storageClass.name預設為nfs-client,可自定義,另外也可以將nfs-client作為預設storageclass,這樣在申請pvc時不需在指定storageclass name。因為我們的樹莓派k8s叢集已經設定了local-path為預設storageclass,這裡就不再切換了,具體命令可以參考如下:

helm install -n nfs-client-provisioner \
stable/nfs-client-provisioner \
--set nfs.server=192.168.5.18 \
--set nfs.path=/nfs-share \
--set storageClass.name=nfs-client \
--set image.repository=quay.io/external_storage/nfs-client-provisioner-arm \
--set image.tag=latest \
--set storageClass.defaultClass=true
  • 檢視建立的pod
root@pi4-master01:~# kubectl get pod|grep nfs
NAME                                             READY   STATUS    RESTARTS   AGE
nfs-client-provisioner-5d7dd8f468-f2ctd           1/1     Running   0          6s
  • 檢視建立的storageclass
root@pi4-master01:~# kubectl get storageclass|grep nfs
nfs-client             cluster.local/nfs-client-provisioner   23m

驗證

  • 建立一個yaml檔案
(
cat <<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  storageClassName: "nfs-client"
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Mi
---
kind: Pod
apiVersion: v1
metadata:
  name: test-pod
spec:
  containers:
  - name: test-pod
    image: arm64v8/busybox
    command:
      - "/bin/sh"
    args:
      - "-c"
      - "touch /mnt/SUCCESS && exit 0 || exit 1"
    volumeMounts:
      - name: nfs-pvc
        mountPath: "/mnt"
  restartPolicy: "Never"
  volumes:
    - name: nfs-pvc
      persistentVolumeClaim:
        claimName: nfs-pvc

EOF
) > pvc-test.yaml
  • 執行yaml檔案
root@pi4-master01:/home/charts/nfs-client-provisioner# kubectl apply -f pvc-test.yaml
  • pvc將自動建立並自動申請pv
root@pi4-master01:/home/charts/nfs-client-provisioner# kubectl get pvc,pv
NAME                            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/nfs-pvc   Bound    pvc-627b935c-0419-49b4-b6bb-530a7d8860ad   10Mi       RWX            nfs-client     47s

NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                           STORAGECLASS   REASON   AGE
persistentvolume/pvc-627b935c-0419-49b4-b6bb-530a7d8860ad   10Mi       RWX            Delete           Bound    default/nfs-pvc                                 nfs-client              47s
  • 檢視/nfs-share目錄,自動建立了儲存卷目錄,SUCCESS欄位成功寫入該目錄下
root@pi4-master01:/# ll /nfs-share/default-nfs-pvc-pvc-627b935c-0419-49b4-b6bb-530a7d8860ad/
總用量 8
drwxrwxrwx 2 root root 4096 8月   8 20:36 ./
drwxrwxrwx 5 root root 4096 8月   8 20:36 ../
-rw-r--r-- 1 root root    0 8月   8 20:36 SUCCESS
推薦:站長