Kubernetes Gateway API 攻略:解锁集群流量服务新维度!
Kubernetes Gateway API 刚刚 GA,旨在改进将集群服务暴露给外部的过程。这其中包括一套更标准、更强大的 API资源,用于管理已暴露的服务。在这篇文章中,我将介绍 Gateway API 资源,并以 Istio 为例来展示这些资源是如何关联的。通过这个示例,你将了解 Gateway API 的各个组成部分如何配合以将流量传递到后端服务。
背 景
允许外部与 Kubernetes 集群内的服务通信是 administrator 需要执行的最基本任务之一。Service 在 IP 层面上提供的功能十分有限,且缺乏根据应用层数据(如 DNS 主机名或 HTTP 路径)路由流量的能力。因此 Kubernetes 提供了 Ingress API 来实现应用层路由。
然而,Ingress API 有一些限制。Ingress2gateway 的公告[1]清楚地列出了这些限制:
-
Ingress 侧重于 HTTP 流量,因此用户需要找到其他解决方案来处理 UDP、TCP 或其他协议。
-
Ingress 资源混合了基础架构和应用程序配置,让细粒度的基于角色的访问控制(RBAC)的实施变得较为困难。
第二点对于已经熟悉 Ingress 的用户来说是最明显的。在平台工程中提供强大的 RBAC 是集群管理的关键步骤。将基础设施组件(负载均衡器、配置等)的权限与流量路由规则的权限分开,能够让权限的边界更加清晰。
接下来我将介绍 Gateway API 如何划分这些资源,以及它们如何最终结合在一起来路由流量。
设置测试环境
本文使用运行 Istio 和一个示例工作负载的测试环境来检查和理解各种 Gateway API 资源。如果你也想上手尝试,可以复制这个环境。
我用的是 K3s,使用 Kubernetes 集群也是类似的操作。如果选择使用 K3s,则在安装时不要启用 Traefik:
$ curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server --disable=traefik" sh -
首先,部署 Gateway API CRD(Custom Resource Definitions),并按照官方文档安装 Istio(https://istio.io/latest/docs/tasks/traffic-management/ingress/gateway-api/):
# Install the CRDs
$ kubectl get crd gateways.gateway.networking.k8s.io &> /dev/null || \{ kubectl kustomize "github.com/kubernetes-sigs/gateway-api/config/crd?ref=v0.8.0" | kubectl apply -f -; }
customresourcedefinition.apiextensions.k8s.io/gatewayclasses.gateway.networking.k8s.io created
customresourcedefinition.apiextensions.k8s.io/gateways.gateway.networking.k8s.io created
customresourcedefinition.apiextensions.k8s.io/httproutes.gateway.networking.k8s.io created
customresourcedefinition.apiextensions.k8s.io/referencegrants.gateway.networking.k8s.io created# Install Istio
$ istioctl install --set profile=minimal -y
✔ Istio core installed
✔ Istiod installed
✔ Installation complete
Made this installation the default for injection and validation.
接下来创建一个简单的工作负载,比如一个 Nginx deployment ,并通过 deservice 将其暴露:
# Deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginxname: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:creationTimestamp: nulllabels:app: nginxspec:containers:- image: nginx:latestname: nginx
# Service.yaml
---
apiVersion: v1
kind: Service
metadata:labels:app: nginxname: nginxnamespace: default
spec:ports:- port: 80protocol: TCPtargetPort: 80selector:app: nginxtype: ClusterIP
$ kubectl apply -f Deployment.yaml
deployment.apps/nginx created
$ kubectl apply -f Service.yaml
service/nginx created
以上就是你用来理解 Gateway API 所需的全部基础设施。
了解 Gateway API 资源
想要使用 Gateway API,有三种资源类型你需要明确了解:
-
GatewayClass -
Gateway -
路由资源,比如
HTTPRoute或GRPCRoute。GA 版本仅包含在 v1 通道中到HTTPRoute。
这些资源在标准 Ingress API 或自定义提供商负载均衡器和路由工具提供的 CRD 中以各种方式组合在一起。通过将这些资源拆分为单独的组件,Gateway API 实现了关注点分离和强大的、细粒度的访问控制。
让我们逐个了解这些资源,以了解它们之间的关系。
了解 GatewayClass 资源
GatewayClass资源的作用与现有 Ingress API 中的 IngressClass相同,类似于 Storage API 中的 StorageClass。它定义了可以创建的 Gateway类别。通常,此资源由你的基础架构平台(如 EKS 或 GKE)提供。也可以由第三方的 Ingress Controller 提供,例如 Istio 或 Nginx。Istio 包含两个 GatewayClasses:
$ kubectl get gatewayclass
NAME CONTROLLER ACCEPTED AGE
istio-remote istio.io/unmanaged-gateway True 19h
istio istio.io/gateway-controller True 19h
spec字段提供了有关实现 GatewayClass功能的 controller 的信息,它定义了整个集群使用的控制器,而 GatewayClasses 是集群范围的资源,适用于所有命名空间。
$ kubectl get gatewayclass istio -o yaml
apiVersion: gateway.networking.k8s.io/v1beta1
kind: GatewayClass
metadata:creationTimestamp: "2023-10-30T02:15:11Z"generation: 1name: istioresourceVersion: "636"uid: dea0bb44-5f1b-4d23-8f7f-c34f70b4603c
spec:controllerName: istio.io/gateway-controllerdescription: The default Istio GatewayClass
status:conditions:- lastTransitionTime: "2023-10-30T02:15:11Z"message: Handled by Istio controllerobservedGeneration: 1reason: Acceptedstatus: "True"type: Accepted
GatewayClass还可以指定传递给控制器的参数。这样上游项目能够进一步定制向集群管理员公开的配置。也就是说, GatewayClass允许集群管理员专注于将其流量暴露给外部,而不必担心例如在底层基础设施上如何创建负载均衡器等实现细节。
创建 Gateway
Gateway 代表在基础设施提供商中实例化的负载均衡器服务。它可以是一个实际的云负载均衡器,用于处理流量。也可以代表现有负载均衡器中的虚拟配置。然后通过 GatewayClass 进行抽象。Cluster operator 专注于定义必要的 Gateway 资源,无需担心由 GatewayClass 处理的实现细节。
Gateway 在其规范中引用了一个 GatewayClass。下面的示例使用 istio 类,并定义了一个响应端口 8080 上 *.example.com 的 HTTP 请求的单个侦听器:
# Gateway.yaml
---
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:name: tutorial-gwnamespace: default
spec:gatewayClassName: istiolisteners:- name: defaulthostname: "*.example.com"port: 8080protocol: HTTPallowedRoutes:namespaces:from: All
使用 Istio 在创建 Gateway 时还会相应配置Deployment和 Service 来处理流量。GatewayClass 的控制器负责为 Gateway 处理所需的基础设施或配置的设置:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
tutorial-gw-istio-65bfccf7c-45c4w 1/1 Running 2 (6m31s ago) 18h$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
tutorial-gw-istio LoadBalancer 10.43.126.90 192.168.122.10 15021:31348/TCP,8080:31728/TCP 18h
这里需要注意的是 Gateway 中没有定义路由规则。Gateways 代表基础设施的配置,这种分离对于实现 RBAC 至关重要。访问控制模型允许 cluster operator 配置可用的Gateways ,让用户在其路由资源中引用,而无需暴露对基础设施配置本身的访问。
创建路由
现有的 Ingress API 仅支持 HTTP 和 HTTPS 服务,这是一个比较大的限制。
而新的 Gateway API 为各种入站流量类型提供通用支持。 HTTPRoute、TCPRoute 、 TLSRoute 、 GRPCRoute 等资源在特定 Gateway 上指定了实际的流量路由。Gateway API 的 GA 版本只在标准的 v1 通道中包含了 HTTPRoute资源,在未来的版本中将会有更多的协议支持。
HTTPRoute资源指定与用于暴露服务的 Gateway 的连接,以及一系列规则来将流量路由到适当的后端。下面的示例将 HTTPRoute附加到 tutorial-gw Gateway,并指定规则将所有流量路由到 nginx Service:
---
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:name: tutorial-routenamespace: default
spec:parentRefs:- group: gateway.networking.k8s.iokind: Gatewayname: tutorial-gwrules:- backendRefs:- group: ""kind: Servicename: nginxport: 80weight: 1matches:- path:type: PathPrefixvalue: /
$ kubectl apply -f HTTPRoute.yaml
httproute.gateway.networking.k8s.io/tutorial-route created
$ kubectl get httproute
NAME HOSTNAMES AGE
tutorial-route 6s
综合以上
Gateway API 将许多传统上包含在单个资源定义中的资源拆分开来。要跟踪所有这些资源之间的连接可能有点困难,这里我将资源之间的关系图展示如下:

Gateway API 资源之间的关系
快速回顾
-
GatewayClass定义了可以部署的 Gateway 类型。通常由基础设施提供商提供。在本示例中,Istio 定义了GatewayClass。 -
Gateway是负载均衡基础设施的实例化。这可以是在云环境中部署的实际负载均衡器,也可以是针对现有负载均衡器执行的一些配置。无论哪种方式,通过简单地引用所需的GatewayClass,就能从 cluster administrator 中抽象出来。 -
HTTPRoute(或任何其他支持的 Route 资源)定义了处理流量的实际规则。这些路由附加到特定的 Gateway,最终决定了流量的转发。
有了所有这些配置,就可以对服务进行测试请求。本示例Gateway 配置为侦听端口 8080 上 *.example.com 的 HTTP 请求,因此你的请求需要设置适当的 Host header 和端口:
$ curl -H "Host: www.example.com" 192.168.122.10:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
这样,你就使用新的网关 API 成功配置了第一组资源咯!
链接:
https://itnext.io/what-you-should-know-about-the-kubernetes-gateway-api-801d46b68ae2
相关文章:
Kubernetes Gateway API 攻略:解锁集群流量服务新维度!
Kubernetes Gateway API 刚刚 GA,旨在改进将集群服务暴露给外部的过程。这其中包括一套更标准、更强大的 API资源,用于管理已暴露的服务。在这篇文章中,我将介绍 Gateway API 资源,并以 Istio 为例来展示这些资源是如何关联的。通…...
直播间弹幕直播游戏开发教程
随着直播技术的不断发展,交互式弹幕直播游戏成为吸引用户参与的新兴方式。这种游戏融合了实时弹幕互动和直播视频,为观众和主播提供了更加丰富的互动体验。在这篇文章中,我们将探讨从概念到实现的步骤,帮助你打造一款引人入胜的交…...
通过AppLink把拼多多热门榜单商品同步至小红书
上篇说到AppLink当中定时调度方式如何配置,这次来演示一下,如何把热门榜单信息同步至小红书 1.拉取一个定时器作为触发动作,通过配置定时器调度时间将定时策略配置为每天执行一次 2.触发动作完成后通过好单库获取拼多多每日热门榜单…...
力扣题目学习笔记(OC + Swift)
训练思维,提高编程能力,不为刷题而刷题 文章目录 1. 两数之和Swift版本OC版本 2. 两数相加Swift实现OC实现 3.无重复字符的最长子串SwiftOC 4.寻找两个正序数组的中位数SwiftOC 1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请…...
20. Spring源码篇之@Lookup详解
简介 Lookup注解可能平时开发中大家接触的少,但是又确实挺有用的,比如我们一个单例Bean注入了一个原型Bean,原型Bean的效果其实是会失效的,因为单例Bean一开始就实例化好了,后面也不会再变化,但我们可能需…...
2.5计划任务远程管理
2.5计划任务/远程管理 一、计划任务 1、计划任务概念解析 在Linux操作系统中,除了用户即时执行的命令操作以外,还可以配置在指定的时间、指定的日期 执行预先计划好的系统管理任务(如定期备份、定期采集监测数据)。RHEL6系统中…...
光伏、储能双层优化配置接入配电网研究(附带Matlab代码)
由于能源的日益匮乏,电力需求的不断增长等,配电网中分布式能源渗透率不断提高,且逐渐向主动配电网方向发展。此外,需求响应(demand response,DR)的加入对配电网的规划运行也带来了新的因素。因此,如何综合考…...
低代码服务商,中小型数字化软件服务商的新出路
数字化时代大背景下,企业信息化向数字化转型成为所有企业发展的必由之路,企业在对业务模式、流程、组织形式、信息技术等方面进行重新定义时,软件必然参与价值创造的全过程,这势必驱使软件成为推动数字化转型的“引擎”࿰…...
Arcgis 日常天坑问题2——三维场景不能不能加载kml图层,着手解决这个问题
arcgis js api官网介绍kml图层的地址: shttps://developers.arcgis.com/javascript/latest/api-reference/esri-layers-KMLLayer.html从文档里看到kml图层有诸多限制,比较重要的两点是: 1、不能在三维场景(SceneView࿰…...
Ubuntu22.04 交叉编译GCC13.2.0 for Rv1126
一、安装Ubuntu22.04 sudo apt install vim net-tools openssh-server 二、安装必要项 sudo apt update sudo apt upgrade sudo apt install build-essential gawk git texinfo bison flex 三、下载必备软件包 1.glibc https://ftp.gnu.org/gnu/glibc/glibc-2.38.tar.gz…...
什么是EVM?以太坊EVM合约交互
目录 什么是EVM? 为什么 EVM 很重要? 结论 虚拟机引擎 以太坊虚拟机...
Vue Treeselect el-tree-select 多选 只选中第三级
话不多说,直接看代码: <Treeselect v-model"scope.row.mdeptIds" :normalizernormalizer :defaultExpandLevel"2" :disable-branch-nodes"true" :multiple"true":append-to-body"true" :z-index"9999" style…...
Stable Diffusion专场公开课
从SD原理、本地部署到其二次开发 分享时间:11月25日14:00-17:00 分享大纲 从扩散模型DDPM起步理解SD背后原理 SD的本地部署:在自己电脑上快速搭建、快速出图如何基于SD快速做二次开发(以七月的AIGC模特生成系统为例) 分享人简介 July&#…...
【Typroa使用】Typroa+PicGo-Core(command line)+gitee免费图片上传配置
TyproaPicGo-Core(command line)gitee免费图片上传配置 本文是在win10系统下配置typroapicGo-Core(command line)gitee图片上传的教程。需要的环境和工具有: gitee账号,新建仓库及token令牌;已经安装了的typroa,需要0.9.98版本以上…...
【云原生-Kurbernetes篇】HPA 与 Rancher管理工具
文章目录 一、Pod的自动伸缩1.1 HPA1.1.1 简介1.1.2 HPA的实现原理1.1.3 相关命令 1.2 VPA1.2.1 简介1.2.2 VPA的组件1.2.3 VPA工作原理 1.3 metrics-server简介 二、 HPA的部署与测试2.1 部署metrics-serverStep1 编写metrics-server的配置清单文件Step2 部署Step3 测试kubect…...
Python学习笔记(4)
《Python编程:从入门到实践》学习笔记 1.文件和异常 1.1 从文件中读取数据 1.1.1 读取整个文件 要读取文件,需要一个包含几行文本的文件。下面首先来创建一个文件,它包含精确到小数 点后30位的圆周率值,且在小数点后每10位处都换…...
算法通关村第十二关-青铜挑战字符串
大家好我是苏麟 , 今天带来字符串专题 . 转换成小写字母 描述 : 给你一个字符串 s ,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。 题目 : LeetCode 709.转换成小写字母 : 709. 转换成小写字母 分析 : 这个题可以先遍历整个字符串…...
网站被反诈拦截该怎么申诉与解封
随着互联网的发展,网络诈骗问题也日益突出。为了打击这类问题,反诈中心采取了一系列的措施,如打击违规诈骗网站和APP,标记诈骗手机号等。虽然这些措施在一定程度上取得了效果,但是也不可避免会出现审核不到位的情况。 …...
【机器学习】033_反向传播
一、计算图、反向传播原理 1. 回顾前向传播 例:假设现在有一个神经网络,其仅有一个输出层和一个神经单元 定义 定义 ,即激活函数对激活值不再做具体处理 定义平方损失函数 ,计算a的值与真实值的差距 此时,通过计算…...
关于缓存和数据库一致性问题的深入研究
如何保证缓存和数据库一致性,这是一个老生常谈的话题了。 但很多人对这个问题,依旧有很多疑惑: 到底是更新缓存还是删缓存?到底选择先更新数据库,再删除缓存,还是先删除缓存,再更新数据库&…...
Strada.Brain:基于PAOR循环与多智能体编排的Unity AI编程副驾驶
1. 项目概述:一个为Unity开发者服务的AI编程副驾驶 如果你是一个Unity开发者,或者正在用C#做游戏,每天在编辑器、脚本和构建错误之间反复横跳,那今天聊的这个东西可能会让你眼前一亮。Strada.Brain,这名字听起来有点科…...
AI思维:跨学科协作与负责任AI实践的核心方法论
1. 项目概述:为什么我们需要“AI思维”?如果你最近在尝试将人工智能技术引入你的工作流程,无论是分析市场数据、优化客户服务,,还是辅助科研实验,你很可能已经感受到了某种“割裂感”。工程师团队在讨论模型…...
面向空间环境的星载AI系统设计:从挑战到工程实践
1. 项目概述:当AI遇见深空“把AI送上太空”,这听起来像是科幻电影里的情节,但SpIRIT卫星的Loris成像载荷项目,正在将这一构想变为现实。作为一名长期关注航天与边缘计算交叉领域的技术从业者,我深知这其中的挑战与魅力…...
CANN/hccl:rank table配置资源信息(Atlas 300I Duo 推理卡)
rank table配置资源信息(Atlas 300I Duo 推理卡) 【免费下载链接】hccl 集合通信库(Huawei Collective Communication Library,简称HCCL)是基于昇腾AI处理器的高性能集合通信库,为计算集群提供高性能、高可…...
CANN/ops-math 融合转置D算子
ConfusionTransposeD 【免费下载链接】ops-math 本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-math 产品支持情况 产品是否支持Ascend 950PR/Ascend 950DT√ 功能说明 算子功能:…...
3步解锁高效工作流:KeymouseGo终极鼠标键盘自动化指南
3步解锁高效工作流:KeymouseGo终极鼠标键盘自动化指南 【免费下载链接】KeymouseGo 类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入 | automate mouse clicks and keyboard input 项目地址: https://gitcode.com/gh_mirrors/ke/KeymouseGo 你是否厌…...
对比自行维护多个 API 密钥使用 Taotoken 的管理效率提升
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比自行维护多个 API 密钥使用 Taotoken 的管理效率提升 在开发基于大模型的应用时,团队或个人开发者常常需要接入多个…...
Codex CLI与MCP协议集成:打造无缝AI编程工作流
1. 项目概述:当Codex CLI遇上MCP协议如果你和我一样,是个重度AI编程工具使用者,那你肯定对OpenAI的Codex CLI不陌生。这个命令行工具,特别是它最新的GPT-5.4模型,在代码生成和项目理解上的能力,已经让很多开…...
动态域名解析工具diny:基于Cloudflare API的轻量级DDNS解决方案
1. 项目概述:一个轻量级、可定制的动态域名解析工具最近在折腾个人服务器和家庭网络服务时,我又一次被动态公网IP的问题给绊住了。相信很多自己搭网站、建NAS或者跑一些自研服务的朋友都深有体会:运营商给的公网IP说变就变,一旦IP…...
【无人机三维路径规划】基于任务分配与存档引导变异粒子群优化算法TAMOPSO的三维无人机飞行路径规划附Matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室👇 关注我领取海量matlab电子书和数学建模资料 dz…...
