apiVersion: v1
kind: Service
metadata:
name: clustered-app
spec:
selector:
cluster: clustered-app
ports:
- name: jgroups
port: 7800
protocol: TCP
publishNotReadyAddresses: true
clusterIP: None
在 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:
headless-service.yml生效配置:
kubectl apply -f headless-service.yml
2. 部署 Frontend 网关服务
前端服务配置 JVM 参数以接入 Infinispan 集群:
-
vertx.jgroups.config: 指定为default-configs/default-jgroups-kubernetes.xml -
jgroups.dns.query: 指向我们刚才创建的无头服务 DNS 域名
frontend/deployment.ymlapiVersion: 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
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 架构下的自愈与高可用集群特性。