Kind集群默认不支持Go二进制镜像拉取,必须显式配置registry信任:需在kind-config.yaml中通过containerdConfigPatches添加insecure registry配置(http://localhost:5000),并用extraPortMappings暴露5000端口;docker push localhost:5000/myapp:dev不可省略;调试需securityContext启用SYS_PTRACE、关闭ASLR、挂载/proc;无默认StorageClass需手动部署local-path-provisioner;client-go版本须与K8s集群严格对齐。

Kind集群默认不支持Go二进制镜像拉取,必须显式配置registry信任
直接 kind create cluster 启动的集群会监听 localhost:5000 内置 registry,但 Pod 默认用 HTTPS 协议尝试拉取 localhost:5000/myapp:dev,而该 registry 只提供 HTTP 服务,必然报错:http: server gave HTTP response to HTTPS client。
实操建议:
针对 Kubernetes 仪表板和 Web UI 的浏览器自动化。适用于与 Kubernetes Dashboard、Grafana、ArgoCD UI 或其他 Web 界面交互。需要设置 MCP_BROWSER_ENABLED=true。
- 写一个
kind-config.yaml,在containerdConfigPatches中添加 insecure registry 配置:[[plugins."io.containerd.grpc.v1.cri".registry.mirrors."localhost:5000"]]+endpoint = ["http://localhost:5000"] - 通过
extraPortMappings显式暴露 5000 端口,确保宿主机能访问 registry 容器 -
docker push localhost:5000/myapp:dev必须执行——即使镜像已在本地 Docker daemon 中,Pod 仍需从 Kind 节点的 containerd 存储中加载,而该存储只认 registry 推送过的镜像
Go程序在Kind Pod里无法用dlv调试,缺三项关键安全上下文
运行 dlv --headless --listen=:2345 exec ./myapp 时常见卡住或报错 could not attach to pid,根本原因不是端口没开,而是容器默认禁止:SYS_PTRACE、ASLR 关闭、/proc 挂载。Kubernetes 不允许任意提权,必须显式放开。
实操建议:
- Deployment 的
securityContext至少包含:runAsUser: 0(root)、privileged: true(仅开发环境)、capabilities: {add: ["SYS_PTRACE"]} - 容器启动命令前加
echo 0 > /proc/sys/kernel/randomize_va_space关闭 ASLR(否则 dlv 找不到符号地址) - 挂载
hostPath类型的/proc:在volumeMounts和volumes中声明name: proc+hostPath: {path: /proc}
Kind集群没有默认StorageClass,PVC会卡在Pending状态
YAML 里只要写了 PersistentVolumeClaim,且没指定 storageClassName,就会匹配集群默认 StorageClass;而 kind create cluster 默认不部署任何 provisioner,导致 PVC 永远 Pending。
实操建议:
- 创建集群时用
--config加载含local-path-storage的配置,或集群创建后手动部署:kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.24/deploy/local-path-storage.yaml - 确认生效:
kubectl get storageclass应看到local-path并标记为(default) - 若已有 PVC 处于 Pending,删掉它再
kubectl apply—— Kubernetes 不会自动重试已失败的绑定
Go版本与client-go必须严格对齐Kubernetes大版本
用 Go 1.22 写 controller 去连 Kubernetes 1.29 集群?编译可能通过,但 runtime 会 panic:undefined: scheme.Scheme 或 no kind "Deployment" is registered。这不是语法问题,是 apimachinery 版本错配导致 Scheme 初始化失败。
实操建议:
- 查清目标集群版本:
kubectl version --short,对应 client-go tag(如 v1.29.x →k8s.io/client-go@v0.29.0) - 三者必须同 tag:
k8s.io/client-go、k8s.io/apimachinery、k8s.io/api—— 少一个go mod tidy就可能漏掉隐式依赖 -
go env GOPATH和GOROOT路径不能含空格或中文,否则go build时 import 路径解析失败,报cannot find package

















