如何在 Terraform 中将 Amazon EFS 与 EKS 结合使用

Tay*_*ner 5 amazon-web-services kubernetes amazon-efs amazon-eks kustomize

到目前为止我有2个目录:

aws/ k8s/

里面aws/.tf描述 VPC、网络、安全组、IAM 角色、EKS 集群、EKS 节点组和一些 EFS 挂载的文件。这些都使用AWS提供商,状态存储在S3中。

然后,k8s/我使用 Kubernetes 提供程序并在我创建的 EKS 集群内创建 Kubernetes 资源。此状态存储在同一 S3 存储桶中的不同状态文件中。

我无法弄清楚如何将 EFS 作为持久卷挂载到我的 Pod。

我找到了描述使用 efs-provisioner pod 来执行此操作的文档。请参阅如何将 EFS 与 EKS 结合使用?

在最近的 EKS 文档中,他们现在说使用Amazon EFS CSI Driver。第一步是创建kubectl apply以下文件。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
- ../../base
images:
- name: amazon/aws-efs-csi-driver
  newName: 602401143452.dkr.ecr.us-west-2.amazonaws.com/eks/aws-efs-csi-driver
  newTag: v0.2.0
- name: quay.io/k8scsi/livenessprobe
  newName: 602401143452.dkr.ecr.us-west-2.amazonaws.com/eks/csi-liveness-probe
  newTag: v1.1.0
- name: quay.io/k8scsi/csi-node-driver-registrar
  newName: 602401143452.dkr.ecr.us-west-2.amazonaws.com/eks/csi-node-driver-registrar
  newTag: v1.1.0
Run Code Online (Sandbox Code Playgroud)

有谁知道我将如何在 Terraform 中做到这一点?或者一般如何将 EFS 文件共享作为 PV 挂载到 EKS 集群?

Tay*_*ner 6

@BMW 说得对,我能够将这一切放入 Terraform 中。

在该aws/目录中,我创建了所有 AWS 资源、VPC、EKS、工作线程等以及 EFS 挂载。

resource "aws_efs_file_system" "example" {
  creation_token = "${var.cluster-name}-example"

  tags = {
    Name = "${var.cluster-name}-example"
  }
}

resource "aws_efs_mount_target" "example" {
  count = 2
  file_system_id = aws_efs_file_system.example.id
  subnet_id = aws_subnet.this.*.id[count.index]
  security_groups = [aws_security_group.eks-cluster.id]
}
Run Code Online (Sandbox Code Playgroud)

我还从 AWS 提供商计划中导出 EFS 文件系统 ID。

output "efs_example_fsid" {
  value = aws_efs_file_system.example.id
}
Run Code Online (Sandbox Code Playgroud)

创建 EKS 集群后,我必须手动将 EFS CSI 驱动程序安装到集群中,然后才能继续。

然后在k8s/目录中引用aws/状态文件,以便我可以在 PV 创建中使用 EFS 文件系统 ID。

data "terraform_remote_state" "remote" {
  backend = "s3"
  config = {
    bucket = "example-s3-terraform"
    key    = "aws-provider.tfstate"
    region = "us-east-1"
  }
}
Run Code Online (Sandbox Code Playgroud)

然后使用 Kubernetes 提供程序创建持久卷。

resource "kubernetes_persistent_volume" "example" {
  metadata {
    name = "example-efs-pv"
  }
  spec {
    storage_class_name = "efs-sc"
    persistent_volume_reclaim_policy = "Retain"
    capacity = {
      storage = "2Gi"
    }
    access_modes = ["ReadWriteMany"]
    persistent_volume_source {
      nfs {
        path = "/"
        server = data.terraform_remote_state.remote.outputs.efs_example_fsid
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)