kubernetes - 如何通过 terraform 在新配置的 EKS 集群上修复 kubernetes_config_map 资源错误?
问题描述
我正在使用 Terraform 来配置 EKS 集群(主要遵循此处的示例)。在教程的最后,有一个方法是通过terraform output
命令输出 configmap,然后通过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
工作,并将 configmap 应用到 EKS 集群。这让我相信这可能是一个时间问题?我试图在集群配置和应用配置映射之间执行一系列操作,但这没有用。我还提出了一个明确的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"]
}
我希望它第一次可以正确运行,但是它仅在第二次应用相同文件且没有更改的情况下运行。
我试图通过启用TRACE
terraform 的调试标志来获取更多信息,但是我得到的唯一输出是与上面完全相同的错误。
解决方案
这似乎是引导集群时的时间问题。您kube-apiserver
最初认为没有configmaps
资源。
很可能它使用Role
的RoleBinding
创建 ConfigMap 尚未在集群中完全配置,以允许它创建使用iam-authenticator和以下策略的 ConfigMap(可能在 EKS 基础架构中):
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}"
}
Terraform 子句不会做太多事情,depends
因为似乎时间正在 EKS 服务中发生。
我建议您尝试使用文档中描述的相同资源的terraform-aws-eks模块。如果您想了解它们如何解决您所看到的问题,您也可以浏览代码。
推荐阅读
- node.js - node.js 路由器中的同步错误处理
- python - 在读取多个文件时更改起始列标题并读取下一行
- express - Cloud Run 不适用于 Express 静态中间件
- reactjs - react项目中的flatpickr webpack导入错误
- bash - 重新连接 Openwrt 脚本以在启动时运行并继续检查当前状态
- javascript - 用于检测来自特定域的任何通配符 url(例如:google)的 Javascript
- reactjs - React Firestore 增量给出类型错误
- tensorflow - 如何将以下代码从 pytorch 更改为 tensorflow?
- express - 将 jQuery 转换为 Express 函数
- swift - 表视图自动维度强制重复约束