一. PersistentVolume
PersistentVolume (PV) 是外部存储系统中的一块存储空间,由管理员创建和维护。与 Volume 一样,PV 具有持久性,生命周期独立于 Pod。
二. PersistentVolumeClaim
PersistentVolumeClaim (PVC) 是对 PV 的申请 (Claim)。PVC 通常由普通用户创建和维护。需要为 Pod 分配存储资源时,用户可以创建一个 PVC,指明存储资源的容量大小和访问模式(比如只读)等信息,Kubernetes 会查找并提供满足条件的 PV
三. StorageClass存储类介绍
也是我们所说的自动创建 路径放在了我们搭建nfs 的路径上的deployment上去定义路径
下面是一下的各种参数基于下面的yaml文件去查看
回收策略:reclaimPolicy参数
Recycle:清除 PV 中的数据,效果相当于执行 rm -rf
Delete:删除 Storage Provider 上的对应存储资源
Retain:需要管理员手工回收
accessModes
ReadWriteOnce:以 read-write 模式 mount 到单个节点
ReadOnlyMany:read-only 模式 mount 到多个节点
ReadWriteMany:read-write 模式 mount 到多个节点
Phase
Available – PV可以被使用
Bound – PV被绑定到PVC
Released – 被绑定的PVC被删除,可以被Reclaim
Failed – 自动回收失败
.
创建静态pv+pvc 这里基于nfs搭建的
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfspv1 #pv的名字
spec:
capacity: #用于定义PV的存储容量,当前只支持定义大小,未来会实现其他能力如:IOPS、吞吐量。
storage: 200Gi #创建存储的空间大小
accessModes:
- ReadWriteMany #用于定义资源的访问方式 (单个节点 这里用的是单节点可读可写)
storageClassName: nfs #类的名称
nfs:
path: /nfs/data #本地的路径
server: 172.28.104.92 #自己用的nfs服务器
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nfspvc1
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 100Gi
storageClassName: nfs
创建玩查看 已经是绑定状态
下面是基于storageclass的动态存储
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-claim1 # 名字
spec:
accessModes:
- ReadWriteMany #这里有三个参数可以使用
resources:
requests:
storage: 1Mi #用了多大 (这里只是测试)
storageClassName: nfs-storage #引用的哪个storage (这里
是基于nfs的storage下面图去查看)
这个截图就是基于nfs的storageclass 的动态存储引用的创建的名字
下面基于nginx做一下动态的持久化存储挂载
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: nginx-test
spec:
selector:
matchLabels:
app: nginx-test
replicas: 1
template:
metadata:
labels:
app: nginx-test
spec:
containers:
- name: nginx-test
image: registry.harbor.com/test/nginx:latest
ports:
- containerPort: 80
volumeMounts:
- name: index
mountPath: /usr/share/nginx/html
- name: nginx #自己定义的名字引用下面的(自己定义的名字)
mountPath: /root #挂载到容器里面的目录
volumes:
- name: index
configMap:
name: index
items:
- key: index.html
path: index.html
- name: nginx #自己定义的名字
persistentVolumeClaim: #引用的模式
claimName: test-claim1 #引用到的pvc动态创建的名字
---
apiVersion: v1
kind: Service
metadata:
name: nginx-test
spec:
type: NodePort
ports:
- port: 80
selector:
app: nginx-test
以这样的形式也可以写入进去pod中 一般引用到statefulsets 中 这里可
volumeClaimTemplates:
- metadata:
name: rabbitmq-storage
spec:
accessModes:
- ReadWriteMany
storageClassName: "nfs-storage"
resources:
requests:
storage: 4Gi
我这里挂载到了/root 目录上 我在nginx容器/root下创建了 3个文本文件 去我们存放nfs的路径下查看
[root@k8s-master02 nginxpv+mount]# kubectl exec -it nginx-test-6f6c7c8969-2rnbq -- bash
root@nginx-test-6f6c7c8969-2rnbq:/# cd /root/
root@nginx-test-6f6c7c8969-2rnbq:~# ls
1.txt
root@nginx-test-6f6c7c8969-2rnbq:~# touch {1..3}.txt
root@nginx-test-6f6c7c8969-2rnbq:~# ls
1.txt 2.txt 3.txt
这是是我挂载到哪里的持久化存储路径 查看已经有了
[root@nfs nfs]# pwd
/nfs_data/k8s_data/nfs
[root@nfs nfs]# ls
default-test-claim1-pvc-8325a0d0-1e4a-11eb-a683-005056b1ca0d
[root@nfs nfs]# cd default-test-claim1-pvc-8325a0d0-1e4a-11eb-a683-005056b1ca0d/
[root@nfs default-test-claim1-pvc-8325a0d0-1e4a-11eb-a683-005056b1ca0d]# ls
1.txt 2.txt 3.txt
[root@nfs default-test-claim1-pvc-8325a0d0-1e4a-11eb-a683-005056b1ca0d]#
个人记录
绑定pvc
```bash
spec:
containers:
- image: nginx:latest
imagePullPolicy: Never
name: nginx
volumeMounts:
- mountPath: /opt #容器的目录
name: nginx
volumes:
- name: nginx
persistentVolumeClaim: #本地pvc
claimName: nginx-test-pvc #pvc 名字
node节点亲和性
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution: #反亲和性
- weight: 1
preference:
matchExpressions:
- key: ssd #引用的键值就是打的标签
operator: In
values:
- kk #标签后面的键值
pod亲和性
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app #pod的标签节点
operator: In
values:
- nginx #pod 内部键值
topologyKey: "kubernetes.io/hostname"
静态 存储
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfspv1
spec:
capacity:
storage: 1Gi
#指定访问模式
accessModes:
#pv能以readwrite模式mount到单个节点
- ReadWriteOnce
#指定pv的回收策略,即pvc资源释放后的事件.recycle(不建议,使用动态供给代替)删除pvc的所有文件
persistentVolumeReclaimPolicy: Recycle
#指定pv的class为nfs,相当于为pv分类,pvc将指定class申请pv
storageClassName: mynfs
#指定pv为nfs服务器上对应的目录
nfs:
path: /data/nfs
server: 192.168.1.10
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nfspvc1
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: mynfs