tutorial tag images hub example dockers docker kubernetes kubernetes-service

tag - dockers images



¿Múltiples nodos de aplicaciones como exponer jmx en kubernetes? (4)

  1. En kubernetes puedo exponer servicios con service . Esto esta bien.
  2. Digamos que tengo 1 instancia web y 10 instancias de servidor java.
  3. Tengo una puerta de enlace de Windows que estoy acostumbrada a acceder a esas 10 instancias de servidores java a través del jconsole instalado en él.
  4. Obviamente no expongo todas las aplicaciones del puerto jmx a través del servicio kubernetes.

¿Cuáles son mis opciones aquí? ¿Cómo debo permitir que este acceso externo a la puerta de enlace de Windows del clúster kubernetes a esos 10 servidores jmx ports? ¿Alguna práctica aquí?


Agregando a https://.com/a/39927197/1387184 , quería monitorear todas las instancias del mismo pod a la vez, ya que estamos codificando el puerto como 1099, fue difícil ya que solo puedo hacer un portforward a uno vaina con ese puerto.

Usé Shell Script para asignar dinámicamente el pod al ejecutar la ventana acoplable

Dockerfile CMD /run.sh

run.sh

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

echo "Running JMX on Port $JMX_PORT"

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

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"

La evaluación evaluará el JMX_PORT para golpear el valor, cada vez que comience, cada pod tendrá un pod diferente. yo


Creo que una forma es agregar una etiqueta a su pod con una cadena / id única, por ejemplo, pod_name y usar el comando expose para crear un nuevo servicio con el selector de esta id / string única.

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


Lo hicimos de la siguiente manera.

  1. Agrega una etiqueta única para cada pod. ej: podid = asdw23443
  2. Crea un nuevo servicio con selector de podid = asdw23443. Asegúrese de que en el servicio exponga los puertos jmx en el pod a través de nodeport o loadbalancer.

Si está seleccionando nodeport in service, debido a que está realizando una operación de NAT, es posible que deba proporcionar el siguiente argumento de JVM para cada jvm que necesita para conectarse a través de jconsole

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


Otra opción es reenviar el puerto JMX desde el pod K8 a su PC local con kubectl port-forward .

Lo hago así:

1). Agregue las siguientes opciones de JVM a su aplicación:

-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

La parte crítica aquí es que:

  • El mismo puerto se debe usar como ''jmxremote.port'' y ''jmxremote.rmi.port''. Esto es necesario para reenviar un solo puerto.

  • 127.0.0.1 se debe pasar como nombre de host del servidor rmi. Esto es necesario para que la conexión JMX funcione a través del reenvío de puertos.

2). Reenvíe el puerto JMX (1099) a su PC local a través de kubectl:

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

3). Abra la conexión jconsole a su puerto local 1099:

jconsole 127.0.0.1:1099

De esta manera, es posible depurar cualquier pod de Java a través de JMX sin tener que exponer públicamente JMX a través del servicio K8 (que es mejor desde la perspectiva de seguridad).

Otra opción que también puede ser útil es adjuntar el agente de Jolokia ( https://jolokia.org/ ) al proceso de Java dentro del contenedor, de manera que proxiese el puerto JMX a través de HTTP y exponga o reenvíe este puerto HTTP para consultar JMX sobre HTTP.