如何通过Terraform修复新配置的EKS集群上的kubernetes_config_map资源错误?

时间:2019-04-04 19:35:47

标签: kubernetes terraform aws-eks

我正在使用Terraform来配置EKS集群(主要是在示例here之后)。在本教程的最后,有一种方法可以通过terraform output命令输出configmap,然后通过kubectl apply -f <file>将它应用于集群。我正在尝试使用kubectl资源将此kubernetes_config_map命令包装到Terraform文件中,但是第一次运行Terraform时,出现以下错误:

Error: Error applying plan:

1 error(s) occurred:

* kubernetes_config_map.config_map_aws_auth: 1 error(s) occurred:

* kubernetes_config_map.config_map_aws_auth: the server could not find the requested resource (post configmaps)

奇怪的是,每个后续terraform apply都有效,并将configmap应用于EKS集群。这使我相信这可能是时间问题?我试图在群集的配置和应用configmap之间执行一系列操作,但这没有用。我还添加了一个明确的depends_on参数,以确保在尝试应用configmap之前首先已完全配置了集群。

provider "kubernetes" {
  config_path = "kube_config.yaml"
}

locals {
  map_roles = <<ROLES
- rolearn: ${aws_iam_role.eks_worker_iam_role.arn}
  username: system:node:{{EC2PrivateDNSName}}
  groups:
    - system:bootstrappers
    - system:nodes
ROLES
}

resource "kubernetes_config_map" "config_map_aws_auth" {
  metadata {
    name      = "aws-auth"
    namespace = "kube-system"
  }

  data {
    mapRoles = "${local.map_roles}"
  }

  depends_on = ["aws_eks_cluster.eks_cluster"]
}

我希望它第一次能够正确运行,但是它仅在应用相同文件后第二次没有更改地运行。

我尝试通过为terraform启用TRACE调试标志来获取更多信息,但是我得到的唯一输出是与上面完全相同的错误。

1 个答案:

答案 0 :(得分:0)

这似乎是引导群集时的计时问题。您最初的kube-apiserver认为没有configmaps资源。

正在使用用于创建ConfigMap的RoleRoleBinding可能没有在集群中完全配置为允许其创建使用ConfigMap的ConfigMap(可能在EKS基础架构中)。 iam-authenticator和以下政策:

resource "aws_iam_role_policy_attachment" "demo-cluster-AmazonEKSClusterPolicy" {
  policy_arn = "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy"
  role       = "${aws_iam_role.demo-cluster.name}"
}

resource "aws_iam_role_policy_attachment" "demo-cluster-AmazonEKSServicePolicy" {
  policy_arn = "arn:aws:iam::aws:policy/AmazonEKSServicePolicy"
  role       = "${aws_iam_role.demo-cluster.name}"
}

depends Terraform子句的作用不大,因为EKS服务似乎正在计时。

我建议您尝试使用与文档中描述的资源相同的terraform-aws-eks模块。如果您想弄清楚它们如何解决您遇到的问题,也可以浏览代码。