企业级网关 Kong 部署 Spring Boot 项目实战

2023-05-16

企业级网关 Kong 部署 Spring Boot 项目实战

1、概述

在本教程中,我们将演示使用 Kong Ingress Controller (KIC) 在 Kubernetes 上部署 Spring Boot 应用程序。通过为应用程序实现一个简单的速率限制器来演示 KIC 的高级使用,而无需任何编码。

2. 改进的安全和访问控制

现代应用程序部署,尤其是 API,需要应对许多挑战,例如:隐私法(例如 GPDR)、安全问题 (DDOS) 和使用跟踪(例如 API 配额和速率限制)。在这种情况下,现代应用程序和 API 需要额外的保护级别来应对这些挑战,例如防火墙、反向代理、速率限制器等。

尽管 K8s 环境保护应用程序免受其中许多威胁,但我们仍然需要采取一些措施来进一步确保应用程序安全。这些措施之一是部署入口控制器并设置其对应用程序的访问规则。

Ingress 是一个对象,它通过向部署的应用程序公开 HTTP / HTTPS 路由并强制执行访问规则来管理对 K8s 集群及其上部署的应用程序的外部访问。为了暴露应用程序以允许外部访问,我们需要定义入口规则并使用入口控制器,它是一个专门的反向代理和负载平衡器。通常,ingress controller 由第三方公司提供,功能各不相同,例如:本文使用的 Kong Ingress Controller

https://docs.konghq.com/kubernetes-ingress-controller/latest/

3.搭建环境

为了演示 Kong Ingress Controller (KIC) 与 Spring Boot 应用程序的结合使用,需要访问 K8s 集群,因此可以使用 minikube 创建一个示例 K8s 集群。启动 K8s 环境后,需要在集群上部署 Kong Ingress Controller 。

https://docs.konghq.com/kubernetes-ingress-controller/2.7.x/guides/getting-started/

Kong 公开了一个外部 IP,需要使用它来访问应用程序,因此最好使用该地址创建一个环境变量:

export PROXY_IP=$(minikube service -n kong kong-proxy --url | head -1)

如果 Kong Ingress Controller 已安装,我们就可以通过访问该PROXY_IP来测试它是否正在运行:

curl -i $PROXY_IP

响应应该是 404 错误,这是正常的,因为我们还没有部署任何应用程序,所以应该说没有与之匹配的路由。现在是时候创建一个示例应用程序了,为了将我们的应用程序部署到 K8s,我们需要创建容器镜像,我们可以使用 Docker 来做到这一点。所以需要提前安装 docker。

4. 创建示例 Spring Boot 应用程序

现在我们需要一个 Spring Boot 应用程序并将其部署到 K8s 集群。要生成具有至少一个公开 Web 资源的简单 HTTP 服务器应用程序,我们可以这样做:

curl https://start.spring.io/starter.tgz -d dependencies=webflux,actuator -d type=maven-project | tar -xzvf -

一件重要的事情是选择默认的 Java 版本。如果我们需要使用旧版本,则需要执行javaVersion属性:

curl https://start.spring.io/starter.tgz -d dependencies=webflux,actuator -d type=maven-project -d javaVersion=11 | tar -xzvf -

在这个示例应用程序中,我们选择了 webflux,它使用 Spring WebFlux 和 Netty 生成一个响应式 Web 应用程序。

https://www.baeldung.com/spring-webflux

以及添加了另一个重要的依赖项:actuator

https://www.baeldung.com/spring-boot-actuators

这是一个 Spring 应用的监控工具,已经暴露了一些 web 资源,这正是我们需要用 Kong 测试的。这样,应用程序已经公开了可以使用的 Web API。现在开始构建它:

./mvnw install

生成的 jar 是可执行的,因此可以通过运行它来测试应用程序:

java -jar target/*.jar

要测试应用程序,需要打开另一个终端并键入以下命令:

curl -i http://localhost:8080/actuator/health

响应必须是执行器提供的应用程序的健康状态:

HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 15

{"status":"UP"}

5. 从应用生成容器镜像

将应用程序部署到 Kubernetes 集群的过程涉及创建容器映像并将其部署到集群可访问的存储库。我们通常会将镜像推送到 DockerHub 或自己私有容器镜像注册中心。但是,由于我们正在使用 Minikube,让我们将 Docker 客户端环境变量指向 Minikube 的 Docker:

$(minikube docker-env)

现在可以构建应用程序镜像:

./mvnw spring-boot:build-image

6. 部署应用

现在是时候在 K8s 集群上部署应用程序了。我们需要创建一些 K8s 对象来部署和测试应用程序,所有需要的文件都可以在演示的存储库中找到:

  • 具有容器规范的应用程序的 deployment 对象
  • 为 Pod 分配 cluster IP 地址的 service 定义
  • 在 routes 中使用 Kong 的代理 IP 地址的 ingress 规则

部署对象只是创建运行我们的镜像所必需的 pod,这是创建它的 YAML 文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: demo
  name: demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: demo
    spec:
      containers:
      - image: docker.io/library/demo:0.0.1-SNAPSHOT
        name: demo
        resources: {}
        imagePullPolicy: Never

status: {}

我们指向在 Minikube 中创建的镜像,获取其全名。请注意,有必要将imagePullPolicy 属性指定为Never ,因为我们没有使用镜像注册服务器,因此不希望 K8s 尝试下载镜像,而是使用其内部 Docker 存档中已有的镜像。可以使用kubectl部署它:

kubectl apply -f serviceDeployment.yaml

如果部署成功,可以看到消息:

deployment.apps/demo created

为了让应用程序有一个统一的 IP 地址,需要创建一个服务,为它分配一个内部集群范围的 IP 地址,这是创建它的 YAML 文件:

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: demo
  name: demo
spec:
  ports:
  - name: 8080-8080
    port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: demo
  type: ClusterIP
status:
  loadBalancer: {}

可以使用kubectl部署它:

kubectl apply -f clusterIp.yaml

为了能够被外部访问(在 K8s 集群之外),需要创建一个 ingress 规则,在我们的例子中,将它指向路径/actuator/health和端口 8080:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo
spec:
  ingressClassName: kong
  rules:
  - http:
      paths:
      - path: /actuator/health
        pathType: ImplementationSpecific
        backend:
          service:
            name: demo
            port:
              number: 8080

使用kubectl部署它:

kubectl apply -f ingress-rule.yaml

现在可以使用 Kong 的代理 IP 地址进行外部访问:

$ curl -i $PROXY_IP/actuator/health
HTTP/1.1 200 OK
Content-Type: application/vnd.spring-boot.actuator.v3+json
Content-Length: 49
Connection: keep-alive
X-Kong-Upstream-Latency: 325
X-Kong-Proxy-Latency: 1
Via: kong/3.0.0

7. 演示速率限制器

我们设法在 Kubernetes 上部署了一个 Spring Boot 应用程序,并使用 Kong Ingress Controller 提供对它的访问。但 KIC 的功能远不止于此:身份验证、负载均衡、监控、速率限制和其他功能。为了展示 Kong 的真正力量,我们将对应用程序实施一个简单的速率限制器,限制每分钟只能访问五个请求。为此,需要 在 K8s 集群中创建一个名为KongClusterPlugin的对象。使用以下 YAML 文件执行:

apiVersion: configuration.konghq.com/v1
kind: KongClusterPlugin
metadata:
  name: global-rate-limit
  annotations:
    kubernetes.io/ingress.class: kong
  labels:
    global: true
config:
  minute: 5
  policy: local
plugin: rate-limiting

插件配置允许我们为应用程序指定额外的访问规则,将对它的访问限制为每分钟五个请求。们应用此配置并测试结果:

kubectl apply -f rate-limiter.yaml

为了测试它,可以在一分钟内重复之前使用的 CURL 命令五次以上,会得到一个 429 错误:

curl -i $PROXY_IP/actuator/health
HTTP/1.1 429 Too Many Requests
Date: Sun, 06 Nov 2022 19:33:36 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
RateLimit-Reset: 24
Retry-After: 24
X-RateLimit-Remaining-Minute: 0
X-RateLimit-Limit-Minute: 5
RateLimit-Remaining: 0
RateLimit-Limit: 5
Content-Length: 41
X-Kong-Response-Latency: 0
Server: kong/3.0.0

{
  "message":"API rate limit exceeded"
}

可以看到响应 HTTP 标头通知客户端有关速率限制。

8.清理资源

为了清理演示,需要按 LIFO 顺序删除所有对象:

kubectl delete -f rate-limiter.yaml
kubectl delete -f ingress-rule.yaml
kubectl delete -f clusterIp.yaml
kubectl delete -f serviceDeployment.yaml

并停止 Minikube 集群:

minikube stop

九、结论

在本文中,我们演示了使用 Kong Ingress Controller 来管理对部署在 K8s 集群上的 Spring Boot 应用程序的访问。

用到的示例文件,可以 在 GitHub 上找到源代码。

https://github.com/eugenp/tutorials/tree/master/kubernetes-modules/kubernetes-spring

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

企业级网关 Kong 部署 Spring Boot 项目实战 的相关文章

随机推荐

  • 安卓不透明度和透明度

    安卓不透明度和透明度 xff1a 不透明度透明度16进制100 0 FF99 1 FC98 2 FA97 3 F796 4 F595 5 F294 6 F093 7 ED92 8 EB91 9 E890 10 E689 11 E388 12
  • Centos7安装PHP

    阿里云官方镜像站 xff1a 阿里巴巴开源镜像站 OPSX镜像站 阿里云开发者社区 我们在系统安装软件时都会遇到各种小问题 xff0c 那么如何才能提高我们在云服务器上的软件安装效率呢 xff1f 接下来就为大家详细介绍下如何在 CentO
  • Canny边缘检测

    Canny边缘检测 1 使用高斯滤波器 xff0c 以平滑图像 xff0c 滤除噪声 2 计算图像中每个像素点的梯度强度和方向 3 应用非极大值 xff08 Non Maximum Suppression xff09 抑制 xff0c 以消
  • MBus协议详解(一)

    看了许多关于MBus协议的资料 xff0c 感觉说的不具体 不完整 也不系统 xff0c 本人准备结合一个具体的产品实现 xff0c 从理论和实现上对MBus协议做一个详细的论述 xff0c 如有不当之处 xff0c 欢迎讨论 1 介绍 M
  • 机器学习期末复习题题库-单项选择题

    1 属于监督学习 的机器学习算法是 xff1a 贝叶斯分类器 2 属于无监督学习 的机器学习算法是 xff1a 层次聚类 3 二项式 分布的共轭分布是 xff1a Beta分布 4 多项式 分布的共轭分布是 xff1a Dirichlet分
  • Linux中查看磁盘大小、文件大小、排序方法小结

    一 xff0c 查看磁盘空间大小的命令 xff1a df df命令用于查看磁盘分区上的磁盘空间 xff0c 包括使用了多少 xff0c 还剩多少 xff0c 默认单位是KB 比如以下命令 xff1a df hl 执行结果如下 xff1a 执
  • 【Mac M1】安装stable diffusion webui教程及问题集锦

    这里写自定义目录标题 我的配置MacBookPro 14 M1安装视频教程可参考如下链接 xff1a 主播讲的挺清楚安装步骤 xff1a 第一步 xff1a 安装homebrew第二步 xff1a 安装pytorch第三步 xff1a 安装
  • cmake找不到trigger_msgsConfig.cmake 解决办法

    在编译FLIR相机驱动时遇到 百度无人记录此问题 xff0c 特此记录解决办法 sudo apt install ros melodic image transport
  • PX4源码开发人员文档(一)——软件架构

    软件架构 PX4 在广播消息网络内 xff0c 按照一组节点 xff08 nodes xff09 的形式进行组织 xff0c 网络之间使用像如 姿态 和 位置 之类的语义通道来传递系统状态 软件的堆栈结构主要分为四层 应用程序接口 提供给
  • PX4(PIXHAWK)源码开发人员文档(二)——Hello Sky

    前提 用UART1连接PX4FMU和计算机 安装PX4Toolchain 注册Github账户 Step 1 准备源码文件 为了方便管理代码 xff0c 可以使用GIT 版本控制系统 xff0c 在 GitHub上 fork和更新源码 不注
  • PX4(PIXHAWK)源码开发人员文档(二)——Hello Sky(续)

    Step 5 订阅传感器数据 为了做有用的事情 xff0c 应用需要订阅subscribe输入并发布publish输出 e g 电机 或伺服指令 PX4平台真正的硬件抽象 xff08 true hardware abstraction xf
  • PX4(PIXHAWK)源码开发人员文档(三)——进程间通讯的开发者指南

    进程 应用之间的通信 xff08 例如将传感器应用的传感器数据发送到姿态滤波应用 xff09 是 PX4 软件架构的关键部分 进程 xff08 通常又被叫做节点 xff08 node xff09 xff09 通过命名为总线 xff08 bu
  • Ubuntu21.10配置Docker CE 镜像

    Docker CE 是免费的 Docker 产品的新名称 xff0c Docker CE 包含了完整的 Docker 平台 xff0c 非常适合开发人员和运维团队构建容器 APP 参考阿里云官方镜像站 xff1a 阿里巴巴开源镜像站 OPS
  • PX4源码开发人员文档(四)——创建后台程序(应用)

    在 Unix 和其他多任务计算机操作系统中 xff0c 后台程序是指 xff0c 作为后台进程运行的计算机 xff0c 而不是由交互用户直接控制 后台程序概念的主要好处是 xff0c 后台程序可以直接启动 xff0c 而不需要将其发送到精确
  • PHP获取今天、本周、今年开始时间戳

    PHP获取今天 本周 今年开始时间戳 注 xff1a 以下代码在php8 0上测试通过 xff0c 其它版本的php理论上也是可行的 span class token delimiter important lt php span span
  • 搬砖过程中常用的英文单词(代码命名规则)

    注册register用户名 用户userName user密码password pwd路径path成绩score服务器host图片img字符串str数字num
  • CAN 邮箱的理解

    对于CAN邮箱的理解 xff1a CAN总线有接收邮箱和发送邮箱 xff1a 发送邮箱 是用于CAN总线数据发送的 xff0c 总共有3个 xff0c 并且存在优先级关系 优先级越高表示其里面的数据会被优先发送 数据在发送前都会被送到优先级
  • 变量名前为什么要加_下划线

    简单来说 xff0c 含有两个下划线和下划线 43 大写字母开头的标识符是给编译器和标准库用的 xff0c 你不能用 xff0c 否则后果自负 一个下划线开头的随便用 xff0c 只要你不嫌麻烦 而我们一般在前面加 表示私有变量 一般来说
  • 23 张图细讲使用 Devtron 简化 K8S 中应用开发

    23 张图细讲使用 Devtron 简化 K8S 中应用开发 在本文中 xff0c 您将学习如何在多集群环境中使用 Devtron 在 K8S 上进行应用开发 https devtron ai Devtron 附带用于构建 部署和管理微服务
  • 企业级网关 Kong 部署 Spring Boot 项目实战

    企业级网关 Kong 部署 Spring Boot 项目实战 1 概述 在本教程中 xff0c 我们将演示使用 Kong Ingress Controller KIC 在 Kubernetes 上部署 Spring Boot 应用程序 通过