尝试使用 EKS 集群将 configmap 应用于身份验证时出错

Posted

技术标签:

【中文标题】尝试使用 EKS 集群将 configmap 应用于身份验证时出错【英文标题】:Error when try apply configmap to auth with EKS cluster 【发布时间】:2021-12-02 09:20:50 【问题描述】:

我有以下问题。我尝试使用带有 Gitlab CI/CD 的 Terraform 连接到 eks 集群,我收到错误消息,但是在我的计算中尝试它时,不会出现此错误,有人有同样的错误吗?


$ terraform output authconfig > authconfig.yaml
$ cat authconfig.yaml
<<EOT
apiVersion: v1
kind: ConfigMap
metadata:
    name: aws-auth
    namespace: kube-system
data:
    mapRoles: |
      - rolearn: "arn:aws:iam::503655390180:role/clusters-production-workers"
            username: system:node:EC2PrivateDNSName
            groups:
                - system:bootstrappers
                - system:nodes
EOT
$ kubectl create -f authconfig.yaml -n kube-system
error: error parsing authconfig.yaml: error converting YAML to JSON: yaml: line 2: mapping values are not allowed in this context

【问题讨论】:

【参考方案1】:

输出包含 EOT(EndOfText) 标记,因为它最初是作为多行字符串生成的。

如文档所示 (terrafom doc link)

不要使用“heredoc”字符串来生成 JSON 或 YAML。相反,使用 jsonencode 函数或 yamlencode 函数,以便 Terraform 可以 负责保证有效的 JSON 或 YAML 语法。

在构建输出之前使用 json 编码或 yaml 编码。

如果您想继续使用现在的内容,请尝试使用 output -json 或 -raw 提供这些选项

terraform 输出 -json authconfig > authconfig.yaml 或 terraform 输出 -raw authconfig > authconfig.yaml

【讨论】:

感谢帮助,一切正常!【参考方案2】:

错误信息告诉你 authconfig.yaml 文件无法从 YAML 转换为 JSON,提示它不是一个有效的 yaml

您向我们展示的 cat authconfig.yaml 包含一些 &lt;&lt;EOTEOT 标签。我建议在运行 kubectl create -f

之前删除这些

您的评论表明您已经知道这一点 - 那么您为什么不询问 terraform,而不是向我们展示 kubectl create 失败?从您的帖子来看,听起来您实际上是在复制/粘贴您的工作输出,甚至没有阅读它。

因此,很明显,下一步是 terraform 输出 -raw 或 -json,在他们的文档或知识库中有多次提及,谷歌搜索会指向您:

https://discuss.hashicorp.com/t/terraform-outputs-with-heredoc-syntax-leaves-eot-in-file/18584/7 https://www.terraform.io/docs/cli/commands/output.html

最后:我们可以问为什么?当您可以让 terraform 写入文件时,您为什么要 terraform output &gt; 一些东西?

虽然作为一般规则,每当将 terraform stdout/stderr 写入文件时,我强烈建议使用 no-color。

【讨论】:

好的。这是我已经知道的,为了让 GitLab 能够应用 configMap,但是当我运行 CI / CD 时,它会与这个 EOT 一起出现 查看 terraform 输出文档,有几个选项可以尝试:terraform.io/docs/cli/commands/output.html。以 -raw 开头。如果它不起作用,-json 可能会。 @MiltonJesus 您可以使用yamlencode() 来避免这些类型的问题,而不是在字符串模板中构建您的 yaml。 谢谢大家,这个解决方案有效

以上是关于尝试使用 EKS 集群将 configmap 应用于身份验证时出错的主要内容,如果未能解决你的问题,请参考以下文章

configmaps“aws-auth”已经存在

Prometheus:区分应用程序指标

使用 Pulumi 创建 EKS 后如何修改 `aws-auth` Config Map?

在 EKS 中哪里可以找到我的集群域?

如何将 GitLab Operator 部署到 AWS EKS 集群?

尝试使用 eksctl 和 ssh-access 创建 eks 集群