部署运维与容错韧性

在 Kubernetes 上基于 Infinispan 构建 Vert.x 集群

本指南将向你展示如何在 Kubernetes 集群环境中,利用 Infinispan 集群管理器搭建拓扑感知、自动发现与跨 Pod 分布式 Event Bus 通信的高可用 Vert.x 微服务集群。

你将构建什么

你将构建一套包含 frontend(前端网关)和 backend(后端计算)的双层微服务集群。 前端接收 HTTP 请求后,通过分布式 Event Bus 将任务透明负载分发给多个后端 Pod,并感知后端各个实例节点的自愈状态。

前置要求

  • 文本编辑器或 IDE

  • Java 11 或更高版本

  • Maven 或 Gradle

  • Minikube 或可用的 Kubernetes 集群环境

  • kubectl 命令行工具

构建与容器化

在 Kubernetes 环境下,由于多播(Multicast)网络通常被云厂商禁用,Infinispan 会配置为借助 Kubernetes 的 Headless Service(无头服务) 实现节点间的 DNS 自动发现。

1. 部署 Headless Service 发现服务

定义 clustered-app 无头服务,自动聚合所有带有 cluster:clustered-app 标签的 Pod:

YAML headless-service.yml
apiVersion: v1
kind: Service
metadata:
  name: clustered-app
spec:
  selector:
    cluster: clustered-app
  ports:
    - name: jgroups
      port: 7800
      protocol: TCP
  publishNotReadyAddresses: true
  clusterIP: None

生效配置:

kubectl apply -f headless-service.yml

2. 部署 Frontend 网关服务

前端服务配置 JVM 参数以接入 Infinispan 集群:

  • vertx.jgroups.config: 指定为 default-configs/default-jgroups-kubernetes.xml

  • jgroups.dns.query: 指向我们刚才创建的无头服务 DNS 域名

YAML frontend/deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend-deployment
  labels:
    app: frontend
spec:
  replicas: 2
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
        cluster: clustered-app
    spec:
      containers:
        - name: frontend
          image: clustering-kubernetes/frontend:latest
          imagePullPolicy: IfNotPresent
          env:
            - name: JAVA_TOOL_OPTIONS
              value: "-Djava.net.preferIPv4Stack=true -Dvertx.jgroups.config=default-configs/default-jgroups-kubernetes.xml -Djgroups.dns.query=clustered-app.default.svc.cluster.local"
            - name: HTTP_PORT
              value: "8080"
          ports:
            - containerPort: 8080
            - containerPort: 7800
          livenessProbe:
            httpGet:
              path: /health
              port: 8080
            failureThreshold: 1
            periodSeconds: 10
          readinessProbe:
            httpGet:
              path: /readiness
              port: 8080
            initialDelaySeconds: 5
            periodSeconds: 5
          startupProbe:
            httpGet:
              path: /readiness
              port: 8080
            failureThreshold: 30
            periodSeconds: 10

部署前端与负载均衡 Service:

kubectl apply -f frontend/deployment.yml
kubectl apply -f frontend/service.yml

3. 部署 Backend 分布式计算服务

启动 3 个副本的后端集群节点:

kubectl apply -f backend/deployment.yml

4. 远程调用验证

向前端发送 HTTP 请求:

http <FRONTEND_IP>/hello name=="Vert.x Clustering"

返回结果将输出:

HTTP/1.1 200 OK
content-length: 64

Hello Vert.x Clustering from backend-deployment-74d7f45c67-6r2g2

当你持续发起请求时,你会看到各个后端 Pod 的名称以 轮询(Round-Robin) 方式交替出现。这证明跨 Pod 的 Event Bus 分布式通信与透明负载均衡已成功建立!

本文总结

  • 掌握了在 Kubernetes 环境下配置 Infinispan Headless DNS 自动服务发现;

  • 使用 Jib 实现了微服务的无 Dockerfile 快速容器化打包;

  • 验证了 Vert.x 分布式事件总线在多 Pod 架构下的自愈与高可用集群特性。