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

