Kubernetes持久化存储
一、emptyDir持久化存储配置
emptyDir
的一些用途:
-
-
- 缓存空间,例如基于磁盘的归并排序。
- 为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。
- 在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件。
-
和上述 volume 不同的是,如果删除 Pod,emptyDir 卷中的数据也将被删除,一般 emptyDir卷用
于 Pod 中的不同 Container 共享数据。它可以被挂载到相同或不同的路径上。默认情况下,
emptyDir 卷支持节点上的任何介质,可能是 SSD、磁盘或网络存储,具体取决于自身的环境。可以将
emptyDir.medium 字段设置为 Memory,让 Kubernetes 使用 tmpfs(内存支持的文件系统),虽然 tmpfs
非常快,但是 tmpfs 在节点重启时,数据同样会被清除,并且设置的大小会被计入到 Container 的内存限制当中。
说明:
当启用 SizeMemoryBackedVolumes
特性门控时, 你可以为基于内存提供的卷指定大小。
如果未指定大小,则基于内存的卷的大小为 Linux 主机上内存的 50%
1-1、创建emptyDir yaml文件
vim emptydir-volume.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: emptydir-volume name: emptydir-volume spec: replicas: 1 selector: matchLabels: app: emptydir-volume template: metadata: creationTimestamp: null labels: app: emptydir-volume spec: containers: - image: nginx:1.16.1-alpine name: nginx volumeMounts: #容器内挂载参数值 - mountPath: /mnt #容器内挂载参数目录路径 name: emptydir-share #挂载名字,名称要跟volume. - name 名称一致 volumes: #创建挂载模式参数值 - name: emptydir-share #挂载存储名称 emptyDir: {} #设置为emptyDir挂载模式
1-2、执行创建的emptyDir yaml文件命令
#创建 emptyDir 命令 kubectl create -f emptydir-volume.yaml #查看创建状态命令 kubectl get pod
注:emptyDir容器数据共享最好是一个yaml文件实现一个容器两个运气,这样才能实现数据共享。
上面的emptyDir yaml文件只需在配置文件里containers 下面添加一个镜像配置即可
二、hostPath持久化数据存储
2-1、创建hostPath yaml文件
vim hostpath-volume.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: hostpath-volume name: hostpath-volume spec: replicas: 1 selector: matchLabels: app: hostpath-volume template: metadata: creationTimestamp: null labels: app: hostpath-volume spec: containers: - image: nginx:1.16.1-alpine name: nginx volumeMounts: - mountPath: /opt #挂载容器目录路径 name: hostpath-share volumes: - name: hostpath-share hostPath: #设置为hostPath数据持久化 path: /data #指定宿主机目录,这个目录每个节点需要都存在 type: Directory #设置hostPath type类型
注:hostPath 卷常用的 type(类型)如下:
1) type 为空字符串:默认选项,意味着挂载 hostPath 卷之前不会执行任何检查。
2) DirectoryOrCreate:如果给定的 path 不存在任何东西,那么将根据需要
创建一个权限为0755 的空目录,和 Kubelet 具有相同的组和权限。
3) Directory:目录必须存在于给定的路径下。
4) FileOrCreate:如果给定的路径不存储任何内容,则会根据需要创建一个空文件,
权限设置为 0644,和 Kubelet 具有相同的组和所有权。
5) File:文件,必须存在于给定路径中。
6) Socket:UNIX 套接字,必须存在于给定路径中。
7) CharDevice:字符设备,必须存在于给定路径中。
2-2、创建hostPath 容器命令和查询创建后状态
#创建 kubectl create -f hostpath-volume.yaml #查询 kubectl get pod
注:
在创建使用hostPaht持久化容器的时候,会存在volume.hostpath.path指定的宿主机目录相互节点数据不能同步,
如果数据不能同步会存在hostpath容器删除重建安装到其它节点上面,原来的数据不能功能想到新的节点上面使用。
hostPaht不推荐使用
2-3、挂载/etc/localtime 到容器修改容器里面的时间
vim web-hostpah.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: web-hostpath name: web-hostpath spec: replicas: 2 selector: matchLabels: app: web-hostpath template: metadata: labels: app: web-hostpath spec: containers: - image: nginx name: web-hostpath ports: - containerPort: 80 name: hostpath-svc volumeMounts: - name: cm-localtime mountPath: /etc/localtime readOnly: true volumes: - name: cm-localtime hostPath: path: /etc/localtime type: File
三、NFS持久化数据存储
3-1、安装nfs服务(nfs服务只在一台机器安装即可)和每个节点上面安装nfs客户端软件
#找一台机器安装NFS服务端,命令如下 yum install nfs* rpcbind -y #NFS服务端创建共享目录 mkdir /data/share -p #NFS服务器创建共享目录 vim /etc/exports /data/share/ *(rw,sync,no_subtree_check,no_root_squash) #启动NFS服务端 exportfs -r systemctl restart nfs rpcbind #k8s所有节点安装nfs客户端 yum install nfs-utils -y #挂载测试 mount -t nfs nfs-serverIP:/data/share /mnt/
3-2、创建NFS yaml文件 vim nfs-volume.yaml
apiVersion: apps/v1 kind: Deployment metadata: labels: app: nfs-volume name: nfs-volume spec: replicas: 1 selector: matchLabels: app: nfs-volume template: metadata: creationTimestamp: null labels: app: nfs-volume spec: containers: - image: nginx:1.16.1-alpine name: nginx volumeMounts: - mountPath: /opt #挂载目录路径 name: nfs-volume volumes: - name: nfs-volume nfs: #指向nfs 持久化存储 server: 192.168.3.81 #指向NFS服务器IP地址 path: /data/share #指向nfs服务器挂载目录
3-2、创建nfs容器和查看nfs容器创建状态
#创建 kubectl create -f nfs-volume.yaml #查询 kubectl get pod
注:
NFS持久化存储和NAS持久化存储配置一样只需稍作修改既可以使用NAS持久化存储。
生产环境不推荐使用NFS作为持久化存储
四、PVS配置NFS或NAS
说明:关于NFS服务架设看上面3-1示例
4-1、PV回收策略
➢ Retain:保留,该策略允许手动回收资源,当删除PVC时,PV仍然存在,PV被视为已释放,管理员可以手动回收卷。
➢ Recycle:回收,如果Volume插件支持,Recycle策略会对卷执行rm -rf清理该PV,并使其可用于下一个新的PVC,
但是本策略将来会被弃用,目前只有NFS和HostPath支持该策略。
➢ Delete:删除,如果Volume插件支持,删除PVC时会同时删除PV,动态卷默认为Delete,目前支持Delete的存储
后端包括AWS EBS, GCEPD, Azure Disk, or OpenStack Cinder等。
➢ 可以通过persistentVolumeReclaimPolicy: Recycle字段配置
4-4、创建NFS PV yaml 文件 vim pv-nfs.yaml
#NFS PV yaml文件 apiVersion: v1 kind: PersistentVolume metadata: name: pv-nfs spec: capacity: storage: 5Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle storageClassName: nfs-slow nfs: path: /data/share server: 192.168.3.81 #创建 kubectl create -f pv-nfs.yaml
注:
➢ capacity:容量配置
➢ volumeMode:卷的模式,目前支持Filesystem文件系统) 和 Block(块),其中Block类型需要后端存储支持,
默认为文件系统
➢ storage: 5Gi :配置容量大小。容量大小限制需要挂载类型支撑。NFS不支持容量大小限制
➢ accessModes:该PV的访问模式
➢ storageClassName:PV的类,一个特定类型的PV只能绑定到特定类别的PVC;
➢ persistentVolumeReclaimPolicy:回收策略
➢ mountOptions:非必须,新版本中已弃用
[root@k8s-master1 pvc]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv-hostpath 5Gi RWO Recycle Available hostpath 8s pv-nfs 5Gi RWO Recycle Available nfs-slow 12h
#hostPath PV yaml vim pv-hostpath.yaml apiVersion: v1 kind: PersistentVolume metadata: name: pv-hostpath labels: type: local spec: capacity: storage: 5Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle storageClassName: hostpath hostPath: path: "/mnt/data" #创建 kubectl create -f pv-hostpath.yaml
4-7、创建PVC绑定NFS PV yaml文件
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-nfs-claim spec: storageClassName: nfs-slow #这里指定是创建PV里面的storageClassName这个名称,进行PV绑定 accessModes: - ReadWriteOnce #这里访问策略和PV里面的策略保持一致 resources: requests: storage: 3Gi #这里要小于或等于PV storage 大小
注:pvc 没有指定命名空间因为需要跟pod在一个命名空间。如果需要指定命名空间自己在指向命名空间
4-7-1、创建PVC 绑定NFS和查看创建后状态
#创建 [root@k8s-master1 pvc]# kubectl create -f pvc-nfs-claim.yaml persistentvolumeclaim/pvc-nfs-claim created #查看pvc绑定状态 [root@k8s-master1 pvc]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-nfs-claim Bound pv-nfs 5Gi RWO nfs-slow 8s [root@k8s-master1 pvc]# kubectl get pv pv-nfs NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv-nfs 5Gi RWO Recycle Bound default/pvc-nfs-claim nfs-slow 12h
注:通过查看绑定状态,status 信息显示了Bound 以绑定状态,查看nfs pv的时候也显示Bound状态。说明NFS pv 已经更PVC绑定成功
4-8、挂载pvc
4-8-1、创建挂载yaml文件。把pvc挂载到Deployment nginx上面
apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx-pvc-nfs name: nginx-pvc-nfs spec: replicas: 2 selector: matchLabels: app: nginx-pvc-nfs template: metadata: creationTimestamp: null labels: app: nginx-pvc-nfs spec: containers: - image: nginx:1.16.1-alpine name: nginx volumeMounts: - mountPath: /usr/share/nginx/html #挂载目录路径 name: pvc-nfs-storage #这里的名称要跟volumes. -name 名称一致 volumes: - name: pvc-nfs-storage persistentVolumeClaim: claimName: pvc-nfs-claim #这里的pvc-nfs-claim名称是pvc里面命名的名称需要跟pvc里面的名称一致,忘记需要进行查看
4-8-2、创建绑定和查看创建状态
#创建nginx和pvc绑定命令 [root@k8s-master1 pvc]# kubectl create -f nginx-pvc-nfs.yaml deployment.apps/nginx-pvc-nfs created #查看状态 [root@k8s-master1 pvc]# kubectl get pod NAME READY STATUS RESTARTS AGE emptydir-volume-5c5f5f99cb-9nptl 1/1 Running 2 (98m ago) 21h hostpath-volume-6896d5b675-mm467 1/1 Running 2 (97m ago) 21h nfs-volume-76df7d5f7f-r24jm 1/1 Running 2 (97m ago) 21h nginx-7f56bb9bdc-qgmvb 1/1 Running 4 (97m ago) 47h nginx-pvc-nfs-69ccf559d6-9g8jm 1/1 Running 0 13s nginx-pvc-nfs-69ccf559d6-v7kqj 1/1 Running 0 13s web-5675698566-qlpl7 1/1 Running 4 (97m ago) 47h
4-8-3、登录容器查看nfs容器直接数据是否互相共享