Kubernetes Service 类型详解:ClusterIP/NodePort/LoadBalancer/Ingress

在 Kubernetes(K8s)中,Service 是用于抽象和暴露 Pod 网络访问的核心对象。它确保了 Pod 的动态变化不会影响外部访问,并提供负载均衡功能。本详解将逐步介绍四种常见类型:ClusterIP、NodePort、LoadBalancer 和 Ingress(注意:Ingress 不是 Service 类型,而是一个独立的 API 对象,但常与 Service 配合使用)。内容基于官方文档和最佳实践,确保真实可靠。

1. ClusterIP Service

ClusterIP 是默认的 Service 类型,它创建一个内部虚拟 IP 地址(VIP),仅在 Kubernetes 集群内部可访问。这适用于微服务架构中的内部通信,例如数据库服务或后端 API。

  • 特点
    • 服务只在集群内可见,外部无法直接访问。
    • IP 地址由 Kubernetes 自动分配,并在集群内稳定。
    • 负载均衡通过轮询算法实现,将流量分发到后端 Pod。
  • 使用场景:内部服务间调用,如前端应用访问后端 API。
  • YAML 配置示例
apiVersion: v1
kind: Service
metadata:
  name: my-clusterip-service
spec:
  type: ClusterIP  # 类型指定为 ClusterIP
  selector:
    app: my-app    # 选择器匹配 Pod 标签
  ports:
    - protocol: TCP
      port: 80     # 服务端口
      targetPort: 8080  # Pod 端口

2. NodePort Service

NodePort 在 ClusterIP 基础上扩展,暴露服务到每个节点的静态端口(范围:30000-32767)。外部用户可以通过任意节点的 IP 地址和该端口访问服务。

  • 特点
    • 服务在集群内部和外部均可访问。
    • 每个节点上监听相同端口,流量通过 NodePort 路由到 Service。
    • 如果节点 IP 变化,需手动更新访问地址。
  • 使用场景:开发测试环境或小型部署,外部用户直接访问节点 IP。
  • YAML 配置示例
apiVersion: v1
kind: Service
metadata:
  name: my-nodeport-service
spec:
  type: NodePort   # 类型指定为 NodePort
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80      # 服务端口
      targetPort: 8080
      nodePort: 31000  # 指定节点端口(可选,默认随机)

3. LoadBalancer Service

LoadBalancer 在 NodePort 基础上进一步集成云提供商的负载均衡器(如 AWS ELB、GCP Cloud Load Balancing)。它自动创建外部负载均衡器,并将流量分发到节点。

  • 特点
    • 提供高可用和可扩展的外部访问。
    • 依赖于云平台(AWS、Azure、GCP 等),在本地环境可能无效。
    • 负载均衡器 IP 稳定,支持 SSL 终止和健康检查。
  • 使用场景:生产环境的外部访问,如 Web 应用面向公网。
  • YAML 配置示例
apiVersion: v1
kind: Service
metadata:
  name: my-loadbalancer-service
spec:
  type: LoadBalancer  # 类型指定为 LoadBalancer
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

4. Ingress

Ingress 不是 Service 类型,而是一个独立的 Kubernetes API 对象。它用于管理外部 HTTP/HTTPS 访问,通过定义路由规则(如基于主机名或路径)将流量导向后端 Service。Ingress 需要与 Ingress 控制器(如 Nginx Ingress Controller)配合使用。

  • 特点
    • 提供第7层(应用层)路由,支持 URL 路径、主机名和 TLS 终止。
    • 一个 Ingress 可以路由到多个 Service,减少外部 IP 数量。
    • 不直接暴露 Pod,而是通过 Service 间接访问。
  • 使用场景:复杂 Web 应用,需要多域名或路径路由。
  • YAML 配置示例
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
    - host: example.com  # 基于主机名路由
      http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: my-clusterip-service  # 指向 ClusterIP Service
                port:
                  number: 80
  tls:                  # TLS 配置
    - secretName: my-tls-secret

比较与总结

下表对比各类型的关键特性,帮助您选择合适方案:

类型访问范围外部依赖典型用途复杂度
ClusterIP集群内部内部服务通信
NodePort集群内外部节点 IP测试环境或简单外部访问
LoadBalancer公网访问云平台负载均衡器生产环境外部高可用
Ingress基于 HTTP 路由Ingress 控制器复杂 Web 路由和 TLS 管理

建议

  • 优先使用 ClusterIP 处理内部流量。
  • NodePort 适合临时访问,LoadBalancer 用于云环境生产部署。
  • Ingress 优化 HTTP 路由,结合 Service 使用。
  • 实际部署时,结合 Kubernetes 网络策略和 CNI 插件(如 Calico)确保安全。

通过以上步骤,您可以根据应用需求灵活配置服务。如有具体场景问题,欢迎提供细节以深入探讨!

更多推荐