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
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83672.shtml
英文地址,請注明出處:http://en.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組件轉換后,我們是東八區,前端傳給后端的時間為&…