【问题标题】:Ingress creating health check on HTTP instead of TCPIngress 在 HTTP 而不是 TCP 上创建健康检查
【发布时间】:2022-01-24 00:20:58
【问题描述】:

我实际上是在尝试在我的 gke 集群中运行 3 个容器。我通过网络负载平衡器将它们暴露出来,并且在此之上,我使用入口,因此我可以使用 SSL 证书从不同域访问我的服务。

这是完整的清单

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app:web
    spec:
      containers:
      - name: web
        image: us-east4-docker.pkg.dev/web:e856485      # docker image
        ports:
        - containerPort: 3000
        env:
        - name: NODE_ENV
          value: production
---
# DEPLOYMENT MANIFEST #
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cms
spec:
  replicas: 3
  selector:
    matchLabels:
      app: cms
  template:
    metadata:
      labels:
        app: cms
    spec:
      containers:
      - name: cms
        image: us-east4-docker.pkg.dev/cms:4e1fe2f      # docker image
        ports:
        - containerPort: 8055
        env:
        - name  : DB
          value : "postgres"

        - name  : DB_HOST
          value : 10.142.0.3

        - name  : DB_PORT
          value : "5432"
---
# DEPLOYMENT MANIFEST #
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api
spec:
  replicas: 3
  selector:
    matchLabels:
      app: api
  template:
    metadata:
      labels:
        app: api
    spec:
      containers:
      - name: api
        image: us-east4-docker.pkg.dev/api:4e1fe2f      # docker image
        ports:
        - containerPort: 8080
        env:
        - name  : HOST
          value : "0.0.0.0"

        - name  : PORT
          value : "8080"
     
        - name  : NODE_ENV
          value : production
---
# SERVICE MANIFEST #
apiVersion: v1
kind: Service
metadata:
  name: web-lb
  annotations:
    cloud.google.com/neg: '{"ingress": true}'
  labels:
    app: web
spec:
  ports:
  - port: 3000
    protocol: TCP
    targetPort: 3000
  selector:
    app: web
  type: NodePort
---
# SERVICE MANIFEST #
apiVersion: v1
kind: Service
metadata:
  name: cms-lb
  annotations:
    cloud.google.com/neg: '{"ingress": true}'
  labels:
    app: cms
spec:
  ports:
  - port: 8055
    protocol: TCP
    targetPort: 8055
  selector:
    app: cms
  type: NodePort
---
# SERVICE MANIFEST #
apiVersion: v1
kind: Service
metadata:
  name: api-lb
  annotations:
    cloud.google.com/neg: '{"ingress": true}'
  labels:
    app: api
spec:
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: api
  type: NodePort
---
apiVersion: v1
data:
  tls.crt: abc
  tls.key: abc
kind: Secret
metadata:
  name: web-cert
type: kubernetes.io/tls
---
apiVersion: v1
data:
  tls.crt: abc
  tls.key: abc
kind: Secret
metadata:
  name: cms-cert
type: kubernetes.io/tls
---
apiVersion: v1
data:
  tls.crt: abc
  tls.key: abc
kind: Secret
metadata:
  name: api-cert
type: kubernetes.io/tls
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress
  annotations:
    # If the class annotation is not specified it defaults to "gce".
    kubernetes.io/ingress.class: "gce"
spec:
  tls:
  - secretName: api-cert
  - secretName: cms-cert
  - secretName: web-cert
  rules:
  - host: web-gke.dev
    http:
      paths:
      - pathType: ImplementationSpecific
        backend:
          service:
            name: web-lb
            port:
              number: 3000
  - host: cms-gke.dev
    http:
      paths:
      - pathType: ImplementationSpecific
        backend:
          service:
            name: cms-lb
            port:
              number: 8055
  - host: api-gke.dev
    http:
      paths:
      - pathType: ImplementationSpecific
        backend:
          service:
            name: api-lb
            port:
              number: 8080

容器可通过负载均衡器(网络)访问,但从入口(L7 lb)运行状况检查失败

我尝试将健康检查从 HTTP:80 手动编辑到 TCP:8080/8055/3000 以获取 3 个服务,它可以正常工作。

但最终,入口将其恢复为 HTTP 健康检查,但它再次失败。我也尝试使用 NodePort 而不是负载均衡器作为服务类型,但没有运气。 有什么帮助吗?

【问题讨论】:

  • 使用 serviceType Loadbalancer AND Ingress 并没有真正的好处,您只是在创建多个 Google 负载均衡器。如果您的服务需要纯 TCP 流量,只需使用 LoadBalancers。如果您想要第 7 层路由,请将服务更改为 NodePort 并保留 Ingress
  • 是的,我正在使用 nodeport 提供服务。让我编辑代码块
  • @SohaibMustafa 下面的答案解决了你的问题吗?
  • 是的,它有。这不是端口或协议的问题,而是健康检查位置的问题。它没有给出 200 / 所以我不得不将它更改为实际路径

标签: kubernetes google-cloud-platform google-kubernetes-engine kubernetes-ingress


【解决方案1】:

首先我要提到的是,您需要重新检查您的实现,因为据我所知,您正在创建一个Ingress,它将创建一个LoadBanacer,而这个Ingress 正在使用以下三个服务键入LoadBalancer,其中每个人还将创建其LoadBalancer(我假设默认行为,除非您应用了著名的解决方法,即在创建后手动删除serviceLoadBalancer)。

除非您出于某种原因需要该设计,否则我认为这是不正确的。因此,我的建议是您可能希望将服务类型更改为 NodePort


至于回答你的问题,你缺少的是:

您需要使用自定义HealthCheck 配置实现BackendConfig

1- 创建Backendconfig:

apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: api-lb-backendconfig
spec:
  healthCheck:
    checkIntervalSec: INTERVAL
    timeoutSec: TIMEOUT
    healthyThreshold: HEALTH_THRESHOLD
    unhealthyThreshold: UNHEALTHY_THRESHOLD
    type: PROTOCOL
    requestPath: PATH
    port: PORT

2- 在您的服务/s 中使用此配置

apiVersion: v1
kind: Service
metadata:
  annotations:
    cloud.google.com/backend-config: '{"ports": {
    "PORT_NAME_1":"api-lb-backendconfig"
    }}'
spec:
  ports:
  - name: PORT_NAME_1
    port: PORT_NUMBER_1
    protocol: TCP
    targetPort: TARGET_PORT

应用此类配置后,您的IngressLoadBalanacer 将使用BackendConfig 创建"api-lb-backendconfig"


this 文档页面作为您的参考。

【讨论】:

  • 您对我的大部分问题都是正确的,但还有一件事。如何通过 TCP 创建健康检查?我可以在控制台上看到它,但根据这个链接,我无法为 TCP 协议创建健康检查。
  • 这是真的,因为健康检查需要 HTTP 响应来执行健康检查。由于您使用的是入口(第 7 层),因此假设您正在公开 Web 服务,HTTP 将是首选类型,对于端口,请选择您正在使用的端口(不需要是 80 或 8080) .运行状况检查只需要它所针对的端口的 200 响应
  • 好的,我明白你的意思,但是如果我想在 TCP 而不是 HTTP 上配置健康检查,有什么办法吗?我可以从控制台看到这是可能的,但我无法使用 Kubernetes 配置文件来做到这一点
  • @SohaibMustafa as Patrick 强调 运行状况检查需要获得 HTTP 200 (OK) 响应。因此,无论您使用哪个端口,响应都必须是 HTTP 200(OK)。有关详细信息,请参阅here。我建议你尝试创建health check,然后从云控制台查看它的样子
猜你喜欢
  • 2016-10-16
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 2017-02-02
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 2019-09-26
相关资源
最近更新 更多