生產中常用的幾種存儲
第一種傳統
SAN:iscsi,fc
NAS:nfs,cifs
第二種分布式的
glusterfs,rbd,cephfs
第三種雲存儲
EBS,Azure Disk,阿里雲,騰訊雲
K8S 存儲類型:
emptyDir
Pod 里面各容器共享存儲,Pod 在節點創建就會生成,生命周期隨着運行的Pod
kubectl explain pods.spec.volumes.emptyDir
vim pod-emptyDir.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-emptyDir
namespace: default
labels:
app: myapp
tier: frontend
annotations:
doudou/create-by: "cluster admin"
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 的幾種寫法:
#command:
#- "/bin/sh"
#- "-c"
#- "while true: do echo $(date) >> /data/index.html;sleep 2; done"
#command: ['/bin/sh','-c','while true;do echo $(date) >> /data/index.html; sleep 2; done']
command: ['/bin/sh']
args: ["-c","while true;do echo $(date) >> /data/index.html; sleep 2; done"]
volumes:
- name: html
emptyDir: {}
[root@k8s-master volumes]# kubectl apply -f pod-emptyDir.yaml
pod/pod-emptyDir created
[root@k8s-master volumes]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-emptyDir 2/2 Running 0 11s 10.244.2.72 k8s-node1 <none> <none>
[root@k8s-master volumes]# curl 10.244.2.72
Sun Apr 28 03:25:24 UTC 2019
Sun Apr 28 03:25:28 UTC 2019
Sun Apr 28 03:25:32 UTC 2019
hostPath
Pod 掛載節點文件系統到Pod里面,生命周期隨Node生命周期
kubectl explain pods.spec.volumes.hostPath
https://kubernetes.io/docs/concepts/storage/volumes/#hostpath
vim pod-hostPath.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-hostPath
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/
volumes:
- name: html
hostPath:
path: /data/pod/volume1
type: DirectoryOrCreate
在各節點創建目錄
mkdir /data/pod/volume1
[root@k8s-master volumes]# kubectl create -f pod-hostpath.yaml
pod/pod-vol created
[root@k8s-master volumes]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-vol 1/1 Running 0 10s 10.244.2.70 k8s-node1 <none> <none>
[root@k8s-master volumes]# curl 10.244.2.70
node1
[root@k8s-master volumes]# kubectl delete -f pod-hostpath.yaml
pod "pod-vol" deleted
[root@k8s-master volumes]# kubectl create -f pod-hostpath.yaml
pod/pod-vol created
[root@k8s-master volumes]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-vol 1/1 Running 0 3s 10.244.1.207 k8s-node2 <none> <none>
[root@k8s-master volumes]# curl 10.244.1.207
node2
NFS
Pod隨NFS 配置的生命周期
nfs的簡單配置
yum install nfs-utils -y
mkdir /data/volumes -pv
vim /etc/exports
/data/volumes/ 10.0.0.0/8(rw,no_root_squash)
vim /data/volumes/index.html
<h1>NFS volumes<h1>
然后在各節點測試一下
綁定hosts
10.211.55.11 k8s-master
mount -t nfs k8s-master:/data/volumes /mnt
如果報錯:需要安裝包yum install nfs-utils -y
然后umount /mnt
kubectl explain pods.spec.volumes.nfs
vim pod-nfs.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-nfs
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/
volumes:
- name: html
nfs:
path: /data/volumes
server: k8s-master
[root@k8s-master volumes]#kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-nfs 1/1 Running 0 11s 10.244.2.73 k8s-node1 <none> <none>
[root@k8s-master volumes]# curl 10.244.2.73
<h1>NFS volumes<h1>
PVC
用來掛載持久化磁盤,用戶不用關心存儲的細節,只需要分配存儲資源就行
在定義PVC 之前要創建PV
kubectl explain pv
kubectl explain pv.spec
先在NFS 機器定義好存儲
mkdir /data/volumes/v{1,2,3,4,5}
vim /etc/exports
/data/volumes/v1 10.0.0.0/8(rw,no_root_squash)
/data/volumes/v2 10.0.0.0/8(rw,no_root_squash)
/data/volumes/v3 10.0.0.0/8(rw,no_root_squash)
/data/volumes/v4 10.0.0.0/8(rw,no_root_squash)
/data/volumes/v5 10.0.0.0/8(rw,no_root_squash)
service nfs restart
vim pv-demp.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv001
labels:
name: pv001
spec:
nfs:
path: /data/volumes/v1
server: k8s-master
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv002
labels:
name: pv002
spec:
nfs:
path: /data/volumes/v2
server: k8s-master
accessModes: ["ReadWriteOnce"]
capacity:
storage: 5Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv003
labels:
name: pv003
spec:
nfs:
path: /data/volumes/v3
server: k8s-master
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 20Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv004
labels:
name: pv004
spec:
nfs:
path: /data/volumes/v4
server: k8s-master
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 10Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv005
labels:
name: pv005
spec:
nfs:
path: /data/volumes/v5
server: k8s-master
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 10Gi
kubectl apply -f pv-demp.yaml
[root@k8s-master volumes]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv001 2Gi RWO,RWX Retain Available 12m
pv002 5Gi RWO Retain Available 12m
pv003 20Gi RWO,RWX Retain Available 12m
pv004 10Gi RWO,RWX Retain Available 12m
pv005 10Gi RWO,RWX Retain Available 12m
注意:現在版本,如果PV 在使用是不能夠刪除的,刪除的時候回卡住
現在創建PVC
kubectl explain pvc.spec
vim pod-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
spec:
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 6Gi
---
apiVersion: v1
kind: Pod
metadata:
name: pod-pvc
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/
volumes:
- name: html
persistentVolumeClaim:
claimName: mypvc
kubectl apply -f pod-pvc.yaml
[root@k8s-master volumes]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mypvc Bound pv004 10Gi RWO,RWX 4m5s
[root@k8s-master volumes]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv001 2Gi RWO,RWX Retain Available 58m
pv002 5Gi RWO Retain Available 58m
pv003 20Gi RWO,RWX Retain Available 58m
pv004 10Gi RWO,RWX Retain Bound default/mypvc 58m
pv005 10Gi RWO,RWX Retain Available 58m
[root@k8s-master volumes]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-pvc 1/1 Running 0 47m 10.244.1.209 k8s-node2 <none> <none>
kubectl describe pod pod-pvc
vim /data/volumes/v4/index.html
<h1> pv 4 <h1>
[root@k8s-master v4]# curl 10.244.1.209
<h1> pv 4 <h1>
當然可以測試一下數據庫類型的Pod,這樣是永久持久的。