You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes 1.4下iSCSI/NFS动态PV配置(StorageClass)实操咨询

我之前刚好在Kubernetes 1.4环境里折腾过iSCSI和NFS的动态PV配置,踩过不少坑,给你梳理下实操步骤,应该能直接落地:

第一步:部署外部存储配置器(以容器形式运行)

没错,外部存储配置器必须以Pod的形式运行在K8s集群里,它需要和K8s API交互来监听PVC的创建请求,自动生成对应的PV。这里需要先配置RBAC权限(K8s 1.4已支持RBAC),再部署Provisioner Pod:

1.1 创建RBAC权限资源

先给Provisioner分配足够的权限来操作PV、PVC等核心资源:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: storage-provisioner
  namespace: default

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: storage-provisioner-role
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: ["list", "watch", "create", "update", "patch"]

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: storage-provisioner-binding
subjects:
- kind: ServiceAccount
  name: storage-provisioner
  namespace: default
roleRef:
  kind: ClusterRole
  name: storage-provisioner-role
  apiGroup: rbac.authorization.k8s.io

执行命令创建:kubectl apply -f rbac-config.yaml

1.2 部署iSCSI Provisioner

iSCSI的Provisioner需要连接到你的iSCSI存储服务器,Deployment里要指定存储的关键参数:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: iscsi-provisioner
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: iscsi-provisioner
    spec:
      serviceAccountName: storage-provisioner
      containers:
      - name: iscsi-provisioner
        image: quay.io/external_storage/iscsi-provisioner:v1.0.0  # 适配K8s 1.4的稳定版本
        args:
        - "--provisioner=example.com/iscsi"  # 这个名称要和后续StorageClass的provisioner字段完全一致
        env:
        - name: ISCSI_TARGET_PORTAL
          value: "192.168.1.100:3260"  # 替换为你的iSCSI服务器地址+端口
        - name: ISCSI_IQN
          value: "iqn.2024-05.com.example:storage.target01"  # 替换为你的iSCSI目标IQN
        - name: ISCSI_LUN
          value: "0"  # 替换为要使用的LUN编号
        - name: ISCSI_FSTYPE
          value: "ext4"  # 可选文件系统类型,比如xfs

执行命令创建:kubectl apply -f iscsi-provisioner.yaml

1.3 部署NFS Provisioner

NFS的Provisioner需要访问你的NFS服务器共享目录,Deployment配置如下:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nfs-provisioner
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: nfs-provisioner
    spec:
      serviceAccountName: storage-provisioner
      containers:
      - name: nfs-provisioner
        image: quay.io/external_storage/nfs-provisioner:v1.0.0  # 适配K8s 1.4的稳定版本
        args:
        - "--provisioner=example.com/nfs"  # 对应后续StorageClass的provisioner字段
        env:
        - name: NFS_SERVER
          value: "192.168.1.101"  # 替换为你的NFS服务器地址
        - name: NFS_PATH
          value: "/nfs-shared"  # 替换为NFS共享的根目录
        volumeMounts:
        - name: nfs-volume
          mountPath: /nfs-shared
      volumes:
      - name: nfs-volume
        nfs:
          server: 192.168.1.101
          path: /nfs-shared

执行命令创建:kubectl apply -f nfs-provisioner.yaml

第二步:创建StorageClass

现在创建对应iSCSI和NFS的StorageClass,让用户可以按需申领存储:

2.1 iSCSI StorageClass

apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
  name: iscsi-dynamic
provisioner: example.com/iscsi  # 必须和iSCSI Provisioner的--provisioner参数完全一致
parameters:
  fsType: "ext4"
  targetPortal: "192.168.1.100:3260"
  iqn: "iqn.2024-05.com.example:storage.target01"
  lun: "0"
reclaimPolicy: Delete  # PVC删除后自动删除PV,可选Retain保留PV

创建命令:kubectl apply -f iscsi-storageclass.yaml

2.2 NFS StorageClass

apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
  name: nfs-dynamic
provisioner: example.com/nfs  # 必须和NFS Provisioner的--provisioner参数完全一致
parameters:
  fsType: "nfs"
  server: "192.168.1.101"
  path: "/nfs-shared"
reclaimPolicy: Delete

创建命令:kubectl apply -f nfs-storageclass.yaml

第三步:验证动态配置

创建一个测试PVC,指定使用上面的StorageClass:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-iscsi-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: iscsi-dynamic
  resources:
    requests:
      storage: 10Gi  # 用户按需指定需要的容量

创建后执行kubectl get pv,pvc,你会看到系统自动创建了对应的PV,并且PVC状态变为Bound。之后就可以在Pod里挂载这个PVC使用了。

注意事项

  • 确保K8s节点能正常访问iSCSI/NFS服务器(端口开放、网络连通)
  • Provisioner的镜像版本要适配K8s 1.4,避免版本不兼容导致的API调用失败
  • 如果需要多套不同的存储配置,可以创建多个StorageClass,对应不同参数的Provisioner实例

内容的提问来源于stack exchange,提问作者picku

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:44:32