日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

goland遠程調試k8s上容器的實現_Golang

作者:-_-void ? 更新時間: 2023-03-29 編程語言

上次也遇到過一次需要在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按鈕

原文鏈接:https://blog.csdn.net/xmh19936688/article/details/126650584

欄目分類
最近更新