1.Volume
• Kubernetes中的Volume提供了在容器中挂载外部存储的能力
• Pod需要设置卷来源(spec.volume)和挂载点(spec.containers.volumeMounts)两个信息后才可
以使用相应的Volume
存储类型
本地 (hostPath emptyDir)
网络 (NFS Ceph Glusterfs)
公有云 (AWS EBS)
(1)emptyDir
临时目录,缓存,随着pod消失而消失
创建一个空卷,挂载到Pod中的容器。Pod删除该卷也会被删除。
应用场景:Pod中容器之间数据共享
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: write
image: centos
command: ["bash","-c","for i in {1..100};do echo $i >> /data/hello;sleep 1;done"]
volumeMounts:
- name: data
mountPath: /data
- name: read
image: centos
command: ["bash","-c","tail -f /data/hello"]
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
emptyDir: {}
#同一个pod中的不同容器共享一个存储卷
(2)hostPath
挂载Node文件系统上文件或者目录到Pod中的容器。 要考虑到pod的生命周期是短暂的,当pod重新生成的时候,也许就会换node节点,这时导致原先的共享目录就无法使用。
应用场景:Pod中容器需要访问宿主机文件
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: busybox
image: busybox
args:
- /bin/sh
- -c - sleep 36000
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
hostPath:
path: /tmp
type: Directory
#Type类型
#在底层主机上创建的文件或目录只能由root写入。您需要在特权Container中以root身份运行您的进程, 或者修改主机上的文件权限以便能够写入hostPath卷
(3)gitRepo
可以在pod创建的时候把git的代码同步克隆下来,前提是宿主机有git命令,是依赖于宿主机做的,需要注意的是,无论pod中的代码修改或者是git仓库中的代码修改都不会互相影响,也就是说我git仓库代码更新了,pod还保持 刚clone下来的样子,当然这个也可以实现,在pod中来一个辅助容器,实时同步git仓库代码
2.PersistentVolume
(1)部署nfs共享服务器
[root@test ~]# yum install -y nfs-utils
[root@test ~]# mkdir /www
[root@test ~]# vim /etc/exports
/www 192.168.74.0/24(rw,sync,no_root_squash)
关于nfs的权限可以百度
(2)简单使用nfs共享存储创建pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default #指定命名空间
labels:
app: nginx #控制器的标签
spec: #控制器期望的状态
replicas: 1 #指定副本个数
selector: #标签选择器
matchLabels: #逻辑域(可以写多个标签)
app: nginx
template: #pod模板定义
metadata: #pod的元数据
labels: #pod标签一定符合标签选择器,至少符合标签选择器的一个
app: nginx
spec: #pod的期望的状态
nodeName: k8s-node1 #指定分配节点
containers: #列表所以下面会有-
- name: nginx-deployment #镜像
image: nginx:1.15
ports:
- containerPort: 80
volumeMounts: #数据卷
- name: wwwroot #名称 可以写多个通过名称来对应
mountPath: /usr/share/nginx/html #镜像发布路径
volumes:
- name: wwwroot #对应上面数据卷名称
nfs: #类型nfs
server: 192.168.74.233 #nfs对应IP
path: /www/aa #nfs的共享目录路径
readOnly #只读 可以不写默认是读写
restartPolicy: Always #重启策略
(3)PV和PVC的概念
官网文档:
https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistent-volumes
PV是不能指定名称空间的,因为PV属于集群级别的资源,同样名称空间(namespace)也是集群级别的资源
PVC可以定义名称空间
Pvc和pv都存储在etcd中
只要pv被pvc绑定着是无法直接删除pvc
Pv和pvc限制大小取决于你底层存储,如果你底层储存可以限制大小,那么他就可以,如果底层存储没有限制大小,比如nfs,他只是一个匹配依据,并没有实际上的大小限制
PersistentVolume(PV):对存储资源创建和使用的抽象,使得存储作为集群中的资源管理
• 静态
• 动态
• PersistentVolumeClaim(PVC):让用户不需要关心具体的Volume实现细节
PVC和PV之间是一 一对应的,但是一个一个pvc可以被多个pod对应,这个要取决于创建PVC的时候是否支持 accessModes
(4)PV的创建
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
labels: #可以定义标签来让pvc用标签选择器来绑定
name: my-pv
spec:
capacity: #给多大空间
storage: 5Gi #单位(E P T G M K m)计算1000 (EI PI TI GI MI KI)计算1024
accessModes: #访问模型是列表那么就可以定义很多种功能
- ReadWriteMany
persistentVolumeReclaimPolicy: Delete #设置回收策略
nfs:
path: /www/bb
server: 192.168.74.248
1 accessModes:访问模型
ReadWriteOnce (可以简写RWO)- 卷可以由单个节点以读写方式挂载
ReadOnlyMany (可以简写ROX)- 卷可以由许多节点以只读方式挂载
ReadWriteMany (可以简写RWX)- 卷可以由许多节点以读写方式挂载
2 回收策略设置(Reclaim Policy)
Retain(保留):如果下次还用就可以继续用
Recycle(回收):删除数据 把pv 空闲,可以让其他pvc使用
Delete(删除):pvc没有的时候pv直接删除
(5)PVC以及POD的创建
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default #指定命名空间
labels:
app: nginx #控制器的标签
spec: #控制器期望的状态
replicas: 1 #指定副本个数
selector: #标签选择器
matchLabels: #逻辑域(可以写多个标签)
app: nginx
template: #pod模板定义
metadata: #pod的元数据
labels: #pod标签一定符合标签选择器,至少符合标签选择器的一个
app: nginx
spec: #pod的期望的状态
nodeName: k8s-node1 #指定分配节点
containers: #列表所以下面会有-
- name: nginx-deployment #镜像
image: nginx:1.15
ports:
- containerPort: 80
volumeMounts:
- name: wwwroot
mountPath: /usr/share/nginx/html
volumes:
- name: wwwroot
persistentVolumeClaim:
claimName: my-pvc
restartPolicy: Always #重启策略
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
namespace: default # 跟pod在同一个命名空间
spec:
selector: #可以加标签选择器pv和pvc都使用相同标签选择器,对应绑定
matchLabels:
name: pv003
accessModes:
- ReadWriteMany #必须在pv的accessModes的子集,就是说得能满足pv的
resources:
requests: #要求存储空间
storage: 5Gi #pv的限制一定要大于或等于才可以绑定
3.PersistentVolume 动态供给
(1)简介
Kubernetes支持持久卷的存储插件:
https://kubernetes.io/docs/concepts/storage/persistent-volumes/
Kubernetes支持动态供给的存储插件:
https://kubernetes.io/docs/concepts/storage/storage-classes/
https://kubernetes.io/docs/tutorials/stateful-application/basic-stateful-set/
基于NFS存储实现数据持久化。
https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client/deploy
Dynamic Provisioning机制工作的核心在于StorageClass的API对象。
StorageClass声明存储插件,用于自动创建PV。
(2)部署插件
[root@k8s-master nfs]# wget https://raw.githubusercontent.com/kubernetes-incubator/external-storage/master/nfs-client/deploy/deployment.yaml
[root@k8s-master nfs]# wget https://raw.githubusercontent.com/kubernetes-incubator/external-storage/master/nfs-client/deploy/rbac.yaml
[root@k8s-master nfs]# wget https://raw.githubusercontent.com/kubernetes-incubator/external-storage/master/nfs-client/deploy/class.yaml
class.yaml定义存储类
[root@k8s-master nfs]# kubectl create -f rbac.yaml
[root@k8s-master nfs]# vim deployment.yaml
env:
- name: PROVISIONER_NAME
value: fuseim.pri/ifs
- name: NFS_SERVER
value: 192.168.74.233 #nfs共享的服务器IP
- name: NFS_PATH
value: /www #nfs共享服务器共享目录
volumes:
- name: nfs-client-root
nfs:
server: 192.168.74.233 #nfs共享服务器IP
path: /www #nfs共享服务器IP
[root@k8s-master nfs]# kubectl create -f class.yaml
[root@k8s-master nfs]# kubectl create -f deployment.yaml
部署前可以修改yaml的命名空间,以及在那个node节点,然后提前导入镜像
查看
[root@k8s-master nfs]# kubectl get storageclass (简写sc)
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default #指定命名空间
labels:
app: nginx #控制器的标签
spec: #控制器期望的状态
replicas: 1 #指定副本个数
selector: #标签选择器
matchLabels: #逻辑域(可以写多个标签)
app: nginx
template: #pod模板定义
metadata: #pod的元数据
labels: #pod标签一定符合标签选择器,至少符合标签选择器的一个
app: nginx
spec: #pod的期望的状态
nodeName: k8s-node1 #指定分配节点
containers: #列表所以下面会有-
- name: nginx-deployment #镜像
image: nginx:1.15
ports:
- containerPort: 80
volumeMounts:
- name: wwwroot
mountPath: /usr/share/nginx/html
volumes:
- name: wwwroot
persistentVolumeClaim:
claimName: my-pvc
restartPolicy: Always #重启策略
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
storageClassName: managed-nfs-storage #指定存储类sc 直接自动创建pvc并且创建pv
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
存储类的回收机制如果是delete的话pvc被删除对应的pv也会被删除,然后nfs共享的自动创建目录也会删除,数据也随之丢失,所以可以设置回收机制
Pod → pvc → storageclass(简称sc,后端存储)→ pv