引言

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无法访问排查

  1. 检查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网络与调度的核心逻辑:

  1. Scheduler​:通过预选过滤节点,优选评分选出最优节点;
  2. Service​:ClusterIP用于内部通信,NodePort临时暴露,LoadBalancer生产对外服务;
  3. Ingress​:基于域名/路径路由流量,需配合Controller实现高级功能。

掌握这些知识,不仅能通过面试,更能高效运维K8s集群——这才是云原生工程师的核心竞争力。

参考资料​:

  • K8s官方文档(Scheduler策略、Service类型、Ingress配置);
  • 《Kubernetes权威指南》(张磊著);
  • 工具:kubectl describe ingress(调试Ingress)、kube-proxy日志分析。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐