goland遠(yuǎn)程調(diào)試k8s上容器的實現(xiàn)
上次也遇到過一次需要在k8s的容器里debug程序的情況,當(dāng)時找了個偷懶的辦法繞過去了,這回繞不過去了,老老實實整一把。主要還是用dlv配合goland的遠(yuǎn)程調(diào)試功能。
選node并同步代碼
- 可以用kubectl top node查看資源使用情況,選一個相對清閑的node,記住這個主機(jī)名nodeName
- 可以用scp或者goland的同步功能(最好是直接在node上git clone便于分辨臟文件)將本地代碼傳到node上的某個路徑下,記錄這個代碼路徑codePath
- 用這個nodeName和codePath創(chuàng)建deployment
準(zhǔn)備debug鏡像
- 在node上創(chuàng)建一個空文件夾(空文件夾編譯更快)
- 保存如下內(nèi)容到fileName
- 執(zhí)行
docker build -f fileName -t image:tag .
# 選用go1.19的alpine版本 FROM golang:1.19-alpine # 設(shè)置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
創(chuàng)建deployment
用上面的nodeName codePath image:tag替換yaml中的變量
執(zhí)行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
創(chuàng)建svc
遠(yuǎn)程調(diào)試需要網(wǎng)絡(luò)通信,創(chuàng)建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遠(yuǎn)程啟動dlv
- 執(zhí)行kubectl exec進(jìn)入容器
- 執(zhí)行dlv debug --headless --listen=:2345 --api-version=2 --accept-multiclient ./your_package,等待輸出API server listening at: [::]:2345
- 在goland創(chuàng)建GoRemote啟動,ip為nodeIP,端口為32345
- 創(chuàng)建完成后,點擊debug按鈕
到此這篇關(guān)于goland遠(yuǎn)程調(diào)試k8s上容器的實現(xiàn)的文章就介紹到這了,更多相關(guān)goland遠(yuǎn)程調(diào)試k8s上容器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
快速掌握Go 語言 HTTP 標(biāo)準(zhǔn)庫的實現(xiàn)方法
基于HTTP構(gòu)建的服務(wù)標(biāo)準(zhǔn)模型包括兩個端,客戶端(Client)和服務(wù)端(Server),這篇文章主要介紹了Go 語言HTTP標(biāo)準(zhǔn)庫的實現(xiàn)方法,需要的朋友可以參考下2022-07-07
簡單聊聊Go語言中空結(jié)構(gòu)體和空字符串的特殊之處
在日常的編程過程中,大家應(yīng)該經(jīng)常能遇到各種”空“吧,比如空指針、空結(jié)構(gòu)體、空字符串等,本文就以?Go?語言為例,一起來看看空結(jié)構(gòu)體和空字符串在?Go?語言中的特殊之處吧2024-03-03
Go在GoLand中引用github.com中的第三方包具體步驟
這篇文章主要給大家介紹了關(guān)于Go在GoLand中引用github.com中第三方包的具體步驟,文中通過圖文介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Go具有一定的參考價值,需要的朋友可以參考下2024-01-01
Skywalking-go自動監(jiān)控增強(qiáng)使用探究
這篇文章主要介紹了Skywalking-go自動監(jiān)控增強(qiáng)使用深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01

