ArcLibrary

Pod / Service / Ingress 三连

K8s 网络的三层抽象 —— 把流量从外部一路打到容器进程。

K8s网络Ingress
核心 · Key Idea

一句话Pod 跑容器、Service 给一组 Pod 套稳定虚拟 IP + DNS、Ingress 把外部域名 / 路径转给 Service。三者堆在一起就是 K8s 的请求路径。

是什么#

# Pod 是工人 —— 通常通过 Deployment 管
# Service 是接待员 —— 把请求轮询转给后端 Pod
apiVersion: v1
kind: Service
metadata: { name: web, namespace: prod }
spec:
  selector: { app: web }
  ports: [{ port: 80, targetPort: 8080 }]
  type: ClusterIP        # 默认 —— 集群内可达
---
# Ingress 是大堂经理 —— 解析 Host / Path 路由
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt
spec:
  ingressClassName: nginx
  rules:
    - host: app.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service: { name: web, port: { number: 80 } }
  tls:
    - hosts: [app.example.com]
      secretName: web-tls

打个比方#

打个比方 · Analogy

Pod = 餐厅厨师,可能 3 个人在做同一道菜,IP 一直变。
Service = 传菜员,对外只一个稳定窗口;按算法把订单发给后厨任一空闲厨师。
Ingress = 大堂经理,把客人按预约(Host / Path)领去对应窗口。

Service 的几种类型#

ClusterIP
默认,集群内访问。配 DNS 名 svc.namespace.svc.cluster.local。
NodePort
在每个节点开一个 30000–32767 的端口,适合开发 / 调试。
LoadBalancer
云厂商给你创真负载均衡器(ALB / NLB / SLB),生产暴露用。
ExternalName
DNS CNAME 到外部域名,比如把 svc 别名指 RDS。
Headless (clusterIP: None)
不分配 VIP,直接返回所有 Pod 的 IP,StatefulSet 必备。

怎么工作#

kube-proxy 在每个节点维护 iptables/ipvs 规则,把 ClusterIP DNAT 到具体 Pod。

实操要点#

  • Pod IP 不要硬编码:永远通过 Service DNS(web.prod.svc.cluster.local,同 namespace 内省略后两段)。
  • Service 端口名字化ports: [{name: http, port: 80}],方便后续 Ingress / NetworkPolicy 引用。
  • Ingress Controller 是「集群外暴露」的主流方案:装一个就够(nginx / Traefik / Envoy / Caddy)。
  • TLS 自动化:装 cert-manager,annotation 一行自动签 Let's Encrypt 证书。
  • NodePort / LoadBalancer 与 Ingress 取舍:NodePort 多了 → 维护成本高;统一走 Ingress + 一个外部 LB 最干净。
  • NetworkPolicy:默认任意 Pod 互通;上 NetworkPolicy 可限制东西向流量,零信任基础。
  • 金丝雀 / 蓝绿:装 Argo Rollouts 或者 Istio,比手撸 weights 简单 100 倍

易混点#

Service
集群内**TCP / UDP** 抽象。
L4。
Ingress
集群外**HTTP / HTTPS** 路由。
L7,依赖 controller。

延伸阅读#