kubernetes
では、service
でサービスを公開できます。これは大丈夫です。ここで私のオプションは何ですか?これらの10サーバーjmxポートへのkubernetesクラスタWindowsゲートウェイ外部へのアクセスをどのように許可する必要がありますか?ここに慣習はありますか?
別のオプションは、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を照会します。
次のようにした
サービスでnodeportを選択している場合、NAT操作を行うため、jconsoleを介して接続する必要がある各jvmに次のJVM引数を指定する必要がある場合があります。
-Djava.rmi.server.hostname=<your-ip-address>
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つの方法は、pod_nameなどの一意の文字列\ idでポッドにラベルを追加し、exposeコマンドを使用してこの一意のid\stringのセレクタで新しいサービスを作成することだと思います。
kubectl label pods <podname> podname=<podname>
kubectl expose pod <podname> --port=9010 --name=<podname>_jmx