使用intellij的kubernetes中的远程调试容器

elp*_*elp 6 intellij-idea docker kubernetes

我尝试使用host:192.168.99.100和port 在附加模式下远程调试应用程序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>
Run Code Online (Sandbox Code Playgroud)

这是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
Run Code Online (Sandbox Code Playgroud)

在这里,我暴露了容器端口

spec:
  containers:
  - name: catalogservice
    image: elps/myimage
    ports:
    - containerPort: 8080
      name: app
    - containerPort: 5005
      name: debug
Run Code Online (Sandbox Code Playgroud)

我建立影像的方式:

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"]
Run Code Online (Sandbox Code Playgroud)

当我执行时,nmap -p 5005 192.168.99.100我收到

PORT     STATE  SERVICE
5005/tcp closed avt-profile-2
Run Code Online (Sandbox Code Playgroud)

当我执行时,nmap -p 32003 192.168.99.100我收到

PORT     STATE  SERVICE
32003/tcp closed unknown
Run Code Online (Sandbox Code Playgroud)

当我执行时,nmap -p 31003 192.168.99.100我收到

PORT     STATE  SERVICE
31003/tcp open unknown
Run Code Online (Sandbox Code Playgroud)

当我执行时,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
Run Code Online (Sandbox Code Playgroud)

minikube service customerservice --url 退货

http://192.168.99.100:32004
Run Code Online (Sandbox Code Playgroud)

Laz*_*ass 6

作为NodePort在 a 中使用 a 的替代方法,Service您还可以使用它kubectl port-forward来访问Pod.

kubectl port-forward 自 Kubernetes v1.10 起,允许使用资源名称(例如 pod 名称)来选择要转发到的匹配 pod。

您需要在部署 yaml 中为 Pod 公开调试端口

spec:
  containers:
    ...
    ports:
      ...
      - containerPort: 5005
Run Code Online (Sandbox Code Playgroud)

然后通过以下方式获取您的 Pod 的名称

kubectl get pods
Run Code Online (Sandbox Code Playgroud)

然后向该 Pod 添加端口转发

kubectl port-forward podname 5005:5005
Run Code Online (Sandbox Code Playgroud)

在 IntelliJ 中,您将能够连接到

主持人: localhost

港口: 5005


Rya*_*son 0

您首先发布的 yaml 中有一个错误:

    - containerPort: 5050
      name: debug
Run Code Online (Sandbox Code Playgroud)

应该:

    - containerPort: 5005
      name: debug
Run Code Online (Sandbox Code Playgroud)

32003配置 IntelliJ 调试器时还需要​​使用外部端口。通过这些更改,它应该可以工作。

您可能还想考虑如何使其更加灵活。过去,当我完成此操作时,我对 docker start 命令使用了不同的形式,该命令允许您通过名为 的环境变量打开和关闭远程调试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

您可能会发现需要设置环境变量 $JAVA_OPTS来限制 jvm 内存使用,以避免k8s 中出现问题

  • 您需要允许调试代理接受来自任何主机的请求。指定地址为“address=*:5005”,否则只允许127.0.0.1访问。完成此设置后,请尝试使用您指定的节点端口(来自 intellij 的 32003)远程连接到 pod。 (3认同)