柚子快報激活碼778899分享:Gateway API
柚子快報激活碼778899分享:Gateway API
Gateway API
目錄
原文鏈接
https://onedayxyy.cn/docs/GatewayAPI
本節(jié)實戰(zhàn)
實戰(zhàn)名稱? 實戰(zhàn):Gateway API在istio里的安裝及測試-2023.12.23(測試失敗)
前言
Gateway API 是由 SIG-NETWORK 社區(qū)管理的開源項目,項目地址:https://gateway-api.sigs.k8s.io/。
主要原因是 Ingress 資源對象不能很好的滿足網(wǎng)絡(luò)需求,很多場景下 Ingress 控制器都需要通過定義 annotations 或者 crd 來進(jìn)行功能擴展,這對于使用標(biāo)準(zhǔn)和支持是非常不利的,新推出的 Gateway API 旨在通過可擴展的面向角色的接口來增強服務(wù)網(wǎng)絡(luò)。
Gateway API 是 Kubernetes 中的一個 API 資源集合,包括 GatewayClass、Gateway、HTTPRoute、TCPRoute、Service 等,這些資源共同為各種網(wǎng)絡(luò)用例構(gòu)建模型。
Gateway API 最初設(shè)計用于管理從集群外部客戶端到集群內(nèi)部服務(wù)的流量(入口或北/南情況)。隨著時間的推移,服務(wù)網(wǎng)格用戶的興趣促使 GAMMA(Gateway API for Service Mesh)計劃的創(chuàng)建,以定義 Gateway API 如何用于同一集群內(nèi)的服務(wù)間或東/西流量。
Gateway API 的改進(jìn)比當(dāng)前的 Ingress 資源對象有很多更好的設(shè)計:
面向角色 - Gateway 由各種 API 資源組成,這些資源根據(jù)使用和配置 Kubernetes 服務(wù)網(wǎng)絡(luò)的角色進(jìn)行建模。通用性 - 和 Ingress 一樣是一個具有眾多實現(xiàn)的通用規(guī)范,Gateway API 是一個被設(shè)計成由許多實現(xiàn)支持的規(guī)范標(biāo)準(zhǔn)。更具表現(xiàn)力 - Gateway API 資源支持基于 Header 頭的匹配、流量權(quán)重等核心功能,這些功能在 Ingress 中只能通過自定義注解才能實現(xiàn)??蓴U展性 - Gateway API 允許自定義資源鏈接到 API 的各個層,這就允許在 API 結(jié)構(gòu)的適當(dāng)位置進(jìn)行更精細(xì)的定制。
還有一些其他值得關(guān)注的功能:
GatewayClasses - GatewayClasses 將負(fù)載均衡實現(xiàn)的類型形式化,這些類使用戶可以很容易了解到通過 Kubernetes 資源可以獲得什么樣的能力。共享網(wǎng)關(guān)和跨命名空間支持 - 它們允許共享負(fù)載均衡器和 VIP,允許獨立的路由資源綁定到同一個網(wǎng)關(guān),這使得團(tuán)隊可以安全地共享(包括跨命名空間)基礎(chǔ)設(shè)施,而不需要直接協(xié)調(diào)。規(guī)范化路由和后端 - Gateway API 支持類型化的路由資源和不同類型的后端,這使得 API 可以靈活地支持各種協(xié)議(如 HTTP 和 gRPC)和各種后端服務(wù)(如 Kubernetes Service、存儲桶或函數(shù))。服務(wù)網(wǎng)格支持 - Gateway API 支持將路由資源與服務(wù)資源關(guān)聯(lián),以配置服務(wù)網(wǎng)格以及入口控制器。
1、面向角色設(shè)計
無論是道路、電力、數(shù)據(jù)中心還是 Kubernetes 集群,基礎(chǔ)設(shè)施都是為了共享而建的,然而共享基礎(chǔ)設(shè)施提供了一個共同的挑戰(zhàn),那就是如何為基礎(chǔ)設(shè)施用戶提供靈活性的同時還能被所有者控制。
Gateway API 通過對 Kubernetes 服務(wù)網(wǎng)絡(luò)進(jìn)行面向角色的設(shè)計來實現(xiàn)這一目標(biāo),平衡了靈活性和集中控制。它允許共享的網(wǎng)絡(luò)基礎(chǔ)設(shè)施(硬件負(fù)載均衡器、云網(wǎng)絡(luò)、集群托管的代理等)被許多不同的團(tuán)隊使用,所有這些都受到集群運維設(shè)置的各種策略和約束。
一個集群運維人員創(chuàng)建了一個基于 GatewayClass 的 Gateway 資源,這個 Gateway 配置了它所代表的基礎(chǔ)網(wǎng)絡(luò)資源,集群運維和特定的團(tuán)隊必須溝通什么可以附加到這個 Gateway 上來暴露他們的應(yīng)用。 集中的策略,如 TLS,可以由集群運維在 Gateway 上強制執(zhí)行,同時,Store 和 Site 應(yīng)用在他們自己的命名空間中運行,但將他們的路由附加到相同的共享網(wǎng)關(guān)上,允許他們獨立控制他們的路由邏輯。
這種關(guān)注點分離的設(shè)計可以使不同的團(tuán)隊能夠管理他們自己的流量,同時將集中的策略和控制留給集群運維。
2、概念
在整個 Gateway API 中涉及到 3 個角色:基礎(chǔ)設(shè)施提供商、集群管理員、應(yīng)用開發(fā)人員,在某些場景下可能還會涉及到應(yīng)用管理員等角色。Gateway API 中定義了 3 種主要的資源模型:GatewayClass、Gateway、Route。
GatewayClass
GatewayClass 定義了一組共享相同配置和動作的網(wǎng)關(guān)。每個 GatewayClass 由一個控制器處理,是一個集群范圍的資源,必須至少有一個 GatewayClass 被定義。
這與 Ingress 的 IngressClass 類似,在 Ingress v1beta1 版本中,與 GatewayClass 類似的是 ingress-class 注解,而在 Ingress V1 版本中,最接近的就是 IngressClass 資源對象。
Gateway
Gateway 網(wǎng)關(guān)描述了如何將流量轉(zhuǎn)化為集群內(nèi)的服務(wù),也就是說,它定義了一個請求,要求將流量從不了解 Kubernetes 的地方轉(zhuǎn)換到集群內(nèi)的服務(wù)。例如,由云端負(fù)載均衡器、集群內(nèi)代理或外部硬件負(fù)載均衡器發(fā)送到 Kubernetes 服務(wù)的流量。
它定義了對特定負(fù)載均衡器配置的請求,該配置實現(xiàn)了 GatewayClass 的配置和行為規(guī)范,該資源可以由管理員直接創(chuàng)建,也可以由處理 GatewayClass 的控制器創(chuàng)建。
Gateway 可以附加到一個或多個路由引用上,這些路由引用的作用是將流量的一個子集導(dǎo)向特定的服務(wù)。
Route 資源
路由資源定義了特定的規(guī)則,用于將請求從網(wǎng)關(guān)映射到 Kubernetes 服務(wù)。從 v1alpha2 版本開始,API 中包含四種 Route 路由資源類型。
HTTPRoute
HTTPRoute 是用于 HTTP 或 HTTPS 連接,適用于我們想要檢查 HTTP 請求并使用 HTTP 請求進(jìn)行路由或修改的場景,比如使用 HTTP Headers 頭進(jìn)行路由,或在請求過程中對它們進(jìn)行修改。
TLSRoute
TLSRoute 用于 TLS 連接,通過 SNI 進(jìn)行區(qū)分,它適用于希望使用 SNI 作為主要路由方法的地方,并且對 HTTP 等更高級別協(xié)議的屬性不感興趣,連接的字節(jié)流不經(jīng)任何檢查就被代理到后端。
TCPRoute 和 UDPRoute
TCPRoute(和 UDPRoute)旨在用于將一個或多個端口映射到單個后端。在這種情況下,沒有可以用來選擇同一端口的不同后端的判別器,所以每個 TCPRoute 在監(jiān)聽器上需要一個不同的端口。你可以使用 TLS,在這種情況下,未加密的字節(jié)流會被傳遞到后端,當(dāng)然也可以不使用 TLS,這樣加密的字節(jié)流將傳遞到后端。
GRPCRoute
GRPCRoute 用于路由 gRPC 流量,支持 GRPCRoute 的網(wǎng)關(guān)必須支持 HTTP/2,無需從 HTTP/1 進(jìn)行初始升級,因此可以確保 gRPC 流量正常進(jìn)行。
組合
GatewayClass、Gateway、xRoute 和 Service 的組合定義了一個可實施的負(fù)載均衡器,下圖說明了不同資源之間的關(guān)系:
使用反向代理實現(xiàn)的網(wǎng)關(guān)的典型客戶端/網(wǎng)關(guān) API 請求流程如下所示:
客戶端向 http://foo.example.com 發(fā)出請求 DNS 將域名解析為 Gateway 網(wǎng)關(guān)地址 反向代理在監(jiān)聽器上接收請求,并使用 Host Header 來匹配 HTTPRoute (可選)反向代理可以根據(jù) HTTPRoute 的匹配規(guī)則進(jìn)行路由 (可選)反向代理可以根據(jù) HTTPRoute 的過濾規(guī)則修改請求,即添加或刪除 headers 最后,反向代理根據(jù) HTTPRoute 的 forwardTo 規(guī)則,將請求轉(zhuǎn)發(fā)給集群中的一個或多個對象,即服務(wù)。
與 Istio API 的區(qū)別
我們這里主要是講解 Gateway API 在服務(wù)網(wǎng)格中的使用,首先我們先了解下 Gateway API 與 Istio API 的區(qū)別。
Gateway API 與 Istio API(如 Gateway 和 VirtualService)有很多相似之處。主資源使用相同的 Gateway 名稱,并且這些資源服務(wù)于相類似的目標(biāo)。
新的 Gateway API 致力于從 Kubernetes 的各種 Ingress 實現(xiàn)(包括 Istio)中吸取經(jīng)驗,以構(gòu)建標(biāo)準(zhǔn)化的,獨立于供應(yīng)商的 API。這些 API 通常與 Istio Gateway 和 VirtualService 具有相同的用途,但依然有一些不同的地方:
Istio API 中的 Gateway 僅配置已部署的現(xiàn)有網(wǎng)關(guān) Deployment/Service,而在 Gateway API 中的 Gateway 資源不僅配置也會部署網(wǎng)關(guān)。在 Istio VirtualService 中,所有協(xié)議都在單一的資源中配置,而在 Gateway API 中,每種協(xié)議類型都有自己的資源,例如 HTTPRoute 和 TCPRoute。雖然 Gateway API 提供了大量豐富的路由功能,但它還沒有全部涵蓋 Istio 的全部特性。
3、實現(xiàn)
接下來我們就來了解下如何在 Istio z 中使用 Gateway API。默認(rèn)情況下 Kubernetes 集群中不會安裝 Gateway API。
? 實戰(zhàn):Gateway API在istio里的安裝及測試-2023.12.23(測試失敗)
測試環(huán)境
k8s v1.27.6(containerd://1.6.20)(cni:flannel:v0.22.2)
istio v1.19.3(--set profile=demo)
實驗軟件:
鏈接:https://pan.baidu.com/s/1pMnJxgL63oTlGFlhrfnXsA?pwd=7yqb 提取碼:7yqb 2023.11.5-實戰(zhàn):BookInfo 示例應(yīng)用-2023.11.5(測試成功)
experimental-install.yaml文件:
鏈接:https://pan.baidu.com/s/1pcuEn2DHsqmDTPX_rtNtLQ?pwd=wwhj 提取碼:wwhj 實戰(zhàn):Gateway API在istio里的安裝及測試-2023.12.23(測試失敗)
1.安裝 Gateway API CRD
首先我們需要安裝 Gateway API CRD:
[root@master1 GatewayAPI]#kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.0.0/experimental-install.yaml
customresourcedefinition.apiextensions.k8s.io/backendtlspolicies.gateway.networking.k8s.io created
customresourcedefinition.apiextensions.k8s.io/gatewayclasses.gateway.networking.k8s.io created
customresourcedefinition.apiextensions.k8s.io/gateways.gateway.networking.k8s.io created
customresourcedefinition.apiextensions.k8s.io/grpcroutes.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
customresourcedefinition.apiextensions.k8s.io/tcproutes.gateway.networking.k8s.io created
customresourcedefinition.apiextensions.k8s.io/tlsroutes.gateway.networking.k8s.io created
customresourcedefinition.apiextensions.k8s.io/udproutes.gateway.networking.k8s.io created
standard-install.yaml 包括所有已升級為 GA 或 Beta 的資源,包括 GatewayClass、Gateway、HTTPRoute 和 ReferenceGrant,由于 Istio 已經(jīng)對 Gateway API 提供了支持,所以現(xiàn)在我們就可以直接使用了。
experimental.yaml包括其他的路由對象,比如 TLSRoute、TCPRoute、UDPRoute 等。
比如現(xiàn)在就會自動創(chuàng)建一個 istio 的 GatewayClass 資源對象,如下所示(另外還有一個名為 istio-remote):
[root@master1 GatewayAPI]#kubectl get gatewayclass
NAME CONTROLLER ACCEPTED AGE
istio istio.io/gateway-controller True 13m
istio-remote istio.io/unmanaged-gateway True 13m
[root@master1 GatewayAPI]#kubectl get gatewayclass istio -oyaml
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
……
spec:
controllerName: istio.io/gateway-controller
description: The default Istio GatewayClass
……
[root@master1 GatewayAPI]#
因為大部分場景下在一個 Kubernetes 集群中只會有一個 Istio 集群,所以我們可以直接使用默認(rèn)的 istio 這個 GatewayClass,如果你有多個 Istio 集群,那么你可以創(chuàng)建多個 GatewayClass 來區(qū)分不同的集群。
2.將 httpbin 應(yīng)用使用 Gateway API 暴露到外部
比如接下來我們來嘗試將 httpbin 應(yīng)用使用 Gateway API 暴露到外部。
部署httpbin 應(yīng)用
首先我們需要部署一個 httpbin 應(yīng)用:
kubectl apply -f samples/httpbin/httpbin.yaml
部署一個 Gateway 資源對象
然后接下來同樣我們需要部署一個 Gateway 資源對象,用于將流量從外部負(fù)載均衡器轉(zhuǎn)發(fā)到集群內(nèi)的服務(wù),如下所示:
# default-gateway.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: gateway
namespace: istio-ingress # 網(wǎng)關(guān)資源對象所在的命名空間
spec:
gatewayClassName: istio # 使用默認(rèn)的 istio GatewayClass
listeners: # 監(jiān)聽器
- name: default
hostname: "*.example.com"
port: 80
protocol: HTTP
allowedRoutes: # 允許的路由
namespaces:
from: All # 允許所有命名空間
Gateway 代表了邏輯負(fù)載均衡器的實例化,它是根據(jù)一個 istio 這個 GatewayClass 進(jìn)行模板化的,網(wǎng)關(guān)在 80 端口上監(jiān)聽 HTTP 流量,這個特定的 GatewayClass 在部署后會自動分配一個 IP 地址,該地址會顯示在 Gateway.status 中。
? 注意:
需要注意的是這里我們聲明使用的命名空間為 istio-ingress, 這是因為 Istio Gateway 可以直接使用 istio ingressgateway 的 Deployment,而這個 Deployment 默認(rèn)是部署在 istio-system 命名空間中的,我們這里單獨將 Gateway 資源對象創(chuàng)建在 istio-ingress 命名空間中,那么就會自動在這個命名空間中部署一個網(wǎng)關(guān)控制器,用于區(qū)分默認(rèn)的 istio ingressgateway。
所以我們需要在 istio-ingress 命名空間中創(chuàng)建這個 Gateway 資源對象,這樣才能讓 istio ingressgateway 通過 Gateway 資源對象來獲取配置。
kubectl create namespace istio-ingress
然后直接應(yīng)用這個資源對象即可:
$ kubectl apply -f default-gateway.yaml
##查看
$ kubectl get gateway -n istio-ingress
NAME CLASS ADDRESS PROGRAMMED AGE
gateway istio False 8m23s
$ kubectl get deploy -n istio-ingress
NAME READY UP-TO-DATE AVAILABLE AGE
gateway-istio 1/1 1 1 8m35s
$ kubectl get svc -n istio-ingress
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
gateway-istio LoadBalancer 10.100.103.86
我們也可以去對比下上面生成的 gateway-istio 和 Istio 默認(rèn)的 istio-ingressgateway 的 Deployment,他們的配置幾乎是一樣的。
**完了,又報錯了**?
這里的排查記錄僅作為記錄,稍后再排查這個問題!
故障現(xiàn)象
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 4m23s default-scheduler Successfully assigned istio-ingress/gateway-istio-7474cd4d9b-pkmsr to node2
Warning FailedCreatePodSandBox 6s (x20 over 4m21s) kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to create containerd task: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: open /proc/sys/net/ipv4/ip_unprivileged_port_start: no such file or directory: unknown
[root@master1 GatewayAPI]#
[root@master1 GatewayAPI]#kubectl get gateway -nistio-ingress
NAME CLASS ADDRESS PROGRAMMED AGE
gateway istio False 5m50s
[root@master1 GatewayAPI]#kubectl get po -nistio-ingress
NAME READY STATUS RESTARTS AGE
gateway-istio-7474cd4d9b-pkmsr 0/1 ContainerCreating 0 5m52s
[root@master1 GatewayAPI]#kubectl get svc -nistio-ingress
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
gateway-istio LoadBalancer 10.100.204.5
[root@master1 GatewayAPI]#
預(yù)測原因–感覺還是和底層版本有關(guān)系。。。;
感覺像是底層pod sandbox–pause??問題??;
可能和這個有關(guān)系:。。。。例如 containerd 或 runc 的正確版本。
gpt
kubelet沒有用日志
node2節(jié)點kubelet有報錯
百度
排查方法
我刪除下flannel看下把。。。
[root@master1 ~]#kubectl get po -nkube-flannel -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-flannel-ds-2ndhl 1/1 Running 1 (11d ago) 44d 172.29.9.62 node1
kube-flannel-ds-m44dc 1/1 Running 1 (11d ago) 44d 172.29.9.61 master1
kube-flannel-ds-s4787 1/1 Running 3 (5m10s ago) 44d 172.29.9.63 node2
[root@master1 ~]#kubectl delete po kube-flannel-ds-s4787 -n kube-flannel
pod "kube-flannel-ds-s4787" deleted
##已重建
[root@master1 ~]#kubectl delete po kube-flannel-ds-s4787 -n kube-flannel
pod "kube-flannel-ds-s4787" deleted
[root@master1 ~]#kubectl get po -nkube-flannel -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-flannel-ds-2ndhl 1/1 Running 1 (11d ago) 44d 172.29.9.62 node1
kube-flannel-ds-m44dc 1/1 Running 1 (11d ago) 44d 172.29.9.61 master1
kube-flannel-ds-mkh5z 1/1 Running 0 14s 172.29.9.63 node2
[root@master1 ~]#
還是不行。。。
pause版本
Warning FailedCreatePodSandBox 12m (x3 over 14m) kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to get sandbox image "registry.k8s.io/pause:3.6": failed to pull image "registry.k8s.io/pause:3.6": failed to pull and unpack image "registry.k8s.io/pause:3.6": failed to resolve reference "registry.k8s.io/pause:3.6": failed to do request: Head "https://us-west2-docker.pkg.dev/v2/k8s-artifacts-prod/images/pause/manifests/3.6": dial tcp 173.194.174.82:443: i/o timeout
sed -i 's/registry.k8s.io\/pause:3.6/registry.aliyuncs.com\/google_containers\/pause:3.9/g' /etc/containerd/config.toml
重啟node2
重啟node2后,一直卡在這里。。。
放棄
這里記錄下就好,這個問題有點難搞……
[root@master1 ~]#ssh node2
Last login: Sat Dec 23 08:48:26 2023 from master1
[root@node2 ~]#ctr -n k8s.io i ls -q|grep pause
registry.aliyuncs.com/k8sxio/pause:3.8
registry.aliyuncs.com/k8sxio/pause@sha256:67cc096c2abe1f29ece08439b509738a5cd11f8ff87851a06d092772d52c090e
[root@node2 ~]#
使用 HTTPRoute 資源對象來定義路由規(guī)則
接下來我們就需要去創(chuàng)建一個路由規(guī)則了,也就是想要如何訪問我們的 httpbin 應(yīng)用,類似于 VirtualService,我們可以使用 HTTPRoute 資源對象來定義這個路由規(guī)則,如下所示:
# httpbin-route.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: httpbin
namespace: default
spec:
parentRefs: # 引用定義的 Gateway 對象
- name: gateway
namespace: istio-ingress
hostnames: ["httpbin.example.com"] # 域名
rules: # 具體的路由規(guī)則
- matches:
- path:
type: PathPrefix
value: /get # 匹配 /get 的請求
backendRefs: # 引用的后端服務(wù)
- name: httpbin
port: 8000
在上面的 HTTPRoute 對象中我們通過 parentRefs 字段指定要連接到的網(wǎng)關(guān),只要網(wǎng)關(guān)允許這種連接,這將允許路由接收來自父網(wǎng)關(guān)的流量,在 backendRefs 中定義將要發(fā)送流量的后端。但是需要注意我們這里只定義了匹配 /get 這個路徑的請求,然后將要訪問的域名通過 hostnames 來定義。
同樣直接應(yīng)用該資源對象即可:
$ kubectl apply -f httpbin-route.yaml
$ kubectl get httproute
NAME HOSTNAMES AGE
httpbin ["httpbin.example.com"] 5s
3.測試
然后我們就可以通過 httpbin.example.com 來訪問 httpbin 應(yīng)用了:
# $ export INGRESS_HOST=$(kubectl get gateways.gateway.networking.k8s.io gateway -n istio-ingress -ojsonpath='{.status.addresses[0].value}')
export GATEWAY_URL=$(kubectl get po -l istio.io/gateway-name=gateway -n istio-ingress -o 'jsonpath={.items[0].status.hostIP}'):$(kubectl get svc gateway-istio -n istio-ingress -o 'jsonpath={.spec.ports[?(@.name=="default")].nodePort}')
如果你的集群可以正常使用 LoadBalancer,那么 Gateway 控制器在部署后會自動分配一個 IP 地址,該地址會顯示在 Gateway.status 中。我們這里暫不支持,所以還是可以通過 NodePort 方式來進(jìn)行訪問。
然后可以使用 curl 訪問 httpbin 服務(wù):
$ curl -s -HHost:httpbin.example.com "http://$GATEWAY_URL/get"
HTTP/1.1 200 OK
server: istio-envoy
date: Mon, 18 Dec 2023 07:29:11 GMT
content-type: application/json
content-length: 494
access-control-allow-origin: *
access-control-allow-credentials: true
x-envoy-upstream-service-time: 2
請注意,使用 -H 標(biāo)志可以將 Host HTTP 標(biāo)頭設(shè)置為 httpbin.example.com。這一步是必需的,因為 HTTPRoute 已配置為處理 httpbin.example.com 的請求,但是在測試環(huán)境中,該主機沒有 DNS 綁定,只是將請求發(fā)送到入口 IP。
訪問其他沒有被顯式暴露的 URL 時,正常就會看到 HTTP 404 錯誤:
$ curl -s -I -HHost:httpbin.example.com "http://$INGRESS_HOST/headers"
HTTP/1.1 404 Not Found
date: Mon, 18 Dec 2023 07:31:51 GMT
server: istio-envoy
transfer-encoding: chunked
或者:
同樣我們也可以查看下 gateway-istio 的日志,可以看到類似于下面的日志:
$ kubectl -n istio-ingress logs -f gateway-istio-7474cd4d9b-8dw2k
# ......
2023-12-18T07:04:33.164968Z info cache returned workload trust anchor from cache ttl=23h59m59.835033638s
2023-12-18T07:04:33.621616Z info Readiness succeeded in 813.201909ms
2023-12-18T07:04:33.621946Z info Envoy proxy is ready
[2023-12-18T07:29:11.177Z] "HEAD /get HTTP/1.1" 200 - via_upstream - "-" 0 0 2 2 "10.244.1.1" "curl/7.29.0" "68f51e89-8125-4d9e-be36-e0cdc6e6ead8" "httpbin.example.com" "10.244.1.131:80" outbound|8000||httpbin.default.svc.cluster.local 10.244.1.132:46066 10.244.1.132:80 10.244.1.1:55626 - default.httpbin.0
[2023-12-18T07:31:52.051Z] "HEAD /headers HTTP/1.1" 404 NR route_not_found - "-" 0 0 0 - "10.244.1.1" "curl/7.29.0" "a9a1002f-d65c-40d8-861d-ec99d4a4a442" "httpbin.example.com" "-" - - 10.244.1.132:80 10.244.1.1:53583 - -
證明我們的路由規(guī)則已經(jīng)生效了。
同樣如果我們想要能夠正常訪問刀 /headers 路由,那么我們可以更新下 HTTPRoute 對象:
# httpbin-route.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: httpbin
namespace: default
spec:
parentRefs: # 引用定義的 Gateway 對象
- name: gateway
namespace: istio-ingress
hostnames: ["httpbin.example.com"] # 域名
rules: # 具體的路由規(guī)則
- matches:
- path:
type: PathPrefix
value: /get # 匹配 /get 的請求
- path:
type: PathPrefix
value: /headers # 匹配 /headers 的請求
filters:
- type: RequestHeaderModifier # 添加一個修改請求頭的過濾器
requestHeaderModifier:
add: # 添加一個標(biāo)頭
- name: my-added-header
value: added-value
backendRefs: # 引用的后端服務(wù)
- name: httpbin
port: 8000
我們除了在 rules 中添加了一個匹配 /headers 的規(guī)則外,還添加了一個 RequestHeaderModifier 過濾器,用于添加一個 Header 頭信息。
更新這個資源對象后再次訪問 /headers,注意到 My-Added-Header 標(biāo)頭已被添加到請求中了:
$ curl -s -HHost:httpbin.example.com "http://$GATEWAY_URL/headers"
{
"headers": {
"Accept": "*/*",
"Host": "httpbin.example.com",
"My-Added-Header": "added-value", # 添加了一個Header頭
"User-Agent": "curl/7.29.0",
"X-Envoy-Attempt-Count": "1",
"X-Envoy-Internal": "true",
"X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/default/sa/httpbin;Hash=11fc66a1c6c9fc44e65ec67f7f8b16d06fbaa73d9729e141e0bd91134dc59db3;Subject=\"\";URI=spiffe://cluster.local/ns/istio-ingress/sa/gateway-istio"
}
}
在上面的示例中,在配置網(wǎng)關(guān)之前,我們并沒有去安裝 Ingress 網(wǎng)關(guān)的 Deployment,因為在默認(rèn)配置中會根據(jù) Gateway 配置自動分發(fā)網(wǎng)關(guān) Deployment 和 Service。但是對于高級別的場景可能還是需要去手動部署。
4.擴展
1、自動部署
默認(rèn)情況下,每個 Gateway 將自動提供相同名稱的 Service 和 Deployment。如果 Gateway 發(fā)生變化(例如添加了一個新端口),這些配置將會自動更新。這些資源可以通過以下幾種方式進(jìn)行定義:
將 Gateway 上的注解和標(biāo)簽復(fù)制到 Service 和 Deployment。這就允許配置從上述字段中讀取到的內(nèi)容,如配置內(nèi)部負(fù)載均衡器等。Istio 提供了一個額外的注解來配置生成的資源:
networking.istio.io/service-type:控制 Service.spec.type 字段。例如設(shè)置 ClusterIP 為不對外暴露服務(wù),將會默認(rèn)為 LoadBalancer。 通過配置 addresses 字段可以顯式設(shè)置 Service.spec.loadBalancerIP 字段:
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: gateway
spec:
addresses:
- value: 192.0.2.0 # 僅能指定一個地址
type: IPAddress
2、手動部署
如果您不希望使用自動部署,可以進(jìn)行手動配置 Deployment 和 Service。完成此選項后,您將需要手動將 Gateway 鏈接到 Service,并保持它們的端口配置同步。
要將 Gateway 鏈接到 Service,需要將 addresses 字段配置為指向單個 Hostname。
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
name: gateway
spec:
addresses:
- value: ingress.istio-gateways.svc.cluster.local
type: Hostname
當(dāng)然我們這里只是一個最簡單的示例,我們將在后面的課程中繼續(xù)介紹 Gateway API 的更多功能。
關(guān)于我
我的博客主旨:
排版美觀,語言精煉;文檔即手冊,步驟明細(xì),拒絕埋坑,提供源碼;本人實戰(zhàn)文檔都是親測成功的,各位小伙伴在實際操作過程中如有什么疑問,可隨時聯(lián)系本人幫您解決問題,讓我們一起進(jìn)步!
? 微信二維碼
x2675263825 (舍得), qq:2675263825。
? 微信公眾號
《云原生架構(gòu)師實戰(zhàn)》
? 個人博客站點
http://onedayxyy.cn/
? 語雀
https://www.yuque.com/xyy-onlyone
? csdn
https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421
? 知乎
https://www.zhihu.com/people/foryouone
最后
好了,關(guān)于本次就到這里了,感謝大家閱讀,最后祝大家生活快樂,每天都過的有意義哦,我們下期見!
304699014)]
? 微信公眾號
《云原生架構(gòu)師實戰(zhàn)》
[外鏈圖片轉(zhuǎn)存中…(img-zntHMkMo-1703304699015)]
? 個人博客站點
http://onedayxyy.cn/
[外鏈圖片轉(zhuǎn)存中…(img-dyfE0ixN-1703304699015)]
[外鏈圖片轉(zhuǎn)存中…(img-A9No82cT-1703304699016)]
? 語雀
https://www.yuque.com/xyy-onlyone
[外鏈圖片轉(zhuǎn)存中…(img-FAK6bbRe-1703304699016)]
? csdn
https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421
[外鏈圖片轉(zhuǎn)存中…(img-IiWTivCF-1703304699017)]
? 知乎
https://www.zhihu.com/people/foryouone
[外鏈圖片轉(zhuǎn)存中…(img-UdDqYg5I-1703304699017)]
最后
好了,關(guān)于本次就到這里了,感謝大家閱讀,最后祝大家生活快樂,每天都過的有意義哦,我們下期見!
柚子快報激活碼778899分享:Gateway API
推薦文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。