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

  • 路由资源,比如 HTTPRouteGRPCRoute。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 为各种入站流量类型提供通用支持。 HTTPRouteTCPRoute 、 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 成功配置了第一组资源咯!

文章转载自:Seal软件

原文链接:https://www.cnblogs.com/sealio/p/17843315.html

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

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

相关文章

C语言之sizeof 和 strlen 详细介绍

C语言之sizeof 和 strlen 文章目录 C语言之sizeof 和 strlen1. sizeof 和 strlen 的比较1.1 sizeof1.2 strlen1.3 sizeof 和 strlen 的对比 2. 练习2.1.1 一维数组2.1.2 字符数组 1. sizeof 和 strlen 的比较 1.1 sizeof sizeof是C语言中的一个关键字&#xff0c;计算的是变量…

设计模式常见面试题

简单梳理下二十三种设计模式&#xff0c;在使用设计模式的时候&#xff0c;不仅要对其分类了然于胸&#xff0c;还要了解每个设计模式的应用场景、设计与实现&#xff0c;以及其优缺点。同时&#xff0c;还要能区分功能相近的设计模式&#xff0c;避免出现误用的情况。 什么是…

python -opencv形态学操作

python -opencv形态学操作 1.服饰和膨胀 1.服饰和膨胀 opencv 腐蚀通过cv2.erode实现&#xff0c;膨胀通过cv2.dilate实现&#xff0c;看一下下面代码&#xff1a; from ctypes.wintypes import SIZE from multiprocessing.pool import IMapUnorderedIterator import cv2 i…

76基于matlab的免疫算法求解配送中心选址问题,根据配送地址确定最佳配送中心地址位置。

基于matlab的免疫算法求解配送中心选址问题&#xff0c;根据配送地址确定最佳配送中心地址位置。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 76matlab免疫算法配送中心选址 (xiaohongshu.com)

git 将本地已有的一个项目上传到新建的git仓库的方法

将本地已有的一个非git项目上传到新建的git仓库的方法一共有两种 一、 克隆拷贝 第一种方法比较简单&#xff0c;直接用把远程仓库拉到本地&#xff0c;然后再把自己本地的项目拷贝到仓库中去。然后push到远程仓库上去即可。此方法适用于本地项目不是一个git仓库的情况。 具…

泛型进阶:通配符

基本概念 对泛型不了解的可以看这篇博客&#xff1a;数据结构前瞻-CSDN博客 一般来说&#xff0c;&#xff1f;在泛型里的使用就是通配符 看看下面的代码 class Message<T> {private T message ;public T getMessage() {return message;}public void setMessage(T m…

go类型断言类型转换

类型断言 断言 在现代化 程序中 有助于 终止代码 , 防止 更大的 错误产生 package mainimport "fmt"func main() {var i interface{} "hello"s : i.(string)fmt.Println(s)s, ok : i.(string)fmt.Println(s, ok)f, ok : i.(float64)fmt.Println(f, ok)f…

网络协议头分析及抓包三次挥手四次握手

数据的封装与传递过程 思考&#xff1a; 应用层调用send后&#xff0c;是如何把数据发送到另一台机器的某个进程的。接收的设备收到数据包后&#xff0c;如何处理给应用层&#xff1f; MTU &#xff1a; Maximum Transmit Unit 最大传输单元 物理接口&#xff08;数据链路层&am…

android的通知使用

在 Android 中&#xff0c;通知&#xff08;Notification&#xff09;是一种在状态栏显示消息的方式&#xff0c;通常用于向用户展示应用程序的重要信息、事件或更新。以下是一个简单的示例&#xff0c;演示如何在 Android 应用程序中使用通知&#xff1a; import android.app…

Lightsail VPS 实例在哪些方面胜过 EC2 实例?

文章作者&#xff1a;Libai 引言 Lightsail VPS 实例和 EC2 实例是云计算领域中两种受欢迎的技术。虽然两者都提供虚拟服务器解决方案&#xff0c;但了解 Lightsail VPS 实例在哪些方面胜过 EC2 实例非常重要。在本文中&#xff0c;我们将探讨这两种技术之间的关键区别&#x…

如何调用本地 json 文件数据

文章目录 如何调用本地 json 文件数据1. 使用场景2. 步骤 如何调用本地 json 文件数据 1. 使用场景 使用场景&#xff1a;当无数据接口时&#xff0c;需要调用自己写的 json 文件&#xff0c;请求数据。 2. 步骤 在 public 文件夹下&#xff0c;新建一个存放 json 数据的文件…

CI/CD - jenkins

目录 一、部署 1、简介 2、部署 二、配置 三、实时触发 四、自动化构建docker镜像 五、通过ssh插件交付任务 六、添加jenkins节点 七、RBAC 八、pipeline 九、jenkins结合ansible参数化构建 1、安装ansible 2、新建gitlab项目 3、jenkins新建项目playbook 一、部…

choices参数的使用、MVC和MTV的模式、创建表对表关系的三种创建方式

【1】choices参数的使用 应用场景&#xff1a;针对表中可能列表完全的字段&#xff0c;采用choices参数 例如&#xff1a;性别&#xff0c;代码如下 # 1.创建一张表class gender_info(models.Model):name models.CharField(max_length32)password models.CharField(max_lengt…

大数据题目的解题技巧

目录 大数据题目的技巧总括 实例精析 实例一 实例二 实例三 大数据题目的技巧总括 &#xff08;1&#xff09;哈希函数可以把数据按照种类均匀分流&#xff1b; &#xff08;2&#xff09;布隆过滤器用于集合的建立与查询&#xff0c;并可以节省大量空间&#xff1b; &…

ubuntu 安装 gparted

前提环境&#xff1a; 阿里云的源。 sudo apt update sudo apt upgrade sudo apt install gparted 搜索&#xff1a;

Android AIDL中使用Surface问题

1.构建ITest.aidl文件 package com.xxx.xxxx;import android.view.Surface;interface IMonitorService {boolean addSurface(in Surface surface);boolean removeSurface(in Surface surface); } 2.构建时报错 3.Surface源码分析 android.view.Surface中包含两个Surface类&am…

Spring Boot和Spring MVC的区别

1 Spring MVC 是Spring的一个模块&#xff0c;是一个web框架。分为Model&#xff0c;View&#xff0c;Controller&#xff08;模型层、视图层、控制层&#xff09;。 2 Spring Boot Spring Boot 自动配置&#xff0c;降低了项目搭建的复杂度。Spring框架需要大量的配置&…

查看windows后台进程命令行参数

wmic process where processid[PID] get commandline管理员身份运行cmd&#xff0c;输入以上命令&#xff0c;[PID]替换为任务管理器中看到的PID

万字解析设计模式之 装饰者模式

一、装饰者模式 1.1概述 装饰者模式是一种结构型设计模式&#xff0c;它允许在运行时动态地为一个对象添加额外的职责。它以一种透明的方式来扩展对象的功能&#xff0c;而不需要通过子类来实现。在装饰者模式中&#xff0c;有一个基本对象&#xff0c;也称为组件&#xff0c;…

SpringBean的配置详解 --中

目录 Bean的初始化和销毁方法配置 Bean的初始化和销毁方法配置 扩展 Bean的实例化 Bean的初始化和销毁方法配置 当lazy-init设置为true时为延迟加载&#xff0c;也就是当Spring容器加载的时候&#xff0c;不会立即创建Bean实例&#xff0c;等待用到时再创建Bean实例并存储到单…