Terraform 无法创建入口(找不到请求的资源 ingresses.extensions)

Max*_*Max 12 kubernetes terraform minikube

我在本地使用 minikube。以下是.tf我用来创建 kubernetes 集群的文件:

provider "kubernetes" {
  config_path = "~/.kube/config"
}

resource "kubernetes_namespace" "tfs" {
  metadata {
    name = "tfs" # terraform-sandbox
  }
}

resource "kubernetes_deployment" "golang_webapp" {
  metadata {
    name      = "golang-webapp"
    namespace = "tfs"
    labels = {
      app = "webapp"
    }
  }
  spec {
    replicas = 3
    selector {
      match_labels = {
        app = "webapp"
      }
    }
    template {
      metadata {
        labels = {
          app = "webapp"
        }
      }
      spec {
        container {
          image             = "golang-docker-example"
          name              = "golang-webapp"
          image_pull_policy = "Never" # this is set so that kuberenetes wont try to download the image but use the localy built one
          liveness_probe {
            http_get {
              path = "/"
              port = 8080
            }
            initial_delay_seconds = 15
            period_seconds        = 15
          }

          readiness_probe {
            http_get {
              path = "/"
              port = 8080
            }
            initial_delay_seconds = 3
            period_seconds        = 3
          }
        }
      }
    }
  }
}


resource "kubernetes_service" "golang_webapp" {
  metadata {
    name      = "golang-webapp"
    namespace = "tfs"
    labels = {
      app = "webapp_ingress"
    }
  }
  spec {
    selector = {
      app = kubernetes_deployment.golang_webapp.metadata.0.labels.app
    }
    port {
      port        = 8080
      target_port = 8080
      protocol    = "TCP"
    }
    # type = "ClusterIP"
    type = "NodePort"
  }
}

resource "kubernetes_ingress" "main_ingress" {
  metadata {
    name      = "main-ingress"
    namespace = "tfs"
  }

  spec {
    rule {
      http {
        path {
          backend {
            service_name = "golang-webapp"
            service_port = 8080
          }
          path = "/golang-webapp"
        }
      }
    }
  }
}

Run Code Online (Sandbox Code Playgroud)

执行时terraform apply,我成功地创建了除入口之外的所有资源。

错误是:

Error: Failed to create Ingress 'tfs/main-ingress' because: the server could not find the requested resource (post ingresses.extensions)

with kubernetes_ingress.main_ingress,
   on main.tf line 86, in resource "kubernetes_ingress" "main_ingress":
   86: resource "kubernetes_ingress" "main_ingress" {
Run Code Online (Sandbox Code Playgroud)

当我尝试使用与上面相同的配置(仅在命令中.yaml并使用kubectl apply命令)使用 kubectl 创建入口服务时,它可以工作,因此 kubectl 和 minikube 似乎能够创建这种类型的入口,但 terraform 无法创建某些入口原因...

预先感谢您的任何帮助!

编辑1:

添加.yaml我可以用来创建入口的

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  namespace: tfs
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: golang-webapp
                port:
                  number: 8080
Run Code Online (Sandbox Code Playgroud)

and*_*ied 13

kubernetes_ingress资源生成一个入口,apiVersion您的 kubernetes 集群不支持该入口。您必须使用[kubernetes_ingress_v1][1]看起来与资源类似kubernetes_ingress但有一些差异的资源。对于您的示例,它将是这样的:

resource "kubernetes_ingress_v1" "jenkins-ingress" {
   metadata {
      name        = "example-ingress"
      namespace   = "tfs"
      annotations = {
        "nginx.ingress.kubernetes.io/rewrite-target" = "/$1"
      }
   }
   spec {
      rule {
        http {
         path {
           path = "/"
           backend {
             service {
               name = "golang-webapp"
               port {
                 number = 8080
               }
             }
           }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


beh*_*777 2

我认为这个问题可能与入口类名有关。可能您需要在 .tf 中明确提供它:

metadata {
    name = "example"
    annotations = {
      "kubernetes.io/ingress.class" = "nginx or your classname"
    }
Run Code Online (Sandbox Code Playgroud)

或者可能是您的集群中不存在 ingresses.extensions。你能提供正确执行的.yaml吗?

  • 我在您的 yaml 文件中看到您的入口是使用 apiVersion: **networking.k8s.io/v1** 创建的。但是,当您使用 terraform 资源 _kubernetes_ingress_ 时,它使用 **extensions/v1beta1**。如果您使用此资源 https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs/resources/ingress_v1 会怎么样? (8认同)
  • 我尝试以这种方式使用注释标签,但不起作用:( 我将 .yaml 文件添加到问题中 (2认同)