配置 Endpoint Health Checker

Overview

Endpoint Health Checker 是一个集群插件,旨在监控和管理 k8s 集群中服务端点的健康状态。它会自动将不健康的端点从服务中移除,确保流量仅路由到健康实例,从而提升整体服务的可靠性和可用性。

Key Features

  • 自动健康监控:持续监控 k8s 集群中服务端点的健康状态
  • 负载均衡集成:自动将不健康端点从服务中移除
  • 服务可用性:确保流量仅导向健康且可用的端点
  • 快速故障切换:在节点断电时将端点切换时间从 40 秒缩短至 10 秒

Installation

通过 Marketplace 安装

  1. 进入 管理员 > Marketplace > 集群插件

  2. 在插件列表中搜索“Alauda Container Platform Endpoint Health Checker”。

  3. 点击 安装 打开安装配置页面。

  4. 在部署配置对话框中,可选配置以下参数:

    参数描述
    节点选择器配置标签选择器,指定 Endpoint Health Checker 组件应运行在哪些节点上。点击 添加 可添加多个标签键值对。
    节点容忍度配置容忍度,允许 Endpoint Health Checker 组件调度到带有特定污点的节点上。点击 添加 可添加多个包含 Key、Value 和类型的容忍度。
  5. 点击 安装 部署插件。

  6. 等待插件状态变为“Ready”。

How It Works

健康检查机制

Endpoint Health Checker 是专门的健康监控组件,确保只有健康的端点接收流量。它通过监控服务端点并自动管理其可用性状态来实现。

核心功能

Endpoint Health Checker 的工作流程:

  1. 服务发现:识别集群中配置了健康监控的服务和 Pod。
  2. Pod 健康监控:监控支撑服务端点的 Pod 的就绪和存活探针状态。
  3. 主动健康检查:使用可配置的标准执行主动健康评估:
    • TCP 连接检查:建立 TCP 连接以验证端口可访问性。
  4. 端点管理:自动将不健康端点从服务端点列表中移除,防止流量路由到故障实例。

健康检查流程

健康检查流程包括:

  • 探针集成:利用 Kubernetes 的就绪和存活探针结果作为初步健康指标。
  • 网络连通性:向目标端点端口发送 TCP 包以验证可访问性。
  • 响应验证:评估响应状态、时长和内容以确定端点健康状况。
  • 自动故障切换:将无响应或失败的端点从服务端点列表中移除。

性能提升

  • 之前方法:依赖 kubelet 心跳检测,延迟最长达 40 秒。
  • 当前方法:主动端点健康检查,检测和切换时间为 10 秒。
  • 提升效果:显著提升 ALB + MetalLB 环境中节点故障时的服务可用性。

How To Activate

健康检查可通过以下两种方式激活:

Pod 级注解(推荐)

针对 ALB

设置 ALB2alb.cpaas.io/pod-annotations 注解

apiVersion: crd.alauda.io/v2
kind: ALB2
metadata:
  annotations:
    alb.cpaas.io/pod-annotations: '{"endpoint-health-checker.io/enabled":"true"}'
  name: demo-alb
spec:
  config:
    loadbalancerName: demo-alb
    nodeSelector:
      ingress: 'true'
    replicas: 1
  type: nginx

针对 IngressNginx

  1. 安装 ingress-nginx
  2. IngressNginx.spec.controller.podAnnotations 中设置 podAnnotations
    apiVersion: ingress-nginx.alauda.io/v1
    kind: IngressNginx
    metadata:
      name: demo
      namespace: ingress-nginx-operator
    spec:
      controller:
        replicaCount: 1
        podAnnotations:
          endpoint-health-checker.io/enabled: 'true'

针对 EnvoyGateway

  1. 安装 envoy-gateway-operator
  2. EnvoyProxy.spec.provider.kubernetes.envoyDeployment.patch.value.spec.template.metadata.annotations 中设置 annotations
    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
      name: demo
    spec:
      infrastructure:
        parametersRef:
          group: gateway.envoyproxy.io
          kind: EnvoyProxy
          name: demo
      gatewayClassName: envoy-gateway-operator-cpaas-default
      listeners:
        - name: http
          port: 80
          protocol: HTTP
    ---
    apiVersion: gateway.envoyproxy.io/v1alpha1
    kind: EnvoyProxy
    metadata:
      name: demo
    spec:
      provider:
        kubernetes:
          envoyDeployment:
            replicas: 1
            patch:
              type: StrategicMerge
              value:
                spec:
                  template:
                    metadata:
                      annotations:
                        endpoint-health-checker.io/enabled: 'true'
            container:
              imageRepository: registry.alauda.cn:60080/acp/envoyproxy/envoy
        type: Kubernetes

针对自定义 Deployment

Deployment.spec.template.metadata.annotations 中设置 annotations

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
      annotations:
        endpoint-health-checker.io/enabled: 'true'
    spec:
      containers:
        - name: container
          ports:
            - containerPort: 8080
          livenessProbe:
            tcpSocket:
              port: 8080
            initialDelaySeconds: 15
            periodSeconds: 10
          readinessProbe:
            tcpSocket:
              port: 8080
            initialDelaySeconds: 5
            periodSeconds: 5

Pod 级 readinessGates(旧版)

为旧版本配置 Pod 的 readinessGates:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pod-legacy
  namespace: cpaas-system
spec:
  replicas: 3
  selector:
    matchLabels:
      app: pod-legacy
  template:
    metadata:
      labels:
        app: pod-legacy
    spec:
      readinessGates:
        - conditionType: 'endpointHealthCheckSuccess'
      containers:
        - name: container
          image: your-image:latest
          ports:
            - containerPort: 8080
          livenessProbe:
            tcpSocket:
              port: 8080
            initialDelaySeconds: 15
            periodSeconds: 10
          readinessProbe:
            tcpSocket:
              port: 8080
            initialDelaySeconds: 5
            periodSeconds: 5

注意:readinessGates 配置来自旧版本,建议新部署使用 Pod 注解 endpoint-health-checker.io/enabled: 'true'

Uninstallation

卸载 Endpoint Health Checker:

  1. 进入 管理员 > Marketplace > 集群插件

  2. 找到已安装的“Endpoint Health Checker”插件。

  3. 点击选项菜单,选择 卸载

  4. 按提示确认卸载。