5.6 KiB
5.6 KiB
id, title, type, domain, stack, tags, level, prerequisites, est_hours, related, week, order
| id | title | type | domain | stack | tags | level | prerequisites | est_hours | related | week | order | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| devops.k8s.core-objects | Kubernetes 基础:Pod / Deployment / Service / Ingress、配置与密钥、探针、滚动更新和扩缩容 | lesson | devops |
|
|
basic |
|
3 |
|
|
1 |
Kubernetes 基础:Pod / Deployment / Service / Ingress、配置与密钥、探针、滚动更新和扩缩容
定位:能读懂和修改清单、能用 kubectl 排查,集群搭建和运维不在范围内。BOSS直聘 2026-10-23 的调研中有岗位把 K8s 列为要求或加分项。示例清单通过 kubeconform 结构校验(6 个资源全部有效)和团队规范测试(5 个测试通过),没有在真实集群中部署。以官方文档为准:https://kubernetes.io/zh-cn/docs/home/ 。
解释说明
核心对象
| 对象 | 作用 | 类比 |
|---|---|---|
| Pod | 最小调度单位,一个或几个容器共享网络和存储 | 一组 docker run |
| Deployment | 声明“要几个什么样的 Pod”,负责滚动更新和回滚 | Compose 的 service + 副本数 |
| Service | 给一组 Pod 一个稳定的虚拟 IP / DNS 名,做负载均衡 | 内部的负载均衡器 |
| Ingress | 集群入口的 HTTP 路由(域名、路径、TLS) | Nginx 反向代理配置 |
| ConfigMap / Secret | 配置 / 敏感信息,以环境变量或文件注入 | .env |
| HPA | 按指标自动调整副本数 | — |
| PDB | 主动驱逐(节点维护)时至少保留多少可用 Pod | — |
| Namespace | 资源隔离和配额 | — |
声明式:你提交“期望状态”(YAML),控制器不断把“实际状态”调整为期望状态。Pod 挂了会被重建,而不是由你手动重启。
标签和选择器:Deployment、Service 通过标签选择 Pod,标签不一致是新手最常见的问题(Service 没有后端)。
三种探针
| 探针 | 失败的后果 | 检查什么 |
|---|---|---|
| startupProbe | 启动阶段超时则重启 | 启动是否完成(给慢启动的应用留时间) |
| readinessProbe | 从 Service 的后端中摘除,不重启 | 能否处理请求(可检查关键依赖) |
| livenessProbe | 重启容器 | 进程是否卡死(不要检查外部依赖) |
滚动更新和优雅退出
maxSurge/maxUnavailable控制更新节奏;kubectl rollout undo回滚。- Pod 终止流程:从 Service 端点中移除 + 执行
preStop→ 发送 SIGTERM → 等待terminationGracePeriodSeconds→ SIGKILL。应用要处理 SIGTERM:停止接收新请求、完成进行中的请求(AI 流式回答可能持续几十秒)。
常用排查命令
kubectl get pods -l app.kubernetes.io/name=agent-api -o wide
kubectl describe pod <pod> # 看事件:拉取镜像失败、探针失败、OOMKilled、调度失败
kubectl logs <pod> --previous # 看上一次崩溃前的日志
kubectl get endpoints agent-api # Service 是否有后端
kubectl rollout status deploy/agent-api
kubectl rollout undo deploy/agent-api
案例
把 AI Agent API 部署到公司的 K8s 集群:3 副本、零不可用的滚动更新、启动慢时用 startupProbe 保护、密钥由 Secret 注入、Ingress 关闭缓冲以支持 SSE、HPA 按负载扩到 10 个、PDB 保证节点维护时至少 2 个可用。
代码示例
清单:examples/agent-api(deployment.yaml、service.yaml、ingress.yaml、configmap.yaml、hpa.yaml),校验结果:
$ kubeconform -strict -summary *.yaml
Summary: 6 resources found in 5 files - Valid: 6, Invalid: 0, Errors: 0, Skipped: 0
$ pytest -q test_manifests.py
5 passed
Deployment 关键部分:
strategy:
type: RollingUpdate
rollingUpdate: { maxSurge: 1, maxUnavailable: 0 }
template:
spec:
terminationGracePeriodSeconds: 90
containers:
- name: api
image: registry.example.com/agent-api:1.4.2
env:
- name: LLM_API_KEY
valueFrom: { secretKeyRef: { name: agent-api-secrets, key: llm-api-key } }
resources:
requests: { cpu: "250m", memory: "256Mi" }
limits: { memory: "512Mi" }
startupProbe: { httpGet: { path: /healthz, port: http }, periodSeconds: 5, failureThreshold: 24 }
readinessProbe: { httpGet: { path: /readyz, port: http }, periodSeconds: 5 }
livenessProbe: { httpGet: { path: /healthz, port: http }, periodSeconds: 10 }
团队规范测试(test_manifests.py)检查:选择器与标签一致、镜像固定版本、有资源和探针、密钥不明文、PDB 小于最小副本数、仓库中没有 Secret 对象。
易错点
- Service 选择器和 Pod 标签不一致。
- 存活探针检查数据库,数据库抖动时所有 Pod 被重启,雪上加霜。
- 没有 startupProbe,慢启动的应用被存活探针反复杀掉(CrashLoopBackOff)。
- 镜像用
latest,无法确定线上跑的是哪个版本,回滚也不可靠。 - 内存没有限制或限制过小(OOMKilled)。
- 应用不处理 SIGTERM,滚动更新时正在进行的流式回答被切断。
- 把 Secret 的 YAML(只是 base64,不是加密)提交到仓库。
面试常问
- Pod、Deployment、Service 的关系?
- 三种探针的区别?
- 滚动更新怎么做到不中断服务?
- Pod 一直 CrashLoopBackOff 怎么排查?