Статьи

Удаленная отладка Java для приложений, работающих в Kubernetes

Kubernetes 1.2 был только что выпущен и быстро становится решением для управления кластерами defacto для контейнеров (Docker, Rocket, Hyper и т. Д.). Проверьте это, если вы еще этого не сделали — вот несколько интересных моментов о выпуске 1.2: kubernetes-логотип

  • Кластер теперь может масштабироваться до 30 000 контейнеров на кластер
  • Грамотное отключение узлов, переход на другие работающие узлы в кластере
  • Пользовательские метрики как основа для автоматического масштабирования
  • Динамическое управление конфигурацией

Когда вы разрабатываете микросервисы на своем локальном ноутбуке, вы можете использовать что-то вроде Kubernetes для локального запуска ваших док-контейнеров и получения сходства между разработчиками / QA / production и тем, как вы развертываете свои приложения. Например, вы получаете изоляцию процесса, изоляцию пространства порта, сеть / хранилище и т. Д., Чтобы на локальном ноутбуке разработчика не возникало проблем.

Одна вещь для разработчиков Java, которая подходит, состоит в том, как вы просматриваете журналы, делаете удаленную отладку и выполняете трассировку стека.

Вот несколько советов:

Хвостовые журналы для вашего стручка

В некоторых системах управления кластером вы должны в основном искать локальный IP-адрес вашего приложения (если он выполняется в контейнере), каким-то образом подключаться к нему по ssh, а затем находить журнал и подключать его. С Kubernetes вам не нужно ничего этого делать. Независимо от того, на какой машине вы работаете (т. Е. Где вы запускаете клиент kubernetes), вы можете сделать следующее:

Список стручков в вашем кластере

1
2
3
4
ceposta@postamac(~) $ kubectl get pod
NAME                        READY     STATUS    RESTARTS   AGE
broker-amq-1-hjbeh          1/1       Running   1          15h
file-ingress-events-3artj   1/1       Running   1          13h

Хвост журналы

Теперь выберите модуль, с которого хотите передавать логи, и начинайте!

1
ceposta@postamac(~) $ kubectl logs -f file-ingress-events-3artj

Подключитесь через Shell, если необходимо

Если по какой-то причине вам необходимо войти в модуль (покопаться в файловой системе, поискать другие файлы конфигурации и т. Д.):

1
ceposta@postamac(~) $ kubectl exec -it file-ingress-events-3artj bash

JVM Remote отлаживает ваше приложение

Это становится действительно удобным, чтобы точно увидеть, что происходит в вашем приложении. Чтобы сделать это, вы на самом деле не делаете ничего, отличного от того, что вы делаете сегодня. Когда вы загружаете свою JVM, у вас должен быть способ включить отладку JVM. Например, для плагина HawtApp Maven, который представляет собой простой плагин mvn, который назначает Java Main в качестве исполняемого файла, и простой, гибкий загрузочный скрипт bin/run.sh (или пакетный файл для окон), который позволяет вам контролировать путь к классам и отладку с помощью переменные среды

Загрузочное Java-приложение для предоставления удаленного порта отладки.

Пример:

1
2
3
4
# Set debug options if required
if [ x"${JAVA_ENABLE_DEBUG}" != x ] && [ "${JAVA_ENABLE_DEBUG}" != "false" ]; then
    java_debug_args="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=${JAVA_DEBUG_PORT:-5005}"
fi

Определите порт отладки в контейнере Docker через манифест kubernetes

Теперь вам нужно предоставить порт 5005 (в этом примере) в ваших контейнерах Docker через файл манифеста Kubernetes (json / yaml):

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
spec:
        containers:
        - args: []
          command: []
          env:
          - name: "JAVA_ENABLE_DEBUG"
            value: "true"
          - name: "OUTGOING_FILE_PATH"
            value: "/deployments/camel/outgoing"
          - name: "INCOMING_FILE_PATH"
            value: "/deployments/camel/incoming"
          - name: "KUBERNETES_NAMESPACE"
            valueFrom:
              fieldRef:
                fieldPath: "metadata.namespace"
          image: "fabric8/file-ingress-events:1.0-SNAPSHOT"
          name: "file-ingress-events"
          ports:
          - containerPort: 5005
            name: "jvm-debug"
          - containerPort: 8778
            name: "jolokia"

Обратите внимание, мы также добавили переменную env в файл манифеста kubernetes, чтобы иметь возможность контролировать, хотим ли мы удаленную отладку или нет (true / false). Сценарии начальной загрузки (выше) проверят эту переменную env, и вы можете управлять ею через манифест kube (теперь с ConfigMap в Kube 1.2 или шаблонами OpenShift ).

Последний шаг — это прокси порт отладки на вашем локальном компьютере. Если вы запускаете клиент kubectl локально, это легко:

Список стручков в вашем кластере

1
2
3
4
ceposta@postamac(~) $ kubectl get pod
NAME                        READY     STATUS    RESTARTS   AGE
broker-amq-1-hjbeh          1/1       Running   1          15h
file-ingress-events-3artj   1/1       Running   1          13h

Прокси-модуль для определенного порта

1
ceposta@postamac(~) $ kubectl port-forward file-ingress-events-3artj  5005:5005

Вышеприведенное будет перенаправлять порт из вашей локальной среды (5005) на порт модуля 5005. Теперь вы можете просто подключить удаленный отладчик к localhost:5005 .

Надеюсь, это поможет вам отладить ваши Java-приложения!