yangxt65535

Devcontainer 开发指南

工具安装

使用VSCode

安装远程开发扩展

  • 使用VSCode,安装Remote-sshDevContainers扩展

    image

    image

  • 在左侧远程菜单中,点击加号添加 k8s 集群所在的远程节点,按提示完成 SSH 登录

    image

安装K8s扩展

  • 在远程节点上安装Kubernetes扩展

    image

  • 点击K8s标签,点击clusters菜单中的Set Kubeconfig。选择默认/root/.kube/config或输入自定义kubeconfig文件路径。确认后,k8s插件能够获取当前集群的资源信息

    image

    image

开发容器准备

根据需要开发的项目的工作负载配置,编写开发用的资源配置。主要流程在于:

  • 编写开发Pod(必须是Pod),保持环境变量、挂载卷、权限等配置不变,修改开发镜像、命令,并挂载代码、开发环境等
  • 使用原有的Service、ConfigMap、ServiceAccount等配套资源。

以某后端服务为例,以下是一个开发用 Pod。和原 Deployment 配置相比:

  • 删除 securityContext 权限限制,便于开发
  • 新增了 app-dev 标签,用于后续从对应 Service 分流
  • 修改容器镜像为 golang 开发镜像,并修改命令为 tail -f /dev/null 使 Pod 常驻
  • 沿用原有环境变量、端口、挂载卷、服务账号
  • 新增 hostPath 挂载卷:
    • code:远程主机上的源码路径;
    • go-path:远程主机上的 Golang 路径,执行 go env GOPATH 获取;
  • 设置 nodeName 为当前远程节点名称,确保 Pod 与源码在同一节点(hostPath 挂载要求)
  • 这里额外将源码挂载路径设置为 workingDir,便于进入容器后开发。
app-dev.yaml
apiVersion: v1
kind: Pod
metadata:
  name: app-dev
  namespace: example-system
  labels:
    app: app-dev
spec:
  serviceAccountName: app
  containers:
    - name: app
      image: golang:1.24.5
      imagePullPolicy: IfNotPresent
      command: ["tail"]
      args: ["-f", "/dev/null"]
      workingDir: /app
      env:
        - name: OAUTH_CLIENT_ID
          valueFrom:
            secretKeyRef:
              key: client-id
              name: app-oauth-client
        - name: OAUTH_CLIENT_SECRET
          valueFrom:
            secretKeyRef:
              key: client-secret
              name: app-oauth-client
      ports:
        - containerPort: 8080
          protocol: TCP
      resources: {}
      volumeMounts:
        - name: code
          mountPath: /app
        - name: go-path
          mountPath: /go/pkg
        - mountPath: /ssl/ca.pem
          name: app-tls
          subPath: ca.crt
        - mountPath: /ssl/server.key
          name: app-tls
          readOnly: true
          subPath: tls.key
        - mountPath: /ssl/server.crt
          name: app-tls
          readOnly: true
          subPath: tls.crt
        - mountPath: /etc/app/log-config
          name: log-config-volume
        - mountPath: /etc/app/config
          name: config-volume
  volumes:
    - name: code
      hostPath:
        path: /path/to/code    # change this
        type: Directory
    - name: go-path
      hostPath:
        path: /path/to/golang    # change this
        type: DirectoryOrCreate
    - name: app-tls
      secret:
        defaultMode: 384
        secretName: app-tls
    - name: log-config-volume
      configMap:
        defaultMode: 420
        name: app-logcfg
    - name: config-volume
      configMap:
        defaultMode: 420
        name: app-config
  nodeName: <node-name>    # change this

修改对应 Service 的标签选择,将流量转移到开发 Pod 上来

    labelSelector: app-dev

开发运行

  • 在K8s扩展中,展开Namespace,选择开发Pod所在的命名空间,右键Use Namespace切换上下文

    image

  • 按F1后通过关键词搜索并选择Dev Containers: Attach to Running Kubernetes Container...

    image

  • 选择上面部署的开发Pod

    image

  • 在新建的VSCode窗口中编辑代码、执行命令,使用方式与普通VSCode开发一致。首次打开需要再容器中启用Golang扩展