Kubernetes 的 Spring Cloud Gateway

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

開源專案 Spring Cloud Gateway (SCG) 已經擴充套件,併為 Kubernetes 平臺提供商業版本。 這個新版本允許您透過將 YAML 配置物件應用到 Kubernetes 叢集來自動化 API 閘道器服務的部署。 您還可以透過將 YAML 配置應用到叢集來更新 Kubernetes 中 API 閘道器的路由。

Kubernetes 的 Spring Cloud Gateway 支援路由到使用任何語言編寫的服務,只要它們暴露 HTTP 端點即可。 提供了一個 Kubernetes 操作員,透過將定義的自定義資源應用到叢集來處理建立和配置閘道器例項。 您可以在 Kubernetes 平臺中動態配置生成的 SCG 例項,從而為持續整合 (CI) 和持續交付 (CD) 管道啟用 API 路由更新。 此外,Kubernetes 的 SCG 還提供商業 API 路由過濾器,用於單點登入 (SSO) 身份驗證、基於角色的訪問控制、範圍授權、授權令牌轉發、客戶端證書授權、速率限制和斷路器。 Kubernetes 平臺中的 SCG 例項以高可用性執行,並且可以調整記憶體和 vCPU 資源消耗的設定。

Kubernetes 的 Spring Cloud Gateway 易於安裝和使用。 在這篇部落格中,我將展示如何在本地開發環境中安裝 Kubernetes 的 SCG,並展示如何建立和配置具有路由的閘道器例項。 您需要同時安裝 DockerHelm 命令列介面 (CLI) 工具。 首先,讓我們從設定一個包含本地 Kubernetes 叢集的環境開始。 將叢集配置為具有本地 Docker 登錄檔和入口控制器也會有所幫助。 我們可以使用 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

這樣,您應該已經準備好包含小型叢集的本地開發環境以供使用。 現在我們可以看看如何部署 Kubernetes 的 SCG。 假設您擁有許可證和訪問許可權,您可以從 VMware Tanzu Network 下載 Kubernetes 的 SCG 的安裝程式。 我們將下載當前版本 (1.0.0) 的安裝程式並將其解壓到資料夾中。 您需要首先將 Kubernetes docker 映象的 Spring Cloud Gateway 分配到我們安裝在 localhost 埠 5000 的 docker 登錄檔。 從解壓後的資料夾中,執行位於 scripts 目錄中的映象重新定位指令碼。 此命令拉取、標記並將映象推送到 docker 登錄檔

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

透過執行以下指令碼完成安裝。 預設情況下,Kubernetes 操作員和後備應用程式的 Spring Cloud Gateway 部署在 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

此配置建立一個新的 Gateway 例項(預設情況下,Gateway 例項在當前名稱空間中建立)。 要新增路由並將路由對映到閘道器,我們需要建立一個 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。 您可以安裝一個入口控制器以從叢集外部訪問閘道器。 例如,您可以按如下方式安裝 nginx 入口控制器

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

然後,您可以建立一個入口以訪問閘道器。 下面建立的入口使用 /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:///gateway/github 透過配置的閘道器啟動 GitHub

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

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

瞭解更多

獲取支援

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

瞭解更多

即將舉行的活動

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

檢視全部