Kubernetes 的 Spring Cloud Gateway

工程 | Haytham Mohamed | 2021 年 5 月 4 日 | ...

用於 Kubernetes 平台的 Spring Cloud Gateway (SCG) 開源專案已擴展,並針對商業用途提供。這個新產品讓您能夠透過將 YAML 組態物件應用於 Kubernetes 集群,自動化 API 閘道服務的部署。您也可以透過將 YAML 組態應用於集群,在 Kubernetes 中更新 API 閘道的路由。

Spring Cloud Gateway for Kubernetes 支援路由到以任何語言編寫的服務,只要這些服務公開 HTTP 端點即可。Kubernetes Operator 可用於透過將定義的自訂資源應用於集群,處理閘道執行個體的建立和組態。您可以在 Kubernetes 平台上動態組態產生的 SCG 執行個體,以針對持續整合 (CI) 和持續交付 (CD) 管道啟用 API 路由更新。此外,SCG for Kubernetes 提供商業 API 路由篩選器,用於單一登入 (SSO) 驗證、基於角色的存取控制、範圍授權、授權權杖轉發、用戶端憑證授權、速率限制和斷路器。Kubernetes 平台上的 SCG 執行個體以高可用性執行,並具有記憶體和 vCPU 資源消耗的可調整設定。

Spring Cloud Gateway for Kubernetes 易於安裝和使用。在這篇部落格中,我將展示如何在本地開發環境中安裝 SCG for Kubernetes,並展示如何建立和組態具有路由的閘道執行個體。您需要安裝 DockerHelm 命令列介面 (CLI) 工具。讓我們先從設定具有本地 Kubernetes 集群的環境開始。將集群組態為具有本地 Docker 映像檔倉庫和 Ingress 控制器也會很有幫助。我們可以使用 KinD 來建立本地集群。您可以從 此處 安裝 KinD。首先,我們使用 "registry" docker 映像檔啟動一個連接埠為 5000 的本地映像檔倉庫 (名為 myregistry),如下所示

$ Docker run -d –restart=always -p “127.0.0.1:5000” –name myregistry registry:2

您可以使用以下命令建立一個名為 mycluster 的新 KinD 集群。此集群包含兩個節點,一個作為控制平面節點,另一個作為工作負載節點,連接埠 80 和 443 對應到您的主機以進入集群。此集群已組態為使用上述本地 Docker 映像檔倉庫。

$ cat <<EOF | kind create cluster --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
containerdConfigPatches:
- |-
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."localhost:5000"]
    endpoint = ["http://myregistry:5000"]
nodes:
- role: control-plane
- role: worker
  kubeadmConfigPatches:
  - |
    kind: JoinConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    protocol: TCP
  - containerPort: 443
    hostPort: 443
    protocol: TCP
EOF

您需要使用以下命令將映像檔倉庫連接到集群網路

$ docker network connect mycluster myregistry || true

此外,您需要建立 Kubernetes ConfigMap 以在集群中組態本地映像檔倉庫

$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
  name: local-registry-hosting
  namespace: kube-public
data:
  localRegistryHosting.v1: |
    host: "localhost:5000"
    help: "https://kind.sigs.k8s.io/docs/user/local-registry/"
EOF

這樣,您應該就擁有準備就緒的本地開發環境,其中包含一個小型集群可供使用。現在我們可以研究如何部署 SCG for Kubernetes。假設您擁有授權和存取權,您可以從 VMware Tanzu Network 下載 SCG for Kubernetes 的安裝程式。我們將下載目前版本 (1.0.0) 的安裝程式,並將其解壓縮到資料夾中。您需要先將 Spring Cloud Gateway for Kubernetes docker 映像檔配置到我們在 localhost 連接埠 5000 安裝的 docker 映像檔倉庫。從解壓縮的資料夾中,執行位於 scripts 目錄中的映像檔重新定位腳本。此命令會提取、標記映像檔並將其推送至 docker 映像檔倉庫

$ ./scripts/relocate-images.sh localhost:5000

執行以下腳本以完成安裝。預設情況下,Spring Cloud Gateway for Kubernetes Operator 和後端應用程式會部署在 spring-cloud-gateway 命名空間中。

$ ./scripts/ install-spring-cloud-gateway.sh

您現在可以在集群中建立閘道執行個體。使用 SpringCloudGateway CRD 產生新的 SCG 執行個體,使用 SpringCloudGatewayRouteConfig CRD 定義新路由,以及使用 SpringCloudGatewayMapping CRD 組態具有路由的閘道。

image link

例如,您可以建立一個名為 gateway-config.yaml 的檔案,其中包含以下 YAML 定義

apiVersion: tanzu.vmware.com/v1
kind: SpringCloudGateway
metadata:
  name: my-gateway

接下來,將此定義套用至您的 Kubernetes 集群

$ kubectl apply -f gateway-config.yaml

此組態會建立新的閘道執行個體 (預設情況下,閘道執行個體會在目前的命名空間中建立)。若要新增路由並將路由對應到閘道,我們需要建立一個描述路由的 SpringCloudGatewayRouteConfig 物件,以及一個將路由組態對應到閘道的 SpringCloudGatewayMapping 物件。建立一個名為 route-config.yaml 的檔案,其中包含以下 YAML 定義

apiVersion: tanzu.vmware.com/v1
kind: SpringCloudGatewayRouteConfig
metadata:
  name: my-gateway-routes
spec:
  routes:
  - id: test-route
    uri: https://github.com
    predicates:
      - Path=/github/**
    filters:
      - StripPrefix=1

然後建立一個名為 mapping.yaml 的檔案,其中包含以下 YAML 定義

apiVersion: tanzu.vmware.com/v1
kind: SpringCloudGatewayMapping
metadata:
  name: test-gateway-mapping
spec:
  gatewayRef:
    name: my-gateway
  routeConfigRef:
    name: my-gateway-routes

將這兩個定義都套用至您的 Kubernetes 集群,以使用定義的路由組態閘道。依照這些步驟,您可以路由到 Kubernetes 平台內部或外部的 API。例如,您可以組態 SCG 以從公開的前端 API 路由到不同的後端協作 API。

image link

上述範例閘道已組態為路由到 GitHub。您可以安裝 Ingress 控制器,以從集群外部連線到閘道。例如,您可以如下所示安裝 nginx Ingress 控制器

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/kind/deploy.yaml

然後您可以建立 Ingress 以連線到閘道。以下建立的 Ingress 使用 /gateway 作為連接埠 80 上內部 Kubernetes 閘道服務 my-gateway 的路徑。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: gateway-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  ingressClassName: nginx
  rules:
    - http:
        paths:
          - path: /gateway(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: my-gateway
                port:
                  number: 80

這樣一來,您就可以使用 https://127.0.0.1/gateway/github 透過組態的閘道啟動 GitHub

取得 Spring 電子報

隨時關注 Spring 電子報

訂閱

領先一步

VMware 提供訓練和認證,以加速您的進展。

了解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

了解更多

即將到來的活動

查看 Spring 社群中所有即將到來的活動。

檢視全部