日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

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

發(fā)布時(shí)間:2023/11/21 windows 42 coder
生活随笔 收集整理的這篇文章主要介紹了 Kubernetes Gateway API 攻略:解锁集群流量服务新维度! 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

背 景

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

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

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

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

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

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

設(shè)置測(cè)試環(huán)境

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

我用的是 K3s,使用 Kubernetes 集群也是類似的操作。如果選擇使用 K3s,則在安裝時(shí)不要啟用 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)建一個(gè)簡(jiǎn)單的工作負(fù)載,比如一個(gè) Nginx deployment ,并通過 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 所需的全部基礎(chǔ)設(shè)施。
?

了解 Gateway API 資源

想要使用 Gateway API,有三種資源類型你需要明確了解:

  • GatewayClass

  • Gateway

  • 路由資源,比如 HTTPRouteGRPCRoute。GA 版本僅包含在 v1 通道中到 HTTPRoute
    ?

這些資源在標(biāo)準(zhǔn) Ingress API 或自定義提供商負(fù)載均衡器和路由工具提供的 CRD 中以各種方式組合在一起。通過將這些資源拆分為單獨(dú)的組件,Gateway API 實(shí)現(xiàn)了關(guān)注點(diǎn)分離和強(qiáng)大的、細(xì)粒度的訪問控制。
?

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

了解 GatewayClass 資源

GatewayClass資源的作用與現(xiàn)有 Ingress API 中的 IngressClass相同,類似于 Storage API 中的 StorageClass。它定義了可以創(chuàng)建的 Gateway類別。通常,此資源由你的基礎(chǔ)架構(gòu)平臺(tái)(如 EKS 或 GKE)提供。也可以由第三方的 Ingress Controller 提供,例如 Istio 或 Nginx。Istio 包含兩個(gè) 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)實(shí)現(xiàn) GatewayClass功能的 controller 的信息,它定義了整個(gè)集群使用的控制器,而 GatewayClasses 是集群范圍的資源,適用于所有命名空間。
?

$ kubectl get gatewayclass istio -o yaml
apiVersion: gateway.networking.k8s.io/v1beta1
kind: GatewayClass
metadata:
  creationTimestamp: "2023-10-30T02:15:11Z"
  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-30T02:15:11Z"
    message: Handled by Istio controller
    observedGeneration: 1
    reason: Accepted
    status: "True"
    type: Accepted

?

GatewayClass還可以指定傳遞給控制器的參數(shù)。這樣上游項(xiàng)目能夠進(jìn)一步定制向集群管理員公開的配置。也就是說, GatewayClass允許集群管理員專注于將其流量暴露給外部,而不必?fù)?dān)心例如在底層基礎(chǔ)設(shè)施上如何創(chuàng)建負(fù)載均衡器等實(shí)現(xiàn)細(xì)節(jié)。
?

創(chuàng)建 Gateway

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

Gateway 在其規(guī)范中引用了一個(gè) GatewayClass。下面的示例使用 istio 類,并定義了一個(gè)響應(yīng)端口 8080 上 *.example.com 的 HTTP 請(qǐng)求的單個(gè)偵聽器:

# 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 時(shí)還會(huì)相應(yīng)配置DeploymentService 來處理流量。GatewayClass 的控制器負(fù)責(zé)為 Gateway 處理所需的基礎(chǔ)設(shè)施或配置的設(shè)置:

$ 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 代表基礎(chǔ)設(shè)施的配置,這種分離對(duì)于實(shí)現(xiàn) RBAC 至關(guān)重要。訪問控制模型允許 cluster operator 配置可用的Gateways ,讓用戶在其路由資源中引用,而無需暴露對(duì)基礎(chǔ)設(shè)施配置本身的訪問。
?

創(chuàng)建路由

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

而新的 Gateway API 為各種入站流量類型提供通用支持。 HTTPRouteTCPRouteTLSRouteGRPCRoute 等資源在特定 Gateway 上指定了實(shí)際的流量路由。Gateway API 的 GA 版本只在標(biāo)準(zhǔn)的 v1 通道中包含了 HTTPRoute資源,在未來的版本中將會(huì)有更多的協(xié)議支持。
?

HTTPRoute資源指定與用于暴露服務(wù)的 Gateway 的連接,以及一系列規(guī)則來將流量路由到適當(dāng)?shù)暮蠖恕O旅娴氖纠龑?code> HTTPRoute附加到 tutorial-gw Gateway,并指定規(guī)則將所有流量路由到 nginx Service:

---
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)上包含在單個(gè)資源定義中的資源拆分開來。要跟蹤所有這些資源之間的連接可能有點(diǎn)困難,這里我將資源之間的關(guān)系圖展示如下:

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

快速回顧

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

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

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

?

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

$ curl -H "Host: www.example.com" 192.168.122.10:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

?

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

鏈接:
https://itnext.io/what-you-should-know-about-the-kubernetes-gateway-api-801d46b68ae2

?

總結(jié)

以上是生活随笔為你收集整理的Kubernetes Gateway API 攻略:解锁集群流量服务新维度!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。