為啥需要數據卷
容器磁盤上的文件的生命周期是短暫的,這就使得在容器中運行重要應用時會出現一些問題。首先,當容器崩潰時,kubelet會重啟它,但是容器中的文件將丟失——容器以干凈的狀態(鏡像最初的狀態)重新啟動。其次,在 Pod 中同時運行多個容器時,這些容器之間通常需要共享文件。Kubernetes 中的 Volume 抽象就很好的解決了這些問題。
Volume類型
目前,Kubernetes支持以下Volume 類型:
NFS
NFS是Network File System的縮寫,即網絡文件系統。分布式文件系統協議,NFS基于RPC(Remote Procedure Call)遠程過程調用實現,其允許一個系統在網絡上與他人共享目錄和文件。通過使用NFS,用戶和程序就可以像訪問本地文件一樣訪問遠程系統上的文件。NFS是一個非常穩定的,可以移植的網絡文件。具備可擴展和高性能等特性,達到了企業級應用質量標準。
Kubernetes中通過簡單地配置就可以掛載NFS到Pod中,而NFS中的數據是可以永久保存的,同時NFS支持同時寫操作。
》》NFS原理
NFS 使用RPC(Remote Procedure Call)的機制進行實現,RPC使得客戶端可以調用服務端的函數。同時,由于有VFS的存在,客戶端可以像使用其它普通文件系統一樣使用NFS文件系統。經由操作系統的內核,將NFS文件系統的調用請求通過TCP/IP 發送至服務端的NFS服務。NFS服務器執行相關的操作,并將操作結果返回給客戶端。
emptyDir可以提供不同容器間的文件共享,但不能存儲;hostPath可以為不同容器提供文件的共享并可以存儲,但受制于節點限制,不能跨節點共享;這時需要網絡存儲 (NAS),即既可以方便存儲容器又可以從任何集群節點訪問
安裝NFS 服務端
# NFS是一個分布式系統,建議單獨部署一臺主機
# 創建一個共享目錄
mkdir -pv /usr/local/nfs/volumes
# 給這個目錄增加RW權限
chomd a+rw /usr/local/nfs/volumes
# Ubuntu 安裝NFS 服務端
sudo apt update
sudo apt install nfs-kernel-server
# centos 安裝NFS 服務端
sudo yum install nfs-utils rpcbind
sudo systemctl enable --now nfs-server rpcbind
# 配置NFS服務目錄 vim /etc/exports
追加 /usr/local/nfs/volumes *(rw,sync,no_subtree_check,no_root_squash)
# /usr/local/nfs/volumes 作為服務目錄向客戶端開放
# 10.244.0.0/16 表示這個網段IP都可以訪問,也可以 * 表示任何IP都可以訪問
# rw 讀寫權限
# sync 同步權限
# no_subtree_check 如果輸出目錄是一個子目錄,NFS服務器不檢查其父目錄的權限
# no_root_squash 客戶端連接服務端時如果使用是root用戶,那么也擁有對服務端分享的目錄的root權限# 重啟服務,讓上面的配置生效
sudo exportfs -ra
# 重新加載exports配置
sudo systemctl restart nfs-kernel-server
## 上面是針對 nfs 服務端的操作
## 下面對nfs檢測是否能使用,可以跟上面同一個節點或另外找一個節點 以下以是在k8s 集群的節點中操作
# 安裝客戶端
apt update
apt install -y nfs-common
# 創建NFS 客戶端掛載目錄
mkdir -pv /usr/local/kubernetes/nfs-volumes-mount
# 將NFS服務端/usr/local/nfs/volumes 的目錄掛載到NFS 客戶端的 /usr/local/kubernetes/nfs-volumes-mount 目錄
# 如果報錯 mount.nfs: access denied by server while mounting
# 要檢查 是否允許ip地址掛載,或是否有讀寫的權限
mount 172.30.164.60:/usr/local/nfs/volumes /usr/local/kubernetes/nfs-volumes-mount
# 查看是否掛載成功
df | grep mount# 取消NFS 客戶端掛載 注意不要直接在掛載目錄下執行(就是不能在nfs-volumes-mount目錄下執行),否則會報錯(device is busy
)
umount /usr/local/kubernetes/nfs-volumes-mount
# nfs-volumes-mount 這個文件夾也需要手動刪除
》》或者在安裝nfs客戶端節點 機器中 執行
》showmount -e 172.30.164.60 ip地址就是 nfs服務端的ip
PV PVC
》》定義pv
# 只需在master節點執行
# 創建pv的配置文件
apiVersion: v1
kind: PersistentVolume
metadata:name: nfs-pv-sqlserver
spec:# 設置容量capacity:storage: 5Gi# 訪問模式accessModes:# 該卷能夠以讀寫模式被多個節點同時加載- ReadWriteMany# 回收策略,這里是基礎擦除 相當于 rm -rf /掛載/persistentVolumeReclaimPolicy: Recyclenfs:# NFS 服務端設置的路徑 就是 vim /etc/exportspath: "/usr/local/nfs/volumes"# NFS 服務端地址server: 172.30.164.60readOnly: false
#
kubectl create -f nfs-pv-sqlserver.yml
#
kubectl get pv
》》定義pvc
# 也只需要在 master節點執行
# nfs-pvc-sqlserver.ymlapiVersion: v1
kind: PersistentVolumeClaim
metadata: name: nfs-pvc-sqlserver-zen
spec:accessModes:# 需要使用和PV 一致的訪問模式- ReadWriteMany# 按需分配資源resources:requests:storage: 2Gi# 部署 上面的yml文件
kubectl create -f nfs-pvc-sqlserver.yml
# 查看
kubectl get pvc
》》定義sqlserver 配置文件
# 創建命名空間
apiVersion: v1
kind: Namespace
metadata:name: sqlserver
---
# sqlserver-secret.yaml
apiVersion: v1
kind: Secret
metadata:name: mssql-secretnamespace: sqlserver
type: Opaque
data:MSSQL_SA_PASSWORD: "U3VwZXJTdHJvbmdQYXNzMTIzIQ==" # Base64 編碼的密碼(示例:SuperStrongPass123!)
---
# sqlserver 部署文件
apiVersion: apps/v1
kind: Deployment
metadata:name: mssql-deploymentnamespace: sqlserver
spec:replicas: 1selector:matchLabels:app: mssqltemplate:metadata:labels:app: mssqlspec:containers:- name: mssqlimage: mcr.microsoft.com/mssql/server:2022-latestports:- containerPort: 1433env:- name: MSSQL_PIDvalue: "Developer" # 版本:Developer/Express/Enterprise(按需選擇)- name: ACCEPT_EULAvalue: "Y"- name: MSSQL_SA_PASSWORDvalueFrom:secretKeyRef:name: mssql-secretkey: MSSQL_SA_PASSWORDvolumeMounts:- name: mssql-datamountPath: /var/opt/mssqlvolumes:- name: mssql-datapersistentVolumeClaim:claimName: nfs-pvc-sqlserver-zen
---
# sqlserver-service.yaml
apiVersion: v1
kind: Service
metadata:name: mssql-servicenamespace: sqlserver
spec:selector:app: mssqlports:- protocol: TCPport: 1433targetPort: 1433nodePort: 30099type: NodePort # 生產環境可改為 LoadBalancer 或 NodePort
可用把 PVC、PV、命名空間、應用部署(sqlserver) 放在一個ymal文件
# 創建命名空間
apiVersion: v1
kind: Namespace
metadata:name: sqlserver
---
# pv配置文件
apiVersion: v1
kind: PersistentVolume
metadata:name: nfs-pv-sqlserver# 由于 PV 是集群級別的資源,即 PV 可以跨 namespace 使用,所以 PV 的 metadata 中不用配置 namespace#namespace: sqlserverlabels:app: kaizen
spec:# 設置容量capacity:storage: 5Gi# 訪問模式accessModes:# 該卷能夠以讀寫模式被多個節點同時加載- ReadWriteMany# 回收策略,這里是基礎擦除 相當于 rm -rf /掛載/*persistentVolumeReclaimPolicy: RecyclestorageClassName: nfsnfs:# NFS 服務端設置的路徑 就是 vim /etc/exportspath: "/usr/local/nfs/volumes"# NFS 服務端地址server: 172.30.164.60readOnly: false
---
# pvc 配置文件
apiVersion: v1
kind: PersistentVolumeClaim
metadata: name: nfs-pvc-sqlserver-zennamespace: sqlserver
spec:accessModes:# 需要使用和PV 一致的訪問模式- ReadWriteMany# 按需分配資源resources:requests:storage: 2GistorageClassName: nfsselector:matchLabels:app: kaizen
---
# sqlserver-secret.yaml
apiVersion: v1
kind: Secret
metadata:name: mssql-secretnamespace: sqlserver
type: Opaque
data:MSSQL_SA_PASSWORD: "U3VwZXJTdHJvbmdQYXNzMTIzIQ==" # Base64 編碼的密碼(示例:SuperStrongPass123!)
---
# sqlserver 部署文件
apiVersion: apps/v1
kind: Deployment
metadata:name: mssql-deploymentnamespace: sqlserver
spec:replicas: 1selector:matchLabels:app: mssqltemplate:metadata:labels:app: mssqlspec:containers:- name: mssqlimage: mcr.microsoft.com/mssql/server:2022-latestports:- containerPort: 1433env:- name: MSSQL_PIDvalue: "Developer" # 版本:Developer/Express/Enterprise(按需選擇)- name: ACCEPT_EULAvalue: "Y"- name: MSSQL_SA_PASSWORDvalueFrom:secretKeyRef:name: mssql-secretkey: MSSQL_SA_PASSWORDvolumeMounts:- name: mssql-datamountPath: /var/opt/mssqlvolumes:- name: mssql-datapersistentVolumeClaim:claimName: nfs-pvc-sqlserver-zen
---
# sqlserver-service.yaml
apiVersion: v1
kind: Service
metadata:name: mssql-servicenamespace: sqlserver
spec:selector:app: mssqlports:- protocol: TCPport: 1433targetPort: 1433nodePort: 30099type: NodePort # 生產環境可改為 LoadBalancer 或 NodePort
》》密碼:SuperStrongPass123!
》》持續化了