web-dev-qa-db-ja.com

複数のアプリノードがKubernetesでjmxを公開する方法は?

  1. kubernetesでは、serviceでサービスを公開できます。これは大丈夫です。
  2. 1つのWebインスタンスと10のJavaサーバーインスタンスがあるとします。
  3. 私はそれらにインストールされたjconsoleを介してそれらの10 Javaサーバーインスタンスにアクセスするために使用されるWindowsゲートウェイを持っています。
  4. 明らかに、すべてのアプリのjmxポートをkubernetesサービス経由で公開しているわけではありません。

ここで私のオプションは何ですか?これらの10サーバーjmxポートへのkubernetesクラスタWindowsゲートウェイ外部へのアクセスをどのように許可する必要がありますか?ここに慣習はありますか?

29
Jas

別のオプションは、kubectl port-forwardを使用して、JMXポートをK8ポッドからローカル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」として使用する必要があります。これは、1つのポートのみを転送するために必要です。

  • 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

この方法により、K8サービスを介してJMXを公開することなく、JMXを介して任意のJava Podをデバッグできます(セキュリティの観点からは優れています)。

もう1つの便利なオプションは、Jolokia( https://jolokia.org/ )エージェントをコンテナ内のJavaプロセスに接続して、 JMX over HTTPポート。このHTTPポートを公開またはポートフォワードして、JMX over HTTPを照会します。

64
daniilyar

次のようにした

  1. 各ポッドに一意のラベルを追加します。例:podid = asdw23443
  2. Podid = asdw23443のセレクターで新しいサービスを作成します。サービスでは、nodeportまたはloadbalancerを介してポッドのjmxポートを公開するようにしてください。

サービスでnodeportを選択している場合、NAT操作を行うため、jconsoleを介して接続する必要がある各jvmに次のJVM引数を指定する必要がある場合があります。

-Djava.rmi.server.hostname=<your-ip-address>
2
Dimuthu

https://stackoverflow.com/a/39927197/1387184 に追加して、ポートを1099としてハードコーディングしているため、同じポッドのすべてのインスタンスを一度に監視したかったため、そのポートで1つのポッドに対して1つのポートフォワードのみを実行できます。

シェルスクリプトを使用して、Dockerの実行時にポッドを動的に割り当てました

Dockerfile _CMD /run.sh_

run.sh

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

_echo "Running JMX on Port $JMX_PORT"_

_Java ``eval echo $Java_OPTS`` ..._

deployment.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値に評価します。各ポッドは開始時に異なるポッドを取得する可能性があります。私

1
Humble

1つの方法は、pod_nameなどの一意の文字列\ idでポッドにラベルを追加し、exposeコマンドを使用してこの一意のid\stringのセレクタで新しいサービスを作成することだと思います。

kubectl label pods <podname> podname=<podname>
kubectl expose pod <podname> --port=9010 --name=<podname>_jmx
1
Liran Cohen