Appearance
K8s 运维:探针 / 发布 / 扩缩容 / 监控 / 排障 / 安全
一、健康探针(Probes)
| 探针 | 失败后果 | 用途 |
|---|---|---|
| livenessProbe | 重启容器 | 检测死锁/卡死,活着但不健康就重启 |
| readinessProbe | 从 Service 摘除(不接流量) | 未就绪时不转发流量,就绪后再加入 Endpoints |
| startupProbe | 重启容器 | 慢启动应用,成功前不执行 liveness/readiness(防误杀) |
检查方式:httpGet / tcpSocket / exec / grpc。 关键参数:initialDelaySeconds、periodSeconds、timeoutSeconds、failureThreshold。
高频坑:liveness 检查依赖外部服务(如 DB),外部抖动会导致容器被误重启 → 制造雪崩。liveness 应只检查"自身是否卡死"。
二、发布策略
- 滚动更新(RollingUpdate):默认。用
maxSurge(最多超出期望副本数)和maxUnavailable(最多不可用数)控制节奏,逐批替换,保证不中断。 - 重建(Recreate):先全删再全建,会短暂中断,适合不兼容升级。
- 蓝绿(Blue-Green):两套环境切换,秒级回滚(需 Ingress/Service 切流,非 K8s 原生,需工具)。
- 金丝雀(Canary):先给小比例流量验证,再逐步放量(可用两个 Deployment + Service 权重,或 Istio/Argo Rollouts)。
- 回滚:
kubectl rollout undo deployment/x [--to-revision=n]。
三、扩缩容
- HPA(水平):按指标(CPU/内存/自定义,如 QPS)调整副本数。依赖 metrics-server。
- VPA(垂直):调整 Pod 的 requests/limits。
- Cluster Autoscaler:节点不够时增删节点。
- KEDA:基于事件(队列长度等)的弹性伸缩。
四、可观测性(监控/日志/追踪)
- 监控指标:Prometheus(拉取 + 时序库)+ Grafana(可视化);K8s 指标经 kubelet/cAdvisor、kube-state-metrics 暴露。
- 日志:容器标准输出 → 节点日志文件 → 采集(Fluent Bit/Fluentd/Filebeat)→ 集中存储(ELK/Loki)。
- 追踪:OpenTelemetry / Jaeger,分布式链路。
- 三大支柱:Metrics、Logs、Traces。
五、常见故障排查(高分实操题)
Pod 状态异常:
- Pending:调度失败。
kubectl describe pod看 Events(资源不足、亲和性、PVC 未绑、污点)。 - ImagePullBackOff / ErrImagePull:镜像名/标签错、私有仓库缺 imagePullSecret、网络不通。
- CrashLoopBackOff:容器反复退出。看
kubectl logs <pod> --previous、退出码(137=OOMKill/SIGKILL,1=应用错误)、describe事件。 - OOMKilled:超内存 limit,调大 limit 或查内存泄漏。
- Terminating 卡住:finalizer 未清、优雅退出超时(
terminationGracePeriodSeconds)、节点失联。 - Running 但不 Ready:readiness 探针失败,检查探针配置与应用健康端点。
常用命令:
bash
kubectl get pods -o wide
kubectl describe pod <name> # Events 是排查金矿
kubectl logs <pod> [-c container] [--previous] [-f]
kubectl exec -it <pod> -- sh
kubectl get events --sort-by=.lastTimestamp
kubectl top pod / node # 需 metrics-server
kubectl get ep <svc> # 看 Service 后端是否为空"Service 访问不通"排查链(经典):
kubectl get ep <svc>→ Endpoints 是否为空?空则 selector 不匹配或无就绪 Pod。- Pod 是否 Ready?readiness 探针配置对否。
- Service 端口/targetPort 是否正确?
- 节点上 kube-proxy 规则、CNI 是否正常?
- NetworkPolicy 是否拦截?
六、安全
- RBAC:Role/ClusterRole + RoleBinding/ClusterRoleBinding,决定"谁能对什么资源做什么"。
- ServiceAccount:Pod 的身份,用于访问 apiserver 或云资源(IRSA/Workload Identity)。
- NetworkPolicy:Pod 级网络隔离。
- Pod Security:限制特权容器、root、capabilities(Pod Security Admission)。
- Secret 管理:etcd 加密、外部 KMS/Vault、避免明文入库。
- 镜像安全:私有仓库、镜像扫描、最小基础镜像、只读根文件系统、非 root 运行。
七、高频速答
Q:liveness 和 readiness 的区别? A:liveness 失败重启容器(治卡死);readiness 失败从负载均衡摘除(控流量)。生命周期不同、目的不同。
Q:优雅停机怎么保证? A:K8s 先发 preStop hook、把 Pod 从 Endpoints 摘除,再发 SIGTERM,等待 terminationGracePeriodSeconds 后 SIGKILL。应用要处理 SIGTERM 做优雅退出。
Q:如何做到零停机发布? A:滚动更新 + readiness 探针 + 优雅停机 + 足够副本 + PodDisruptionBudget。
Q:容器退出码 137 是什么意思? A:128+9=SIGKILL,常见于 OOMKilled 或被强制杀死。
Q:HPA 不生效? A:缺 metrics-server、未设 requests、指标不可用、或已达 min/max 副本。