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

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/466012.html
標籤:其他
上一篇:Redis
