0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Kubernetes Gateway API攻略教程

马哥Linux运维 来源:51cto 2024-01-12 11:32 次阅读

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.

接下来创建一个简单的工作负载,比如一个 Nginxdeployment,并通过deservice将其暴露:

# Deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:latest
        name: nginx
# Service.yaml
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
  name: nginx
  namespace: default
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: 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-30T0211Z"
  generation: 1
  name: istio
  resourceVersion: "636"
  uid: dea0bb44-5f1b-4d23-8f7f-c34f70b4603c
spec:
  controllerName: istio.io/gateway-controller
  description: The default Istio GatewayClass
status:
  conditions:
  - lastTransitionTime: "2023-10-30T0211Z"
    message: Handled by Istio controller
    observedGeneration: 1
    reason: Accepted
    status: "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-gw
  namespace: default
spec:
  gatewayClassName: istio
  listeners:
  - name: default
    hostname: "*.example.com"
    port: 8080
    protocol: HTTP
    allowedRoutes:
      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-gwGateway,并指定规则将所有流量路由到nginxService:

---
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: tutorial-route
  namespace: default
spec:
  parentRefs:
  - group: gateway.networking.k8s.io
    kind: Gateway
    name: tutorial-gw
  rules:
  - backendRefs:
    - group: ""
      kind: Service
      name: nginx
      port: 80
      weight: 1
    matches:
    - path:
        type: PathPrefix
        value: /
$ kubectl apply -f HTTPRoute.yaml
httproute.gateway.networking.k8s.io/tutorial-route created
$ kubectl get httproute
NAME             HOSTNAMES   AGE
tutorial-route               6s

综合以上

Gateway API 将许多传统上包含在单个资源定义中的资源拆分开来。要跟踪所有这些资源之间的连接可能有点困难,这里我将资源之间的关系图展示如下:

7e929818-b05c-11ee-8b88-92fbcf53809c.jpg

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



Welcome to nginx!

这样,你就使用新的网关 API 成功配置了第一组资源咯!

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 通信
    +关注

    关注

    18

    文章

    6033

    浏览量

    136008
  • 网关
    +关注

    关注

    9

    文章

    4476

    浏览量

    51119
  • API
    API
    +关注

    关注

    2

    文章

    1502

    浏览量

    62040
  • kubernetes
    +关注

    关注

    0

    文章

    224

    浏览量

    8722

原文标题:Kubernetes Gateway API 攻略:解锁集群流量服务新维度!

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Kubernetes的Device Plugin设计解读

    摘要: Kubernetes的生态地位已经确立,可扩展性将是其发力的主战场。异构计算作为非常重要的新战场,Kubernetes非常重视。而异构计算需要强大的计算力和高性能网络,需要提供一种统一的方式
    发表于 03-12 16:23

    MLDL之API:关于各国内外大平台API简介、使用方法之详细攻略

    MLDL之API:关于各国内外大平台API简介、使用方法之详细攻略
    发表于 12-19 17:00

    不吹不黑,今天我们来聊一聊 Kubernetes 落地的三种方式

    Kubernetes API 来访问集群。你可以完全跟着社区升级演进你的 Kubernetes,保持与社区同步,完全借助于社区的力量维护你的 Kubernetes。这种落地方式无疑
    发表于 10-12 16:07

    Kubernetes API详解

    的《kubernetes权威指南》一书的第三章3.2节,获得出版社和作者的独家授权发布。本节重点讲述了kubernetesAPI概述。 Kubernetes
    发表于 10-12 16:19 0次下载
    <b class='flag-5'>Kubernetes</b> <b class='flag-5'>API</b>详解

    深入研究Kubernetes调度

    “本文从 Pod 和节点的配置开始,介绍了 Kubernetes Scheduler 框架、扩展点、API 以及可能发生的与资源相关的瓶颈,并展示了性能调整设置,涵盖了 Kubernetes 中调度
    的头像 发表于 08-23 10:39 1411次阅读

    local-data-api-gateway本地数据API网关

    ./oschina_soft/gitee-local-data-api-gateway.zip
    发表于 06-14 10:27 2次下载
    local-data-<b class='flag-5'>api-gateway</b>本地数据<b class='flag-5'>API</b>网关

    带你快速了解 kubernetes

    节点,负责控制整个 kubernetes 集群。它包括 Api Server、Scheduler、Controller 等组成部分。它们都需要和 Etcd 进行交互以存储数据。 Api Server:
    的头像 发表于 01-17 10:00 1166次阅读

    什么是Kubernetes容器运行时CRI

    起初,Docker是事实上的容器技术标准,Kubernetes v1.5之前的代码中直接调用Docker API,实现容器运行时的相关操作。
    的头像 发表于 02-20 16:22 1521次阅读
    什么是<b class='flag-5'>Kubernetes</b>容器运行时CRI

    Kubernetes Operator最佳实践介绍

    kubernetes operator是通过连接主API并watch时间的一组进程,一般会watch有限的资源类型。
    的头像 发表于 04-19 09:16 977次阅读

    API 网关详细介绍(上)

    业界有很多流行的 API 网关,开源的有 Nginx、Netflix Zuul、Kong 等。当然 Kong 还有商业版,类似的商业版网关还有 GoKu API Gateway 和 Tyk 等
    的头像 发表于 05-04 17:28 1530次阅读
    <b class='flag-5'>API</b> 网关详细介绍(上)

    API 网关详细介绍(下)

    业界有很多流行的 API 网关,开源的有 Nginx、Netflix Zuul、Kong 等。当然 Kong 还有商业版,类似的商业版网关还有 GoKu API Gateway 和 Tyk 等
    的头像 发表于 05-04 17:28 867次阅读
    <b class='flag-5'>API</b> 网关详细介绍(下)

    Kubernetes多租户集群的概念和常见的应用模式

    KaaS 多租户方案通常与云服务提供商有关。在这种场景下,业务平台的服务通过 Kubernetes 控制平面直接暴露给不同租户的用户。最终用户可以使用服务提供商提供的 Kubernetes API 或其他扩展
    的头像 发表于 05-15 16:13 1216次阅读
    <b class='flag-5'>Kubernetes</b>多租户集群的概念和常见的应用模式

    Kubernetes 监控利器功能特性

    Kubeshark 是专为 Kubernetes 设计的 API 流量分析器,它提供实时的 K8s 协议级别的可见性,可以捕获和监控所有在容器、Pod、节点和集群之间进出和流动的流量和负载。可以把它想象成专门针对 Kubernetes
    的头像 发表于 05-17 16:10 649次阅读
    <b class='flag-5'>Kubernetes</b> 监控利器功能特性

    怎么使用Kubernetes检查点API快速进行容器的备份和恢复呢?

    Kubernetes v1.25 引入了容器检查点 API 作为 alpha 特性。这提供了一种在不停止容器的情况下备份和恢复运行在 Pod 中的容器的方式。此功能主要用于调试分析,但任何 Kubernetes 用户都可以利用常
    的头像 发表于 10-30 15:50 526次阅读

    api网关 kong 教程入门

    为什么使用API-Gateway 方便客户端维护– 每个请求方不用管理多个api url,统一访问api-gateway即可 接口重构时调用方不须了解接口本身等拆分和聚合 客户端无须关心接口协议
    的头像 发表于 11-10 11:39 790次阅读
    <b class='flag-5'>api</b>网关 kong 教程入门