deployment的spec.selector.matchlabels必须与spec.template.metadata.labels严格一致,否则pod不被管理;容器端口需显式声明name和containerport;健康探针应基于http handler而非tcpsocket;configmap/secret挂载须用subpath防覆盖。

Deployment YAML 必须显式设置 spec.selector.matchLabels 且与 spec.template.metadata.labels 严格一致
这是 K8s 调度和滚动更新生效的前提。Golang 微服务若漏配或标签不匹配,kubectl apply 不报错,但 Pod 永远不会被 Deployment 管理,出现「Pod 存在但副本数为 0」的假象。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
-
matchLabels应只包含稳定、语义明确的标签,如app: user-service,避免用version: v1.2.3这类易变字段作 selector -
template.metadata.labels必须完全覆盖matchLabels,可额外增加tier: backend或env: prod等辅助标签 - Golang 服务启动时可通过
os.Getenv("POD_NAME")或 Downward API 注入标签值,但 selector 本身不能依赖运行时变量
容器端口必须同时声明 containerPort 和 name,尤其当使用 Service 的 targetPort 时
Golang 微服务通常监听 :8080,但若 containerPort 缺失或 name 未定义,Service 无法通过名称(如 targetPort: http)精准转发,导致 503 或连接拒绝。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 始终写全:
ports: - name: http containerPort: 8080 protocol: TCP
- 若服务暴露多个端口(如 HTTP + gRPC),
name必须唯一且小写,避免grpc写成GRPC—— K8s 对端口名大小写敏感 - 不要依赖
containerPort自动推断:即使 Go 代码里用了http.ListenAndServe(":8080", nil),YAML 里仍需显式声明
Liveness/Readiness 探针应基于 Golang 服务真实健康状态,而非仅端口可达
直接用 tcpSocket 探活对 Go 微服务风险极高:进程卡死、goroutine 泄漏、DB 连接池耗尽时,端口仍可能响应 TCP SYN,探针误判为健康。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 在 Go 服务中暴露
/healthz(liveness)和/readyz(readiness)HTTP handler,检查关键依赖(DB、Redis、下游 gRPC 服务)是否可用 - YAML 中优先用
httpGet:livenessProbe: httpGet: path: /healthz port: http initialDelaySeconds: 30 periodSeconds: 10 -
initialDelaySeconds至少设为 Go 服务冷启动时间(如加载配置、建连 DB),避免探针过早失败触发重启循环
ConfigMap/Secret 挂载到 Golang 容器时,必须用 subPath 或非递归挂载,否则覆盖整个目录
常见错误:把 config.yaml 挂载到 /app/config/,却没加 subPath,结果整个 /app/config/ 目录被替换成单个文件,导致 Go 服务读不到其他必要配置文件或证书。
实操建议:
立即学习“go语言免费学习笔记(深入)”;
- 单文件挂载必须用
subPath:volumes: - name: config configMap: name: user-service-config volumeMounts: - name: config mountPath: /app/config/config.yaml subPath: config.yaml - 若需挂载整个 ConfigMap 为多文件,用
items显式列出键值对,避免无意覆盖默认文件结构 - Golang 读取时别硬编码路径,用
os.Getenv("CONFIG_PATH")或 flag,默认值设为/app/config/config.yaml
真正容易被忽略的是:K8s 不校验挂载路径是否存在,也不提示「你刚删掉了整个 config 目录」——出问题时只会看到 Go 服务 panic 报错「no such file or directory」,得倒查 YAML 才能定位。










