目 录CONTENT

文章目录

【实践】利用k8s service创建remote调试

FatFish1
2025-04-21 / 0 评论 / 0 点赞 / 3 阅读 / 0 字 / 正在检测是否收录...

回忆下k8s各种组织类型:

  • pod就是最基础的容器,负责运行服务

  • replicaSet是pod的组织形式,提供pod的副本管理能力

  • deployment基于replicaSet进行pod创建、更新、删除,是目前最主流的部署模式

这三个kind是服务部署的主要手段

还有一个kind是service,是ip代理,当声明Service的时候,会自动生成一个cluster IP,这个IP是虚拟IP。我们就可以通过这个IP来访问后端的Pod,参考k8s部分

http://www.chymfatfish.cn/archives/kubernetes#service

利用service访问pod的能力,我们可以开放一个remote debug的端口,用于远程访问部署在k8s容器中的java服务,yaml结构如下:

apiVersion: v1
kind: Service
metadata:
  name: myService
  namespace: service
spec:
  ports:
  - name: tomcat-debug
    port: 8446
    protocol: TCP
    targetPort: 8446
  - name: tomcat-http
    port: 8443
    protocol: TCP
    targetPort: 8443
  selector:
    app: myService
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}

还记得service的组成,简单来说就是一个ip+一个lable selector

看上面的案例,这个lable selector指向命名为myService的pod,并且开放了两个访问端口:8443和8446

这个service一旦部署,就会自动获得一个虚拟的clusterIP,即通过该IP:8443或IP:8446就能访问到该pod的8443或8446端口

此外,还需要通过一个java选项开启对应端口的remote调试能力,只需要在启动脚本中增加如下java选项即可:

/JAVA_OPTS="-/a\JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=0.0.0.0:8446,server=y,suspend=n"

其中需要注意的有两点:

  • suspend=n代表不远程连接,tomcat可以正常启动;如果改为suspend=y,就必须要连接才能启动

  • address=0.0.0.0:8446是jdk17后必要的格式,jdk8之前可以之间使用address=8446

配置好java选项和service后,就可以使用k8s指令查看到这个生效的service

使用kubectl -n service get pods -o wide | grep myService 可以先查到pod对应的访问ip

myService-6f58f49f96-wwqs2                    3/3       Running            0          4h        172.16.3.76    172.20.18.195

即172.20.18.195

然后使用kubectl -n service get svc | grep myService

myservice                      NodePort       10.247.44.234    <none>          12580:31227/TCP,8446:31545/TCP                  2y

可以看到对应service生成的8446的访问端口映射在31545端口上,即使用172.20.18.195:31545即可访问到该pod的debug端口了

0

评论区