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.kubernetes.ac.cn/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

这样,您将能够使用 http://localhost/gateway/github 通过配置的网关启动 GitHub

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部