Kubernetes 网络 — Broken Labs 与 事件响应

发布: (2026年1月10日 GMT+8 06:29)
8 分钟阅读
原文: Dev.to

Source: Dev.to

当流量出现故障时,切勿猜测。
始终遵循以下顺序:

Ingress

Service

Endpoints

Pod

Container

如果某一层出现故障,其上层的所有内容都会失效

实验 1 — ClusterIP 服务(最常见的生产故障)

ClusterIP diagram
Pod‑Service mismatch GIF

场景

  • Pod 运行中
  • Service 已存在
  • 浏览器 / curl 没有返回 任何内容

错误的配置

Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api
spec:
  replicas: 2
  selector:
    matchLabels:
      app: api
  template:
    metadata:
      labels:
        app: api-v1   # ❌ 错误的标签
    spec:
      containers:
      - name: app
        image: hashicorp/http-echo:0.2.3
        args:
          - "-listen=:8080"
          - "-text=API OK"
        ports:
        - containerPort: 8080

Service

apiVersion: v1
kind: Service
metadata:
  name: api-svc
spec:
  selector:
    app: api   # ❌ 不匹配
  ports:
  - port: 80
    targetPort: 8080

症状

kubectl get pods
kubectl get svc
kubectl get endpoints api-svc

输出

ENDPOINTS: 

根本原因

Service 的 selector 匹配 Pod 的标签。

修复方法

kubectl edit deployment api

将 Pod 的标签改为与 Service selector 匹配:

labels:
  app: api

验证:

kubectl get endpoints api-svc

DevOps 面试答案

问: Service 已存在但没有流量,Pod 正在运行。你会检查什么?
答: 检查 Endpoints。空的 endpoints 表明 selector 不匹配或就绪状态有问题。

何时使用 ClusterIP

  • 内部 API
  • 后端服务
  • 微服务

优缺点

优点

  • 安全(不对外暴露)
  • 在集群内部拥有稳定 IP
  • 随 Pod 数量自动扩展

缺点

  • 只能在集群内部访问

实验 2 — NodePort(为何它很危险)

NodePort 图示
NodePort 问题动图

场景

  • NodePort 已暴露
  • 有时可以工作
  • 节点更换后失效

部署示例

apiVersion: v1
kind: Service
metadata:
  name: node-svc
spec:
  type: NodePort
  selector:
    app: api
  ports:
  - port: 80
    targetPort: 8080
    nodePort: 30080

症状

  • 通过 某个节点的 IP 访问服务时可用
  • 使用其他节点的 IP 时失败
  • 安全团队标记了这些开放端口

根本原因

NodePort 会在集群的 每个节点 上打开相同的端口,无法控制路由,导致服务依赖于你访问的节点 IP。

DevOps 解决方案

NodePort 替换为以下任意一种方式:

  • ClusterIP + Ingress
  • LoadBalancer(如果云提供商支持)

面试答案

问: 为什么在生产环境中很少使用 NodePort?
答: 它会暴露所有节点,缺乏细粒度的安全和路由控制,且扩展性差。

NodePort 可接受的场景

  • 调试 / 快速测试
  • 临时的外部访问
  • 学习或沙箱环境

Source:

实验 3 — LoadBalancer 服务(云环境)

LoadBalancer overview
LoadBalancer provisioning GIF

场景

  • LoadBalancer 类型的 Service 会创建一个外部 IP
  • 应用仍然无法访问

部署清单

apiVersion: v1
kind: Service
metadata:
  name: lb-svc
spec:
  type: LoadBalancer
  selector:
    app: api
  ports:
  - port: 80
    targetPort: 8080

症状

kubectl get svc

典型输出会显示已分配的外部 IP,但使用 curl 或浏览器仍然访问不到该服务。

常见根本原因

  1. 云提供商延迟 – 外部负载均衡器可能仍在创建中。
  2. 防火墙规则缺失 – 云防火墙阻止了对分配端口的流量。
  3. Pod 就绪状态 – Pod 未就绪,导致负载均衡器没有健康的后端节点。

修复检查清单

  • 等待 EXTERNAL-IP 列显示真实的 IP(而不是 “)。
  • 确认云防火墙 / 安全组已放行服务端口的入站流量(通常是 80 或 443)。
  • 确认 Pod 为 Ready 状态(kubectl get pods),并且 Service 已有端点(kubectl get endpoints lb-svc)。
  • 若使用私有 VPC,确保能够访问该 IP(VPN、跳板机等)。

DevOps 面试答案

问: LoadBalancer Service 显示外部 IP,但应用不可达。你会检查哪些方面?
答:

  1. 云提供商的负载均衡器创建/配置状态。
  2. 防火墙或安全组规则。
  3. Pod 的就绪情况以及 Service 的端点是否已填充。

额外的 LoadBalancer 故障排查

LoadBalancer 问题与排查

  • External IP 已存在
  • 浏览器超时

排查步骤

kubectl describe svc lb-svc
kubectl get endpoints lb-svc

检查云端

  • 健康检查
  • 安全组
  • 目标端口不匹配

根本原因

云端 LB 健康检查失败,原因可能是:

  • 端口错误
  • 应用未监听
  • Readiness probe 失败

DevOps 解决方案

  • 对齐端口
  • 添加 readiness probe
  • 验证安全组

面试答案

问: 为什么不对每个服务都使用 LoadBalancer
答: 成本较高、缺乏路由功能,并且相较于 Ingress 灵活性受限。

LAB 4 — Ingress(最常被面试的话题)

Ingress Overview
Ingress Example

场景

  • 已创建 Ingress
  • 返回 404 错误

损坏的 Ingress 清单

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
spec:
  rules:
  - http:
      paths:
      - path: /app
        pathType: Prefix
        backend:
          service:
            name: wrong-svc   # ❌ wrong name
            port:
              number: 80

症状

  • Ingress IP 正常
  • 总是返回 404

故障排除

kubectl describe ingress
kubectl get svc
kubectl get pods -n ingress-nginx

根本原因

Ingress 路由指向了一个不存在的服务。

修复

在 Ingress 规范中纠正后端服务名称。

面试答案

Q: Ingress 返回 404 时,你首先检查什么?
A: 检查 Ingress 规则、服务名称、服务端口以及控制器日志。

Source:

实验 5 — DNS 故障(隐藏杀手)

DNS Failure 1
DNS Failure 2

场景

  • 服务已存在
  • DNS 名称解析失败

测试

kubectl run test --rm -it --image=busybox -- sh
nslookup api-svc

根本原因

  • CoreDNS 未运行
  • 命名空间错误
  • 服务被删除

解决办法

kubectl get pods -n kube-system | grep dns

如有必要,重新启动 DNS Pod。

面试答案

问: Pod 如何发现服务?
答: 通过 Kubernetes DNS,将 Service 名称解析为其 ClusterIP。

事件响应手册 (Real DevOps)

步骤指南

  1. 检查 Ingress
  2. 检查 Service
  3. 检查 Endpoints
  4. 检查 Pod 就绪状态
  5. 检查容器日志

绝不要跳过步骤。

最终决策矩阵(非常重要)

RequirementUse
内部流量ClusterIP
外部生产流量Ingress
云简易暴露LoadBalancer
仅调试NodePort

面试快速问答(必须记住)

  • Q: 空的端点意味着什么?
    A: 选择器不匹配或就绪失败。

  • Q: 生产环境中最常用的服务是什么?
    A: ClusterIP

  • Q: 为什么使用 Ingress?
    A: 路由、TLS、成本效益。

  • Q: 生产环境中使用 NodePort 吗?
    A: 避免。

真正的 DevOps 真相

网络问题是:

  • 可预测的
  • 分层的
  • 始终可观察的

在苦苦挣扎与快速解决之间的差异是 有条理的思考

Back to Blog

相关文章

阅读更多 »

你好,我是新人。

嗨!我又回到 STEM 的领域了。我也喜欢学习能源系统、科学、技术、工程和数学。其中一个项目是…