[JAVA] VisualVM (connexion JMX) avec Kubernetes

introduction

Cette fois, je vais utiliser VisualVM pour me connecter à une application Java exécutée sur k8s. Je pense qu'il sera utilisé lors de la surveillance et de l'analyse des applications Java. Puisqu'il s'agit d'un conteneur, je pense qu'il est courant de collecter des métriques avec Prometheus, mais cette fois j'utiliserai l'outil fourni par Java car c'est un outil familier aux développeurs Java.

Informations environnementales

Kubernetes:1.18 helm:v3.2 ※https://helm.sh/docs/intro/quickstart/ Java:1.8 Jenkins:2.235

Préparation des conteneurs Jenkins

Déployez le conteneur Jenkins avec helm.

Tout d'abord, créez un fichier de paramètres pour le déploiement.

Adresse IP du nœud de travail


$ kubectl get nodes --namespace jenkins -o jsonpath="{.items[0].status.addresses[0].address}"

values.yaml


master:
  serviceType: NodePort
  javaOpts: >
    -Djava.rmi.server.hostname=0.0.0.0
    -Dcom.sun.management.jmxremote=true
    -Dcom.sun.management.jmxremote.port=32000
    -Dcom.Sun.management.jmxremote.local.only=false
    -Dcom.sun.management.jmxremote.rmi.port=32000
    -Dcom.sun.management.jmxremote.ssl=false
    -Dcom.sun.management.jmxremote.authenticate=false
    -Djava.rmi.server.hostname=192.168.10.51
  jmxPort: 32000

Créez également un fichier yaml qui définit le service pour l'accès JMX.

svc.yaml


apiVersion: v1
kind: Service
metadata:
  name: jenkins-jmx
  namespace: jenkins
spec:
  ports:
  - name: jmx
    nodePort: 32000
    port: 32000
    protocol: TCP
    targetPort: 32000
  selector:
    app.kubernetes.io/component: jenkins-master
    app.kubernetes.io/instance: jenkins
  type: NodePort

Déployez immédiatement.

deploy_jenkins


#Créer un espace de noms Jenkins
$ kc create ns jenkins

#paramètres de connexion k8s(context)Vérification
$ kc config current-context
sandbox

#paramètres de connexion k8s(context)Paramètre d'espace de noms
$ kc config set-context sandbox --namespace jenkins

#k8s Confirmation de l'espace de noms de destination de connexion
$ kc config get-contexts
CURRENT   NAME                CLUSTER             AUTHINFO   NAMESPACE
*         sandbox             sandbox             sandbox    jenkins

#Dépôt Helm ajouté / informations sur le référentiel mises à jour
$ helm repo add stable https://kubernetes-charts.storage.googleapis.com
"stable" has been added to your repositories

$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "stable" chart repository
Update Complete. ? Happy Helming!?

#Déploiement de conteneurs Jenkins
# helm install <Nom de la version> <Nom du graphique> -f <parameter file> --namespace <Espace de noms de destination de déploiement>
#Nom de la version: nom administratif de Helm pour le déploiement
#Nom du graphique: nom du modèle à utiliser
$ helm install jenkins stable/jenkins -f values.yaml --namespace jenkins
NAME: jenkins
LAST DEPLOYED: Sat Jul 25 hh:mm:ss 2020
NAMESPACE: jenkins
STATUS: deployed
REVISION: 1
NOTES:
1. Get your 'admin' user password by running:
  printf $(kubectl get secret --namespace jenkins jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo
2. Get the Jenkins URL to visit by running these commands in the same shell:
  export NODE_PORT=$(kubectl get --namespace jenkins -o jsonpath="{.spec.ports[0].nodePort}" services jenkins)
  export NODE_IP=$(kubectl get nodes --namespace jenkins -o jsonpath="{.items[0].status.addresses[0].address}")
  echo http://$NODE_IP:$NODE_PORT/login

3. Login with the password from step 1 and the username: admin
・ ・ ・

#Confirmer le déploiement
$ helm list
NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART         APP VERSION
jenkins jenkins         1               2020-MM-DD hh:mm:ss.950509962 +0900 JST deployed        jenkins-2.4.1 lts

Le conteneur créé par helm n'a pas de définition de Service pour se connecter à JMX, alors déployez le Service séparément.

deploy_service


$ kubectl get svc
NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
jenkins         NodePort    10.43.173.89   <none>        8080:31036/TCP   12m
jenkins-agent   ClusterIP   10.43.130.60   <none>        50000/TCP        12m

$ kubectl apply -f svc.yaml
service/jenkins-jmx created

# kubectl get svc
NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)           AGE
jenkins         NodePort    10.43.173.89   <none>        8080:31036/TCP    12m
jenkins-agent   ClusterIP   10.43.130.60   <none>        50000/TCP         12m
jenkins-jmx     NodePort    10.43.97.82    <none>        32000:32000/TCP   19s

Connectez-vous avec Java Visual VM

Maintenant, établissez une connexion JMX au conteneur Jenkins lancé. Lançons Java VisualVM et connectons-nous au conteneur Jenkins. Il est également inclus dans le JDK, etc., mais cette fois, je vais me connecter avec le Java VisualVM 1.8 fourni avec des pléiades (le tout dans une éclipse). https://mergedoc.osdn.jp/

image.png

  1. Cliquez avec le bouton droit de la souris sur "Remote" dans le menu de gauche ⇒ Cliquez sur "Add Remote Host"
  2. Entrez le nom d'hôte (adresse IP) spécifié dans javaOpts dans "Nom d'hôte" et cliquez sur "OK".
  3. Confirmez que la machine distante est ajoutée au menu de gauche
  4. Cliquez avec le bouton droit de la souris sur la machine enregistrée dans le menu de gauche ⇒ cliquez sur "Ajouter une connexion JMX"
  5. Le nom d'hôte étant entré dans "Connect", entrez le numéro de port (32000 dans ce cas) après le: (deux-points).
  6. Cochez "Ne pas utiliser de connexion SSL" et cliquez sur "OK"
  7. Confirmez que la connexion est ajoutée sous la machine distante enregistrée dans le menu de gauche.
  8. Double-cliquez sur la connexion ajoutée et confirmez que les informations s'affichent sur l'écran principal.

** Écran après connexion **

image.png

** Onglet Surveillance **

image.png

** Onglet de fil **

image.png

En prime, quand j'essaye de me connecter avec jconsole, ça ressemble à ça.

image.png

Résumé

Cette fois, j'ai essayé de me connecter à un conteneur fonctionnant sur k8s avec VisualVM ou jconsole. Je n'ai pas pu me connecter en ouvrant un port commun, j'ai donc ajouté ce qui suit et l'ai défini.

--Ajoutez le nom d'hôte aux options de démarrage java (javaOpts) et définissez l'adresse IP du nœud Worker --Définissez la même valeur pour le port connecté par jmx et le port ouvert par Nodeport.

Veuillez l'utiliser comme référence lorsque vous vous connectez à un outil familier au lieu de Prometheus.

Recommended Posts

VisualVM (connexion JMX) avec Kubernetes
[Template] Connexion MySQL avec Java
Essayez la connexion DB avec Java
[PDO → Connexion DB avec docker, PHP]
Connexion JDBC avec MySQL 8.x * Notes *