当前位置: 首页 > 知识库问答 >
问题:

用Terraform配置库伯内特斯入口的健康检查

冯哲彦
2023-03-14

我们正在使用入口(kubernetes\u ingress.db\u admin\u ingress)公开Google kubernetes Engine(GKE)Terraform中部署(kubernetes\u deployment.db\u admin)的服务(kubernetes\u service.db\u admin)。

当Terraform创建入口时,会使用默认运行状况检查自动创建7级负载均衡器:

  • 端口:80

我们的部署(kubernetes_deployment.db_admin)不会以200响应路径/,因此运行状况检查失败。

如何在健康检查配置中更改路径?

resource "google_compute_managed_ssl_certificate" "db_admin_ssl_certificate" {
  provider = google-beta

  name = "db-admin-ssl-certificate"

  managed {
    domains = ["db.${var.domain}."]
  }
}

resource "kubernetes_deployment" "db_admin" {
  metadata {
    name = "db-admin"
    labels = {
      App = "db-admin"
    }
  }

  spec {
    replicas = 1
    selector {
      match_labels = {
        App = "db-admin"
      }
    }
    template {
      metadata {
        labels = {
          App = "db-admin"
        }
      }
      spec {
        container {
          image = "dpage/pgadmin4:2022-01-10-1"
          name  = "db-admin"
          env {
            name = "PGADMIN_DEFAULT_EMAIL"
            value = "test@test.com"
          }
          env {
            name = "PGADMIN_DEFAULT_PASSWORD"
            value = "test"
          }      

          port {
            container_port = 80
          }

          resources {}
        }
      }
    }
  }
}

resource "kubernetes_service" "db_admin" {
  metadata {
    name = "db-admin"
  }
  spec {
    selector = {
      App = kubernetes_deployment.db_admin.spec.0.template.0.metadata[0].labels.App
    }
    port {
      protocol    = "TCP"
      port        = 80
      target_port = 80
    }

    type = "NodePort"
  }
}

resource "kubernetes_ingress" "db_admin_ingress" {
  wait_for_load_balancer = true
  
  metadata {
    name = "db-admin-ingress"
    annotations = {
      "ingress.gcp.kubernetes.io/pre-shared-cert"   = google_compute_managed_ssl_certificate.db_admin_ssl_certificate.name
    }
  }

  spec {

    rule {
      http {
        path {
          backend {
            service_name = "db-admin"
            service_port = 80
          }

          path = "/*"
        }


      }
    }

  }
}

共有1个答案

满俊楠
2023-03-14

根据Google库伯内特斯引擎(GKE)官方留档,您可以通过以下任一方式自定义入口/Level 7负载均衡器健康检查:

>

警告:此方法在此处带有警告

一个backendconfig资源

我强烈建议创建一个backendconfig资源。

不幸的是,基于此GitHub问题,kubernetes Terraform提供程序似乎不支持backendconfig资源。这意味着您可以:

  • 使用kubernetes alpha提供程序(在此处找到)将YAML后端配置清单转录到HCL,其中包含唯一kubernetes alpha资源的参数:kubernetes清单(此处有更多信息)

示例YAML清单:

apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: db-admin
  namespace: default
spec:
  healthCheck:
    checkIntervalSec: 30
    timeoutSec: 5
    healthyThreshold: 1
    unhealthyThreshold: 2
    type: HTTP
    requestPath: /v1/some/path
    port: 80

注意:将后端配置与入口7级负载平衡器关联需要一个服务:

apiVersion: v1
kind: Service
metadata:
  name: db-admin-ingress-backend-config
  labels:
    app: db-admin
  annotations:
    cloud.google.com/backend-config: '{"ports": {"80":"db-admin"}}'
    cloud.google.com/neg: '{"ingress": true}'
spec:
  type: NodePort
  selector:
    app: db-admin
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80

您可以在此处了解有关backendconfig资源和它需要的service的更多信息。

 类似资料:
  • 我试图设置Kubernetes入口,将外部http流量路由到前端pod(路径/)和后端pod(路径/rest/*),但我总是得到400错误,而不是主nginx索引。html。 所以我在第https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer页尝试了谷歌库伯内特斯的例子,但我总是得到400个错误。有什么想法吗?

  • 我正在Kubernetes(GKE)中运行WebService后端应用程序。它仅由我们的前端Web应用程序使用。通常,来自同一用户(ClientIP)的请求有数十个序列。我的应用程序设置为运行至少2个实例(“minReplicas:2”)。 问题:从日志中我可以看到一个pod过载(接收许多请求)而另一个闲置的情况。两个吊舱都处于就绪状态。 我试图修复它:我试图添加一个自定义就绪状态检查,当有太多打

  • 我怎样才能使用入口呢?我尝试使用NodePort和--Target etPort=1001,我在servicePort中添加了80在。 kubectl公开部署测试--Target-port=1001--type=NodePort 我得到了错误 找不到后端-404 我使用的是正确的方法还是需要遵循其他方法?

  • 为了在minikube的k8s上运行php fpm应用程序,我缺少一些kubernetes ingress nginx配置。 k8s配置文件: 先前docker开发环境的docker Nginx映像上使用的Nginx服务器工作配置文件(Nginx位于docker中,是与php容器分离的容器): 在浏览器上访问minikube ip时,出现502错误。 我已经安装了运行以下命令的ingress ng

  • 我假设没有愚蠢的问题,所以这里有一个我找不到直接答案的问题。 现在的情况 我目前有一个运行1.15的Kubernetes集群。AKS上的x,通过Terraform部署和管理。AKS最近宣布Azure将在AKS上停用Kubernetes的1.15版本,我需要将集群升级到1.16或更高版本。现在,据我所知,直接在Azure中升级集群不会对集群的内容产生任何影响,即节点、豆荚、秘密和当前在那里的所有其他

  • 新来的。我想知道是否有人可以帮助我区分我可以用来识别入口控制器和通过YAML和服务识别入口的特征。我有一个预先存在的集群,我认为入口控制器可能是通过helm安装的,但我不确定。有没有办法了解helm在安装nginx ingress控制器时使用的yaml?