一、storageClass存储类

                        一种动态申请存储的机制

1、概念

        StorageClass 是一种资源对象,用于定义持久卷(Persistent Volumes)的动态供给(Dynamic Provisioning)策略。StorageClass 允许管理员定义不同类型的存储,并指定如何动态创建持久卷以供应用程序使用。这使得 Kubernetes 集群中的存储管理更加灵活和自动化。

静态                                                                动态

2、nfs-client-provisioner

        nfs-client-provisioner 是一个 Kubernetes 供应商,用于动态提供由 NFS(Network File System)共享支持的持久卷。在 Kubernetes 中,持久卷是独立于 pod 存在的存储资源,可以在 pod 重新启动或重新调度时持久地存储数据。

        nfs-client-provisioner 自动化了根据需要创建持久卷的过程,通过与 NFS 服务器交互。在需要在 Kubernetes 集群中为应用程序动态分配存储而无需手动管理 NFS 共享和持久卷创建的情况下,这尤其有用。

搭建服务器上一节做过了(主节点)

# 安装 nfs 服务器
$ dnf install nfs-utils rpcbind
$ mkdir /nfs
$ chown nobody /nfs
$ /etc/exports
/nfs *(rw,sync,no_subtree_check)
$ systemctl enable nfs-server && systemctl start nfs-server
$ showmount -e 192.168.10.11

新建目录,vi /etc/exorot

 权限限制

chown -R nobody /nfsdata/share/

 重启+开机自启

systemctl restart nfs-server
systemctl enable nfs-server
systemctl enable rpcbind

 检查是否共享出来

showmount -e 192.168.125.101

 

  创建、client资源清单

# 1. Deployment:部署nfs-client-provisioner容器
kind: Deployment
apiVersion: apps/v1  # 原文档缺失,补充标准apiVersion
metadata:
  name: nfs-client-provisioner  # 控制器名称
  namespace: nfs-storageclass  # 命名空间(后续创建)
spec:
  replicas: 1  # 原文档缺失,补充默认副本数1,想高可用改成2
  selector:
    matchLabels:
      app: nfs-client-provisioner
  strategy:
    type: Recreate  # 重建策略(更新时先删旧Pod再建新Pod)
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner  # 关联服务账户
      containers:
      - name: nfs-client-provisioner
        # 镜像地址(国内镜像,避免国外镜像拉取失败)
        image: k8s.dockerproxy.com/sig-storage/nfs-subdir-external-provisioner:v4.0.2
        volumeMounts:
        - name: nfs-client-root  # 挂载卷名称
          mountPath: /persistentvolumes  # 容器内挂载路径(存储数据的目录)
        # 环境变量:配置NFS服务器信息
        env:
        - name: PROVISIONER_NAME
          value: k8s-sigs.io/nfs-subdir-external-provisioner  # 供应者名称(需与StorageClass匹配)
        - name: NFS_SERVER
          value: 192.168.125.101  # NFS服务器IP(替换为实际IP)
        - name: NFS_PATH
          value: /nfsdata/share  # NFS服务器上的共享目录(替换为实际路径)
      volumes:
      - name: nfs-client-root  # 定义卷,关联NFS共享
        nfs:  # 原文档缺失“nfs”类型,补充
          server: 192.168.125.101  # NFS服务器IP
          path: /nfsdata/share  # NFS共享目录

 创建、sc,权限授权


apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
  namespace: nfs-storageclass  
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: nfs-client-provisioner-runner  
rules:
- apiGroups: [""]  
  resources: ["persistentvolumes"]  
  verbs: ["get", "list", "watch", "create", "delete"]  
- apiGroups: [""]
  resources: ["persistentvolumeclaims"]  
  verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]  
  resources: ["storageclasses"]  
  verbs: ["get", "list", "watch"]
- apiGroups: [""]
  resources: ["events"]  
  verbs: ["create", "update", "patch"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: run-nfs-client-provisioner
subjects:
- kind: ServiceAccount
  name: nfs-client-provisioner
  namespace: nfs-storageclass  # 绑定指定命名空间的服务账户
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
# 5. Role:定义命名空间内权限(仅nfs-storageclass命名空间)
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: leader-locking-nfs-client-provisioner
  namespace: nfs-storageclass
rules:
- apiGroups: [""]
  resources: ["endpoints"]  # 资源类型:端点(用于 leader 选举,避免多副本冲突)
  verbs: ["get", "list", "watch", "create", "update", "patch"]
---
# 6. RoleBinding:将Role绑定到ServiceAccount
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: leader-locking-nfs-client-provisioner
  namespace: nfs-storageclass
subjects:
- kind: ServiceAccount
  name: nfs-client-provisioner
  namespace: nfs-storageclass
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: rbac.authorization.k8s.io

 创建、存储类创建

# 7. StorageClass:定义动态存储供给策略
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-client 
  namespace: nfs-storageclass
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner  
parameters:
  pathPattern: "${.PVC.namespace}/${.PVC.name}"  
reclaimPolicy: Delete 

创建、 名字空间

kubectl create ns nfs-storageclass

启动

kubectl apply -f ../19/

 二、插曲

安装,允许对选项进行补全

yum install bash-completion

编辑,

vi .bashrc

source <(kubectl completion bash)

刷新后,可以补全和查看选项了

 

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐