kubernetes - day22

September 12, 2020

接續上一章的實作,這邊將使用 NFS(Network File System) 分散式儲存系統實現永久儲存,它可以讓客戶端像是在本地端取得資料。

NFS 儲存卷

這邊將不使用 GKE 操作而是使用本地端架設的 K8s 來操作,將會有四台虛擬機,一台 NFS,其它則為 K8s 叢集。我們會在一台虛擬機上安裝 NFS,並設定要導出的儲存空間,之後再藉由設定檔方式去讓 POD 取得 NFS 的掛載目錄。在 POD 生命週期中,此方式只是會卸載掛載的資訊,並非像 emptyDir 一樣是直接刪除。其定義字段如下

先在 NFS 的虛擬機上安裝 NFS 環境,在 NFS Server 主機安裝 nfs-kernel-server,客戶端安裝 nfs-common也就是 K8s 叢集的節點,安裝完之後在 NFS Server 設定以下

sudo apt install  -y
sudo mkdir /k8sData
echo "/home/cch/k8sData *(rw,sync,no_root_squash)" | sudo tee /etc/exports # , 不能有空格隔開
sudo exportfs -r # reload
sudo showmount -e # 顯示 NFS 設定的要掛載目錄

K8s 的叢集節點進行 NFS 的掛載

$ mount NFS_SERVER_IP:/home/cch/k8sData /mnt
$ mount # 觀察有無掛載

這是 yaml 的測試範例

apiVersion: v1
kind: Pod
metadata:
  name: pod-nfs-demo
  namespace: default
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html/
  volumes:
  - name: html
    nfs:
      path: /home/cch/k8sData
      server: 192.168.134.130

接著在 NFS Server 上新增以下,上述完成 K8s 叢集上節點的 /mnt 下要有檔案

$ vi index.html # 要在 NFS Server 要掛載的目錄下新增
<h1>NFS Server $(hostname)</h1>

將剛定義的 yaml 使用 apply 或其它方式進行布署,接著觀察布署後的 POD,並用 curl 驗證是否有讀取 NFS Server 的資料。

$ kubectl get pods -o wide
NAME           READY   STATUS    RESTARTS   AGE     IP            NODE     NOMINATED NODE   READINESS GATES
pod-nfs-demo   1/1     Running   0          2m14s   10.244.2.32   node02   <none>           <none>
cch@master:~$ curl 10.244.2.32
<h1>NFS Server $(hostname)</h1>
cch@master:~$ curl 10.244.2.32
<h1>NFS Server $(hostname)</h1>

這邊在使用 ReplicaSet 實現多副本,用來實現不同節點上能夠有同步的資訊,也實現說不會因為被重新調度而讀取不到資料。

kind: ReplicaSet
metadata:
  name: rs-nfs-demo
  namespace: default
spec:
  replicas: 5
  selector:
    matchLabels:
      app: myapp
      release: canary
  template:
    metadata:
      name: myapp
      namespace: default
      labels:
        app: myapp
        release: canary
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html/
      volumes:
        - name: html
          nfs:
            path: /home/cch/k8sData
            server: 192.168.134.130

同樣取得 POD 資訊,並用 curl 驗證

$ kubectl get pods -o wide -l app=myapp,release=canary
NAME                READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
rs-nfs-demo-479qk   1/1     Running   0          95s   10.244.1.28   node01   <none>           <none>
rs-nfs-demo-8mk2z   1/1     Running   0          95s   10.244.2.35   node02   <none>           <none>
rs-nfs-demo-99z8w   1/1     Running   0          95s   10.244.1.26   node01   <none>           <none>
rs-nfs-demo-bkmbb   1/1     Running   0          95s   10.244.2.36   node02   <none>           <none>
rs-nfs-demo-hz4l9   1/1     Running   0          95s   10.244.1.27   node01   <none>           <none>
cch@master:~$ curl 10.244.1.28
<h1>NFS Server $(hostname)</h1>
cch@master:~$ curl 10.244.2.35
<h1>NFS Server $(hostname)</h1>
cch@master:~$ curl 10.244.1.26
<h1>NFS Server $(hostname)</h1>
cch@master:~$ curl 10.244.2.36
<h1>NFS Server $(hostname)</h1>

透過上面的驗證可以說明,NFS 可以為 POD 達到持久性儲存,POD 被重新調度時也能夠有完整的資訊。要將其儲存刪除則是要以 NFS 管理員身分去做刪除,並非是 POD