【问题标题】:EKS Terraform - datasource aws_eks_cluster_auth - token expiredEKS Terraform - 数据源 aws_eks_cluster_auth - 令牌已过期
【发布时间】:2022-03-23 22:11:01
【问题描述】:

我在 AWS 中部署了一个 EKS 集群,我使用 terraform 将组件部署到该集群。

为了获得身份验证,我使用了以下提供集群 API 身份验证的EKS datasources

data "aws_eks_cluster_auth" "cluster" {
  name = var.cluster_id
}

data "aws_vpc" "eks_vpc" {
  id = var.vpc_id
}

并使用多个 local-exec 供应商(除其他资源外)内的令牌来部署组件

resource "null_resource" "deployment" {
  provisioner "local-exec" {
    working_dir = path.module
    command     = <<EOH
kubectl \
  --server="${data.aws_eks_cluster.cluster.endpoint}" \
  --certificate-authority=./ca.crt \
  --token="${data.aws_eks_cluster_auth.cluster.token}" \
  apply -f test.yaml
EOH
  }
}

我遇到的问题是某些资源需要一些时间来部署,并且在 terraform 执行下一个资源时,我收到此错误,因为令牌已过期:

exit status 1. Output: error: You must be logged in to the server (the server has asked for the client to provide credentials)

有没有办法在运行 local-execs 之前强制重新创建data

【问题讨论】:

  • 哪些资源特别需要很长时间?您可以尝试使用depends_on 关系对它们进行排序,这样deployment 可以直接在aws_eks_cluster_auth 之后运行
  • 嗨!我尝试订购了一些资源,例如 fargate_profiles、helm-charts、负载均衡器等,但有些组件具有很强的依赖性,需要首先执行。

标签: terraform terraform-provider-aws amazon-eks


【解决方案1】:

data.aws_eks_cluster_auth.cluster_auth.token 创建一个具有不可配置的 15 分钟超时的令牌。

解决此问题的一种方法是使用 sts 令牌创建一个长期存在的服务帐户令牌,并使用它为长期运行的 kuberenetes 资源配置 terraform-kubernetes-provider。

我创建了一个名为terraform-kubernetes-service-account 的模块来捕获创建服务帐户的这种常见行为,为其赋予一些权限,并输出身份验证信息,即tokenca.crtnamespace

例如:

module "terraform_admin" {
  source = "aidanmelen/service-account/kubernetes"

  name               = "terraform-admin"
  namespace          = "kube-system"
  cluster_role_name  = "terraform-admin"
  cluster_role_rules = [
    {
      api_groups     = ["*"]
      resources      = ["*"]
      resource_names = ["*"]
      verbs          = ["*"]
    },
  ]
}

provider "kubernetes" {
  alias                  = "terraform_admin_service_account"
  host                   = "https://kubernetes.docker.internal:6443"
  cluster_ca_certificate = module.terraform_admin.auth["ca.crt"]
  token                  = module.terraform_admin.auth["token"]
}

data "kubernetes_namespace_v1" "example" {
  metadata {
    name = kubernetes_namespace.ex_complete.metadata[0].name
  }
}

【讨论】:

    猜你喜欢
    • 2020-11-20
    • 2014-06-27
    • 2019-12-11
    • 2018-10-14
    • 2020-02-07
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多