如何用Cloud Code和GoLand调试AKS集群Go应用且无需每次推送镜像
基于Cloud Code+GoLand的AKS Go应用免推送镜像远程调试方案
前置准备
- 本地已安装GoLand的Cloud Code插件、
kubectl、容器运行时(Docker/Containerd),已通过az aks get-credentials获取AKS集群操作权限,本地kubeconfig配置正常。 - Go项目根目录已生成
skaffold.yaml配置文件,没有的话可以直接执行skaffold init自动生成。
第一步:修改Skaffold配置关闭镜像推送
Cloud Code底层依赖Skaffold实现Kubernetes应用的构建、部署流程,默认会将构建的镜像推送至远程仓库,只需修改skaffold.yaml的build段配置即可关闭推送:
注意:请确保本地构建的镜像架构和AKS节点架构一致,避免出现镜像兼容问题
apiVersion: skaffold/v4beta1 kind: Config build: artifacts: - image: your-go-app-image # 替换为你的应用镜像名称 context: . docker: dockerfile: Dockerfile # 核心配置:禁用镜像推送 local: push: false useBuildkit: true deploy: kubectl: manifests: - k8s/*.yaml # 替换为你的K8s部署清单路径
第二步:编写带调试能力的Dockerfile
镜像需要内置Delve调试器,同时关闭Go编译器的代码优化和内联,保证调试断点正常生效:
# 构建阶段 FROM golang:1.21 as builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . # 关闭编译优化,适配调试场景 RUN CGO_ENABLED=0 go build -gcflags "all=-N -l" -o main . # 安装Delve调试器 RUN go install github.com/go-delve/delve/cmd/dlv@latest # 运行阶段 FROM alpine:3.18 WORKDIR /app COPY --from=builder /app/main . COPY --from=builder /go/bin/dlv /usr/local/bin/dlv # 暴露应用端口和调试端口 EXPOSE 8080 2345 # 用Delve启动应用 CMD ["dlv", "--listen=:2345", "--headless=true", "--api-version=2", "--accept-multiclient", "exec", "./main"]
第三步:调整K8s部署清单配置
部署配置需要开放调试端口,同时给容器开通ptrace权限保障Delve正常运行:
apiVersion: apps/v1 kind: Deployment metadata: name: go-app-debug spec: replicas: 1 selector: matchLabels: app: go-app template: metadata: labels: app: go-app spec: containers: - name: go-app image: your-go-app-image # 和Skaffold里配置的镜像名保持一致 ports: - containerPort: 8080 - containerPort: 2345 securityContext: capabilities: add: ["SYS_PTRACE"] # Delve调试必须的权限 --- apiVersion: v1 kind: Service metadata: name: go-app-service spec: type: ClusterIP selector: app: go-app ports: - name: app port: 8080 targetPort: 8080 - name: debug port: 2345 targetPort: 2345
第四步:启动调试
打开GoLand底部的Cloud Code面板,选择Debug on Kubernetes,Cloud Code会自动完成本地镜像构建、应用部署到AKS、调试端口转发全流程,整个过程不会将镜像推送至远程镜像仓库,等待调试会话启动完成即可直接在代码中下断点调试。
可选优化:开启代码热重载
修改代码后无需重新构建镜像,直接同步到运行的Pod中生效,只需在Skaffold的artifacts段添加同步配置即可:
build: artifacts: - image: your-go-app-image context: . docker: dockerfile: Dockerfile # 新增代码同步配置 sync: infer: - "**/*.go"
内容的提问来源于stack exchange,提问作者Lior Kesten
相关产品推荐
相关产品推荐

