Dev Containers:附加到正在运行的容器...到 minikube/kind 中的容器

Dev Containers: Attach to Running Containers ... to Container in minikube/kind

提问人:guettli 提问时间:4/19/2023 更新时间:4/19/2023 访问量:420

问:

我运行一个本地 Kubernetes 类型的集群。

如果我使用“Dev Containers: Attach to Running Containers ...”,那么我只看到集群 (foo-control-plane) 类型的控制平面容器。

但是我没有看到控制平面内的容器(pod)。

有没有办法通过开发容器连接到本地 minikube/kind 集群中的容器?

我的目标是使用 Delve 调试 Go 应用程序

转到 kubernetes visual-studio-code vscode-devcontainer delve

评论

1赞 Veera Nagireddy 4/19/2023
请参阅设置 VS Code 开发容器 - minikube 讨论在使用 minikube 时运行开发容器,这可能有助于解决问题。

答:

0赞 Zeke Lu 4/19/2023 #1

由于你的目标是使用 Delve(远程)调试 Go 应用程序,因此我认为你应该参考如何使用 Delve 进行远程调试?使用 Go 扩展进行调试

下面的大多数指南都是从这些文档中复制的。

  1. 在容器中启动 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_scopeDockerfile

    CMD ["/app/dlv", "exec", "/app/goapp", "--listen=:4040", "--headless=true", "--api-version=2", "--log"]
    
  2. 转发端口以使调试服务器可从外部使用:

    kubectl port-forward [pod name] 4040
    
  3. 在 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

  4. 在 vscode 中,使用此配置开始调试。

    vscode debugging

附件

  1. 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!"))
        }))
    }
    
  2. 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
  3. 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

评论

0赞 guettli 4/20/2023
谢谢你的回答。以这种方式调试 Go 代码可以正常工作。虽然这个问题是关于通过开发容器连接的。
1赞 Zeke Lu 4/20/2023
看看我的另一个答案。这个答案有点长,所以我把这部分分成了另一个答案。据我所知(虽然不是到目前为止),用于在容器中进行开发,而不是用于调试该容器中的应用程序。这就是我写这个答案的原因。Dev Container
0赞 Zeke Lu 4/19/2023 #2

有没有办法通过开发容器连接到本地 minikube/kind 集群中的容器?

关于这个问题,请参见 Attach to a container in a Kubernetes cluster

若要附加到 Kubernetes 群集中的容器,请先安装 Kubernetes 扩展和 Dev Containers 扩展。然后,从 Activity bar 中选择 Kubernetes 资源管理器,并展开要附加到的容器所在的集群和 Pod。最后,右键单击容器,然后从上下文菜单中选择“附加 Visual Studio Code”。kubectl

[Attach to Kubernetes Container]