云原生面试高频:K8s调度策略、Service与Ingress的区别及运维实践(距离收官倒计时3)
本文深入解析Kubernetes三大核心组件:调度器(Scheduler)通过预选/优选机制实现高效资源分配;Service提供三类访问方式(ClusterIP、NodePort、LoadBalancer)满足不同场景需求;Ingress配合Controller实现HTTP层流量路由与负载均衡。文章详细剖析了Scheduler的预选策略(如资源检查、污点容忍)和优选算法(如资源均衡评分),对比了不
引言
Kubernetes(K8s)作为云原生事实标准,其调度策略决定资源分配效率,Service/Ingress掌控流量路由。本文深入解析K8s Scheduler的预选/优选机制,对比三类Service的核心差异,并通过手写Ingress规则演示流量管理,助你攻克云原生面试高频考点。
一、K8s Scheduler:预选(Predicate)与优选(Priority)阶段
1.1 Scheduler核心目标
将Pod分配到满足约束条件且综合评分最优的Node上,保障集群资源高效利用。
1.2 预选阶段(Predicate):过滤不满足条件的Node
核心任务:剔除无法运行Pod的节点,输出候选节点列表。
常用策略:
| 策略 | 作用 |
|---|---|
PodFitsResources |
检查Node资源(CPU/Memory)是否满足Pod Request |
PodFitsHostPorts |
检查Node端口是否被占用 |
PodAntiAffinity |
避免同拓扑域部署相同应用的Pod(如反亲和性规则) |
TaintsTolerations |
校验Pod容忍Node的污点(Taints) |
示例:
若Pod声明requests.cpu: 2,而Node剩余CPU仅1核,则PodFitsResources策略将其过滤。
1.3 优选阶段(Priority):为候选节点评分
核心任务:对预选通过的Node按策略加权评分,选最高分节点。
常用策略:
| 策略 | 评分逻辑 |
|---|---|
LeastRequestedPriority |
优先选择资源利用率低的节点((capacity - request) / capacity) |
BalancedResourceAllocation |
均衡CPU/Memory利用率(越接近50%得分越高) |
NodeAffinityPriority |
匹配Node亲和性规则(requiredDuringSchedulingIgnoredDuringExecution) |
评分公式:
FinalScore = Σ (Weight_i * StrategyScore_i)
(Weight为策略权重,StrategyScore为单项得分)
二、Service类型对比:ClusterIP vs NodePort vs LoadBalancer
Service是K8s服务发现的核心,三类类型适用场景迥异:
2.1 ClusterIP(默认类型)
- 作用:创建集群内部虚拟IP(VIP),仅集群内可访问。
- 原理:通过
kube-proxy实现iptables/IPVS规则,将请求转发到后端Pod。 - 适用场景:微服务内部通信(如前端调用后端API)。
2.2 NodePort
- 作用:在每个Node上开放静态端口(默认30000-32767),外部可通过
NodeIP:Port访问。 - 原理:在ClusterIP基础上添加NodePort规则,流量经NodePort→ClusterIP→Pod。
- 适用场景:开发测试环境对外暴露服务(无LB时临时方案)。
2.3 LoadBalancer
- 作用:集成云厂商负载均衡器(如AWS ALB、阿里云SLB),分配公网IP。
- 原理:调用云厂商API创建LB,LB将流量转发到各Node的NodePort。
- 适用场景:生产环境对外服务(需云厂商支持)。
2.4 对比总结
| 特性 | ClusterIP | NodePort | LoadBalancer |
|---|---|---|---|
| 访问范围 | 集群内部 | 集群外部(NodeIP) | 公网(LB IP) |
| 端口分配 | 自动分配VIP | 固定端口范围 | LB分配公网端口 |
| 云厂商依赖 | 无 | 无 | 需支持LB的云平台 |
| 生产推荐度 | ★★★★☆(内部) | ★★☆☆☆(临时) | ★★★★★(外部) |
三、手写Ingress规则:实现流量路由与负载均衡
3.1 Ingress核心概念
Ingress是HTTP层路由规则,需配合Ingress Controller(如Nginx Ingress)生效。
核心组件:
- Ingress Resource:定义路由规则(域名、路径、后端Service)。
- Ingress Controller:监听Ingress变化,动态更新负载均衡配置。
3.2 实战:手写Ingress规则
场景:
- 域名
app.example.com路由到app-service(端口80) - 路径
/api转发到api-service(端口8080) - 启用HTTPS与Rewrite规则
Ingress YAML:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2 # Rewrite路径
cert-manager.io/cluster-issuer: letsencrypt-prod # 自动证书
spec:
tls:
- hosts:
- app.example.com
secretName: app-tls-secret # TLS证书Secret
rules:
- host: app.example.com
http:
paths:
- path: / # 根路径
pathType: Prefix
backend:
service:
name: app-service
port:
number: 80
- path: /api(/|$)(.*) # /api/xxx 路径
pathType: ImplementationSpecific
backend:
service:
name: api-service
port:
number: 8080
3.3 关键注解解析
| Annotation | 作用 |
|---|---|
nginx.ingress.kubernetes.io/rewrite-target |
重写请求路径(如/api/user → /user) |
cert-manager.io/cluster-issuer |
自动申请TLS证书(需Cert-Manager) |
nginx.ingress.kubernetes.io/proxy-buffer-size |
调整代理缓冲区大小 |
四、运维实践:故障排查与性能优化
4.1 Service无法访问排查
- 检查Endpoint:
kubectl get endpoints <service-name> # 确认Pod IP是否注册
2.查看NodePort范围:
kubectl get svc <service-name> -o jsonpath='{.spec.ports[0].nodePort}' # 确认端口开放
3.防火墙规则:
iptables -L -n -t nat | grep <node-port> # 检查iptables转发规则
4.2 Ingress性能优化
- 启用Nginx缓存:
annotations:
nginx.ingress.kubernetes.io/proxy-cache-path: "/var/cache/nginx" # 启用缓存
调整Worker进程数:
annotations:
nginx.ingress.kubernetes.io/worker-processes: "4" # 匹配CPU核数
4.3 调度优化:污点与亲和性
场景:将Redis部署到带SSD的节点
# Node打污点
kubectl taint nodes node-ssd disktype=ssd:NoSchedule
# Pod添加容忍
spec:
tolerations:
- key: disktype
operator: Equal
value: ssd
effect: NoSchedule
五、总结
K8s网络与调度的核心逻辑:
- Scheduler:通过预选过滤节点,优选评分选出最优节点;
- Service:ClusterIP用于内部通信,NodePort临时暴露,LoadBalancer生产对外服务;
- Ingress:基于域名/路径路由流量,需配合Controller实现高级功能。
掌握这些知识,不仅能通过面试,更能高效运维K8s集群——这才是云原生工程师的核心竞争力。
参考资料:
- K8s官方文档(Scheduler策略、Service类型、Ingress配置);
- 《Kubernetes权威指南》(张磊著);
- 工具:
kubectl describe ingress(调试Ingress)、kube-proxy日志分析。
更多推荐
所有评论(0)