工作负载、Service 与集群网络
工作负载管理应用副本,Service 提供稳定的访问入口。本文负责工作负载选择、滚动更新和集群网络。
1. 面试核心
先记住这几条,再读正文- 副本与稳定身份。 Deployment 管理可替换副本,StatefulSet 管理稳定身份。卡 · 工作负载
- 节点代理。 DaemonSet 在符合条件的节点上维护 Pod 副本。卡 · 工作负载
- Service 转发。 Service 数据面依据端点信息,把流量送到后端。卡 · Service 与流量入口
- 网络职责。 CNI 配置 Pod 网络,Service 代理实现虚拟地址转发。卡 · 集群网络
- 网络访问策略。 NetworkPolicy 的允许规则按并集生效。卡 · NetworkPolicy
2. 工作负载
| 对象 | 主要用途 |
|---|---|
| Deployment | 管理可替换副本、滚动更新和版本回滚 |
| StatefulSet | 提供稳定序号、网络身份及按模板创建的 PVC |
| DaemonSet | 在符合条件的节点上运行日志、网络等代理 |
| Job | 执行到完成的任务 |
| CronJob | 按计划创建 Job |
StatefulSet 默认使用 OrderedReady 管理顺序。Parallel 策略可并行创建和删除 Pod。稳定身份有助于应用识别成员。数据库复制、选主和一致性仍由应用承担。
PVC 通过 StorageClass 可触发动态供应 PV。实际存储还取决于供应器和访问模式。StatefulSet 的卷保留行为由 PVC 保留策略决定。数据保留与应用备份应分别设计。
2.1 滚动更新与回滚
ReplicaSet 维持副本数量。Deployment 在它之上管理 Pod 模板版本。修改模板会创建或复用对应的 ReplicaSet。
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 3
selector:
matchLabels: {app: web}
strategy:
rollingUpdate: {maxSurge: 25%, maxUnavailable: 0}
template:
metadata:
labels: {app: web}
spec:
containers:
- name: web
image: registry.example.com/web:1.4.2
ports: [{containerPort: 8080}]
readinessProbe:
httpGet: {path: /ready, port: 8080}
resources:
requests: {cpu: 250m, memory: 256Mi}
limits: {memory: 512Mi}
3 个副本的 25% maxSurge 向上取整为 1。maxUnavailable 为 0,要求维持 3 个可用副本。新副本未就绪时,滚动更新会停住。终止中的 Pod 仍占资源,应额外预留容量。
kubectl rollout status deployment/web 检查进展。progressDeadlineSeconds 超时会记录进展失败。Deployment 控制器不会因此自动回滚。kubectl rollout undo deployment/web 可恢复保留的模板版本。外部配置、数据库迁移和业务数据需单独恢复。
2.2 配置更新
ConfigMap 保存普通配置,Secret 保存敏感配置。安全边界见 Kubernetes 架构。
环境变量在容器启动时注入。更新对象后,已有进程的环境变量保持原值。卷投射文件会经 kubelet 更新传播。应用还需重新读取或重载配置。subPath 挂载不会接收此类自动更新。
需要确定切换时点时,可使用版本化配置。修改 Pod 模板引用,再触发滚动更新。
3. Service 与流量入口
| 类型或模式 | 行为 |
|---|---|
| ClusterIP | 分配集群虚拟 IP,供内部访问 |
| NodePort | 在节点地址的指定端口提供入口 |
| LoadBalancer | 请求负载均衡器实现提供外部入口 |
| ExternalName | DNS 返回配置的 CNAME |
| Headless | clusterIP: None,通过 DNS 提供端点地址 |
带选择器的 Service 由控制器维护 EndpointSlice。端点包含地址、端口和 ready 等条件。代理根据这些条件选择后端。无选择器的 Service 可由使用者维护端点。
CoreDNS 为 Service 提供名称解析。默认集群域为 cluster.local,部署可更改。kubectl port-forward svc/web 8080:80 选择后端 Pod 建立调试通道。它不经过 ClusterIP 的常规转发路径。
Ingress 描述 HTTP 域名和路径路由,需要控制器执行。Gateway API 用 GatewayClass、Gateway 和路由对象分工。Gateway API 同样需要具体实现。
3.1 外部流量策略
externalTrafficPolicy: Cluster 可选择集群内后端。Local 只选择当前节点的本地后端。NodePort 等外部路径使用 Local 可保留客户端源 IP。
没有本地后端的节点无法按 Local 正常转发。外部负载均衡器需正确检查节点健康。副本分布不均时,各节点流量也会不均。Local 需要在源地址、可用性和分布之间取舍。
4. 集群网络
普通 Pod 网络要求跨节点直接寻址。NetworkPolicy 可进一步限制允许的连接。hostNetwork Pod 则共享节点网络。
| 路径 | 实现方式 |
|---|---|
| 同一 Pod | 通过共享网络空间与 localhost 通信 |
| 同一节点 | 可通过网桥、主机路由或 eBPF 转发 |
| 跨节点 | 通过封装隧道或可达的 Pod 网段路由 |
| Service | 先选择后端,再经 Pod 网络送达 |
| 外部入口 | 由负载均衡器和网关转入集群 |
Flannel 支持 VXLAN 和 host-gw 等后端。Calico 支持路由以及 IPIP、VXLAN 等封装。Cilium 可用 eBPF 实现网络和 Service 转发。具体路径应以插件及部署模式为准。
隧道要求节点间承载网络可达,并放行相应协议。封装额外占用 MTU。直接路由则要求底层能转发 Pod 网段。
Linux kube-proxy 可通过 iptables 或 IPVS 实现转发。IPVS 将 Service VIP 绑定到虚拟接口。因此,VIP 的具体落点取决于代理模式。
排查从源 Pod 路由开始,再看节点与目标 Pod。沿途检查策略、防火墙、隧道、MTU 和连接跟踪。两端抓包用于确认丢失位置。
5. NetworkPolicy
NetworkPolicy 按 Pod、命名空间和网段选择流量。网络插件必须支持策略执行。
某方向没有选择该 Pod 的策略时,该方向默认放行。策略选中 Pod 并声明该方向后,该方向进入隔离。所有匹配策略允许的流量取并集。
连接需同时满足源端 egress 和目标端 ingress 规则。允许出站 DNS 时,需按部署开放 UDP 和 TCP 53。策略控制连接边界,HTTP 路径授权需由应用或网关完成。
6 · 面试题卡片
本页题目与参考回答
6.1 Deployment、StatefulSet 和 DaemonSet 有什么区别?Deployment 和 ReplicaSet 是什么关系?
考察重点
- 三类工作负载在身份、存储、分布上的区别和适用场景。
- Deployment 通过多个 ReplicaSet 实现滚动更新和回滚;清单的结构。
相关内容:工作负载。
参考回答
Deployment 管理可替换副本,StatefulSet 保留稳定身份。
StatefulSet 可按卷模板为副本配置独立 PVC。数据复制与选主仍由应用完成。DaemonSet 在符合条件的节点运行代理。
ReplicaSet 维持数量,Deployment 管理模板版本。滚动更新受 maxSurge 和 maxUnavailable 约束。回滚恢复历史 Pod 模板。外部配置和数据库数据需单独处理。
6.2 Service 有哪些类型?Service 是怎样把流量转发到 Pod 的?Ingress 和 Service、Nginx 是什么关系?
考察重点
- 各类型的访问方式和适用场景;Headless Service。
- EndpointSlice、kube-proxy、CoreDNS 的分工;Ingress 规则与控制器;Gateway API。
相关内容:Service 与流量入口、Linux 网络排查。
参考回答
Service 提供后端发现和访问方式,Ingress 定义七层路由,Nginx 可作为实现这些路由的控制器所使用的代理。
Service 有 ClusterIP、NodePort、LoadBalancer 和 ExternalName 四种类型。Headless 模式不分配 ClusterIP,其 DNS 可返回端点地址。控制器维护 EndpointSlice,Service 代理按端点条件转发,CoreDNS 负责解析。
Ingress 规则需要控制器执行;Gateway API 将网关与路由拆为独立对象。port-forward 则经 API 通道访问选中的 Pod,不经过普通 Service 转发路径。
6.3 Kubernetes 中 Pod 之间怎样通信?跨节点通信是怎样实现的?Flannel、Calico 和 kube-proxy 有什么区别?
考察重点
- 网络模型的要求;同 Pod、同节点、跨节点三种路径。
- 隧道与路由两种方式的取舍;CNI 与 kube-proxy 的分工。
相关内容:集群网络、Service 与流量入口。
参考回答
Pod 网络由 CNI 等网络实现建立。
Pod 内容器用 localhost 通信。同节点路径可用网桥、路由或 eBPF。跨节点路径可用隧道或直接路由。
Flannel 支持 VXLAN、host-gw 等模式。Calico 支持路由、IPIP 与 VXLAN。隧道要求承载网络可达,并需要合适的 MTU。直接路由要求底层能转发 Pod 网段。
Service 代理负责虚拟地址到后端的选择与转发。它可由 kube-proxy 或网络插件实现。故障时按实际数据路径检查策略、路由和抓包。
6.4 Deployment 更新卡住会自动回滚吗?ConfigMap 更新何时生效?
考察重点:滚动参数、进展条件与配置传播。
参考回答
进展超时会记录失败条件,控制器不会自动回滚。
需修复原因或执行 rollout undo。环境变量在容器启动时固定。投射文件经 kubelet 更新后,应用仍需重新读取。subPath 挂载不会自动接收更新。回滚模板也不会撤销数据库迁移。
6.5 NetworkPolicy 如何决定 Pod 能否通信?多条策略怎样合并?
考察重点:双向许可、默认隔离与策略并集。
相关内容:NetworkPolicy。
参考回答
多条策略的允许规则取并集。
连接需满足源端 egress 和目标端 ingress。某方向被策略选中后,只放行规则允许的流量。策略生效还要求网络插件支持。默认拒绝出站后,还需按部署放行 DNS。
6.6 externalTrafficPolicy 设置为 Local 有什么收益和代价?
考察重点:源地址、本地端点与节点负载。
相关内容:外部流量策略。
参考回答
Local 只使用节点本地后端。
NodePort 等外部路径可因此保留客户端源 IP。没有本地后端的节点无法正常承接该流量。负载均衡器需检查节点健康,副本也要合理分布。