K8S Gateway API 快速开始、胎教级教程

假设有如下三个节点的 K8S 集群:

​​

k8s31master 是控制节点

k8s31node1、k8s31node2 是工作节点

容器运行时是 containerd

一、Gateway 是什么

  • 背景和目的

  • 入口(Ingress)目前已停止更新。新的功能正在集成至网关 API 中。
  • 在 Kubernetes 环境中,服务的网络访问管理至关重要。传统的 Ingress 资源在功能上存在一定局限性,例如对流量管理的细粒度控制不足、难以满足复杂的网络拓扑和多集群场景等需求。Gateway API 的出现就是为了克服这些局限性,提供更通用、更灵活且更具扩展性的网络流量管理解决方案,以适应现代云原生应用复杂的网络需求。
  • 核心概念

  • Gateway:代表了集群内的一个网络入口点,通常与底层的物理或虚拟网络设备相对应,定义了流量进入集群的位置以及相关的网络配置,如 IP 地址、端口等。
  • GatewayClass:用于描述 Gateway 的类型和配置参数,它是对一类 Gateway 的抽象定义,例如可以定义基于 Nginx、Istio 等不同技术实现的 GatewayClass,每个 GatewayClass 可以有自己特定的配置选项,如负载均衡算法、TLS 配置等。
  • HTTPRoute:用于定义 HTTP 流量的路由规则,通过匹配请求的路径、方法、头信息等条件,将流量路由到后端的不同服务或服务版本上,支持丰富的路由功能,如路径重写、请求头修改、流量分流等。
  • TLSRoute:专门用于处理 HTTPS 加密流量的路由规则,定义了如何将加密的 TLS 流量路由到后端服务,包括 TLS 证书的管理和配置,以及根据 TLS 握手信息进行流量路由的规则。
  • Service:Kubernetes 中的服务资源,是一组提供相同功能的 Pod 的抽象集合,通过 Service 可以实现对后端 Pod 的负载均衡和服务发现,Gateway API 通过与 Service 的结合,将外部流量路由到具体的后端服务上。
  •  请求数据流

以下是使用 Gateway 和 HTTPRoute 将 HTTP 流量路由到服务的简单示例:

在此示例中,实现为反向代理的 Gateway 的请求数据流如下:

  1. 客户端开始准备 URL 为 http://gateway.example.com 的 HTTP 请求
  2. 客户端的 DNS 解析器查询目标名称并了解与 Gateway 关联的一个或多个 IP 地址的映射。
  3. 客户端向 Gateway IP 地址发送请求;反向代理接收 HTTP 请求并使用 Host: 标头来匹配基于 Gateway 和附加的 HTTPRoute 所获得的配置。
  4. 可选的,反向代理可以根据 HTTPRoute 的匹配规则进行请求头和(或)路径匹配。
  5. 可选地,反向代理可以修改请求;例如,根据 HTTPRoute 的过滤规则添加或删除标头。
  6. 最后,反向代理将请求转发到一个或多个后端。
  •  资源链接

Gateway API 官网:https://gateway-api.sigs.k8s.io

NGINX Gateway Fabric 官网:https://docs.nginx.com/nginx-gateway-fabric

NGC github:https://github.com/nginx/nginx-gateway-fabric

Gateway API github:https://github.com/kubernetes-sigs/gateway-api

二、怎么找资源

Gateway API 是 Ingress API 的后继者。Gateway API 资源不是由 Kubernetes 原生实现的,而是被定义为受广泛实现支持的自定义资源(CustomResourceDefinition)。Gateway API CRD 是一个规范,就像 Java JDBC 一样,具体的实现依赖于各个厂商。

下面是官网列出的实现了 Gateway API 的一些项目,以及所处的阶段。

像我们熟悉的 NGINX Gateway Fabric、Istio、Envoy Gateway 都处于 GA 阶段。

我们今天来部署 NGINX Gateway Fabric,这个是 F5/Nginx 公司提供的一种 Gateway API 实现。

 

我们基于 NGINX Gateway Fabric 官网安装文档,来教大家如何安装 NGINX Gateway Fabric。

因为 NGINX Gateway Fabric 依赖 Gateway API CRD,所以第一步就是要安装 Gateway API CRD。

 NGF 与 K8S 的版本依赖关系倒是不大 1.19+即可,与 Gateway API CRD 的版本依赖比较大。

直接运行官网推荐的命令是肯定运行不了的,因为众所周知的原因,github.com 在国内是访问不了的。但是我们可以把命令请求的资源文件下载下来,直接在本地集群中运行。

kubectl kustomize "https://github.com/nginx/nginx-gateway-fabric/config/crd/gateway-api/standard?ref=v1.6.2" | kubectl apply -f -
  • kubectl kustomize:命令用于根据指定的配置生成 Kubernetes 资源清单。这里指定的是一个来自 GitHub 仓库 nginx/nginx-gateway-fabric 的配置路径,ref=v1.6.2 表示使用该仓库 v1.6.2 版本的配置。kubectl kustomize 会读取该路径下的配置文件(如kustomization.yaml等),对其中定义的资源进行定制化处理,生成最终的 Kubernetes 资源清单文件内容。
  • | kubectl apply -f -| 是管道符,将 kubectl kustomize 命令的输出作为 kubectl apply -f - 的输入。kubectl apply -f - 中的 -f 表示从文件中读取资源配置来创建或更新 Kubernetes 资源,- 表示从标准输入读取。所以这部分命令会将 kubectl kustomize 生成的资源清单内容在 Kubernetes 集群中应用,即创建或更新对应的 Kubernetes 资源,比如可能会创建与 NGINX Gateway Fabric 相关的自定义资源,这些资源用于配置和管理基于 NGINX Gateway Fabric 的网关功能,像网关的路由规则、服务暴露方式等。

 https://github.com/nginx/nginx-gateway-fabric/config/crd/gateway-api/standard

https://github.com/kubernetes-sigs/gateway-api/config/crd 

执行这五份就可以,不过 Gateway API 官方也有提供一份统一的 yaml。

https://github.com/kubernetes-sigs/gateway-api/releases

我这里也提供给大家 standard-install.yaml。

三、部署

1)部署 Gateway API CRDs

[root@k8s31master gateway]# kubectl apply -f standard-install.yaml

# 查看是否安装到位
kubectl get crds | grep gateway.networking.k8s.io

2)部署 NGF CRDs

NGF 也有一些自定义资源,所以也要执行 crds.yaml。

[root@k8s31master gateway]# kubectl apply -f crds.yaml

 3)部署 NGF

因为是本地自建集群,所以没有云服务商 LoadBalancer 提供公网 IP,选择 NodePort 的方式暴露端口。

整个部署依赖两个镜像:

ghcr.io/nginx/nginx-gateway-fabric:1.6.2
ghcr.io/nginx/nginx-gateway-fabric/nginx:1.6.2
  • 下载镜像

找个国内好访问的镜像站,在各个工作节点上提前下载好镜像。

# 在 node1 执行
[root@k8s31node1 ~]# ctr -n=k8s.io images pull ghcr.nju.edu.cn/nginx/nginx-gateway-fabric/nginx:1.6.2
[root@k8s31node1 ~]# ctr -n=k8s.io images pull ghcr.nju.edu.cn/nginx/nginx-gateway-fabric:1.6.2# 在 node2 执行
[root@k8s31node2 ~]# ctr -n=k8s.io images pull ghcr.nju.edu.cn/nginx/nginx-gateway-fabric/nginx:1.6.2
[root@k8s31node2 ~]# ctr -n=k8s.io images pull ghcr.nju.edu.cn/nginx/nginx-gateway-fabric:1.6.2
  • 修改 deploy.yaml(提供给大家)

将 deploy.yaml 中 ghcr.io 全部替换为 ghcr.nju.edu.cn

 修改 Deployment 副本数

spec:replicas: 2
# 跟工作节点数量一致

 修改 Deployment Pod 亲和性

    affinity:podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 100podAffinityTerm:labelSelector:matchLabels:app.kubernetes.io/name: nginx-gatewaytopologyKey: kubernetes.io/hostname

 让每个节点上都安装 nginx-gateway-controller。官网给的 nginx-gateway-controller 的部署方式是 Deployment,官网也推荐使用 DaemonSet,在每一个节点上安装一份,对于请求处理的性能更佳。

  •  运行

[root@k8s31master gateway]# kubectl apply -f deploy.yaml
  •  验证

整个部署会帮我们创建 2 个 nginx-gateway-controller Pod,分别运行在两个工作节点上,负责监听请求:

kubectl get pod -n nginx-gateway -owide

创建了 1 个 gatewayclass 资源,引用 nginx-gateway-controller,且 gatewayclass 的名字叫 nginx:

kubectl get gatewayclass -n nginx-gateway

 

创建了一个 NodePort 的 Service,代理了那 2 个 nginx-gateway-controller Pod:

kubectl get svc -n nginx-gateway
kubectl describe svc -n nginx-gateway

 后续请求各个工作节点的 30185 端口,则会被 nginx-gateway-controller 80 端口接管。

 四、将流量路由到应用

  1)创建应用

apiVersion: apps/v1
kind: Deployment
metadata:name: tomcat-deploy
spec:replicas: 2selector:matchLabels:app: tomcattemplate:metadata:labels:app: tomcatspec:containers:- name: tomcatimage: tomcat:8.5-jre8-alpineimagePullPolicy: IfNotPresentports:- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:name: tomcat-svc
spec:type: ClusterIPselector:app: tomcatports:- port: 8080protocol: TCPtargetPort: 8080

创建了 2 个 tomcat Pod,和一个 Service,Service 暴露 8080 端口。

 2)创建 gateway

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:name: nginx-gatewaynamespace: default
spec:gatewayClassName: nginxlisteners:- name: httpprotocol: HTTPport: 80

gatewayClassName 要使用我们 NGF 为我们创建的名字 nginx。

gateway 监听 80 端口。

 3)创建 httproute

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:name: example-routenamespace: default
spec:parentRefs:- name: nginx-gatewayhostnames:- "gateway.example.com"rules:- matches:- path:type: PathPrefixvalue: / backendRefs:- name: tomcat-svckind: Serviceport: 8080
  • parentRefs:绑定我们新建的 gateway。
  • hostnames:定义访问的主机名。
  • rules.matches:定义路由规则,PathPrefix 表示路径前缀匹配。
  • backendRefs:定义后端服务以及服务端口。

 4)访问

curl -H "Host: gateway.example.com" http://192.168.40.20:30185/

 集群外随便找台机子访问都能访问到 tomcat。

 修改本机 hosts 也能浏览器访问:

192.168.40.20 gateway.example.com

 五、原理

其实 nginx-gateway-controller 就是一个 nginx,它会监听 gateway 跟 httproute 的变化,重写 nginx.conf,重启 nginx。

# nginx-gateway-64fd456f8-5qh6k
# nginx-gateway-64fd456f8-n9h26
kubectl exec -it -n nginx-gateway nginx-gateway-64fd456f8-5qh6k -c nginx -- nginx -T

六、A/B 测试、金丝雀发布

看这一篇文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/83672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时序数据库IoTDB分布式架构解析与运维指南

一、IoTDB分布式架构概述 分布式系统由一组独立的计算机组成,通过网络通信,对外表现为一个统一的整体。IoTDB的原生分布式架构将服务分为两个核心部分: ‌ConfigNode(CN)‌:管理节点,负责管理…

Ubuntu 20.04 LTS 中部署 网页 + Node.js 应用 + Nginx 跨域配置 的详细步骤

Ubuntu 20.04 LTS 中部署 网页 Node.js 应用 Nginx 跨域配置 的详细步骤 一、准备工作1、连接服务器2、更新系统 二、安装 Node.js 环境1、安装 Node.js 官方 PPA(用于获取最新稳定版):2、安装 Node.js 和 npm(LTS 长期支持版本…

3DVR制作的工具或平台

3DVR(三维虚拟现实)是利用三维图像技术和虚拟现实技术,将真实场景进行三维扫描并转换成计算机可识别的三维模型,使用户能够在虚拟空间中自由漫游,体验身临其境的感觉。3DVR技术结合了全景拍摄和虚拟现实,提…

垂直智能体:企业AI落地的正确打开方式

在当前AI浪潮中,许多企业急于跟进,推出自己的AI智能体解决方案。然而,市场上大量出现的"万能型"智能体却鲜有真正解决实际问题的产品。本文将探讨为何企业应该专注于开发垂直领域智能体,而非追求表面上的全能&#xff0…

软件工程各种图总结

目录 1.数据流图 2.N-S盒图 3.程序流程图 4.UML图 UML用例图 UML状态图 UML时序图 5.E-R图 首先要先了解整个软件生命周期: 通常包含以下五个阶段:需求分析-》设计-》编码 -》测试-》运行和维护。 软件工程中应用到的图全部有:系统…

王者荣耀游戏测试场景题

如何测试一个新英雄:方法论与实践维度 测试一个新英雄不仅仅是“打打打”,而是一套完整的测试流程,包括设计文档验证、功能验证、数值验证、性能验证、交互验证等。可以从以下多个角度展开: 🔍 1. 方法论维度 ✅ 测试…

第四天的尝试

目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 很抱歉的说一下,我昨天看白色巨塔电视剧,看的入迷了,同时也看出一些道理,学到东西; 但是把昨天的写事情给忘记了,今天…

多模态大语言模型arxiv论文略读(七十八)

AID: Adapting Image2Video Diffusion Models for Instruction-guided Video Prediction ➡️ 论文标题:AID: Adapting Image2Video Diffusion Models for Instruction-guided Video Prediction ➡️ 论文作者:Zhen Xing, Qi Dai, Zejia Weng, Zuxuan W…

优化 Spring Boot 应用启动性能的实践指南

1. 引言 Spring Boot 以其“开箱即用”的特性深受开发者喜爱,但随着项目复杂度的增加,应用的启动时间也可能会变得较长。对于云原生、Serverless 等场景而言,快速启动是一个非常关键的指标。 2. 分析启动过程 2.1 启动阶段概述 Spring Boot 的启动流程主要包括以下几个阶…

Ubuntu下配置VScode出现#include错误请更新includePath的解决方法

首先Ubuntu新手小白一定要先安装g,安装方法是: 在桌面右键打开终端,输入:sudo apt-get install g 安装好g之后,在vscode终端输入:g -v -E -x c - 输出这些路径,复制 如果还存在显示cout不存在的…

【背包dp】小结

背包问题总结 一、什么是背包问题? 定义:给定一个容量为 W 的背包和 n 件物品,每件物品有一个重量 w[i] 和价值 v[i],要求选择若干物品放入背包,在不超过容量的前提下,使总价值最大。 背包问题本质是&am…

济南国网数字化培训班学习笔记-第三组-1-电力通信传输网认知

电力通信传输网认知 电力通信基本情况 传输介质 传输介质类型(导引与非导引) 导引传输介质,如电缆、光纤; 非导引传输介质,如无线电波; 传输介质的选择影响信号传输质量 信号传输模式(单工…

代码随想录算法训练营第六十四天| 图论9—卡码网47. 参加科学大会,94. 城市间货物运输 I

每日被新算法方式轰炸的一天,今天是dijkstra(堆优化版)以及Bellman_ford ,尝试理解中,属于是只能照着代码大概说一下在干嘛。 47. 参加科学大会 https://kamacoder.com/problempage.php?pid1047 dijkstra&#xff08…

upload-labs通关笔记-第8关 文件上传之点绕过

目录 一、点绕过原理 二、deldot()函数 三、源码分析 四、渗透实战 1、构建脚本test8.php 2、打开靶场 3、bp开启拦截 4、点击上传 5、bp拦截 6、后缀名增加点 7、发包并获取脚本地址 8、访问脚本 本文通过《upload-labs靶场通关笔记系列》来进行upload-labs靶场的渗…

Spring Web MVC————入门(3)

今天我们来一个大练习,我们要实现一个登录界面,登录进去了先获取到登录人信息,可以选择计算器和留言板两个功能,另外我们是学后端的,对于前端我们会些基础的就行了,知道ajax怎么用,知道怎么关联…

PhpStudy | PhpStudy 工具安装 —— Windows 系统安装 PhpStudy

🌟想了解这个工具的其它相关笔记?看看这个:[网安工具] 服务器环境配置工具 —— PhpStudy 使用手册 笔者备注:Windows 中安装 PhpStudy 属于傻瓜式安装,本文只是为了体系完善而发。 在前面的章节中,笔者简…

K230 ISP:一种新的白平衡标定方法

第一次遇见需要利用光谱响应曲线进行白平衡标定的方法。很好奇是如何利用光谱响应曲线进行白平衡标定的。 参考资料参考:K230 ISP图像调优指南 K230 介绍 嘉楠科技 Kendryte 系列 AIoT 芯片中的最新一代 AIoT SoC K230 芯片采用全新的多核异构单元加速计算架构&a…

通俗解释Transformer在处理序列问题高效的原因(个人理解)

Transformer出现的背景 CNN 的全局关联缺陷卷积神经网络(CNN)通过多层堆叠扩大感受野,但在自然语言处理中存在本质局限: 局部操作的语义割裂:每个卷积核仅处理固定窗口(如 3-5 词),…

Java 多线程基础:Thread 类核心用法详解

一、线程创建 1. 继承 Thread 类(传统写法) class MyThread extends Thread { Override public void run() { System.out.println("线程执行"); } } // 使用示例 MyThread t new MyThread(); t.start(); 缺点:Java 单…

Django 中时区的理解

背景 设置时区为北京时间 TIME_ZONE ‘Asia/Shanghai’ # 启用时区支持 USE_TZ True 这样设置的作用 前端 (实际上前端el-date-picker 显示的是当地时区的时间) Element组件转换后,我们是东八区,前端传给后端的时间为&…