Kubernetes上で立ち上げられたJMX Server（SpringBoot）に接続する時のTips

## はじめに
今回は、Kubernetes上で立ち上げられたJMX Server（SpringBoot）にJconsole等で接続する時のTipsをまとめていきたいと思います。また、本記事は、JMXカスタムメトリクスの取得する時のTipsも記載していきたいと思います。
※なお、カスタムメトリクスの設定方法には触れていません。
## 実行環境と構成図
### 実行環境と利用しているツール類
#### ツール類
* Kubernetes環境
  - EKS
* JMX 監視ツール
  - Jconsole

### 今回の構成
今回は、Kubernetes上に立てられたJMX ServerにPort forwardを使ってローカルマシン上からJconsoleを使って接続することとします。
![空白の図 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567360/3c6bd99b-5808-917e-85e9-bcf7a9bb8215.png)


## 事前に設定していたもの
```Dockerfile:Dockerfile(sample-spring-boot)
FROM openjdk:8-jdk-oraclelinux8
COPY ./SpringBoot_App_folder /
CMD ["./apply.sh", "SpringBoot_app.jar"]
```
```bash:apply.sh
#!/bin/sh
java \
  -Dcom.sun.management.jmxremote \
  -Dcom.sun.management.jmxremote.authenticate=false \
  -Dcom.sun.management.jmxremote.ssl=false \
  -Dcom.sun.management.jmxremote.rmi.port=8086 \
  -Dcom.sun.management.jmxremote.port=8086 \
  -jar ${1}
```
```yaml:deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
      - name: sample-spring-boot
        image: sample-spring-boot:latest
```
<b>※重要なところのみを切り出しています。
また、imageはDockerfileをBuildして作っています。</b>
### 動作結果
```terminal:実行例
$kubectl port-forward pods/sample-spring-boot-{任意の文字列} 8086:8086
```
![スクリーンショット 2022-08-28 21.19.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567360/93b1e051-c540-73bf-4d6b-de6cba5af689.png)
この設定ではpodに対してPort forwardをし、ローカルマシン上でJMX Serverに接続することができませんでした。
## ローカルマシンからVMX serverに接続するためのTips
```diff_shell:apply.sh
#!/bin/sh
java \
  -Dcom.sun.management.jmxremote \
  -Dcom.sun.management.jmxremote.authenticate=false \
  -Dcom.sun.management.jmxremote.ssl=false \
  -Dcom.sun.management.jmxremote.rmi.port=8086 \
  -Dcom.sun.management.jmxremote.port=8086 \
+ -Djava.rmi.server.hostname=127.0.0.1 \
  -jar ${1}
```

:::note info
* Port-forwardをするためには、`-Djava.rmi.server.hostname`に`127.0.0.1`を設定する必要があります。
* ref: https://iceburn.medium.com/how-to-expose-jmx-in-kubernetes-b1faad450451
:::

### 動作確認
![スクリーンショット 2022-08-28 22.30.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567360/707888e9-e253-04b9-4e95-a930634176ef.png)

JMX Serverに接続することはできました。
## カスタムメトリクスを取得するためのTips
```diff_shell:apply.sh
#!/bin/sh
java \
+ -Dspring.jmx.enabled=true \
  -Dcom.sun.management.jmxremote \
  -Dcom.sun.management.jmxremote.authenticate=false \
  -Dcom.sun.management.jmxremote.ssl=false \
  -Dcom.sun.management.jmxremote.rmi.port=8086 \
  -Dcom.sun.management.jmxremote.port=8086 \
  -Djava.rmi.server.hostname=127.0.0.1 \
  -jar ${1}
```
:::note info
Java Management Extensions（JMX）は、アプリケーションを監視および管理するための標準メカニズムを提供します。デフォルトでは、この機能は有効になっていません。spring.jmx.enabled 設定プロパティを true に設定することでオンにできます。

ref: https://spring.pleiades.io/spring-boot/docs/current/reference/html/actuator.html#actuator.jmx
:::

## 動作確認
![スクリーンショット 2022-08-28 23.13.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567360/a69a7b8f-e002-00b7-9748-66efaa92fae0.png)
これで、カスタムメトリクスの<b>Bean</b>を見つけることができました。

## まとめ
今回は、Kubernetes上で立ち上げられたJMX Server（SpringBoot）にport forwardで接続する時のTipsとJMXカスタムメトリクスの取得する時のTipsについてまとめてみました。もし、この記事を読んでいる方が同じ問題に詰まった時の助けになれば幸いです。