生产中常用的几种存储
第一种传统
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,这样是永久持久的。