首页 > 解决方案 > 在 Kubernetes 上运行的 Spring Boot 应用程序上为 Kafka Streams 远程交互式查询动态配置 application.server 参数的想法

问题描述

我正在 Kubernetes 上部署一个 Kafka Streams 应用程序,复制为多个 pod。这个 pod 被暴露为 Kubernetes 服务,所以我有一个公共入口点来负载平衡流量:myapp:8080

关键是我想运行一个可能是远程的交互式查询,所以我根据文档进行了设置

Web 层由运行在端口 8080 上的 Spring Boot 应用程序提供。

我的问题是如何application.server使用每个 pod 的唯一端点动态配置参数。

更新:

我想我需要的是application.server使用分配给每个 pod 的 kubernetes 端点的值来配置:

$>kubectl get ep
NAME                    ENDPOINTS                       AGE
myapp   10.8.2.85:8080,10.8.2.88:8080   10d

但是打印System.getEnv()应用程序我只有 kubernetes 服务的 ip 和端口,而不是分配的 pod 端点:

MYAPP_SERVICE_PORT=8080
MYAPP_SERVICE_HOST=10.11.248.5
...

那么如何获取 pod 的 kubernetes 端点呢?

标签: kubernetesapache-kafkaapache-kafka-streams

解决方案


通过以这种方式将其添加为环境变量,我已经能够获取每个 pod 的端点 ip:

Kubernetes部署:

spec:
  ...
  template:
    spec:
      containers:
        - env:
          - name: POD_IP
            valueFrom:
              fieldRef:
                fieldPath: status.podIP
          ...

现在我可以访问 pod ip/port 并将其分配给application.server应用程序的每个实例中的参数:

private final Environment environment;

@Autowired
public SomeController(Environment environment) {
    this.environment = environment;
}

...
props.put(StreamsConfig.APPLICATION_SERVER_CONFIG, System.getEnv("POD_IP") + ":" + environment.getProperty("local.server.port"));

推荐阅读