51
  1. kubernetes我可以使用service. 这可以。
  2. 假设我有 1 个 Web 实例和 10 个 Java 服务器实例。
  3. 我有一个 Windows 网关,用于通过安装在其上的 jconsole 访问这 10 个 Java 服务器实例。
  4. 显然,我不会通过 kubernetes 服务公开所有应用程序的 jmx 端口。

我在这里有什么选择?我应该如何允许 kubernetes 集群 windows 网关外部访问这 10 个服务器 jmx 端口?这里有什么做法吗?

4

4 回答 4

129

另一种选择是使用kubectl port-forward将 JMX 端口从 K8 pod 转发到本地 PC 。

我这样做:

1)。将以下 JVM 选项添加到您的应用程序:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.port=1099
-Dcom.sun.management.jmxremote.rmi.port=1099
-Djava.rmi.server.hostname=127.0.0.1

这里的关键部分是:

  • 应将相同的端口用作“jmxremote.port”和“jmxremote.rmi.port”。这仅用于转发一个端口。

  • 127.0.0.1 应作为 rmi 服务器主机名传递。这是 JMX 连接通过端口转发工作所必需的。

2)。通过 kubectl 将 JMX 端口 (1099) 转发到本地 PC:

kubectl port-forward <your-app-pod> 1099

3)。打开与本地端口 1099 的 jconsole 连接:

jconsole 127.0.0.1:1099

这种方式可以通过 JMX 调试任何 Java pod,而无需通过 K8 服务公开暴露 JMX(从安全角度来看这更好)。

另一个可能有用的选项是将 Jolokia ( https://jolokia.org/ ) 代理附加到容器内的 Java 进程,以便它通过 HTTP 端口代理 JMX 并公开或端口转发此 HTTP 端口以查询 JMX通过 HTTP。

于 2016-10-07T23:44:32.493 回答
4

添加到https://stackoverflow.com/a/39927197/1387184,我想一次监控同一个 pod 的所有实例,因为我们将端口硬编码为 1099,这很困难,因为我只能将一个端口转发到一个带有该端口的吊舱。

我在运行 docker 时使用 Shell Script 动态分配 pod

Dockerfile CMD /run.sh

运行.sh

JMX_PORT=$(((RANDOM % 20)+1099))

echo "Running JMX on Port $JMX_PORT"

java ``eval echo $JAVA_OPTS`` ...

部署.yml env: - name: JAVA_OPTS value: "-Xms256m -Xmx6144m -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.port=$JMX_PORT -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT -Djava.rmi.server.hostname=127.0.0.1"

eval 会将 JMX_PORT 评估为 bash 值,每个 pod 在启动时可能会得到不同的 pod。我

于 2018-09-09T09:20:09.017 回答
3

我们按照以下方式做到了

  1. 为每个 pod 添加一个唯一的标签。例如:podid=asdw23443
  2. 使用 podid=asdw23443 的选择器创建一个新服务。确保在服务中通过 nodeport 或负载均衡器在 pod 上公开 jmx 端口。

如果您在服务中选择 nodeport,因为您正在执行 NAT 操作,您可能必须为需要通过 jconsole 连接的每个 jvm 提供以下 JVM 参数

-Djava.rmi.server.hostname=<your-ip-address>
于 2016-02-20T03:01:12.593 回答
1

我认为一种方法是使用唯一的字符串 \ id 为您的 pod 添加一个标签,例如 pod_name,并使用 Expose 命令创建一个具有此唯一 id\string 选择器的新服务。

kubectl label pods <podname> podname=<podname>
kubectl expose pod <podname> --port=9010 --name=<podname>_jmx
于 2016-02-19T10:29:01.500 回答