【问题标题】:Kubernetes Manifest TerraformKubernetes 清单 Terraform
【发布时间】:2022-01-15 07:22:58
【问题描述】:

我正在尝试使用 kubernetes_manifest terraform 资源创建一个 Kubernetes Ingress 对象。它抛出以下错误:

│ Error: Failed to morph manifest to OAPI type
│ 
│   with module.services.module.portal.module.appmesh.kubernetes_manifest.service_ingress_object,
│   on .terraform/modules/services.portal.appmesh/kubernetes_manifest.tf line 104, in resource "kubernetes_manifest" "service_ingress_object":
│  104: resource "kubernetes_manifest" "service_ingress_object" {
│ 
│ AttributeName("spec"): [AttributeName("spec")] failed to morph object element into object element: AttributeName("spec").AttributeName("rules"): [AttributeName("spec").AttributeName("rules")] failed to
│ morph object element into object element: AttributeName("spec").AttributeName("rules"): [AttributeName("spec").AttributeName("rules")] unsupported morph of object value into type:
│ tftypes.List[tftypes.Object["host":tftypes.String, "http":tftypes.Object["paths":tftypes.List[tftypes.Object["backend":tftypes.Object["resource":tftypes.Object["apiGroup":tftypes.String,
│ "kind":tftypes.String, "name":tftypes.String], "serviceName":tftypes.String, "servicePort":tftypes.DynamicPseudoType], "path":tftypes.String, "pathType":tftypes.String]]]]]

我的代码是:

resource "kubernetes_manifest" "service_ingress_object" {
  manifest = {
    "apiVersion" = "networking.k8s.io/v1beta1"
    "kind"       = "Ingress"
    "metadata" = {
      "name"      = "${var.service_name}-ingress"
      "namespace" = "${var.kubernetes_namespace}"
      "annotations" = {
        "alb.ingress.kubernetes.io/actions.ssl-redirect" = "{'Type': 'redirect', 'RedirectConfig': { 'Protocol': 'HTTPS', 'Port': '443', 'StatusCode': 'HTTP_301'}}"
        "alb.ingress.kubernetes.io/listen-ports"         = "[{'HTTP': 80}, {'HTTPS':443}]"
        "alb.ingress.kubernetes.io/certificate-arn"      = "${data.aws_acm_certificate.enivronment_default_issued.arn}"
        "alb.ingress.kubernetes.io/scheme"               = "internal"
        "alb.ingress.kubernetes.io/target-type"          = "instance"
        "kubernetes.io/ingress.class"                    = "alb"
      }
    }
    "spec" = {
      "rules" = {
        "host" = "${aws_route53_record.service_dns.fqdn}"
        "http" = {
          "paths" = {
            "backend" = {
              "serviceName" = "${var.service_name}-svc"
              "servicePort" = "${var.service_port}"
            }
            "path" = "/*"
          }
        }
      }
    }
  }
}

我尝试在“规范”字段中添加括号,但是当我这样做时,我只是出现以下错误:

│ Error: Missing item separator
│ 
│   on .terraform/modules/services.portal.appmesh/kubernetes_manifest.tf line 121, in resource "kubernetes_manifest" "service_ingress_object":
│  120:     "spec" = {[
│  121:       "rules" = {
│ 
│ Expected a comma to mark the beginning of the next item.

收到该错误后,我尝试在“规范”下添加逗号。在此之后它只是不断抛出相同的错误。

【问题讨论】:

  • 错误信息是说rules的值应该是一个列表。 "rules" = [。它应该包含一个对象列表
  • 您可以通过 API 架构文档确认这一点:kubernetes.io/docs/reference/kubernetes-api/service-resources/…
  • @jordanm 是的,但是当我将其列为列表时,即使添加了逗号,逗号错误也不会消失
  • 您需要"rules" = [。您的语法错误示例为 {[ 而不是 [
  • @jordanm 我已经尝试过了。同样的问题

标签: kubernetes terraform


【解决方案1】:

我想通了。您需要在“{”之前添加括号。所以代码现在看起来像这样:

resource "kubernetes_manifest" "service_ingress_object" {
  manifest = {
    "apiVersion" = "networking.k8s.io/v1beta1"
    "kind"       = "Ingress"
    "metadata" = {
      "name"      = "${var.service_name}-ingress"
      "namespace" = "${var.kubernetes_namespace}"
      "annotations" = {
        "alb.ingress.kubernetes.io/actions.ssl-redirect" = "{'Type': 'redirect', 'RedirectConfig': { 'Protocol': 'HTTPS', 'Port': '443', 'StatusCode': 'HTTP_301'}}"
        "alb.ingress.kubernetes.io/listen-ports"         = "[{'HTTP': 80}, {'HTTPS':443}]"
        "alb.ingress.kubernetes.io/certificate-arn"      = "${data.aws_acm_certificate.enivronment_default_issued.arn}"
        "alb.ingress.kubernetes.io/scheme"               = "internal"
        "alb.ingress.kubernetes.io/target-type"          = "instance"
        "kubernetes.io/ingress.class"                    = "alb"
      }
    }
    "spec" = {
      "rules" = [{
        "host" = "${aws_route53_record.service_dns.fqdn}"
        "http" = {
          "paths" = [{
            "backend" = {
              "serviceName" = "${var.service_name}-svc"
              "servicePort" = "${var.service_port}"
            }
            "path" = "/*"
          }]
        }
      }]
    }
  }
}

【讨论】:

    猜你喜欢
    • 2022-06-11
    • 2019-11-26
    • 2018-03-28
    • 1970-01-01
    • 2020-03-10
    • 2021-03-08
    • 2020-05-30
    • 2021-11-15
    • 2016-05-04
    相关资源
    最近更新 更多