我在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服务帐户的模块,以捕捉创建服务帐户的常见行为,赋予它一些权限,并输出身份验证信息,即token
、ca.crt
、namespace
。
例如:
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]