Kubernetes 版 Spring Cloud Gateway

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

Spring Cloud Gateway (SCG) 開源專案已進行擴充套件並針對 Kubernetes 平臺提供了商業版本。此新產品允許您透過將 YAML 配置物件應用於 Kubernetes 叢集來自動化部署 API 閘道器服務。您還可以透過將 YAML 配置應用於叢集來更新 Kubernetes 中 API 閘道器的路由。

Spring Cloud Gateway for Kubernetes 支援路由到任何語言編寫的服務,只要這些服務暴露 HTTP 端點。它提供了一個 Kubernetes 運算子,透過將自定義資源應用到叢集來處理閘道器例項的建立和配置。您可以在 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 運算子和後端應用程式部署在 spring-cloud-gateway 名稱空間中。

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

您現在可以在叢集中建立一個閘道器例項。新的 SCG 例項透過 SpringCloudGateway CRD 派生,新的路由透過 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

然後您可以建立一個入口來訪問閘道器。下面建立的入口使用 /gateway 作為路徑到內部 Kubernetes 閘道器服務 my-gateway 的埠 80。

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:///gateway/github 啟動 GitHub

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有