Pod IP 的本质与特性
Pod IP 的定位
- 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如
10.244.1.2
) - 无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”
- 生命周期:与 Pod 绑定,随 Pod 重建而改变
Pod IP 的关键特性
- 直接可达性:
- 集群内任何节点/Pod 可直接访问
- 无需 NAT(取决于网络插件)
- 临时性:
- Pod 重建时 IP 会改变
- 不适合直接用于服务发现
- 网络隔离:
- 不同命名空间的 Pod 默认互通
- 可通过 NetworkPolicy 限制访问
Service:智能负载均衡抽象层
Service 本质上是为一组 Pod 提供的负载均衡抽象。具体来说:
Service 的三种核心 IP/Port 类型
类型 | 访问范围 | 实现方式 | 示例 |
---|---|---|---|
ClusterIP | 仅集群内部 | 虚拟 IP + iptables/IPVS | 10.96.91.238:8000 |
NodePort | 全网可访问 | 节点端口映射 | <NodeIP>:30948 |
LoadBalancer | 外部流量 | 云厂商负载均衡器集成 | 云厂商提供的公网 IP |
Service 负载均衡架构
负载均衡实现细节
Endpoint 自动管理:
# kubectl get endpoints my-dep NAME ENDPOINTS AGE my-dep 10.244.1.2:80,10.244.1.3:80,10.244.2.4:80 1d
流量分发算法:
- 默认:随机轮询(RR)
- 可选:会话保持(sessionAffinity)
- 高级:Istio 的权重分流
健康检查机制:
- 自动移除不健康的 Pod
- 通过 readinessProbe 判断
readinessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 5 periodSeconds: 10
为什么需要 Service 抽象层?
解决 Pod 直连的四大问题
动态性问题
Pod 可能随时扩缩容/重建,IP 不可靠服务发现问题
客户端如何知道哪些 Pod 可用?负载均衡需求
流量如何均匀分发到多个副本?访问策略统一
如何实施一致的流量策略(如超时、重试)?
Service 的解决方案
实际访问场景对比
场景 1:集群内部访问
# 通过 ClusterIP 访问
curl http://10.96.91.238:8000
# 通过 DNS 访问(推荐)
curl http://my-dep.default.svc.cluster.local:8000
路径:
客户端 → Service 虚拟 IP → iptables 规则 → 后端 Pod
场景 2:外部用户访问
# 通过 NodePort 访问
curl http://<任意节点IP>:30948
路径:
用户 → 节点 IP:30948 → kube-proxy → Service → 后端 Pod
场景 3:云环境访问
# 通过 LoadBalancer IP
curl http://<云负载均衡IP>
路径:
用户 → 云 LB → NodePort → Service → 后端 Pod
高级负载均衡模式
1. 拓扑感知路由
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
topologyKeys: ["topology.kubernetes.io/zone"]
2. 流量镜像
apiVersion: networking.k8s.io/v1
kind: Service
metadata:
name: mirror-service
spec:
ports:
- port: 80
selector:
app: frontend
trafficPolicy:
mirror:
service: debug-service
3. 基于权重的金丝雀发布
apiVersion: split.smi-spec.io/v1alpha1
kind: TrafficSplit
metadata:
name: canary-split
spec:
service: my-service
backends:
- service: v1
weight: 90
- service: v2
weight: 10
生产环境实践
1. 服务命名规范
# 好名字:明确表达服务功能
metadata:
name: payment-service
# 坏名字:无意义标识
metadata:
name: svc-1234
2. 端口管理策略
ports:
- name: http # 使用命名端口
port: 8080
targetPort: web
- name: metrics
port: 9090
targetPort: 9090
3. 结合 Ingress 使用
apiVersion: networking.k8s.io/v1
kind: Ingress
spec:
rules:
- host: api.example.com
http:
paths:
- path: /v1/payments
pathType: Prefix
backend:
service:
name: payment-service
port:
number: 8080
4. 网络策略加固
kind: NetworkPolicy
spec:
podSelector:
matchLabels:
app: payment-service
ingress:
- from:
- namespaceSelector:
matchLabels:
env: prod
ports:
- protocol: TCP
port: 8080
结论:Service 的核心价值
这种设计解决了分布式系统中的关键问题:
稳定性:
提供固定访问端点,隔离 Pod 变化可发现性:
通过 DNS 实现服务自动发现扩展性:
无缝支持 Pod 水平扩缩容流量管理:
内置负载均衡和会话保持能力策略统一:
在单一入口实施安全/监控策略
理解 Pod IP 作为基础网络端点与 Service 作为智能抽象层的关系,是掌握 Kubernetes 服务网络的核心。这种分层设计使 Kubernetes 既能保持基础设施的灵活性,又能为应用提供稳定的服务访问体验。