回忆下k8s各种组织类型:
pod就是最基础的容器,负责运行服务
replicaSet是pod的组织形式,提供pod的副本管理能力
deployment基于replicaSet进行pod创建、更新、删除,是目前最主流的部署模式
这三个kind是服务部署的主要手段
还有一个kind是service,是ip代理,当声明Service的时候,会自动生成一个cluster IP,这个IP是虚拟IP。我们就可以通过这个IP来访问后端的Pod,参考k8s部分:
利用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端口了
评论区