<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
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

    文章

    5715

    瀏覽量

    134551
  • 網關
    +關注

    關注

    9

    文章

    3268

    瀏覽量

    50108
  • API
    API
    +關注

    關注

    2

    文章

    1398

    瀏覽量

    61034
  • kubernetes
    +關注

    關注

    0

    文章

    219

    瀏覽量

    8581

原文標題: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

    【k8s】Kubernetes基礎概念
    發表于 09-27 09:11

    不吹不黑,今天我們來聊一聊 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 ?1212次閱讀

    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

    Master 即主節點,負責控制整個 kubernetes 集群。它包括 Api Server、Scheduler、Controller 等組成部分。它們都需要和 Etcd 進行交互以存儲數據。
    發表于 08-03 10:38 ?262次閱讀

    帶你快速了解 kubernetes

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

    Kubernetes Operator最佳實踐介紹

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

    API 網關詳細介紹(上)

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

    API 網關詳細介紹(下)

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

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

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

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

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

    api網關 kong 教程入門

    為什么使用API-Gateway 方便客戶端維護– 每個請求方不用管理多個api url,統一訪問api-gateway即可 接口重構時調用方不須了解接口本身等拆分和聚合 客戶端無須關心接口協議
    的頭像 發表于 11-10 11:39 ?316次閱讀
    <b class='flag-5'>api</b>網關 kong 教程入門
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>