Service

Service 为一组 Pod 提供稳定的网络访问入口,实现服务发现和负载均衡。

工作原理
flowchart LR
    C[Client] --> S[Service]
    S --> P1[Pod 1]
    S --> P2[Pod 2]
    S --> P3[Pod 3]
                                
Service 类型
类型访问范围适用场景
ClusterIP集群内部内部服务
NodePort集群外部开发测试
LoadBalancer公网访问生产环境
ExternalName外部服务映射映射外部服务到集群内部
Service 流量转发机制
ClusterIP 流量转发

工作原理:ClusterIP Service分配一个集群内部虚拟IP,通过iptables或IPVS规则将流量转发到后端Pod。

graph LR
    Client[集群内客户端] --> SVC[ClusterIP Service
10.96.0.10:80] SVC --> EP1[Pod A
10.1.1.10:8080] SVC --> EP2[Pod B
10.1.1.11:8080] SVC --> EP3[Pod C
10.1.1.12:8080] style SVC fill:#e3f2fd style EP1 fill:#e8f5e8 style EP2 fill:#e8f5e8 style EP3 fill:#e8f5e8

实现方式: kube-proxy监听Service和Endpoints变化,动态更新iptables规则或IPVS条目,实现负载均衡。

NodePort 流量转发

工作原理:在每个节点上开放一个端口,外部通过NodeIP:NodePort访问,流量先到达节点端口,再转发到ClusterIP Service,最后转发到Pod。

graph LR
    ExtClient[外部客户端] --> NodePort[NodeIP:30080]
    NodePort --> SVC[ClusterIP Service
10.96.0.10:80] SVC --> EP1[Pod A
10.1.1.10:8080] SVC --> EP2[Pod B
10.1.1.11:8080] style NodePort fill:#fff3e0 style SVC fill:#e3f2fd

实现方式: NodePort实际上是ClusterIP的扩展,在每个节点上开放端口,并通过iptables规则将该端口流量重定向到Service的ClusterIP。

LoadBalancer 流量转发

工作原理:在公有云环境中,LoadBalancer会创建云提供商的负载均衡器,并将其路由到节点上的NodePort,再转发到Pod。

graph LR
    subgraph "云环境"
        ExtClient[外部客户端]
        LB[云负载均衡器]
    end
    
    subgraph "K8s 集群"
        NodePort[NodePort
30080] SVC[ClusterIP Service
10.96.0.10:80] EP1[Pod A] EP2[Pod B] end ExtClient --> LB LB --> NodePort NodePort --> SVC SVC --> EP1 SVC --> EP2

实现方式: LoadBalancer依赖于云提供商的控制器,创建外部负载均衡器资源,并配置其将流量导向集群节点。

ExternalName 流量转发

工作原理:ExternalName Service不通过kube-proxy处理,而是直接在集群DNS中创建CNAME记录,将服务名映射到指定的外部域名。

graph LR
    App[集群内应用] --> DNS[集群DNS]
    DNS -.-> CNAME["CNAME 记录
my-service --> external.example.com"] App -.-> Ext[外部服务
external.example.com] style DNS fill:#f3e5f5 style Ext fill:#ffebee

实现方式: 当应用访问Service名称时,集群DNS直接返回CNAME记录,将请求转发到外部域名,不经过kube-proxy或任何Pod。

kube-proxy 工作模式
模式实现方式特点性能
userspace 在用户空间处理流量转发 最早的实现方式,性能较低
iptables 使用Linux内核iptables规则 目前主流方式,性能好
IPVS 使用Linux内核IPVS模块 最新方式,支持更多负载均衡算法 最高
ExternalName 类型详解

ExternalName Service 是一种特殊类型的 Service,它不指向 Pod,而是将服务映射到 DNS 名称。这种类型的 Service 通过返回 CNAME 记录和其映射的值来工作。

flowchart LR
    subgraph "K8s Cluster"
        App[应用 Pod]
        S[ExternalName Service
my-external-service] end S -.-> EX[External Service
external.example.com] App --> S S --> EX
# 创建 ExternalName 类型的 Service
apiVersion: v1
kind: Service
metadata:
  name: my-external-service
spec:
  type: ExternalName
  externalName: external.example.com
# 使用 kubectl 创建 ExternalName Service
kubectl create service externalname my-external-service --external-name external.example.com
# 验证 ExternalName Service
kubectl get service my-external-service
# 测试 DNS 解析
nslookup my-external-service.default.svc.cluster.local
常用命令
# 暴露 Deployment 为 Service
kubectl expose deployment nginx --port=80 --target-port=80
# 创建 NodePort 类型 Service
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看所有 Service
kubectl get services
# 查看 Endpoints
kubectl get endpoints nginx