查看k8s支持的存儲類
kubectl explain pods.spec.volumes
1.emptydir
kubectl explain pods.spec.volumes.emptyDir
kubectl explain pods.spec.containers 容器中設置
kubectl explain pods.spec.containers.volumeMounts
實例:
cd manifests/
mkdir volumes
cd volumes/
cp ../pod-demo.yaml ./
mv pod-demo.yaml pod-vol-demo.yaml
vim pod-vol-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
labels:
app: myapp
tier: frontend
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
volumeMounts: 容器中掛載
- name: html 關聯pod存儲卷名
mountPath: /data/web/html 容器中掛載的路徑
- name: busybox
image: busybox:latest
imagePullPolicy: IfNotPresent
volumeMounts:
- name: html
mountPath: /data
command:
- "/bin/sh"
- "-c"
- "sleep 3600"
volumes: pod存儲卷
- name: html pod存儲卷名
emptyDir: {} pod存儲卷類型
kubectl apply -f pod-vol-demo.yaml
kubectl exec -it pod-demo -c busybox -- /bin/sh
-c 指定busybox容器
df -hT 查看掛載
cd /data
date >> index.html
kubectl exec -it pod-demo -c myapp -- /bin/sh
連入myapp容器
df -hT
cd /data/web/html
cat index.html 可以判定兩個容器共享一個目錄 emptyDir
實例:
kubectl delete -f pod-vol-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
labels:
app: myapp
tier: frontend
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/
- name: busybox
image: busybox:latest
imagePullPolicy: IfNotPresent
volumeMounts:
- name: html
mountPath: /data
command:
- "/bin/sh"
- "-c"
- "while true; do echo $(date) >> /data/index.html;sleep 2;done" 命令不會終止,終止容器就會退出
volumes:
- name: html
emptyDir: {}
kubectl apply -f pod-vol-demo.yaml
curl 10.244.1.120 訪問驗證數據
1.1 gitrRepo
kubectl explain pod.spec.volumes.gitRepo
2.hostPath 宿主機路徑 掛載宿主機真實目錄,pod消失,數據還在宿主機目錄上
節點級持久
kubectl explain pod.spec.volumes.hostPath
vim pod-hostpath-vol.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-vol-hostpath
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/
volumes:
- name: html
hostPath: pod存儲卷類型
path: /data/pod/volume1 指定的hostPath存儲路徑,即本地目錄路徑
type: DirectoryOrCreate 類型 目錄不存在則創建
在兩個節點執行,用於驗證
mkdir -p /data/pod/volume1
echo "node1.baidu.com" > /data/pod/volume1/index.html
創建
kubectl apply -f pod-hostpath-vol.yaml
kubectl get pods -o wide
驗證
curl 10.244.1.122
3.網絡共享存儲 nfs 具有持久性
實例
node2作為 nfs共享存儲
yum install nfs-utils -y
mkdir /data/volumes
vim /etc/exports
/data/volumes 192.168.81.0/24(rw,no_root_squash) 壓縮root權限
systemctl start nfs nfs工作在2049端口
去node1節點測試
mount -t nfs node2:/data/volumes /mnt
不支持掛載,安裝nfs套件
yum install nfs-utils -y
mount -t nfs node2:/data/volumes /mnt 測試能掛載上才能做網絡共享存儲
然后卸載 umount /mnt/
cp pod-hostpath-vol.yaml pod-nfs-vol.yaml
kubectl explain pods.spec.volumes.nfs
vim pod-nfs-vol.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-vol-nfs
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/
volumes:
- name: html
nfs: 指定pod存儲卷類型為nfs網絡共享存儲
path: /data/volumes nfs的共享目錄
server: node2 nfs服務器地址
創建
kubectl apply -f pod-nfs-vol.yaml
驗證
kubectl get pods -o wide
去nfs共享目錄創建一個網頁
echo "<h1>nfs store</h1>" > /data/volumes/index.html
curl 10.244.2.96
4.persistentVolumeClaim PVC 持久存儲申請
kubectl explain pod.spec.volumes.persistentVolumeClaim
kubectl explain pvc
pvc 與 pv一一對應
pvc可以給多個pod訪問
創建pv
以前面nfs為存儲
cd /data/volumes
mkdir v{1,2,3,4,5}
vim /etc/exports
/data/volumes/v1 192.168.81.0/24(rw,no_root_squash)
/data/volumes/v2 192.168.81.0/24(rw,no_root_squash)
/data/volumes/v3 192.168.81.0/24(rw,no_root_squash)
/data/volumes/v4 192.168.81.0/24(rw,no_root_squash)
/data/volumes/v5 192.168.81.0/24(rw,no_root_squash)
systemctl restart nfs
exportfs -arv
在node1上 showmount -e node2
在master上k8s把5個存儲卷定義成pv
kubectl explain pv
kubectl explain pv.spec
kubectl explain pv.spec.nfs
vim pv-demo.yaml
apiVersion: v1
kind: PersistentVolume 資源類型 pv
metadata:
name: pv001 pv名
labels: pv標簽
name: pv001
polity: fast
spec: pv規格
nfs: pv的存儲類型nfs
path: /data/volumes/v1 nfs共享的目錄
server: node2 nfs服務器地址
accessModes: ["ReadWriteMany","ReadWriteOnce"] pv讀寫模式 多路讀寫 單路讀寫
capacity: pv最大容量
storage: 1Gi 最大容量1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv002
labels:
name: pv002
polity: fast
spec:
nfs:
path: /data/volumes/v2
server: node2
accessModes: ["ReadWriteOnce"]
capacity:
storage: 5Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv003
labels:
name: pv003
polity: fast
spec:
nfs:
path: /data/volumes/v3
server: node2
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 20Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv004
labels:
name: pv004
polity: fast
spec:
nfs:
path: /data/volumes/v4
server: node2
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 10Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv005
labels:
name: pv005
polity: fast
spec:
nfs:
path: /data/volumes/v5
server: node2
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 10Gi
創建
kubectl apply -f pv-demo.yaml
kubectl get pv
注:RECLAIM POLICY 回收策略 pvc綁定解除之后數據處理問題
創建pvc
vim pod-vol-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim 資源類型 pvc
metadata:
name: mypvc pvc名
namespace: default pvc名稱空間要與使用該pvc的pod名稱空間一致
spec: 規格
accessModes: ["ReadWriteMany"] 指定使用pv的方式 多路讀寫
resources: 要求的資源大小
requests: 要求
storage: 6Gi 大小6G存儲
---
apiVersion: v1
kind: Pod
metadata:
name: pod-vol-pvc
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/
volumes: 指定pod存儲類型
- name: html pod存儲名
persistentVolumeClaim: pod存儲類型為pvc
claimName: mypvc 申請名,就是pvc名
創建pvc和pod
kubectl apply -f pod-vol-pvc.yaml
驗證
kubectl get pv 可以看到一個pv被綁定了
kubectl get pvc 查看pvc
kubectl get pods -o wide
kubectl describe pods pod-vol-pvc
測試:
到nfs的 v5目錄
echo test node v5 > index.html
然后在任一節點
curl 10.244.2.49
kubectl delete pods pod-vol-pvc 刪除pod數據依然在