lipl

记录精彩的程序人生

Open Source, Open Mind,
Open Sight, Open Future!
  menu
8 文章
0 浏览
0 当前访客
ღゝ◡╹)ノ❤️

k8s通过StorageClass动态提供 pv和pvc

k8s通过StorageClass动态提供 pv和pvc

1.PV 和 和 PVC 模式都是需要先创建好PV,然后定义好 PVC 和 和 pv 进行一对一的 Bond ,但是如果 PVC 请求成千	 上万,那么就需要创建成千上万的 PV ,对于运维人员来说维护成本很高,Kubernetes 提供一种自动创建 PV 的机制,    叫StorageClass** ,它的作用就是创建 PV 的模板。k8s 集群管理员通过创建storageclass 可以动态生成一个存   储卷 pv 供 k8s pvc 使用
2.每个 StorageClass 都包含字段 provisioner ,parameters 和 reclaimPolic

3.具体来说,StorageClass 会定义以下两部分:
	PV 的属性 ,比如存储的大小、类型等;
	创建这种 PV 需要使用到的存储插件,比如 Ceph 、NFS 等

有了这两部分信息, Kubernetes 就能够根据用户提交的 PVC ,找到对应的 StorageClass ,然后
Kubernetes 就会调用 StorageClass 声明的存储插件,创建出需要的 PV

以 NFS 为例 , 要想使用 NFS ,我们需要一个 nfs-t client 的自动装载程序, 称之为 provisioner , 这个程序会使用我们已经配置好的NFS 服务器自动创建持久卷,也就是自动帮我们创建 PV.

1.安装 nfs provisioner ,用于 配合 存储类动态生成 pv

创建 运行 nfs- -r provisioner 需要的 sa 账号

cat > serviceaccount.yaml << EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-provisioner
EOF

kubectl apply -f serviceaccount.yaml
kubectl get sa 
什么是 sa ?
sa 的全称是 serviceaccount 。
serviceaccount 是为了方便 Pod 里面的进程调用 Kubernetes API 或其他外部服务而设计的 。
指定了serviceaccount 之后,我们把pod 创建出来了,我们在使用这个pod 时,这个pod 就有了
我们指定的账户的权限了 。

对 sa 授权

kubectl create clusterrolebinding nfs-provisioner-clusterrolebinding --clusterrole=cluster-admin --serviceaccount=default:nfs-provisioner

安装 nfs-provisioner 程序

mkdir /data/nfs_pro -p #把data/nfs_pro变成nfs共享的目录
cat >> /etc/exports << EOF
/data/nfs_pro *(rw,no_root_squash)
EOF

exportfs -arv #使NFS配置生效

cat > nfs-deployment.yaml << EOF
kind: Deployment
apiVersion: apps/v1
metadata:
  name: nfs-provisioner
spec:
  selector:
    matchLabels:
       app: nfs-provisioner
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-provisioner
    spec:
      serviceAccount: nfs-provisioner
      containers:
        - name: nfs-provisioner
          image: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: example.com/nfs
            - name: NFS_SERVER
              value: 192.168.243.180 #这IP是NFS共享服务器的IP,你们要修改为你们自己的IP
            - name: NFS_PATH
              value: /data/nfs_pro/
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.243.180 #这IP是NFS共享服务器的IP,你们要修改为你们自己的IP
            path: /data/nfs_pro/
EOF

kubectl apply -f nfs-deployment.yaml
kubectl get pods |grep nfs #过滤看到pod运行正常

2.创建 storageclass ,动态供给 pv

cat > nfs-storageclass.yaml << EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs
provisioner: example.com/nfs
EOF

kubectl apply -f nfs-storageclass.yaml 
kubectl get storageclass

3.创建 pvc , 通过 storageclass 动态 生成 pv

cat > claim.yaml << EOF
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-claim1
spec:
  accessModes:  ["ReadWriteMany"]
  resources:
    requests:
      storage: 1Gi
  storageClassName:  nfs
EOF

kubectl apply -f claim.yaml 

标题:k8s通过StorageClass动态提供 pv和pvc
作者:lipl666
地址:http://www.lipeilong.space:8088/articles/2025/09/04/1756973835099.html