部署NFS版StorageClass(存储类)

NFS版PV动态供给StorageClass(存储类)

  • 存储类的好处之一便是支持PV的动态供给,它甚至可以直接被视作为PV的创建模版,用户用到持久性存储时,需要通过创建PVC来绑定匹配的PV,此类操作需求较大,或者当管理员手动创建的PV无法满足PVC的所有需求时,系统按PVC的需求标准动态创建适配的PV会为存储管理带来极大的灵活性,不过仅那些属于StorageClassPVCPV才能产生绑定关系,即没有指定StorageClassPVC只能绑定同类的PV
  • 存储类对象名称至关重要,它是用户调用的标识,创建存储类对象时,除了名称之外,还需要为其定义三个关键字段。provisioner(供应者)parameter(参数)reclaimPolicy(回收策略)
  • 所以kubernetes提供了一种可以动态分配的工作机制,可用自动创建PV,该机制依赖于StorageClassAPI,将某个存储节点划分1T给kubernetes使用,当用户申请5Gi的PVC时,会自动从这1T的存储空间去创建一个5Gi的PV,而后自动与之进行关联绑定。
  • 动态PV供给的启用需要事先创建一个存储类,不同的Provisoner(供应者)的创建方法各有不同,并非所有的存储卷插件都由Kubernetes内建支持PV动态供给。

基于NFS实现动态供应

参考: https://www.cnblogs.com/xunweidezui/p/16930975.html

由于kubernetes内部不包含NFS驱动,所以需要使用外部驱动;
nfs-subdir-external-provisioner是一个自动供应器,它使用NFS服务端来支持动态供应
NFS-subdir-external- provisioner实例负责监视PersistentVolumeClaims(PVC)请求StorageClass,并自动为它们创建NFS所支持的PresistentVolumes(PV)


下载NFS存储类资源清单

NFS版StorageClass插件GitHub项目地址: https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner

部署NFS Provisioner参考

免积分下载部署yaml


部署NFS服务器

https://blog.youkuaiyun.com/omaidb/article/details/120926883


为StorageClass(存储类)创建所需的RBAC

nfs-rbac.yaml示例

---
# 创建命名空间
apiVersion: v1
kind: Namespace
metadata:
  name: storage
---
# 创建服务账号
kind: ServiceAccount
apiVersion: v1
metadata:
  # 服务账号名
  name: nfs-client-provisioner
  # 替换为deployment的命名空间
  namespace: storage
---
# 创建集群角色
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  # 集群角色名
  name: nfs-client-provisioner-runner
# 添加集群角色权限
rules:
  - apiGroups: [""]
    # 向该角色增加对PV执行查看,创建,删除 权限
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    # 向该角色增加对PVC执行查看,更新 权限
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    # 向该角色增加对动态存储类执行查看 权限
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    # 向该角色增加对events(集群事件)进行 创建 更新 补丁 权限
    resources: ["events"]
    verbs: ["create", "update", "patch"]
---
# 创建集群角色绑定
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  # 角色绑定的名称
  name: run-nfs-client-provisioner
subjects:
  # 绑定服务账号
  - kind: ServiceAccount
    # 要绑定的服务账号名--就是第一个yaml创建的sa
    name: nfs-client-provisioner
    # 绑定到哪个命名空间
    namespace: storage
roleRef:
  kind: ClusterRole
  # 要绑定的集群角色名--就是第2个yaml创建的集群角色
  name: nfs-client-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
# 创建role
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  # 创建的角色名
  name: leader-locking-nfs-client-provisioner
rules:
  - apiGroups: [""]
    # 向该角色增加对endpoint 查看 创建 更新 补丁 的权限
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
# 创建role绑定
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  # 该角色绑定的名字
  name: leader-locking-nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    # 要绑定的服务账号名--就是第一个yaml创建的服务账号
    name: nfs-client-provisioner
    # 替换为deployment要部署到的命名空间
    # 绑定到storage命名空间
    namespace: storage
roleRef:
  kind: Role
  # 要绑定的角色名称,就是上一个yaml创建的role
  name: leader-locking-nfs-client-provisioner
  apiGroup: rbac.authorization.k8s.io

# 清理rbac授权
kubectl delete -f nfs-rbac.yaml -n kube-system

# 执行rbac授权
kubectl apply -f nfs-rbac.yaml

部署nfs-client-provisioner的deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  # Deployment名
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  # 部署到哪个命名空间
  namespace: storage
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nfs-client-provisioner
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      # 使用哪个服务账号
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          # image: lizhenliang/nfs-subdir-external-provisioner:v4.0.1
          image: k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: k8s-sigs.io/nfs-subdir-external-provisioner
            - name: NFS_SERVER
              # NFS服务器地址
              value: 192.168.31.63
            - name: NFS_PATH
              # NFS服务器share目录
              value: /ifs/kubernetes
      volumes:
        - name: nfs-client-root
          nfs:
            # NFS服务器地址
            server: 192.168.31.63
            # NFS服务器share目录
            path: /ifs/kubernetes

创建StorageClass

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-client
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner # 或选择其他名称,必须与部署的环境 PROVISIONER_NAME 匹配
parameters:
  # 启用PV归档模式 true|false
  archiveOnDelete: "false"

使用存储类创建PVC

---
# 创建pvc
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  # pvc名称
  name: pv-volume
spec:
  # 存储类名称
  storageClassName: nfs-client
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Mi # pvc容量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

教Linux的李老师

赞赏是第一生产力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值