当前位置: 首页 > news >正文

goland远程调试k8s上容器

goland远程调试k8s上容器

上次也遇到过一次需要在k8s的容器里debug程序的情况,当时找了个偷懒的办法绕过去了,
这回绕不过去了,老老实实整一把。主要还是用dlv配合goland的远程调试功能。

选node并同步代码

  • 可以用kubectl top node查看资源使用情况,选一个相对清闲的node,记住这个主机名nodeName
  • 可以用scp或者goland的同步功能(最好是直接在node上git clone便于分辨脏文件)将本地代码传到node上的某个路径下,记录这个代码路径codePath
  • 用这个nodeName和codePath创建deployment

准备debug镜像

  • 在node上创建一个空文件夹(空文件夹编译更快)
  • 保存如下内容到fileName
  • 执行docker build -f fileName -t image:tag .
# 选用go1.19的alpine版本
FROM golang:1.19-alpine
# 设置go代理并下载dlv源码并编译安装
RUN go env -w GOPROXY="https://goproxy.cn,direct" && go mod download github.com/go-delve/delve@v1.9.1
WORKDIR /go/pkg/mod/github.com/go-delve/delve@v1.9.1/
RUN go mod tidy 
RUN go mod vendor
RUN go install ./cmd/dlv/
# 替换源并下载gcc,非必须,看编译是否依赖
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk --no-cache add gcc 
WORKDIR /go

创建deployment

  • 用上面的nodeName codePath image:tag替换yaml中的变量
  • 执行kubectl apply -f deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: go-env
  name: go-env
spec:
  selector:
    matchLabels:
      k8s-app: go-env
  template:
    metadata:
      creationTimestamp: null
      labels:
        k8s-app: go-env
    spec:
      containers:
      - image: ${ImageTag}
        imagePullPolicy: IfNotPresent
        name: go-env
        stdin: true
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        tty: true
        volumeMounts:
        - mountPath: /go/src/code
          name: code
      dnsPolicy: ClusterFirst
      nodeName: ${NodeName} # node name
      restartPolicy: Always
      schedulerName: default-scheduler
      volumes:
      - hostPath:
          path: ${CodePath} # /path/to/code
          type: Directory
        name: code

创建svc

  • 远程调试需要网络通信,创建svc将deploy的2345暴露到node的32345上
apiVersion: v1
kind: Service
metadata:
  name: go-env
spec:
  externalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - nodePort: 32345
    port: 2345
    protocol: TCP
    targetPort: 2345
  selector:
    k8s-app: go-env
  sessionAffinity: None
  type: NodePort

远程启动dlv

  • 执行kubectl exec进入容器
  • 执行dlv debug --headless --listen=:2345 --api-version=2 --accept-multiclient ./your_package,等待输出API server listening at: [::]:2345
  • 在goland创建GoRemote启动,ip为nodeIP,端口为32345
  • 创建完成后,点击debug按钮
  • enjoy

相关文章:

  • Spring IoC、容器初始化、对象
  • java中的集合框架基础-5
  • Python连接Mongodb数据库-PyMongo模块
  • 三、OO三大特性
  • SpringBoot导出Jar包并测试(使用IDEA)
  • 用Windows性能监视器测试分析网站运行状况
  • 3.【异步通信框架】RabbitMQ
  • C++学习(四八七)android studio println的输出位置
  • PCL 生成空间圆点云
  • [JS真好玩] 掘金创作者必备: 监控每天是谁取关了你?
  • Nginx服务之Rewrite
  • 【一起学Rust | 进阶篇 | reqwest库】纯 Rust 编写的 HTTP 客户端——reqwest
  • 数据库技术基础--基本概念
  • [springboot专栏]文件本地上传与提供访问服务
  • 基于AI算法的数据库异常监测系统的设计与实现
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • ECMAScript入门(七)--Module语法
  • JavaScript类型识别
  • javascript数组去重/查找/插入/删除
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • SQL 难点解决:记录的引用
  • ubuntu 下nginx安装 并支持https协议
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 我的面试准备过程--容器(更新中)
  • 项目管理碎碎念系列之一:干系人管理
  • 异常机制详解
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 如何正确理解,内页权重高于首页?
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • (1)(1.13) SiK无线电高级配置(六)
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (排序详解之 堆排序)
  • (四)汇编语言——简单程序
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)visual stdio 书签功能介绍
  • .Family_物联网
  • .java 9 找不到符号_java找不到符号
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .net解析传过来的xml_DOM4J解析XML文件
  • .Net中的集合
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • ??javascript里的变量问题
  • @Controller和@RestController的区别?
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [Asp.net mvc]国际化
  • [C++]18:set和map的使用
  • [CentOs7]搭建ftp服务器(2)——添加用户