Как исправить ошибку ресурса kubernetes_config_map во вновь подготовленном кластере EKS через terraform? - PullRequest
3 голосов
/ 04 апреля 2019

Я использую Terraform для предоставления кластера EKS (в основном по примеру здесь ). В конце урока есть метод вывода configmap с помощью команды terraform output, а затем применения его к кластеру с помощью kubectl apply -f <file>. Я пытаюсь вставить эту команду kubectl в файл Terraform, используя ресурс kubernetes_config_map, однако при первом запуске 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 работает и применяет карту конфигурации к кластеру EKS. Это приводит меня к мысли, что это, возможно, проблема с выбором времени? Я попытался предварительно выполнить ряд действий между подготовкой кластера и применением карты конфигурации, но это не сработало. Я также поставил явный аргумент depends_on, чтобы убедиться, что кластер был полностью подготовлен, прежде чем пытаться применить карту конфигурации.

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"]
}

Я ожидаю, что это будет работать правильно в первый раз, однако он запускается только после применения того же файла без изменений во второй раз.

Я попытался получить больше информации, включив флаг отладки TRACE для terraform, однако единственный вывод, который я получил, был точно такой же ошибкой, что и выше.

1 Ответ

0 голосов
/ 05 апреля 2019

Это похоже на проблему синхронизации при загрузке кластера.Ваш kube-apiserver изначально не думает, что есть ресурс configmaps.

Вероятно, что Role и RoleBinding, что он использует создание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 , который использует тот же самыйРесурс описан в док.Вы также можете просмотреть код, если хотите выяснить, как они решают проблему, с которой вы столкнулись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...