EKS Terraform-数据源aws_EKS_cluster_auth-令牌已过期



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

为了获得身份验证,我使用以下EKS数据源来提供集群API身份验证:

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-exec之前强制重新创建data

UPDATE:示例移动到https://github.com/aidanmelen/terraform-kubernetes-rbac/blob/main/examples/authn_authz/main.tf

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

解决这一问题的一种方法是使用sts令牌创建一个长期服务帐户令牌,并使用该令牌为长期运行的kuberenetes资源提供terraform kubernetes提供程序。

我创建了一个名为terraform kubernetes服务帐户的模块,以捕捉创建服务帐户的常见行为,赋予它一些权限,并输出身份验证信息,即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
}
}

默认情况下,aws_eks_cluster_auth令牌的有效期仅为约15分钟。因此,要自动延长代币寿命,您可以使用以下方法,如所述

provider "kubernetes" {
host                   = module.eks.cluster_endpoint
cluster_ca_certificate = base64decode(module.eks.cluster_certificate_authority_data)
exec {
api_version = "client.authentication.k8s.io/v1alpha1"
args        = ["eks", "get-token", "--cluster-name", module.eks.cluster_name]
command     = "aws"
}
}

如果将IAM角色添加到args,请将其更新为:

args = ["eks", "get-token", "--cluster-name", module.eks.cluster_name, "--role-arn", var.iam_role_arn]

相关内容

  • 没有找到相关文章

最新更新