适用于 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 实例,以启用 API 路由更新以进行持续集成 (CI) 和持续交付 (CD) 管道。此外,适用于 Kubernetes 的 SCG 提供用于单点登录 (SSO) 身份验证、基于角色的访问控制、范围授权、授权令牌中继、客户端证书授权、速率限制和断路器的商业 API 路由过滤器。Kubernetes 平台中的 SCG 实例以高可用性运行,并具有可调整的内存和 vCPU 资源消耗设置。

适用于 Kubernetes 的 Spring Cloud Gateway 易于安装和使用。在本博文中,我将展示如何在本地开发环境中安装适用于 Kubernetes 的 SCG,以及如何创建和配置具有路由的网关实例。您需要安装 DockerHelm 命令行界面 (CLI) 工具。首先,让我们从设置具有本地 Kubernetes 集群的环境开始。将集群配置为具有本地 Docker 注册表和入口控制器也将很有帮助。我们可以使用 KinD 创建本地集群。您可以从 这里安装 KinD。首先,我们使用“registry”docker 镜像启动一个本地注册表(名为myregistry),端口为 5000,如下所示

$ 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 的 Spring Cloud Gateway docker 镜像分配到我们在本地主机端口 5000 上安装的 docker 注册表。从解压缩的文件夹中,运行位于scripts目录中的镜像重新定位脚本。此命令会将镜像拉取、标记并推送到 docker 注册表

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

通过运行以下脚本完成安装。默认情况下,Spring Cloud Gateway for Kubernetes 运算符和后端应用程序部署在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

此配置创建一个新的网关实例(默认情况下,网关实例在当前命名空间中创建)。要添加路由并将路由映射到网关,我们需要创建一个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作为内部 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://127.0.0.1/gateway/github启动 GitHub

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

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

了解更多

获取支持

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

了解更多

即将举行的活动

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

查看全部