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.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 则配置带有路由的网关。

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 社区所有即将举行的活动。

查看所有