kubernetes 持久化存储亲和性

涉及文档

  • kubernetes storageClassName 名称匹配
  • kubernetes PersistentVolumeClaims 节点调度
  • [kubernetes Persistent Volumes 节点调度
  • kubernetes 节点亲和性

一、PVC绑定匹配PV名称

每个 PV 可以属于某个类(Class),通过将其 storageClassName 属性设置为某个 StorageClass 的名称来指定。 特定类的 PV 卷只能绑定到请求该类存储卷的 PVC 申领。 未设置 storageClassName 的 PV 卷没有类设定,只能绑定到那些没有指定特定 存储类的 PVC 申领。

早前,Kubernetes 使用注解 volume.beta.kubernetes.io/storage-class 而不是 storageClassName 属性。这一注解目前仍然起作用,不过在将来的 Kubernetes 发布版本中该注解会被彻底废弃

1、测试未设置 storageClassName 效果

vim  storageClassName-pv-pvc.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name:  pv01
  labels:
    name: pv01
spec:
  nfs:     #定义存储类型为nfs
    path: /root/kubernetes/pv_pvc/volumes/v1   #nfs共享路径
    server: 192.168.11.128    #nfs共享服务service
  accessModes:          #访问模式
  #- ReadWriteOnce       #该卷可以通过单个节点以读写方式安装
  #- ReadOnlyMany        #该卷可以被许多节点只读安装
  - ReadWriteMany       #该卷可以被许多节点读写安装
  #storageClassName: "pv01"  #设置存储类特定的名称,如此PVC 只能匹配到对应相同的名称
  capacity:
    storage: 2Gi        #存储大小
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name:  pv02
  labels:
    name: pv02
spec:
  nfs:     #定义存储类型为nfs
    path: /root/kubernetes/pv_pvc/volumes/v2   #nfs共享路径
    server: 192.168.11.128    #nfs共享服务service
  accessModes:          #访问模式
  - ReadWriteMany       #该卷可以通过单个节点以读写方式安装
  #storageClassName: "pv02"    #设置存储类特定的名称,如此PVC 只能匹配到对应相同的名称
  capacity:
    storage: 4Gi        #存储大小
---
apiVersion: v1
kind: PersistentVolumeClaim   #定义类型为PVC
metadata:
  name: pvcpod                #定义pvc名字为pvcpod
spec:
  accessModes:                #访问模式
  - ReadWriteMany              #该卷可以通过单个节点以读写方式安装,同时pvc匹配与pv一致的模式
  #storageClassName: "pv02"    #该PVC绑定匹配名称一致PV上
  resources:                  #资源
    requests:                 #定义资源请求
      storage: 1Gi            #请求的容量为1G
kubectl  apply -f storageClassName-pv-pvc.yaml &&  kubectl  get  pv,pvc

kubernetes 持久化存储亲和性_第1张图片
全部调度到pv01上,只要匹配到符合的pv就立即绑定。

2、测试设置 storageClassName 效果

  • pvc调度到pv02 的pv上,更新yaml文件
vim storageClassName-pv-pvc.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name:  pv01
  labels:
    name: pv01
spec:
  nfs:     #定义存储类型为nfs
    path: /root/kubernetes/pv_pvc/volumes/v1   #nfs共享路径
    server: 192.168.11.128    #nfs共享服务service
  accessModes:          #访问模式
  #- ReadWriteOnce       #该卷可以通过单个节点以读写方式安装
  #- ReadOnlyMany        #该卷可以被许多节点只读安装
  - ReadWriteMany       #该卷可以被许多节点读写安装
  storageClassName: "pv01"  #设置存储类特定的名称,如此PVC 只能匹配到对应相同的名称
  capacity:
    storage: 2Gi        #存储大小
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name:  pv02
  labels:
    name: pv02
spec:
  nfs:     #定义存储类型为nfs
    path: /root/kubernetes/pv_pvc/volumes/v2   #nfs共享路径
    server: 192.168.11.128    #nfs共享服务service
  accessModes:          #访问模式
  - ReadWriteMany       #该卷可以通过单个节点以读写方式安装
  storageClassName: "pv02"    #设置存储类特定的名称,如此PVC 只能匹配到对应相同的名称
  capacity:
    storage: 4Gi        #存储大小
---
apiVersion: v1
kind: PersistentVolumeClaim   #定义类型为PVC
metadata:
  name: pvcpod                #定义pvc名字为pvcpod
spec:
  accessModes:                #访问模式
  - ReadWriteMany              #该卷可以通过单个节点以读写方式安装,同时pvc匹配与pv一致的模式
  storageClassName: "pv02"    #该PVC绑定匹配名称一致PV上
  resources:                  #资源
    requests:                 #定义资源请求
      storage: 1Gi            #请求的容量为1G
kubectl  delete   -f  storageClassName-pv-pvc.yaml && kubectl  apply -f storageClassName-pv-pvc.yaml &&  kubectl  get  pv,pvc

kubernetes 持久化存储亲和性_第2张图片

  • pvc调度到pv01 的pv上,更新yaml文件
vim storageClassName-pv-pvc.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name:  pv01
  labels:
    name: pv01
spec:
  nfs:     #定义存储类型为nfs
    path: /root/kubernetes/pv_pvc/volumes/v1   #nfs共享路径
    server: 192.168.11.128    #nfs共享服务service
  accessModes:          #访问模式
  #- ReadWriteOnce       #该卷可以通过单个节点以读写方式安装
  #- ReadOnlyMany        #该卷可以被许多节点只读安装
  - ReadWriteMany       #该卷可以被许多节点读写安装
  storageClassName: "pv01"  #设置存储类特定的名称,如此PVC 只能匹配到对应相同的名称
  capacity:
    storage: 2Gi        #存储大小
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name:  pv02
  labels:
    name: pv02
spec:
  nfs:     #定义存储类型为nfs
    path: /root/kubernetes/pv_pvc/volumes/v2   #nfs共享路径
    server: 192.168.11.128    #nfs共享服务service
  accessModes:          #访问模式
  - ReadWriteMany       #该卷可以通过单个节点以读写方式安装
  storageClassName: "pv02"    #设置存储类特定的名称,如此PVC 只能匹配到对应相同的名称
  capacity:
    storage: 4Gi        #存储大小
---
apiVersion: v1
kind: PersistentVolumeClaim   #定义类型为PVC
metadata:
  name: pvcpod                #定义pvc名字为pvcpod
spec:
  accessModes:                #访问模式
  - ReadWriteMany              #该卷可以通过单个节点以读写方式安装,同时pvc匹配与pv一致的模式
  storageClassName: "pv01"    #该PVC绑定匹配名称一致PV上
  resources:                  #资源
    requests:                 #定义资源请求
      storage: 1Gi            #请求的容量为1G
kubectl  delete   -f  storageClassName-pv-pvc.yaml && kubectl  apply -f storageClassName-pv-pvc.yaml &&  kubectl  get  pv,pvc

kubernetes 持久化存储亲和性_第3张图片

二、 Persistent Volumes 节点调度

1、书写资源yaml文件

vim local_亲和性.yaml
kind: PersistentVolume
metadata:
  name: local-pv
spec:
  capacity:
    storage: 1Gi
  volumeMode: Filesystem                #文件系统
  accessModes:
  - ReadWriteOnce                       #一个节点以读写方式挂载
  persistentVolumeReclaimPolicy: Delete #更改回收策略,静态默认回收策略Retain
  storageClassName: local-storage       #设置存储类特定的名称,如此PVC 只能匹配到对应相同的名称
  local:                                #本地模式
    path: /root/kubernetes              #绝对路径
  nodeAffinity:                         #节点亲和
    required:
      nodeSelectorTerms:                #节点匹配标签
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In                  #包含
          values:
          - k8s-node1
---
apiVersion: v1
kind: PersistentVolumeClaim   #定义类型为PVC
metadata:
  name: pvcpod                #定义pvc名字为pvcpod
spec:
  accessModes:                #访问模式
  - ReadWriteOnce             #该卷可以通过单个节点以读写方式安装
  storageClassName: "local-storage"  #该PVC绑定名称一致PV上
  resources:                  #资源
    requests:                 #定义资源请求
      storage: 1Gi            #请求的容量为3Gi
---
apiVersion: apps/v1
kind: Deployment                #控制器
metadata:
  name: pvc-nginx               #这个标签为启动pod时候的名字
spec:
  replicas: 1                   #启动副本数
  selector:                     #设置标签
    matchLabels:
      app: pvc-nginx            #这个标签相当于分组,查看(kubectl  get  pods  --show-labels)
  minReadySeconds: 5            #等待设置的时间后才进行升级,(如果没有设置该值,在某些极端情况下可能会造成服务不正常运行)
  revisionHistoryLimit: 2       #要保留以允许回滚的旧复制集数
  strategy:                     #策略
    type: RollingUpdate         #默认为滚动更新(可以不写)
    rollingUpdate:              #滚动更新
      maxSurge: 1               #升级过程中最多可以比原先设置多出的POD数量
      maxUnavailable: 1         #升级过程中最多有多少个POD处于无法提供服务的状态(该不为0)
  template:                     #模板(相当于定义好的一个python中的模块)
    metadata:
      labels:                   #标签
        app: pvc-nginx          #需要与上面定义selector标签一致,相当于划分在同一个组
    spec:
      containers:               #模板(容器模板)
      - name: pvc-nginx         #node节点启动的容器名字(kind控制器名字+标签名),可以去node节点查看容器名
        image: nginx                    #镜像名
        imagePullPolicy: IfNotPresent   #拉取镜像(选择方式——直接使用本地拥有的镜像)
        ports:
          - containerPort: 80           #容器开放的监听端口
        volumeMounts:                   #挂载容器的目录
        - name: nginxpvc                #特别注意:容器挂载名字和本地挂载名字需要一致(下面名字)
          mountPath: /usr/share/nginx/html/   #容器挂载的目录路径
      restartPolicy: Always            #重新启动pod中所有容器的策略
      volumes:                         #挂载目录方式——本地/网络
      - name: nginxpvc                 #特别注意:容器挂载名字和本地挂载名字需要一致(上面名字)
        persistentVolumeClaim:         #使用pvc进行挂载
          claimName: pvcpod            #绑定PVC卷的名称

2、 生成资源

kubectl apply -f local_亲和性.yaml

kubernetes 持久化存储亲和性_第4张图片

3、 在k8s-node1节点创建目录

mkdir /root/kubernetes

kubernetes 持久化存储亲和性_第5张图片

三、PersistentVolumeClaims PV调度

1、书写资源yaml文件

apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv01
  labels:
    pv: local-pv01
spec:
  capacity:
    storage: 1Gi
  volumeMode: Filesystem                #文件系统
  accessModes:
  - ReadWriteOnce                       #一个节点以读写方式挂载
  persistentVolumeReclaimPolicy: Retain #更改回收策略,静态默认回收策略Retain
  storageClassName: "local-storage"       #设置存储类特定的名称,如此PVC 只能匹配到对应相同的名称
  local:                                #本地模式
    path: /root/kubernetes              #绝对路径
  nodeAffinity:                         #节点亲和
    required:
      nodeSelectorTerms:                #节点匹配标签
      - matchExpressions:
        - key: kubernetes.io/os
          operator: In                  #包含
          values:
          - linux
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv02
  labels:
    pv: local-pv02
spec:
  capacity:
    storage: 1Gi
  volumeMode: Filesystem                #文件系统
  accessModes:
  - ReadWriteOnce                       #一个节点以读写方式挂载
  persistentVolumeReclaimPolicy: Retain #更改回收策略,静态默认回收策略Retain
  storageClassName: "local-storage"       #设置存储类特定的名称,如此PVC 只能匹配到对应相同的名称
  local:                                #本地模式
    path: /root/kubernetes              #绝对路径
  nodeAffinity:                         #节点亲和
    required:
      nodeSelectorTerms:                #节点匹配标签
      - matchExpressions:
        - key: kubernetes.io/os
          operator: In                  #包含
          values:
          - linux
---
apiVersion: v1
kind: PersistentVolumeClaim   #定义类型为PVC
metadata:
  name: pvcpod                #定义pvc名字为pvcpod
  labels:
    name: pvcpod
spec:
  accessModes:                #访问模式
  - ReadWriteOnce             #该卷可以通过单个节点以读写方式安装
  volumeMode: Filesystem
  storageClassName: "local-storage"  #该PVC绑定名称一致PV上
  resources:                  #资源
    requests:                 #定义资源请求
      storage: 1Gi            #请求的容量为3Gi
  selector:
    matchExpressions:
    - key:  pv				#PV标签的key值
      operator: In          #包含
      values:
      - local-pv02			#PV标签的values

---
apiVersion: apps/v1
kind: Deployment                #控制器
metadata:
  name: pvc-nginx               #这个标签为启动pod时候的名字
spec:
  replicas: 1                   #启动副本数
  selector:                     #设置标签
    matchLabels:
      app: pvc-nginx            #这个标签相当于分组,查看(kubectl  get  pods  --show-labels)
  minReadySeconds: 5            #等待设置的时间后才进行升级,(如果没有设置该值,在某些极端情况下可能会造成服务不正常运行)
  revisionHistoryLimit: 2       #要保留以允许回滚的旧复制集数
  strategy:                     #策略
    type: RollingUpdate         #默认为滚动更新(可以不写)
    rollingUpdate:              #滚动更新
      maxSurge: 1               #升级过程中最多可以比原先设置多出的POD数量
      maxUnavailable: 1         #升级过程中最多有多少个POD处于无法提供服务的状态(该不为0)
  template:                     #模板(相当于定义好的一个python中的模块)
    metadata:
      labels:                   #标签
        app: pvc-nginx          #需要与上面定义selector标签一致,相当于划分在同一个组
    spec:
      containers:               #模板(容器模板)
      - name: pvc-nginx         #node节点启动的容器名字(kind控制器名字+标签名),可以去node节点查看容器名
        image: nginx                    #镜像名
        imagePullPolicy: IfNotPresent   #拉取镜像(选择方式——直接使用本地拥有的镜像)
        ports:
          - containerPort: 80           #容器开放的监听端口
        volumeMounts:                   #挂载容器的目录
        - name: nginxpvc                #特别注意:容器挂载名字和本地挂载名字需要一致(下面名字)
          mountPath: /usr/share/nginx/html/   #容器挂载的目录路径
      restartPolicy: Always            #重新启动pod中所有容器的策略
      volumes:                         #挂载目录方式——本地/网络
      - name: nginxpvc                 #特别注意:容器挂载名字和本地挂载名字需要一致(上面名字)
        persistentVolumeClaim:         #使用pvc进行挂载
          claimName: pvcpod            #绑定PVC卷的名称

2、资源生成

kubectl  delete   -f  pvc_selector.yaml  && kubectl  apply -f pvc_selector.yaml &&  kubectl  get  pv,pvc

kubernetes 持久化存储亲和性_第6张图片

PVC 绑定符合 PVC 定义的 selector 标签名称 为PV02的卷,可以看出效果生效。

3、再次更新资源yaml文件(selector 标签名称指定为PV01)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv01
  labels:
    pv: local-pv01
spec:
  capacity:
    storage: 1Gi
  volumeMode: Filesystem                #文件系统
  accessModes:
  - ReadWriteOnce                       #一个节点以读写方式挂载
  persistentVolumeReclaimPolicy: Retain #更改回收策略,静态默认回收策略Retain
  storageClassName: "local-storage"       #设置存储类特定的名称,如此PVC 只能匹配到对应相同的名称
  local:                                #本地模式
    path: /root/kubernetes              #绝对路径
  nodeAffinity:                         #节点亲和
    required:
      nodeSelectorTerms:                #节点匹配标签
      - matchExpressions:
        - key: kubernetes.io/os
          operator: In                  #包含
          values:
          - linux
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv02
  labels:
    pv: local-pv02
spec:
  capacity:
    storage: 1Gi
  volumeMode: Filesystem                #文件系统
  accessModes:
  - ReadWriteOnce                       #一个节点以读写方式挂载
  persistentVolumeReclaimPolicy: Retain #更改回收策略,静态默认回收策略Retain
  storageClassName: "local-storage"       #设置存储类特定的名称,如此PVC 只能匹配到对应相同的名称
  local:                                #本地模式
    path: /root/kubernetes              #绝对路径
  nodeAffinity:                         #节点亲和
    required:
      nodeSelectorTerms:                #节点匹配标签
      - matchExpressions:
        - key: kubernetes.io/os
          operator: In                  #包含
          values:
          - linux
---
apiVersion: v1
kind: PersistentVolumeClaim   #定义类型为PVC
metadata:
  name: pvcpod                #定义pvc名字为pvcpod
  labels:
    name: pvcpod
spec:
  accessModes:                #访问模式
  - ReadWriteOnce             #该卷可以通过单个节点以读写方式安装
  volumeMode: Filesystem
  storageClassName: "local-storage"  #该PVC绑定名称一致PV上
  resources:                  #资源
    requests:                 #定义资源请求
      storage: 1Gi            #请求的容量为3Gi
  selector:
    matchExpressions:
    - key:  pv				#PV标签的key值
      operator: In          #包含
      values:
      - local-pv01			#PV标签的values

---
apiVersion: apps/v1
kind: Deployment                #控制器
metadata:
  name: pvc-nginx               #这个标签为启动pod时候的名字
spec:
  replicas: 1                   #启动副本数
  selector:                     #设置标签
    matchLabels:
      app: pvc-nginx            #这个标签相当于分组,查看(kubectl  get  pods  --show-labels)
  minReadySeconds: 5            #等待设置的时间后才进行升级,(如果没有设置该值,在某些极端情况下可能会造成服务不正常运行)
  revisionHistoryLimit: 2       #要保留以允许回滚的旧复制集数
  strategy:                     #策略
    type: RollingUpdate         #默认为滚动更新(可以不写)
    rollingUpdate:              #滚动更新
      maxSurge: 1               #升级过程中最多可以比原先设置多出的POD数量
      maxUnavailable: 1         #升级过程中最多有多少个POD处于无法提供服务的状态(该不为0)
  template:                     #模板(相当于定义好的一个python中的模块)
    metadata:
      labels:                   #标签
        app: pvc-nginx          #需要与上面定义selector标签一致,相当于划分在同一个组
    spec:
      containers:               #模板(容器模板)
      - name: pvc-nginx         #node节点启动的容器名字(kind控制器名字+标签名),可以去node节点查看容器名
        image: nginx                    #镜像名
        imagePullPolicy: IfNotPresent   #拉取镜像(选择方式——直接使用本地拥有的镜像)
        ports:
          - containerPort: 80           #容器开放的监听端口
        volumeMounts:                   #挂载容器的目录
        - name: nginxpvc                #特别注意:容器挂载名字和本地挂载名字需要一致(下面名字)
          mountPath: /usr/share/nginx/html/   #容器挂载的目录路径
      restartPolicy: Always            #重新启动pod中所有容器的策略
      volumes:                         #挂载目录方式——本地/网络
      - name: nginxpvc                 #特别注意:容器挂载名字和本地挂载名字需要一致(上面名字)
        persistentVolumeClaim:         #使用pvc进行挂载
          claimName: pvcpod            #绑定PVC卷的名称

4、再次资源生成

kubectl  delete   -f  pvc_selector.yaml  && kubectl  apply -f pvc_selector.yaml &&  kubectl  get  pv,pvc

kubernetes 持久化存储亲和性_第7张图片

你可能感兴趣的:(kubernetes,初级篇)