使用 Terraform 部署 Kubernetes Ingress

deploy kubernetes ingress with terraform

我正在尝试使用 terraform 部署 kubernetes ingress。 如此处所述 link 和我自己的变体:

resource "kubernetes_ingress" "node" {
  metadata {
    name = "node"
  }
  spec {
    ingress_class_name = "nginx"
    rule {
      host = "backend.io"
      http {
        path {
          path = "/"
          backend {
            service_name = kubernetes_service.node.metadata.0.name
            service_port = 3000
          }
        }
      }
    }
  }
}

错误:

╷
│ Error: Failed to create Ingress 'default/node' because: the server could not find the requested resource (post ingresses.extensions)
│ 
│   with kubernetes_ingress.node,
│   on node.tf line 86, in resource "kubernetes_ingress" "node":
│   86: resource "kubernetes_ingress" "node" {
│ 
╵

有效:

kubectl apply -f file_below.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: node
spec:
  ingressClassName: nginx
  rules:
  - host: backend.io
    http:
      paths:
      - path: /
        pathType: ImplementationSpecific
        backend:
            service:
              name: node
              port:
               number: 3000

需要一些关于如何使用 terraform 部署 kubernetes ingress 的想法。

这里的问题是 YML 中的示例使用了正确的 API 版本,即 networking.k8s.io/v1,因此它可以工作,因为您的 K8s 版本可能高于 1.19。自该版本以来可用,Ingress 所属的 extensions/v1beta1 在 1.22 中被弃用,取而代之的是 networking.k8s.io/v1,您可以阅读 here。在这种情况下,您当前的 Terraform 代码正在为 Ingress 使用旧的 K8s API 版本。您可以在文档菜单的 left-hand 一侧看到:

如果您进一步查看文档,您将看到 networking/v1resource section kubernetes_ingress_v1。更改您在 Terraform 中的代码以使用来自 networking.k8s.io/v1 的 Ingress,它将变为:

resource "kubernetes_ingress_v1" "node" {
  metadata {
    name = "node"
  }

  spec {
    ingress_class_name = "nginx"
    rule {
      host = "backend.io"
      http {
        path {
          path = "/*"
          path_type = "ImplementationSpecific"
          backend {
            service {
              name = kubernetes_service.node.metadata.0.name
              port {
                number = 3000
              }
            }
          }
        }
      }
    }
  }
}