需求
示意图
如何debug k8s环境的pod?
思路
1、开启远程jvm调试端口
2、将端口映射到公网(或公司内网)
3、使用远程工具连接
断点中,怎么不阻塞别人测试?
思路
1、新增pod节点
2、修改pod节点label,使其偏离正常路由
3、使用该节点调试
能用于线上吗?
影响点
1、扩容pod时,新增的pod实例初始化阶段路由到该节点的请求会拒绝服务
2、修改路由是,会新增pod实例,出现1中的问题
k8s开启远程调试端口
操作步骤
修改JVM
kubectl edit cm $CM_NAME -n $NAMESPACE
JVM_OPTS: 后面添加 -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=82
参数说明
$CM_NAME:要连接的deployment的jvm_options所在配置的configmap的名称(name)
$NAMESPACE:命名空间
注意:-Xrunjdwp这一句加在哪里,根据dockerfile 中的java -***** 会有差异
扩容(扩容后的实例才能使用远程调试)
kubectl scale --replicas=$REPLICAS_NUM deployment/$DEPLOYMENT_NAME -n $NAMESPACE
参数说明
$REPLICAS_NUM:扩容前的数量+1
$NAMESPACE:命名空间
移出正常访问路由
kubectl label pods $DEPLOYMENT_NAME app.kubernetes.io/instance=$INSTANCE_LABEL --overwrite -n $NAMESPACE
参数说明
$INSTANCE_LABEL :随便什么,不要和svc中的 svc 配置文件中的selector: 下的配置一致皆可
$NAMESPACE:命名空间
原理:修改labels,使要用的pod的label不被svc选中
缩容回去
例 kubectl scale --replicas=1 deploy/****-brood -n ****
开公网映射端口
kubectl expose pod $DEPLOYMENT_NAME -n $NAMESPACE --port $OUT_PORT --target-port=$DEPLOYMENT_PORT --external-ip=$EXTERNAL_IP --name=$SVC_NAME
参数说明
$OUT_PORT :暴露到公网的端口
$DEPLOYMENT_PORT :deployment的pod容器端口
$EXTERNAL_IP :暴露到公网的ip,k8s集群的任意一个节点ip
$SVC_NA:起个名字,建议使用debug-人名
81端口映射服务,82端口映射断点
配置远程调试工具(idea的remote插件)
填入$EXTERNAL_IP 和$OUT_POR 并保存运行
访问断点
调试完毕,关闭资源
关闭pod
关闭svc
关闭jvmx端口
网友评论