我在AWS中部署了一个EKS集群,我使用terraform将组件部署到该集群。
为了进行身份验证,我使用了以下提供集群API身份验证的EKS数据源:
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)有办法在运行data s之前强制重新创建local-exec吗?
发布于 2022-03-23 14:11:01
更新:示例移动到authz/main.tf
data.aws_eks_cluster_auth.cluster_auth.token使用不可配置的15分钟超时时间创建令牌。
解决这个问题的一种方法是使用sts令牌来创建一个长期存在的服务帐户令牌,并使用它来提供提供者为长时间运行的kuberenetes资源。
我创建了一个名为terraform-kubernetes-服务-帐户的模块来捕获创建服务帐户的这种常见行为,给它一些权限,并输出auth信息,即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
}
}https://stackoverflow.com/questions/66890442
复制相似问题