領先一步
VMware 提供培訓和認證,以加速您的進步。
瞭解更多開源專案 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,並展示如何建立和配置具有路由的閘道器例項。 您需要同時安裝 Docker 和 Helm 命令列介面 (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 使用路由配置閘道器。
例如,您可以建立一個名為 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。
以上說明的閘道器配置為路由到 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