目录
转载请注明出处
相关链接
- K8S单机部署-00.旧版本卸载
- K8S单机部署-01.单机部署K8S
- K8S单机部署-02.Kuboard面板部署
- K8S单机部署-03.验证K8S的第一个Deployment
- K8S单机部署-04.NFS服务器搭建
- K8S单机部署-05.静态持久化之PV、PVC(基于NFS)
- K8S单机部署-06.动态持久化StorageClass(基于NFS)
- K8S单机部署-07.调整nodePort端口范围
- K8S单机部署-08.安装ingress-nginx-controller
- K8S单机部署-10.增加自定义域名解析
- K8S单机部署-11.安装Kubernetes Metrics Server监控
Persistent volume
Persistent Volume (持久存储卷)简称PV,是一个K8S资源对象,所以我们可以单独创建一个PV。它不和Pod直接发生关系,而是通过Persistent Volume Claim(PV索取),简称PVC来实现动态绑定。Pod定义里指定的是PVC,然后PVC会根据Pod的要求去自动绑定合适的PV给Pod使用。
PV的访问模式有三种:
1、ReadWriteOnce:
是最基本的方式,可读可写,但只支持被单个Pod挂载。简称:RWO – ReadWriteOnce
2、ReadOnlyMany:
可以以只读的方式被多个Pod挂载。 简称:ROX – ReadOnlyMany
3、ReadWriteMany:
简称:RWX – ReadWriteMany。这种存储可以以读写的方式被多个Pod共享。不是每一种存储都支持
这三种方式,像共享方式,目前支持的还比较少,比较常用的是NFS。
PVC绑定PV时通常根据两个条件来绑定,“存储的大小” 及 “访问模式”。
创建PV有两种方式:
静态PV
管理员手动创建一堆PV,组成一个PV池,供PVC来绑定。
动态PV
在现有PV不满足PVC的请求时,可以使用存储分类(StorageClass),描述具体过程为:PV先创建分类,PVC请求已创建的某个类(StorageClass)的资源,这样就达到动态配置的效果。即通过一个叫 Storage Class的对象由存储系统根据PVC的要求自动创建。
PV创建完后状态会变成Available,等待被PVC绑定。一旦被PVC邦定,PV的状态会变成Bound,就可以被定义了相应PVC的Pod使用。Pod使用完后会释放PV,PV的状态变成Released。变成Released的PV会根据定义的回收策略做相应的回收工作。
PV有三种回收策略:
1、Retain
Retain就是保留现场,K8S什么也不做,等待用户手动去处理PV里的数据,处理完后,再手动删除PV。
2、Delete
Delete 策略,K8S会自动删除该PV及里面的数据。
3、Recycle
Recycle方式,K8S会将PV里的数据删除,然后把PV的状态变成Available,又可以被新的PVC绑定使用。
在实际使用场景里,PV的创建和使用通常不是同一个人。一般为:管理员创建一个PV池,开发人员创建Pod和PVC,PVC里定义了Pod所需存储的大小和访问模式,然后PVC会到PV池里自动匹配最合适的PV给Pod使用
K8S+NFS静态存储模式案例:
部署NFS服务器
PV存储卷创建
kubectl apply -f default_name_pv.yaml
default_name_pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: k8s-nfs-pv
namespace: default
spec:
capacity:
storage: 50G
accessModes:
- ReadWriteMany
nfs:
server: 192.168.21.223
path: /middle/nfsdata/
PV配置参数说明:
Capacity 指定 PV 的容量为 100M;
accessModes 指定访问模式为 ReadWriteOnce,支持的访问模式有:
ReadWriteOnce – PV 能以 read-write 模式 mount 到单个节点。
ReadOnlyMany – PV 能以 read-only 模式 mount 到多个节点。
ReadWriteMany – PV 能以 read-write 模式 mount 到多个节点。
persistentVolumeReclaimPolicy 指定当 PV 的回收策略为 Recycle,支持的策略有:
Retain – 需要管理员手工回收。
Recycle – 清除 PV 中的数据,效果相当于执行 rm -rf /thevolume/*;
Delete – 删除 Storage Provider 上的对应存储资源,例如 AWS EBS、GCE PD、Azure、Disk、OpenStack Cinder Volume 等。
storageClassName 指定 PV 的 class 为 nfs。相当于为 PV 设置了一个分类,PVC 可以指定 class 申请相应 class 的 PV。
path:指定 PV 在 NFS 服务器上对应的目录。
PVC存储卷创建
kubectl apply -f kubectl apply -f default_name_pvc.yaml
default_name_pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: k8s-nfs-pv
namespace: default
spec:
accessModes:
- ReadWriteMany
storageClassName: ""
resources:
requests:
storage: 1G
POD使用PVC
依旧来创建Nginx来进行验证, 在创建Nginx的时候将pod的日志目录挂载到我们的PVC
nginx 服务
apiVersion: v1
kind: Service
metadata:
name: demo-nginx
labels:
app: demo-nginx
spec:
type: NodePort
ports:
# node port 要求端口大于30000
- nodePort: 30013
port: 80
targetPort: 80
protocol: TCP
selector:
app: demo-nginx
---
# nginx 部署 deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-nginx
labels:
app: demo-nginx
spec:
replicas: 1
selector:
matchLabels:
app: demo-nginx
template:
metadata:
labels:
app: demo-nginx
spec:
containers:
- name: demo-nginx
image: docker.io/nginx:1.22.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
resources:
requests:
memory: "1Gi"
cpu: "200m"
volumeMounts:
- mountPath: /var/log/nginx
name: nginx-data
volumes:
- name: nginx-data
persistentVolumeClaim:
claimName: k8s-nfs-pv
restartPolicy: Always
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
revisionHistoryLimit: 10
progressDeadlineSeconds: 600
验证
查看pv, pvc 以及pod
[root@master deploy-demo]# kubectl get pv,pvc,pod
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/k8s-nfs-pv 50G RWX Retain Bound default/k8s-nfs-pv 3m34s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/k8s-nfs-pv Bound k8s-nfs-pv 50G RWX 3m27s
NAME READY STATUS RESTARTS AGE
pod/demo-nginx-64fbfbd89b-krg8t 1/1 Running 0 3m17s
[root@master deploy-demo]#
[root@master deploy-demo]#
[root@master deploy-demo]#
[root@master deploy-demo]#
[root@master deploy-demo]# ll /middle/nfsdata/
total 12
-rw-r--r-- 1 nfsnobody nfsnobody 420 Jan 13 20:18 access.log
-rw-r--r-- 1 nfsnobody nfsnobody 12 Jan 13 18:00 demo.txt
-rw-r--r-- 1 nfsnobody nfsnobody 900 Jan 13 20:18 error.log
可以看到 在我们的NFS共享存储下已经有了nginx的日志相关文件
同时可以发现,这里的弊端在pod使用pvc的时候每次都需要创建pvc 和pv 相对繁琐, 后面我们将实践动态存储的方式
转载请注明出处来源