【问题标题】:Terraform fails to create ingress (could not find the requested resource ingresses.extensions)terraform 在使用 minikube 时无法创建入口
【发布时间】:2022-01-26 13:20:34
【问题描述】:

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

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

执行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" {

当我尝试使用与上面相同的配置(仅在.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

【问题讨论】:

    标签: kubernetes terraform minikube


    【解决方案1】:

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

    metadata {
        name = "example"
        annotations = {
          "kubernetes.io/ingress.class" = "nginx or your classname"
        }
    

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

    【讨论】:

    • 我试过这样使用注释标签,但没有用:(我将 .yaml 文件添加到问题中
    • 我在您的 yaml 文件中看到您的入口是使用 apiVersion: networking.k8s.io/v1 创建的。但是,当您使用 terraform 资源 kubernetes_ingress 时,它使用了 extensions/v1beta1。如果您改用此资源registry.terraform.io/providers/hashicorp/kubernetes/latest/… 会怎样?
    • 成功了!我的坏我没有看到还有 v1 选项
    猜你喜欢
    • 1970-01-01
    • 2020-10-11
    • 2021-12-23
    • 2020-08-27
    • 2021-07-28
    • 2023-03-09
    • 2021-04-01
    • 2023-04-06
    • 2017-10-07
    相关资源
    最近更新 更多