提问人:guettli 提问时间:4/19/2023 更新时间:4/19/2023 访问量:420
Dev Containers:附加到正在运行的容器...到 minikube/kind 中的容器
Dev Containers: Attach to Running Containers ... to Container in minikube/kind
问:
我运行一个本地 Kubernetes 类型的集群。
如果我使用“Dev Containers: Attach to Running Containers ...”,那么我只看到集群 (foo-control-plane) 类型的控制平面容器。
但是我没有看到控制平面内的容器(pod)。
有没有办法通过开发容器连接到本地 minikube/kind 集群中的容器?
我的目标是使用 Delve 调试 Go 应用程序
答:
由于你的目标是使用 Delve(远程)调试 Go 应用程序,因此我认为你应该参考如何使用 Delve 进行远程调试? 和 使用 Go 扩展进行调试。
下面的大多数指南都是从这些文档中复制的。
在容器中启动 Delve 的无头实例,如下所示:
dlv attach --headless --listen :4040 [pid] [/path/to/executable]
注意:在 pod 中运行此命令时遇到错误:.为了亲自尝试该解决方案,我创建了一个 docker 映像来直接启动 Delve 服务器,如下所示(请参阅附件部分):
Could not attach to pid 1: this could be caused by a kernel security setting, try writing "0" to /proc/sys/kernel/yama/ptrace_scope
Dockerfile
CMD ["/app/dlv", "exec", "/app/goapp", "--listen=:4040", "--headless=true", "--api-version=2", "--log"]
转发端口以使调试服务器可从外部使用:
kubectl port-forward [pod name] 4040
在 vscode 中,创建文件:
.vscode/launch.json
{ "version": "0.2.0", "configurations": [ { "name": "Connect to pod", "type": "go", "request": "attach", "mode": "remote", "host": "localhost", "port": 4040, "debugAdapter": "dlv-dap", "substitutePath": [{ "from": "${workspaceFolder}", "to": "/app" }] } ] }
正确设置非常重要,这样才能在 vscode 中查看源代码。由于我的演示应用程序的源代码是复制到那里并从那里构建的(使用 docker 构建),因此二进制文件中记录的路径是 ,所以我必须从 映射到 。
substitutePath
/app
/app/main.go
${workspaceFolder}
/app
在 vscode 中,使用此配置开始调试。
附件
main.go
:package main import "net/http" func main() { _ = http.ListenAndServe(":8080", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { _, _ = w.Write([]byte("hello world!")) })) }
Dockerfile
:# syntax=docker/dockerfile:1 # =============== build stage =============== FROM golang:1.18.4-alpine3.16 AS build WORKDIR /app RUN go install github.com/go-delve/delve/cmd/dlv@latest COPY . ./ RUN go build -o goapp -v main.go # =============== final stage =============== FROM alpine:3.16.1 AS final WORKDIR /app COPY --from=build /app/goapp ./ COPY --from=build /go/bin/dlv ./ CMD ["/app/dlv", "exec", "/app/goapp", "--listen=:4040", "--headless=true", "--api-version=2", "--log"]
- 从此文件构建映像:.
docker build -t goapp:1.0 -f Dockerfile .
- 将图像加载到 kind 节点中(是的,我正在使用 kind 进行测试):。
kind load docker-image goapp:1.0
- 从此文件构建映像:.
goapp.yaml
:apiVersion: v1 kind: Pod metadata: name: goapp labels: app: goapp spec: containers: - name: goapp image: goapp:1.0 imagePullPolicy: Never ports: - containerPort: 8080 - containerPort: 4040
- 创建由以下文件定义的 pod:。
kubectl apply -f goapp.yaml
- 创建由以下文件定义的 pod:。
评论
Dev Container
有没有办法通过开发容器连接到本地 minikube/kind 集群中的容器?
关于这个问题,请参见 Attach to a container in a Kubernetes cluster:
若要附加到 Kubernetes 群集中的容器,请先安装 Kubernetes 扩展和 Dev Containers 扩展。然后,从 Activity bar 中选择 Kubernetes 资源管理器,并展开要附加到的容器所在的集群和 Pod。最后,右键单击容器,然后从上下文菜单中选择“附加 Visual Studio Code”。
kubectl
评论