领先一步
VMware 提供培训和认证,助您加速进步。
了解更多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,并演示如何使用路由创建和配置网关实例。您需要安装 Docker 和 Helm 命令行界面 (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.kubernetes.ac.cn/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 则配置带有路由的网关。

例如,您可以创建一个名为 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。

上述说明的网关配置为路由到 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