goland遠(yuǎn)程調(diào)試k8s上容器的實(shí)現(xiàn)
上次也遇到過一次需要在k8s的容器里debug程序的情況,當(dāng)時(shí)找了個偷懶的辦法繞過去了,這回繞不過去了,老老實(shí)實(shí)整一把。主要還是用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)建完成后,點(diǎn)擊debug按鈕
到此這篇關(guān)于goland遠(yuǎn)程調(diào)試k8s上容器的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)goland遠(yuǎn)程調(diào)試k8s上容器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang實(shí)現(xiàn)微信公眾號后臺接入的示例代碼
這篇文章主要介紹了Golang實(shí)現(xiàn)微信公眾號后臺接入的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02Golang運(yùn)行報(bào)錯找不到包:package?xxx?is?not?in?GOROOT的解決過程
這篇文章主要給大家介紹了關(guān)于Golang運(yùn)行報(bào)錯找不到包:package?xxx?is?not?in?GOROOT的解決過程,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-07-07Go語言中http和mysql的實(shí)現(xiàn)代碼
本文通過實(shí)例代碼給大家介紹了Go語言中http和mysql的實(shí)現(xiàn)代碼,非常不錯,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-11-11Golang IPv4 字符串與整數(shù)互轉(zhuǎn)方式
這篇文章主要介紹了Golang IPv4 字符串與整數(shù)互轉(zhuǎn)方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11深入理解Golang?make和new的區(qū)別及實(shí)現(xiàn)原理
在Go語言中,有兩個比較雷同的內(nèi)置函數(shù),分別是new和make方法,二者都可以用來分配內(nèi)存,那他們有什么區(qū)別呢?下面我們就從底層來分析一下二者的不同。感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助2022-10-10詳解如何在golang項(xiàng)目開發(fā)中創(chuàng)建自己的Module
既然我們使用了很多開源的 module為我們的日常開發(fā)提供了很多的便捷性,那我們該如何實(shí)現(xiàn)自己的 module 來提供給團(tuán)隊(duì)中使用,接下小編就給大家介紹一下在golang項(xiàng)目開發(fā)如何創(chuàng)建自己的Module,需要的朋友可以參考下2023-09-09GoLang基礎(chǔ)學(xué)習(xí)之go?test測試
相信每位編程開發(fā)者們應(yīng)該都知道,Golang作為一門標(biāo)榜工程化的語言,提供了非常簡便、實(shí)用的編寫單元測試的能力,下面這篇文章主要給大家介紹了關(guān)于GoLang基礎(chǔ)學(xué)習(xí)之go?test測試的相關(guān)資料,需要的朋友可以參考下2022-08-08