k8s存儲支持多種模式:本地存儲:hostPath/emptyDir骑祟,傳遞網(wǎng)絡(luò)存儲:iscsi/nfs锋叨,分布式網(wǎng)絡(luò)存儲:glusterfs/rbd/cephfs添瓷,以及云存儲等鹅髓;
k8s默認容器如果重建瑟押,則容器中文件將丟失陷寝,為了解決這些問題锅很,通常我們會將容器中需要持久化的文件存儲到其他可持久化存儲目錄中。
1.存儲到臨時目錄
spec:
nodeSelector:
kubernetes.io/hostname: k8s-node2 #指定工作在節(jié)點2上
containers:
- name: nginx-web
image: nginx:latest
ports:
- containerPort: 80
volumeMounts:
- mountPath: /usr/share/nginx/html #容器目錄
name: html
volumes:
- name: html
emptyDir: {}
這種模式數(shù)據(jù)存儲將隨著pod的創(chuàng)建與銷毀生命周期存在凤跑,數(shù)據(jù)將不持久化存儲粗蔚。
2.存儲到宿主機目錄
spec:
nodeSelector:
kubernetes.io/hostname: k8s-node2 #指定工作在節(jié)點2上
containers:
- name: nginx-web
image: nginx:latest
ports:
- containerPort: 80
volumeMounts:
- mountPath: /usr/share/nginx/html #容器目錄
name: html
volumes:
- name: html
hostPath: #類型為hostPath,即宿主機文件路徑
path: /data/nginx/html #宿主機目錄
type: DirectoryOrCreate
優(yōu)點:簡單易用饶火,無需額外支持
缺點:依賴宿主機磁盤容量鹏控,pod與宿主機存在強耦合致扯,不利于管理。當pod部署多個副本并分配到不同host時当辐,數(shù)據(jù)不共享抖僵;當pod漂移時,數(shù)據(jù)不同步缘揪;當node故障時耍群,數(shù)據(jù)易丟失;
3.存儲到NFS中
3.1安裝NFS
#master節(jié)點安裝nfs
[root@k8s-master nginx]# yum -y install nfs-utils
#創(chuàng)建nfs目錄
[root@k8s-master nginx]# mkdir -p /nfs/data/
#修改權(quán)限
[root@k8s-master nginx]# chmod -R 777 /nfs/data
#編輯export文件,這個文件就是nfs默認的配置文件
[root@k8s-master nginx]# vim /etc/exports
/nfs/data *(rw,no_root_squash,sync)
#配置生效
[root@k8s-master nginx]# exportfs -r
#查看生效
[root@k8s-master nginx]# exportfs
/nfs/data <world>
#啟動rpcbind找筝、nfs服務(wù)
[root@k8s-master nginx]# systemctl restart rpcbind && systemctl enable rpcbind
[root@k8s-master nginx]# systemctl restart nfs && systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
#查看 RPC 服務(wù)的注冊狀況
[root@k8s-master nginx]# rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
#showmount測試
[root@k8s-master nginx]# showmount -e 192.168.0.66
Export list for 192.168.0.66:
/nfs/data *
3.2創(chuàng)建PV
創(chuàng)建前我們先在master節(jié)點 mkdir /nfs/data/nginx 創(chuàng)建出一個nginx子目錄供pv使用
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
namespace: default
labels:
pv: nfs-pv
spec:
capacity:
storage: 100Mi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
nfs:
server: 192.168.0.66
path: "/nfs/data/nginx" #NFS目錄蹈垢,需要該目錄在NFS上存在
然后執(zhí)行創(chuàng)建
[root@k8s-master nfs]# kubectl apply -f pv.yaml
persistentvolume/nfs-pv created
[root@k8s-master nfs]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
nfs-pv 100Mi RWX Retain Available 7s
PV 的訪問模式(accessModes)有三種:
ReadWriteOnce(RWO):是最基本的方式,可讀可寫袖裕,但只支持被單個 Pod 掛載曹抬。
ReadOnlyMany(ROX):可以以只讀的方式被多個 Pod 掛載。
ReadWriteMany(RWX):這種存儲可以以讀寫的方式被多個 Pod 共享急鳄。
PV 的回收策略(persistentVolumeReclaimPolicy谤民,即 PVC 釋放卷的時候 PV 該如何操作)也有三種:
Retain,不清理, 保留 Volume(需要手動清理)
Recycle疾宏,刪除數(shù)據(jù)张足,即 rm -rf /volume/*(只有 NFS 和 HostPath 支持)
Delete,刪除存儲資源坎藐,比如刪除 AWS EBS 卷(只有 AWS EBS, GCE PD, Azure Disk 和 Cinder 支持)
PVC釋放卷是指用戶刪除一個PVC對象時为牍,那么與該PVC對象綁定的PV就會被釋放。
PersistentVolume有四種狀態(tài):
Available: 可用狀態(tài)
Bound: 綁定到PVC
Released: PVC被刪掉岩馍,但是尚未回收
Failed : 自動回收失敗
3.3創(chuàng)建PVC
vim pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 50Mi #容量
selector:
matchLabels:
pv: nfs-pv #關(guān)聯(lián)pv 的label,key/value要一致
執(zhí)行創(chuàng)建命令
[root@k8s-master nfs]# kubectl apply -f pvc.yaml
persistentvolumeclaim/nfs-pvc created
[root@k8s-master nfs]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
nfs-pvc Bound nfs-pv 100Mi RWX
[root@k8s-master nfs]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
nfs-pv 100Mi RWX Retain Bound default/nfs-pvc
此時pv狀態(tài)已經(jīng)從Available變成Bound狀態(tài)吵聪。
3.4 創(chuàng)建pod并使用pvc存儲資源
vim nginx.yaml #我們用nginx鏡像進行驗證,將html目錄映射到nfs目錄中
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-nginx
namespace: default
spec:
selector:
matchLabels:
app: nfs-nginx
replicas: 2
template:
metadata:
labels:
app: nfs-nginx
spec:
containers:
- name: nginx-web
image: nginx:latest
ports:
- containerPort: 80
volumeMounts:
- mountPath: /usr/share/nginx/html
name: html
volumes:
- name: html
persistentVolumeClaim:
claimName: nfs-pvc
---
#service
apiVersion: v1
kind: Service
metadata:
name: nfs-nginx
namespace: default
spec:
type: NodePort
ports:
- port: 80
protocol: TCP
targetPort: 80
nodePort: 31681
selector:
app: nfs-nginx
創(chuàng)建pod容器
[root@k8s-master nfs]# kubectl apply -f nginx.yaml
[root@k8s-master nfs]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nfs-nginx-7695b95db6-l74zx 1/1 Running 0 12s 10.244.2.93 k8s-node1 <none> <none>
nfs-nginx-7695b95db6-qcqp8 1/1 Running 0 12s 10.244.1.22 k8s-node2 <none> <none>
如果kubectl describe pods xxx 發(fā)現(xiàn)有如下報錯兼雄,則在節(jié)點服務(wù)器上安裝nfs-unitls
Output: Running scope as unit run-20005.scope.
mount: wrong fs type, bad option, bad superblock on 192.168.0.66:/nfs/data/nginx,
missing codepage or helper program, or other error
各節(jié)點安裝并啟用nfs
yum install nfs-utils
systemctl start nfs & systemctl enable nfs
systemctl start rpcbind & systemctl enable rpcbind
3.5驗證
3.5.1直接放文件到NFS的/nfs/data/nginx目錄
我們在/nfs/data/nginx目錄創(chuàng)建了一個1.html文件
<html>
<body>Test01</body>
</html>
3.5.2 在容器1的/usr/share/nginx/html目錄創(chuàng)建文件2.html
<html>
<body>Test02</body>
</html>
3.5.3 在容器2的/usr/share/nginx/html目錄創(chuàng)建文件3.html
<html>
<body>Test03</body>
</html>
分別測試訪問2.html和3.html
此外我們進入容器查看吟逝,目錄中文件是共享的:
root@nfs-nginx-7695b95db6-l74zx:/usr/share/nginx/html# ls
1.html 2.html 3.html
3.5.4 pod銷毀重建
kubectl delete -f nginx.yaml
kubectl apply -f nginx.yaml
再次訪問1.html/2.html/3.html,依舊可以訪問到赦肋,說明文件未丟失块攒。
root@nfs-nginx-7695b95db6-78wml:/usr/share/nginx/html# ls
1.html 2.html 3.html
#新創(chuàng)建的容器,依舊可以看到這些文件
4.結(jié)語
NFS掛載有靜態(tài)與動態(tài)兩種不同模式佃乘,動態(tài)掛載模式需要創(chuàng)建StorageClass囱井,使用過程相對復(fù)雜,本文采用的是靜態(tài)模式趣避。
另外對于k8s集群來講庞呕,NFS并不是最理想存儲模式,建議優(yōu)先采用分布式存儲方案,如cephfs存儲住练。
本文參考
https://www.cnblogs.com/sunsky303/p/11578206.html
http://www.reibang.com/p/65ed4bdf0e89