iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 22
0
自我挑戰組

我真的覺得認為 K8s 到底在火什麼系列 第 22

以 NFS 實作 K8s 上的儲存

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

NFS 儲存卷

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

  • server: NFS Server 的 IP 或是能解析的域名
  • path: NFS Server 定義的共享檔案路徑
  • readOnly: 是否要唯讀,預設是 false

先在 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


上一篇
K8s 8s 的儲存
下一篇
PV 與 PVC
系列文
我真的覺得認為 K8s 到底在火什麼30

尚未有邦友留言

立即登入留言