0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

Kubernetes Gateway API攻略教程

馬哥Linux運維 ? 來源:51cto ? 2024-01-12 11:32 ? 次閱讀

Kubernetes Gateway API 剛剛 GA,旨在改進將集群服務暴露給外部的過程。這其中包括一套更標準、更強大的 API資源,用于管理已暴露的服務。在這篇文章中,我將介紹 Gateway API 資源,并以 Istio 為例來展示這些資源是如何關(guān)聯(lián)的。通過這個示例,你將了解 Gateway API 的各個組成部分如何配合以將流量傳遞到后端服務。

背 景

允許外部與 Kubernetes 集群內(nèi)的服務通信administrator 需要執(zhí)行的最基本任務之一。Service 在 IP 層面上提供的功能十分有限,且缺乏根據(jù)應用層數(shù)據(jù)(如 DNS 主機名或 HTTP 路徑)路由流量的能力。因此 Kubernetes 提供了 Ingress API 來實現(xiàn)應用層路由。

然而,Ingress API 有一些限制。Ingress2gateway 的公告[1]清楚地列出了這些限制:

Ingress 側(cè)重于 HTTP 流量,因此用戶需要找到其他解決方案來處理 UDP、TCP 或其他協(xié)議。

Ingress 資源混合了基礎架構(gòu)和應用程序配置,讓細粒度的基于角色的訪問控制(RBAC)的實施變得較為困難。

第二點對于已經(jīng)熟悉 Ingress 的用戶來說是最明顯的。在平臺工程中提供強大的 RBAC 是集群管理的關(guān)鍵步驟。將基礎設施組件(負載均衡器、配置等)的權(quán)限與流量路由規(guī)則的權(quán)限分開,能夠讓權(quán)限的邊界更加清晰。

接下來我將介紹 Gateway API 如何劃分這些資源,以及它們?nèi)绾巫罱K結(jié)合在一起來路由流量。

設置測試環(huán)境

本文使用運行 Istio 和一個示例工作負載的測試環(huán)境來檢查和理解各種 Gateway API 資源。如果你也想上手嘗試,可以復制這個環(huán)境。

我用的是 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.

接下來創(chuàng)建一個簡單的工作負載,比如一個 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 實現(xiàn)了關(guān)注點分離和強大的、細粒度的訪問控制。

讓我們逐個了解這些資源,以了解它們之間的關(guān)系。

了解 GatewayClass 資源

GatewayClass資源的作用與現(xiàn)有 Ingress API 中的IngressClass相同,類似于 Storage API 中的StorageClass。它定義了可以創(chuàng)建的Gateway類別。通常,此資源由你的基礎架構(gòu)平臺(如 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字段提供了有關(guān)實現(xiàn)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還可以指定傳遞給控制器的參數(shù)。這樣上游項目能夠進一步定制向集群管理員公開的配置。也就是說,GatewayClass允許集群管理員專注于將其流量暴露給外部,而不必擔心例如在底層基礎設施上如何創(chuàng)建負載均衡器等實現(xiàn)細節(jié)。

創(chuàng)建 Gateway

Gateway代表在基礎設施提供商中實例化的負載均衡器服務。它可以是一個實際的云負載均衡器,用于處理流量。也可以代表現(xiàn)有負載均衡器中的虛擬配置。然后通過GatewayClass進行抽象。Cluster operator 專注于定義必要的Gateway資源,無需擔心由GatewayClass處理的實現(xiàn)細節(jié)。

Gateway在其規(guī)范中引用了一個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 在創(chuàng)建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中沒有定義路由規(guī)則。Gateways代表基礎設施的配置,這種分離對于實現(xiàn) RBAC 至關(guān)重要。訪問控制模型允許 cluster operator 配置可用的Gateways,讓用戶在其路由資源中引用,而無需暴露對基礎設施配置本身的訪問。

創(chuàng)建路由

現(xiàn)有的 Ingress API 僅支持 HTTP 和 HTTPS 服務,這是一個比較大的限制。

而新的 Gateway API 為各種入站流量類型提供通用支持。HTTPRoute、TCPRoute、TLSRoute、GRPCRoute等資源在特定Gateway上指定了實際的流量路由。Gateway API 的 GA 版本只在標準的 v1 通道中包含了HTTPRoute資源,在未來的版本中將會有更多的協(xié)議支持。

HTTPRoute資源指定與用于暴露服務的 Gateway 的連接,以及一系列規(guī)則來將流量路由到適當?shù)暮蠖?。下面的示例將HTTPRoute附加到tutorial-gwGateway,并指定規(guī)則將所有流量路由到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 將許多傳統(tǒng)上包含在單個資源定義中的資源拆分開來。要跟蹤所有這些資源之間的連接可能有點困難,這里我將資源之間的關(guān)系圖展示如下:

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

Gateway API 資源之間的關(guān)系

快速回顧

GatewayClass定義了可以部署的 Gateway 類型。通常由基礎設施提供商提供。在本示例中,Istio 定義了GatewayClass。

Gateway是負載均衡基礎設施的實例化。這可以是在云環(huán)境中部署的實際負載均衡器,也可以是針對現(xiàn)有負載均衡器執(zhí)行的一些配置。無論哪種方式,通過簡單地引用所需的GatewayClass,就能從 cluster administrator 中抽象出來。

HTTPRoute(或任何其他支持的 Route 資源)定義了處理流量的實際規(guī)則。這些路由附加到特定的 Gateway,最終決定了流量的轉(zhuǎn)發(fā)。

有了所有這些配置,就可以對服務進行測試請求。本示例Gateway配置為偵聽端口 8080 上*.example.com的 HTTP 請求,因此你的請求需要設置適當?shù)?Host header 和端口:

$ curl -H "Host: www.example.com" 192.168.122.10:8080



Welcome to nginx!

這樣,你就使用新的網(wǎng)關(guān) API 成功配置了第一組資源咯!

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 通信
    +關(guān)注

    關(guān)注

    18

    文章

    5876

    瀏覽量

    135304
  • 網(wǎng)關(guān)
    +關(guān)注

    關(guān)注

    9

    文章

    4082

    瀏覽量

    50562
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1461

    瀏覽量

    61488
  • kubernetes
    +關(guān)注

    關(guān)注

    0

    文章

    222

    瀏覽量

    8655

原文標題:Kubernetes Gateway API 攻略:解鎖集群流量服務新維度!

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Kubernetes的Device Plugin設計解讀

    摘要: Kubernetes的生態(tài)地位已經(jīng)確立,可擴展性將是其發(fā)力的主戰(zhàn)場。異構(gòu)計算作為非常重要的新戰(zhàn)場,Kubernetes非常重視。而異構(gòu)計算需要強大的計算力和高性能網(wǎng)絡,需要提供一種統(tǒng)一的方式
    發(fā)表于 03-12 16:23

    MLDL之API:關(guān)于各國內(nèi)外大平臺API簡介、使用方法之詳細攻略

    MLDL之API:關(guān)于各國內(nèi)外大平臺API簡介、使用方法之詳細攻略
    發(fā)表于 12-19 17:00

    不吹不黑,今天我們來聊一聊 Kubernetes 落地的三種方式

    Kubernetes API 來訪問集群。你可以完全跟著社區(qū)升級演進你的 Kubernetes,保持與社區(qū)同步,完全借助于社區(qū)的力量維護你的 Kubernetes。這種落地方式無疑
    發(fā)表于 10-12 16:07

    Kubernetes API詳解

    的《kubernetes權(quán)威指南》一書的第三章3.2節(jié),獲得出版社和作者的獨家授權(quán)發(fā)布。本節(jié)重點講述了kubernetesAPI概述。 Kubernetes
    發(fā)表于 10-12 16:19 ?0次下載
    <b class='flag-5'>Kubernetes</b> <b class='flag-5'>API</b>詳解

    深入研究Kubernetes調(diào)度

    “本文從 Pod 和節(jié)點的配置開始,介紹了 Kubernetes Scheduler 框架、擴展點、API 以及可能發(fā)生的與資源相關(guān)的瓶頸,并展示了性能調(diào)整設置,涵蓋了 Kubernetes 中調(diào)度
    的頭像 發(fā)表于 08-23 10:39 ?1304次閱讀

    local-data-api-gateway本地數(shù)據(jù)API網(wǎng)關(guān)

    ./oschina_soft/gitee-local-data-api-gateway.zip
    發(fā)表于 06-14 10:27 ?2次下載
    local-data-<b class='flag-5'>api-gateway</b>本地數(shù)據(jù)<b class='flag-5'>API</b>網(wǎng)關(guān)

    帶你快速了解 kubernetes

    節(jié)點,負責控制整個 kubernetes 集群。它包括 Api Server、Scheduler、Controller 等組成部分。它們都需要和 Etcd 進行交互以存儲數(shù)據(jù)。 Api Server:
    的頭像 發(fā)表于 01-17 10:00 ?1041次閱讀

    什么是Kubernetes容器運行時CRI

    起初,Docker是事實上的容器技術(shù)標準,Kubernetes v1.5之前的代碼中直接調(diào)用Docker API,實現(xiàn)容器運行時的相關(guān)操作。
    的頭像 發(fā)表于 02-20 16:22 ?1330次閱讀
    什么是<b class='flag-5'>Kubernetes</b>容器運行時CRI

    Kubernetes Operator最佳實踐介紹

    kubernetes operator是通過連接主API并watch時間的一組進程,一般會watch有限的資源類型。
    的頭像 發(fā)表于 04-19 09:16 ?834次閱讀

    API 網(wǎng)關(guān)詳細介紹(上)

    業(yè)界有很多流行的 API 網(wǎng)關(guān),開源的有 Nginx、Netflix Zuul、Kong 等。當然 Kong 還有商業(yè)版,類似的商業(yè)版網(wǎng)關(guān)還有 GoKu API Gateway 和 Tyk 等
    的頭像 發(fā)表于 05-04 17:28 ?1419次閱讀
    <b class='flag-5'>API</b> 網(wǎng)關(guān)詳細介紹(上)

    API 網(wǎng)關(guān)詳細介紹(下)

    業(yè)界有很多流行的 API 網(wǎng)關(guān),開源的有 Nginx、Netflix Zuul、Kong 等。當然 Kong 還有商業(yè)版,類似的商業(yè)版網(wǎng)關(guān)還有 GoKu API Gateway 和 Tyk 等
    的頭像 發(fā)表于 05-04 17:28 ?727次閱讀
    <b class='flag-5'>API</b> 網(wǎng)關(guān)詳細介紹(下)

    Kubernetes多租戶集群的概念和常見的應用模式

    KaaS 多租戶方案通常與云服務提供商有關(guān)。在這種場景下,業(yè)務平臺的服務通過 Kubernetes 控制平面直接暴露給不同租戶的用戶。最終用戶可以使用服務提供商提供的 Kubernetes API 或其他擴展
    的頭像 發(fā)表于 05-15 16:13 ?1075次閱讀
    <b class='flag-5'>Kubernetes</b>多租戶集群的概念和常見的應用模式

    Kubernetes 監(jiān)控利器功能特性

    Kubeshark 是專為 Kubernetes 設計的 API 流量分析器,它提供實時的 K8s 協(xié)議級別的可見性,可以捕獲和監(jiān)控所有在容器、Pod、節(jié)點和集群之間進出和流動的流量和負載??梢园阉胂蟪蓪iT針對 Kubernetes
    的頭像 發(fā)表于 05-17 16:10 ?539次閱讀
    <b class='flag-5'>Kubernetes</b> 監(jiān)控利器功能特性

    怎么使用Kubernetes檢查點API快速進行容器的備份和恢復呢?

    Kubernetes v1.25 引入了容器檢查點 API 作為 alpha 特性。這提供了一種在不停止容器的情況下備份和恢復運行在 Pod 中的容器的方式。此功能主要用于調(diào)試分析,但任何 Kubernetes 用戶都可以利用常
    的頭像 發(fā)表于 10-30 15:50 ?423次閱讀

    api網(wǎng)關(guān) kong 教程入門

    為什么使用API-Gateway 方便客戶端維護– 每個請求方不用管理多個api url,統(tǒng)一訪問api-gateway即可 接口重構(gòu)時調(diào)用方不須了解接口本身等拆分和聚合 客戶端無須關(guān)心接口協(xié)議
    的頭像 發(fā)表于 11-10 11:39 ?565次閱讀
    <b class='flag-5'>api</b>網(wǎng)關(guān) kong 教程入門