Gateway API 实践之(六)FSM Gateway 的健康检查功能

2024-01-30 10:52

本文主要是介绍Gateway API 实践之(六)FSM Gateway 的健康检查功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

FSM Gateway 流量管理策略系列:

  • 故障注入
  • 黑白名单访问控制
  • 限速
  • 重试
  • 会话保持
  • 健康检查
  • 负载均衡算法
  • TLS 上游
  • 双向 TLS

网关的健康检查功能是一种自动化监控机制,用于定期检查和验证后端服务的健康状况,确保流量只被转发到那些健康且能正常处理请求的服务。这一功能在微服务或分布式系统中尤为关键,因为它通过及时识别并隔离故障或性能下降的服务,来维护系统的高可用性和弹性。

通过健康检查,网关能够保证请求负载被有效地分配到运行良好的服务上,从而提高整体系统的稳定性和响应速度。

前置条件

  • Kubernetes 集群
  • kubectl 工具

环境准备

安装 FSM Gateway

FSM Gateway 的安装,可以参考 安装文档。这里选择 CLI 的方式安装。

下载 FSM CLI。

system=$(uname -s | tr '[:upper:]' '[:lower:]')
arch=$(uname -m | sed -E 's/x86_/amd/' | sed -E 's/aarch/arm/')
release=v1.2.0
curl -L https://github.com/flomesh-io/fsm/releases/download/$release/fsm-$release-$system-$arch.tar.gz | tar -vxzf -
./$system-$arch/fsm version
sudo cp ./$system-$arch/fsm /usr/local/bin/fsm

在安装 FSM 时启用 FSM Gateway,默认情况是不启用的。

fsm install \--set=fsm.fsmGateway.enabled=true

部署示例应用

为了验证健康检查功能,需要两个不同健康状态的端点。因此我们创建了 Service pipy,并为其创建了两个返回不同响应的端点。这两个端点使用可编程代理 Pipy 来模拟的。

kubectl create namespace server
kubectl apply -n server -f - <<EOF
apiVersion: v1
kind: Service
metadata:name: pipy
spec:selector:app: pipyports:- protocol: TCPport: 8080targetPort: 8080---
apiVersion: v1
kind: Pod
metadata:name: pipy-1labels:app: pipy
spec:containers:- name: pipyimage: flomesh/pipy:0.99.0-2command: ["pipy", "-e", "pipy().listen(8080).serveHTTP(new Message({status: 200},'Hello, world'))"]---
apiVersion: v1
kind: Pod
metadata:name: pipy-2labels:app: pipy
spec:containers:- name: pipyimage: flomesh/pipy:0.99.0-2command: ["pipy", "-e", "pipy().listen(8080).serveHTTP(new Message({status: 503},'Service unavailable'))"]
EOF

创建网关和路由

接下来创建网关并为 Service pipy 创建路由。

kubectl apply -n server -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:name: simple-fsm-gateway
spec:gatewayClassName: fsm-gateway-clslisteners:- protocol: HTTPport: 8000name: httpallowedRoutes:namespaces:from: Same
---
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:name: fortio-route
spec:parentRefs:- name: simple-fsm-gatewayport: 8000rules:- matches:- path:type: PathPrefixvalue: /backendRefs:- name: pipyport: 8080
EOF

检查应用是否可以正常访问。通过结果可以看到,网关将请求负载均衡到了两个端点上:一个健康端点和一个不健康端点。

export GATEWAY_IP=$(kubectl get svc -n server -l app=fsm-gateway -o jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}')curl -o /dev/null -s -w '%{http_code}' http://$GATEWAY_IP:8000/
200curl -o /dev/null -s -w '%{http_code}' http://$GATEWAY_IP:8000/
503

健康检查功能测试

接下来配置健康检查策略。

  • targetRef 指定策略作用的目标资源,在此策略中目标资源只能是 K8s core 中的 Service 。此处我们指定 命名空间 server 下的 pipy
  • ports` 服务的端口列表,由于服务可能暴露多个端口,可以为不同的端口这是重试策略。
    • port 服务端口,设置为本示例中 pipy 服务的 8080

    • config 策略的核心配置。

      • interval:健康检查间隔,表示系统对后端服务进行健康检查的时间间隔。
      • maxFails:最大失败次数,定义了在将上游服务标记为不可用之前,可以连续失败的健康检查次数。这是一个关键参数,因为它决定了系统在决定服务不健康之前的容忍度。
      • failTimeout:失败超时,定义了一个上游服务在被标记为不健康后,将被暂时禁用的时间长度。这意味着,即使服务再次变得可用,它也会在这段时间内被代理视为不可用。
      • path:健康检查路径,用于 HTTP 健康检查的路径。
      • matches:匹配条件,用于确定 HTTP 健康检查的成功或失败。此字段可以包含多个条件,例如期望的 HTTP 状态码、响应体内容等。
        • statusCodes:匹配 HTTP 响应的状态码列表,如 [200,201,204]
        • body:匹配 HTTP 响应的主体内容。
        • headers:匹配 HTTP 响应的头部信息。此字段是可选的。
          • name:它定义了你想在 HTTP 响应头部中匹配的具体字段名。例如,如果你想检查 Content-Type 头部的值,你会设置 nameContent-Type。此字段只在 Type 设置为 headers 时有效,其他情况下不应该设置。此字段是可选的。
          • value:期望的数据。定义了预期的匹配值。例如,

详细的策略配置可以参考官方文档 HealthCheckPolicy。

kubectl apply -n server -f - <<EOF
apiVersion: gateway.flomesh.io/v1alpha1
kind: HealthCheckPolicy
metadata:name: health-check-policy-sample
spec:targetRef:group: ""kind: Servicename: pipynamespace: serverports:- port: 8080config: interval: 10maxFails: 3failTimeout: 1path: /healthzmatches:- statusCodes: - 200- 201
EOF

此时,我们尝试多次请求可以发现都会收到 200 的响应,说明不健康的端点已经被网关隔离了。

curl -o /dev/null -s -w '%{http_code}' http://$GATEWAY_IP:8000/
200curl -o /dev/null -s -w '%{http_code}' http://$GATEWAY_IP:8000/
200curl -o /dev/null -s -w '%{http_code}' http://$GATEWAY_IP:8000/
200

关于 Flomesh
Flomesh(易衡科技)成立于 2018 年,自主研发并开源了高性能可编程代理 Pipy(https://github.com/flomesh-io/pipy)。以 Pipy 为基础,Flomesh 研发了软件负载均衡、服务网格两款软件产品。为工信部认证的可信云产品、可信开源项目。

Flomesh 核心竞争力来自完全自研的核心组件 Pipy,该组件高性能、高可靠、低延迟、可编程、可扩展、低依赖,采用 C++ 开发,内置自研的 JS 引擎,支持适用 JS 脚本做扩展开发。支持包括 x86、arm、龙芯、海光等硬件 CPU 架构;支持 Linux、FreeBSD、OpenWrt 等多种核心的操作系统。

Flomesh 成立以来,以技术为根基、以客户为导向,产品被应用在头部股份制商业银行总行、大型保险公司、运营商总部以及研究院等众多客户和多个场景。
在这里插入图片描述

这篇关于Gateway API 实践之(六)FSM Gateway 的健康检查功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/660009

相关文章

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

一分钟带你上手Python调用DeepSeek的API

《一分钟带你上手Python调用DeepSeek的API》最近DeepSeek非常火,作为一枚对前言技术非常关注的程序员来说,自然都想对接DeepSeek的API来体验一把,下面小编就来为大家介绍一下... 目录前言免费体验API-Key申请首次调用API基本概念最小单元推理模型智能体自定义界面总结前言最

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

SpringBoot整合DeepSeek实现AI对话功能

《SpringBoot整合DeepSeek实现AI对话功能》本文介绍了如何在SpringBoot项目中整合DeepSeekAPI和本地私有化部署DeepSeekR1模型,通过SpringAI框架简化了... 目录Spring AI版本依赖整合DeepSeek API key整合本地化部署的DeepSeek

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

python实现简易SSL的项目实践

《python实现简易SSL的项目实践》本文主要介绍了python实现简易SSL的项目实践,包括CA.py、server.py和client.py三个模块,文中通过示例代码介绍的非常详细,对大家的学习... 目录运行环境运行前准备程序实现与流程说明运行截图代码CA.pyclient.pyserver.py参

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、