Kubernetes 清单生成
填好镜像、端口和资源,生成 Deployment、Service 和 Ingress 三份清单,探针、滚动更新和安全上下文都按常见实践配好。
需要注意
- 没有配置 TLS Secret,Ingress 只提供 HTTP。证书可以用 cert-manager 自动签发,也可以手动创建 Secret。
- 探针路径是 /,如果应用没有这个路由,Pod 会一直重启;换成 /healthz 之类的真实健康检查地址。
生成规则
三份清单共用一个 app.kubernetes.io/name 标签,Deployment 的 selector、Service 的 selector 和 Ingress 的 backend 都靠它串起来。改名字时三处会一起改,不会出现端口或标签对不上的情况。
容器默认加了 runAsNonRoot、allowPrivilegeEscalation: false 和丢弃全部 capabilities。如果你的镜像默认以 root 运行,Pod 会直接起不来,需要先在 Dockerfile 里建用户并切过去。
探针默认用 HTTP GET,路径填 /healthz 这类专门的就绪检查;没有这个路由时会 404,Pod 会反复重启。命令行工具或队列消费者没有 HTTP 端口,应该改用 exec 探针,或者直接去掉。
要构建镜像的话用Dockerfile 生成,要配 CI 自动部署用GitHub Actions 生成;集群前面再加一层 Nginx 的话,配置可以用Nginx 配置生成。
常见问题
requests 和 limits 该怎么设?
requests 决定调度时预留多少资源,limits 是容器上限。CPU 超过 limit 会被节流,内存超过会被 OOMKill。没有历史数据时先按压测峰值给 requests,limits 留 2-3 倍余量,再根据监控调。
readiness 和 liveness 探针有什么区别?
readiness 失败会把 Pod 从 Service 的 Endpoint 里摘掉,不再接流量,但不会重启;liveness 失败会直接重启容器。依赖数据库的检查只适合放 readiness,放进 liveness 会让数据库抖一下就把所有 Pod 重启一遍。
为什么镜像不要用 latest?
latest 不是「最新版本」,只是一个可变 tag。同一个清单在不同时间拉到的内容可能不同,回滚时也无法确定回到哪个版本。用版本号或 digest,配合 imagePullPolicy: IfNotPresent,缓存也更好命中。
环境变量里的密码怎么办?
生产环境用 Secret,再通过 envFrom 或 valueFrom 引用,不要把明文写进 Deployment。Secret 默认只是 base64,不是加密,仓库里还要开 secret 扫描,或者用 External Secrets / Sealed Secrets 管理。
Ingress 配好了为什么还是 404?
先看 ingressClassName 和集群里实际安装的 controller 是否一致,再看 Service 的 targetPort 名字有没有对上容器端口名。host 必须和请求的 Host 头完全一致,带 www 和不带 www 是两个域名。
单副本能不能用滚动更新?
可以,但 maxUnavailable: 0 会要求先起一个新 Pod,再停旧的,集群必须有资源余量。资源紧张时会卡在 Pending 一直不更新,单副本服务更稳妥的做法是用 Recreate,接受短暂中断。