gpt4 book ai didi

kubernetes - 为什么 Kubernetes Ingress 在其负载均衡器上默认创建 *两个* 健康检查?

转载 作者:行者123 更新时间:2023-12-02 11:56:14 26 4
gpt4 key购买 nike

在我创建了一个非常基本的 Ingress(下面的 yaml)之后,没有特殊的健康检查定义(在其他 Kubernetes 对象中也没有),Ingress 创建了一个 GCP 负载均衡器。

为什么这个 LB 有两个针对不同节点端口定义的健康检查(“后端服务”),一个针对根路径 /一个反对/healthz ?我希望只看到一个。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress1
spec:
rules:
- host: example.com
http:
paths:
- backend:
serviceName: myservice
servicePort: 80

最佳答案

/ 的原因健康检查

GKE 入口 Controller 的限制之一如下:

为了让 GKE 入口 Controller 使用您的 readinessProbes 作为运行状况检查,Ingress 的 Pod 必须在 Ingress 创建时存在。如果您的副本被缩放到 0 或创建入口时 Pod 不存在,则使用 / 的默认健康检查适用。

由于上述原因,它创建了两个健康检查。

从就绪探测到工作的健康检查有很多注意事项:

  • 必须定义 Pod 的 containerPort 字段
  • 服务的 targetPort 字段必须指向 pod 的端口
    containerPort 值或名称。请注意,targetPort 默认为
    端口值(如果未定义)
  • pod 在创建入口时必须存在
  • 就绪探针必须暴露在匹配的端口上
    在 Ingress
  • 中指定的 servicePort
  • 就绪探针不能有特殊要求,如标题
    探测超时转换为 GCE 健康检查超时

  • 基于上述,使用 / 进行默认的后备健康检查是有意义的。

    /healthz 的原因健康检查

    据此 FAQ所有 GCE URL 映射都需要至少一个默认后端,它处理所有与主机/路径不匹配的请求。在 Ingress 中,默认后端是可选的,因为资源是跨平台的,并非所有平台都需要默认后端。如果您没有在 yaml 中指定一个,GCE 入口 Controller 将注入(inject)在 kube-system 命名空间中运行的 default-http-backend 服务,作为为该入口资源分配的 GCE HTTP lb 的默认后端。

    关于默认后端的一些注意事项:
  • 它是唯一不直接映射到用户的后端服务
    指定 NodePort 服务
  • 它在创建第一个 Ingress 时创建,并在创建第一个 Ingress 时删除
    最后一个 Ingress 被删除,因为我们不想浪费配额,如果
    用户不需要通过 Ingress 进行 L7 负载平衡
  • 它有一个指向/healthz 的 HTTP 健康检查,而不是默认的/,
    因为/按设计提供 404

  • 因此 GKE 入口使用以下 yaml 部署默认后端服务,并为该服务设置/healthz 健康检查。
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
    name: l7-default-backend
    namespace: kube-system
    labels:
    k8s-app: glbc
    kubernetes.io/name: "GLBC"
    kubernetes.io/cluster-service: "true"
    spec:
    replicas: 1
    selector:
    matchLabels:
    k8s-app: glbc
    template:
    metadata:
    labels:
    k8s-app: glbc
    name: glbc
    spec:
    containers:
    - name: default-http-backend
    # Any image is permissible as long as:
    # 1. It serves a 404 page at /
    # 2. It serves 200 on a /healthz endpoint
    image: k8s.gcr.io/defaultbackend-amd64:1.5
    livenessProbe:
    httpGet:
    path: /healthz
    port: 8080
    scheme: HTTP
    initialDelaySeconds: 30
    timeoutSeconds: 5
    ports:
    - containerPort: 8080
    resources:
    limits:
    cpu: 10m
    memory: 20Mi
    requests:
    cpu: 10m
    memory: 20Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
    # This must match the --default-backend-service argument of the l7 lb
    # controller and is required because GCE mandates a default backend.
    name: default-http-backend
    namespace: kube-system
    labels:
    k8s-app: glbc
    kubernetes.io/cluster-service: "true"
    kubernetes.io/name: "GLBCDefaultBackend"
    spec:
    # The default backend must be of type NodePort.
    type: NodePort
    ports:
    - port: 80
    targetPort: 8080
    protocol: TCP
    name: http
    selector:
    k8s-app: glbc

    关于kubernetes - 为什么 Kubernetes Ingress 在其负载均衡器上默认创建 *两个* 健康检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59553878/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com