k8s入門之PV和PVC(八)

景少發表於2022-04-27

某些應用是要持久化資料的,如果直接持久化在pod所在節點,當pod因為某種原因重建或被排程另外一臺節點,是無法訪問到之前持久化的資料,所以需要一個公共儲存資料的地方,無論pod刪除重建或重新排程到其他節點都能訪問原來的資料,使用nfs就可以到達此目的。

一、安裝nfs

1.在k8sMaster主節點上安裝nfs服務端

apt install -y nfs-kernel-server
systemctl start nfs-server
systemctl enable nfs-server
systemctl status nfs-server

檢視安裝後的狀態為active

建立目錄並設定許可權

mkdir -p /nfs/data
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports

不要忘了重啟nfs-server

systemctl restart nfs-server

2.在兩臺k8sworker節點上安裝nfs客戶端

apt install -y nfs-common
mkdir -p /nfs/data
# 把本地的/nfs/data掛載到主節點上
mount 192.168.59.110:/nfs/data /nfs/data

3.測試

在某臺worker節點上往目錄中寫入測試檔案資料

echo "nfs data" >> /nfs/data/test.txt

在所有節點上都能檢視到寫入的資料,並且是一樣的

二、使用原始方式掛載pod資料目錄

1.先刪除之前dev名稱空間下的所有資源

kubectl delete ns dev

2.把ns、deployment、svc資源的描述合併在一個yaml檔案中

vi nginx-deploy-svc.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: dev
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
  namespace: dev
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: nginxvolume
          mountPath: /usr/share/nginx/html
      volumes:
      - name: nginxvolume
        #通過nfs服務掛載
        nfs:
          server: 192.168.59.110
          # 此處要特別注意:一定要手動建立nginx子目錄,否則pod在過載的時候會報目錄不存在異常
          path: /nfs/data/nginx
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: svc-nginx
  name: svc-nginx
  namespace: dev
spec:
  selector:
    app: nginx
  type: NodePort
  ports:
  - port: 8000
    protocol: TCP
    targetPort: 80

3.建立資源物件

kubectl apply -f nginx-deploy-svc.yaml

檢視svc的ip與埠號

4.測試

在掛載目錄中建立index.html

echo "hello,nfs" >> /nfs/data/nginx/index.html

通過ip埠訪問,可以看到讀取的就是nfs目錄中的內容

現在你可以把dev名稱空間刪除,然後重新建立這些資源,再次訪問的時候,發現資料還在。

三、PV

PV:持久卷(Persistent Volume),將應用需要持久化的資料儲存到指定位置,與namespace無關

1.先建立nfs目錄

# 在master節點執行
mkdir -p /nfs/data/01
mkdir -p /nfs/data/02
mkdir -p /nfs/data/03

2.建立基於nfs的pv物件

(1)建立pv資原始檔

vi pv.yaml

(2)編寫三個pv資源物件,大小分別是:10M,1G,5G

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-10m
spec:
  capacity:
    storage: 10M
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/01
    server: 192.168.59.110
---

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-1gi
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/02
    server: 192.168.59.110
---

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-5gi
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  nfs:
    path: /nfs/data/03
    server: 192.168.59.110

(3)建立pv物件

kubectl apply -f pv.yaml

3.檢視建立結果

kubectl get pv

pv物件列表

某個pv物件的詳細資訊

四、PVC

PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷規格

1.建立pvc

(1)建立pvc資原始檔

vi pvc.yaml

(2)編寫pvc資源申明資訊

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: nginx-pvc
  namespace: dev
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      # 申請200M的空間
      storage: 200Mi
  storageClassName: nfs

(3)建立pvc物件

kubectl apply -f pvc.yaml

2.檢視建立結果

kubectl get pvc -owide -n dev

由於申請的是200M空間,可以看到k8s自定繫結到合適的pv物件上,即選擇大小為1G的pv物件。

再回過頭來檢視pv物件的繫結資訊,可以看到已經和剛剛建立的pvc物件繫結了。

五、繫結pod與pvc

1.建立新的yaml檔案

(1)新建資原始檔

vi nginx-dp-svc-pvc.yaml

(2)使用persistentVolumeClaim屬性指定剛剛建立的nginx-pvc物件

apiVersion: v1
kind: Namespace
metadata:
  name: dev
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
  namespace: dev
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: nginxvolume
          mountPath: /usr/share/nginx/html
      volumes:
      - name: nginxvolume
        # 使用pvc
        persistentVolumeClaim:
          claimName: nginx-pvc
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: svc-nginx
  name: svc-nginx
  namespace: dev
spec:
  selector:
    app: nginx
  type: NodePort
  ports:
  - port: 8000
    protocol: TCP
    targetPort: 80

(3)建立pod,svc物件

kubectl apply -f nginx-dp-svc-pvc.yaml

2.測試

由於申請的是pvc是與名稱為pv-1gi的pv物件繫結的,所以往/nfs/data/02資料夾中寫入index.htm檔案進行測試

echo "hello,pv" >> /nfs/data/02/index.html

使用ip訪問服務,可以看到正確輸出了內容

再次檢視pv,pvc資訊

3.刪除pod

當刪除pod,與之繫結的pvc物件也會被刪除,pv物件的狀態變成Released

相關文章