Я пытаюсь удаленно отлаживать приложение в подключенном режиме с хостом: 192.168.99.100
и портом 5005
, но он сообщает мне, что это unable to open the debugger port
. IP - 192.268.99.100
(кластер размещается локально через minikube).
Выход kubectl describe service catalogservice
Name: catalogservice
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=catalogservice
Type: NodePort
IP: 10.98.238.198
Port: web 31003/TCP
TargetPort: 8080/TCP
NodePort: web 31003/TCP
Endpoints: 172.17.0.6:8080
Port: debug 5005/TCP
TargetPort: 5005/TCP
NodePort: debug 32003/TCP
Endpoints: 172.17.0.6:5005
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
Это pods service.yml:
apiVersion: v1
kind: Service
metadata:
name: catalogservice
spec:
type: NodePort
selector:
app: catalogservice
ports:
- name: web
protocol: TCP
port: 31003
nodePort: 31003
targetPort: 8080
- name: debug
protocol: TCP
port: 5005
nodePort: 32003
targetPort: 5005
И вот здесь выставляю порт контейнеров
spec:
containers:
- name: catalogservice
image: elps/myimage
ports:
- containerPort: 8080
name: app
- containerPort: 5005
name: debug
Как я строю образ:
FROM openjdk:11
VOLUME /tmp
EXPOSE 8082
ADD /target/catalogservice-0.0.1-SNAPSHOT.jar catalogservice-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java", "-agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n", "-jar", "catalogservice-0.0.1-SNAPSHOT.jar"]
Когда я выполняю nmap -p 5005 192.168.99.100
, я получаю
PORT STATE SERVICE
5005/tcp closed avt-profile-2
Когда я выполняю nmap -p 32003 192.168.99.100
, я получаю
PORT STATE SERVICE
32003/tcp closed unknown
Когда я выполняю nmap -p 31003 192.168.99.100
, я получаю
PORT STATE SERVICE
31003/tcp open unknown
Когда я выполняю kubectl get services
, я получаю
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
catalogservice NodePort 10.108.195.102 <none> 31003:31003/TCP,5005:32003/TCP 14m
minikube service customerservice --url
возвращается
http://192.168.99.100:32004
В ямле, который вы сначала написали как:
- containerPort: 5050
name: debug
Должно быть:
- containerPort: 5005
name: debug
Вам также необходимо использовать внешний порт 32003
при настройке отладчика IntelliJ. С этими изменениями все должно работать.
Вы также можете подумать о том, как сделать его более гибким. В прошлом когда я сделал это я использовал другой форма для команды запуска докера, который позволяет вам включать и выключать удаленную отладку с помощью переменной среды REMOTE_DEBUG
, которая для вас будет:
CMD if [ "x$REMOTE_DEBUG" = "xfalse" ] ; then java $JAVA_OPTS -jar catalogservice-0.0.1-SNAPSHOT.jar ; else java $JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n -jar catalogservice-0.0.1-SNAPSHOT.jar ; fi
Вероятно, вы захотите использовать установить env var$JAVA_OPTS
, чтобы ограничить использование памяти jvm, чтобы избежать проблемы в k8s.
@elp Я думаю, вы пытаетесь подключить процесс отладчика не к тому порту. 5005
- это внутренний порт, но отладчик intelliJ должен подключаться к внешнему порту, то есть 32003
.
Я нанёс на карту 32003
, и он тоже закрыт: | Приложил дополнительную информацию выше. Я также попытался изменить порт в intellij 5005 -> 32003, но получил тот же результат.
Можете ли вы попробовать запустить только этот контейнер с docker run
и выставить порты (например, с -p
) и посмотреть, сможете ли вы таким образом удаленную отладку? Просто чтобы сузить круг вопросов, на каком уровне проблема.
Вы также можете попробовать переадресацию портов, как в blog.christianposta.com/kubernetes/…
Необходимо изменить множество заполнителей, установленных кластером, чтобы я мог сделать это позже. Portfowarding тоже не работает .. Я подключил вывод service description
выше, кстати, наверное что-то не так с моим ip?
Предположительно можно еще и localhost
попробовать?
Я уже пробовал, но в любом случае это не имело бы никакого смысла, поскольку кластер работает через minikube, что означает, что он работает на другом IP-адресе.
Вам необходимо разрешить агенту отладки принимать данные от любого хоста. Укажите адрес «address = *: 5005», иначе доступ будет разрешен только с 127.0.0.1. После того, как вы выполните эту настройку, попробуйте удаленно подключиться к модулю, используя указанный вами порт узла, который составляет 32003 от intellij.
В качестве альтернативы использованию NodePort
в Service
вы также можете использовать kubectl port-forward
для доступа к порту отладки в вашем Pod
.
kubectl port-forward
allows using resource name, such as a pod name, to select a matching pod to port forward to since Kubernetes v1.10.
Вам нужно открыть порт отладки в yaml развертывания для Pod
spec:
containers:
...
ports:
...
- containerPort: 5005
Затем получите имя своего модуля через
kubectl get pods
а затем добавьте переадресацию порта в этот под
kubectl port-forward podname 5005:5005
В IntelliJ вы сможете подключиться к
Хост: localhost
Порт: 5005
В качестве альтернативы вы можете использовать плагин Облачный код Intellij.
Кроме того, если вы используете Ткань8, он обеспечивает цель fabric8:debug
.
Плагин Cloud Code IntelliJ делает всю работу за меня. Не прекращена ли поддержка библиотеки Fabric8?
Ой! По-прежнему не работает, поэтому отредактировал правильный порт выше.