Kubernetes 1.2 был только что выпущен и быстро становится решением для управления кластерами defacto для контейнеров (Docker, Rocket, Hyper и т. Д.). Проверьте это, если вы еще этого не сделали — вот несколько интересных моментов о выпуске 1.2:
- Кластер теперь может масштабироваться до 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-приложения!
Ссылка: | Удаленная отладка Java для приложений, запущенных в Кубернетес от нашего партнера по JCG Кристиана Поста в блоге |