某些應用是要持久化資料的,如果直接持久化在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