在 Kubernetes 中使用 Helm 部署 AWS EFS Provisioner:PVC 动态供给与配置实战
【免费下载链接】charts⚠️(OBSOLETE) Curated applications for Kubernetes项目地址https://gitcode.com/gh_mirrors/chart/charts点击查看免费下载导读本文以 Helm Charts 仓库中的 stable/efs-provisioner 图表为核心系统讲解如何在 Kubernetes 集群中部署 AWS EFS 外部存储 Provisioner并通过 StorageClass 实现 PersistentVolumeClaimPVC到 EFS PersistentVolume 的动态供给。读完本文你将掌握 EFS 前置条件准备、Helm 安装命令、values.yaml全部核心参数的语义与默认值、底层 Deployment/StorageClass 模板的渲染逻辑以及基于 RBAC 与 PodSecurityPolicy 的完整安全配置方法。一、背景EFS Provisioner 解决了什么问题AWS EFSElastic File System是亚马逊提供的共享文件存储服务天然支持 NFS 协议。Kubernetes 官方项目kubernetes-incubator/external-storage提供了一个 EFS provisioner用于根据 PersistentVolumeClaim 的创建动态地在 EFS 文件系统上划分目录并生成对应的 PersistentVolume从而让集群内的工作负载能够以 PVC 的方式透明使用 EFS 存储。按图表 README 中的描述该 provisioner 由一个能够访问 AWS EFS 资源的容器构成容器读取包含EFS 文件系统 ID、AWS 区域、provisioner 名称的配置在本图表中通过环境变量注入其中 provisioner 名称会在后续创建 StorageClass 时使用。其核心工作流程为用户创建带storageClassName的 PersistentVolumeClaimEFS Provisioner 监听到 PVC 创建事件Provisioner 在 EFS 文件系统中为 PVC 创建一个独立文件夹Provisioner 自动创建对应的 PersistentVolume并完成 PVC 与 PV 的绑定容器即可将 EFS 卷挂载进 Pod。需要强调的是持久卷是以 AWS EFS 文件系统内的文件夹形式创建的多个 Pod 可共享同一 EFS 文件系统下的不同子目录且 StorageClass 默认使用ReadWriteMany访问模式适合多副本共享读写的应用场景。从 deployment.yaml 的模板实现可以看到Provisioner 容器自身正是通过挂载一个 NFS 类型的pv-volume指向 EFS 的 DNS 地址、path: /来访问 EFS 根目录并通过subPath: {{ trimPrefix / .Values.efsProvisioner.path }}将 PVC 数据统一落盘到 EFS 的指定子路径下挂载点为/persistentvolumes。二、前置条件安装前必须完成的 AWS 侧准备README 明确指出EFS 文件系统与挂载端点需要由使用者自行提前创建图表本身不负责创建创建 EFS 文件系统需提前在 AWS 控制台或通过 CLI 创建 EFS 文件系统并记录其文件系统 ID形如fs-12345678。创建并配置挂载目标Mount Targets / EndpointsEFS 的挂载端点必须能够被集群节点访问到。这通常意味着挂载目标所在的子网与集群节点子网互通或在同一 VPC 内。节点具备 NFS 挂载权限集群节点需要安装 NFS 客户端如nfs-utils并具备挂载 EFS 文件系统的网络与安全组Security Group放行条件。EFS 挂载目标默认使用 2049 端口NFS安全组需允许相应流量。只有满足以上条件Provisioner 容器以及后续挂载 PV 的应用 Pod才能成功 mount 上 EFS 文件系统。若跳过该步骤Provisioner 会因无法挂载而无法进入健康的运行状态。三、快速安装两条命令起步图表 README 给出的最小安装方式只需提供 EFS 文件系统 ID 与 AWS 区域helm install stable/efs-provisioner --set efsProvisioner.efsFileSystemIdfs-12345678 --set efsProvisioner.awsRegionus-east-2所有可配置项均可通过helm inspect values查看helm inspect values stable/efs-provisioner也可以直接阅读仓库中的 values.yaml两者内容一致。关于图表版本信息Chart.yaml 记录了当前图表版本为0.13.2appVersion为v2.4.0对应镜像quay.io/external_storage/efs-provisioner:v2.4.0并已标记deprecated: true——该图表随 Helm Charts 仓库归档而停止更新生产使用请自行评估。关于占位 ID的细节注意 deployment.yaml 中的一处关键实现细节只有当efsFileSystemId不等于默认占位值fs-12345678、或者显式设置了dnsName时模板才会真正渲染 Deployment。注释明确说明这是为了防止 Helm 集成测试在无法访问真实 AWS EFS 资源的环境中渲染出一个永远无法进入干净运行状态的 Deployment。因此如果你在安装时保留默认的fs-12345678而不做任何设置将不会得到任何 Deployment——这提醒我们efsFileSystemId是必须由用户真实提供的参数。四、配置参数详解从 values.yaml 到模板渲染以下参数全部来自 values.yaml并对照模板说明其作用。4.1 全局与部署基础参数默认值说明global.deployEnvdev部署环境标签如 dev/test/prod会作为env标签写入所有资源replicaCount1Deployment 副本数由于 provisioner 需要以Recreate策略运行见 deployment.yaml一般保持单副本revisionHistoryLimit10Deployment 保留的历史版本数量image.repository/image.tag/image.pullPolicyquay.io/external_storage/efs-provisioner/v2.4.0/IfNotPresentProvisioner 容器镜像配置image.pullSecrets空访问私有镜像仓库所需的 Secret 列表busyboxImage.*gcr.io/google_containers/busybox:1.27用于创建 EFS 子路径的 init 容器镜像extraEnv/envFrom[]额外注入的环境变量 / 从 ConfigMap、Secret 批量注入的环境变量渲染进容器env/envFromannotations{}部署等资源的注解4.2 efsProvisioner核心供给配置参数默认值说明efsProvisioner.efsFileSystemIdfs-12345678必填EFS 文件系统 ID模板用它拼出 NFS server 地址{fsId}.efs.{region}.amazonaws.comefsProvisioner.awsRegionus-east-2AWS 区域用于构造 EFS 挂载域名efsProvisioner.dnsName空注释示例my-custom-efs-dns.com可选设置后使用自定义 DNS 或 IP 连接 EFS此时优先于efsFileSystemId拼接出的域名efsProvisioner.path/example-pvProvisioner 在 EFS 中存放 PVC 数据的根子路径efsProvisioner.provisionerNameexample.com/aws-efsProvisioner 标识名StorageClass 的provisioner字段会使用它这些参数在模板中的落地位置非常清晰见 deployment.yamlFILE_SYSTEM_ID←efsFileSystemIdAWS_REGION←awsRegionPROVISIONER_NAME←provisionerNameDNS_NAME←dnsName仅当设置了dnsName时注入4.3 storageClass动态供给的入口参数默认值说明efsProvisioner.storageClass.nameaws-efsStorageClass 名称PVC 通过它引用efsProvisioner.storageClass.isDefaultfalse是否设为集群默认 StorageClass为true时模板会写入注解storageclass.kubernetes.io/is-default-class: true见 storageclass.yamlefsProvisioner.storageClass.gidAllocate.enabledtrue是否启用 GID 自动分配解决 EFS 上不同 PV 间权限隔离问题efsProvisioner.storageClass.gidAllocate.gidMin/gidMax40000/50000GID 分配区间efsProvisioner.storageClass.reclaimPolicyDeletePV 回收策略Delete表示 PVC 删除时 PV 及对应 EFS 数据一并回收efsProvisioner.storageClass.mountOptions[]额外 NFS 挂载选项如tcp、nfsvers4.1会渲染为 StorageClass 的mountOptions列表storageclass.yaml 展示了gidAllocate的渲染逻辑启用时写入gidAllocate: true、gidMin、gidMax三个参数禁用时仅写入gidAllocate: false。reclaimPolicy直接透传mountOptions为空数组时整个字段不会被渲染。4.4 RBAC、ServiceAccount 与安全参数默认值说明rbac.createtrue是否创建 ClusterRole 与 ClusterRoleBindingserviceAccount.createtrue是否创建专用 ServiceAccount为false时回退使用default或serviceAccount.name指定的已有账户serviceAccount.name自定义账户名为空且create: true时按 fullname 模板自动生成见 _helpers.tplserviceAccount.annotations{}ServiceAccount 注解典型用途是注入 EKS IRSA 角色 ARN如eks.amazonaws.com/role-arnpodSecurityPolicy.enabledtrue是否创建 PodSecurityPolicypodSecurityPolicy.annotations可附加自定义注解ClusterRole 的权限集见 clusterrole.yaml精确对应 provisioner 的工作对象对persistentvolumes具备 get/list/watch/create/delete对persistentvolumeclaims具备 get/list/watch/update对storageclasses具备 get/list/watch并拥有events与endpoints的读写权限provisioner 通过 Endpoints 做 leader election 与信息发布。启用 PSP 时还会额外授予对该 PSP 的use权限。PodSecurityPolicy 本身见 podsecuritypolicy.yaml以最小权限为原则privileged: false、禁止提权、丢弃全部 capabilities、禁止 hostNetwork/hostIPC/hostPID卷类型仅允许configMap、secret、nfs根文件系统只读readOnlyRootFilesystem: truerunAsUser与seLinux使用RunAsAnysupplementalGroups 与 fsGroup 限定在 1~65535 区间。4.5 调度与资源参数默认值说明podAnnotations{}Pod 注解注释示例为注入 IAM 角色iam.amazonaws.com/role: efs-provisioner-rolepodLabels{}Pod 标签nodeSelector{}节点选择器affinity{}亲和性配置tolerations{}容忍配置resources{}资源请求与限制注释示例给出cpu: 100m~200m、memory: 128MipriorityClassNamePod 优先级类名上述调度与资源参数在 deployment.yaml 中均按配置了才渲染的方式处理。五、模板实现细节子路径初始化与 NFS 挂载deployment.yaml 中还包含两个值得注意的实现细节1. NFS 卷的 server 地址构造L97-L105volumes: - name: pv-volume nfs: {{- if .Values.efsProvisioner.dnsName }} server: {{ .Values.efsProvisioner.dnsName }} {{- else }} server: {{ .Values.efsProvisioner.efsFileSystemId }}.efs.{{ .Values.efsProvisioner.awsRegion }}.amazonaws.com {{- end }} path: /即默认使用 AWS 标准的 EFS 挂载域名格式{filesystem-id}.efs.{region}.amazonaws.com若配置了dnsName则完全由自定义地址接管。2. init 容器创建子路径L85-L96当efsProvisioner.path不为/时模板会渲染一个名为init-path的 busybox init 容器执行mkdir -p /efs-vol-root/path提前在 EFS 根目录下创建好供给数据所在的子目录避免 Provisioner 主容器启动时目录尚不存在。六、使用通过 PVC 申请 EFS 存储安装完成后NOTES.txt 会输出一个可直接套用的 PVC 示例kind: PersistentVolumeClaim apiVersion: v1 metadata: name: my-efs-vol-1 annotations: volume.beta.kubernetes.io/storage-class: aws-efs spec: storageClassName: aws-efs accessModes: - ReadWriteMany resources: requests: storage: 1Mi其中storageClassName对应efsProvisioner.storageClass.name的实际取值默认aws-efs。创建该 PVC 后EFS Provisioner 会自动完成建目录 → 创建 PV → 绑定 PVC的全流程随后即可在 Deployment/StatefulSet 中通过该 PVC 挂载 EFS 共享存储满足多 Pod 读写同一份数据的场景如共享缓存、上传目录、协同编辑类应用。accessModes: ReadWriteMany与 EFS 的 NFS 特性天然匹配——这正是 EFS 相比 EBS仅单节点读写的核心差异也是选择 EFS 方案的首要理由。七、注意事项与弃用声明本图表位于stable目录但已在 README.md 与 Chart.yaml 中明确标记DEPRECATION NOTICE图表已弃用、不再受支持。这是 Helm Charts 官方仓库整体归档2020-11-13 起不再更新的一部分请结合后续维护方案使用。安装前务必核对EFS 文件系统 ID 是否为真实 ID避免默认占位值导致 Deployment 不渲染、挂载端点与集群网络是否互通、节点是否具备 NFS 挂载能力。若集群启用了 PodSecurityPolicy 准入控制podSecurityPolicy.enabled: true会随之创建 PSP 并绑定权限此时需确保集群支持policy/v1beta1资源。若在 EKS 中使用 IRSA可在serviceAccount.annotations中注入eks.amazonaws.com/role-arn为 provisioner 提供访问 EFS 所需的 IAM 权限EFS 客户端需要权限完成挂载目标访问。结语通过本文你已经掌握 efs-provisioner 图表从前置准备 → 参数配置 → 模板渲染 → PVC 使用的完整链路。核心要点可概括为三条efsFileSystemId与awsRegion是安装的必填项provisionerName决定了 StorageClass 与 provisioner 的绑定关系gidAllocate与mountOptions决定了 EFS 上多租户数据隔离与挂载行为。结合仓库中的 values.yaml 与 templates 源码你可以进一步按需裁剪 RBAC、PSP 与调度参数将其适配到自己的集群环境。赞分享【免费下载链接】charts⚠️(OBSOLETE) Curated applications for Kubernetes项目地址https://gitcode.com/gh_mirrors/chart/charts点击查看免费下载相关推荐使用 Helm 在 Kubernetes 上部署 Apache Druid完整配置与实战指南使用 Helm 在 Kubernetes 上部署 Apache Druid完整配置与实战指南 Apache Druid 是一款高性能的实时分析数据库本指南基PyPTO 系统访问变量实战指南get_block_idx / get_block_num / get_subblock_idx / get_subblock_num 多核编程完全解析PyPTO 系统访问变量实战指南get_block_idx / get_block_num / get_subblock_idx / get_subblock使用 Helm Chart 在 Kubernetes 上部署 Istio 0.2.12安装、RBAC 与配置实战使用 Helm Chart 在 Kubernetes 上部署 Istio 0.2.12安装、RBAC 与配置实战 Istio 是一个为微服务提供统一连接、管理上一篇OpenCV.js 浏览器端实时图像处理实践摄像头帧获取与 20 种 imgproc 滤镜流水线下一篇3个实战场景深度解析Qwen2.5-14B开源大语言模型部署与应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考