【Kubernetes】Service 的类型有哪些?ClusterIP、NodePort 和 LoadBalancer 的区别?

  • 在 Kubernetes 中,Service 是一种抽象的方式,用于将一组 Pod 进行连接并暴露给外部或集群内部访问。
  • 它的主要目的是通过提供稳定的 IP 地址和端口来允许其他服务或客户端与一组 Pod 进行通信。

Service 类型

Kubernetes 中 Service 有四种主要类型,分别是:

  1. ClusterIP (默认类型)
  2. NodePort
  3. LoadBalancer
  4. ExternalName

各种类型的区别

1. ClusterIP
  • 作用 :这是默认的 Service 类型,主要用于集群内部的访问。它为 Service 分配一个集群内的 IP 地址。

  • 访问范围:仅限于 Kubernetes 集群内部的其他 Pod 可以访问该 Service,不能从外部直接访问。

  • 适用场景:用于集群内部服务之间的通信,例如微服务架构中的内部通信。

  • 示例 :

    yaml 复制代码
    kind: Service
    apiVersion: v1
    metadata:
      name: my-service
    spec:
      type: ClusterIP
      selector:
        app: my-app
      ports:
        - port: 80
          targetPort: 8080
2. NodePort
  • 作用 :通过为每个 Node 分配一个端口号(NodePort)来暴露 Service,从而可以通过集群中任意 Node 的 IP 和指定端口访问 Service。

  • 访问范围 :可以从集群外部通过 <NodeIP>:<NodePort> 的方式访问服务。通常会与 ClusterIP 配合使用,前者处理集群内部流量,后者则暴露端口给外部。

  • 适用场景:适用于需要从外部访问 Kubernetes 集群内服务的场景,比如开发测试环境。

  • 示例 :

    yaml 复制代码
    kind: Service
    apiVersion: v1
    metadata:
      name: my-service
    spec:
      type: NodePort
      selector:
        app: my-app
      ports:
        - port: 80
          targetPort: 8080
          nodePort: 30007  # 端口号通常在 30000-32767 之间
3. LoadBalancer
  • 作用 :为 Service 提供一个外部负载均衡器(例如 AWS ELB、GCP Load Balancer 等)。当使用 LoadBalancer 类型时,Kubernetes 会自动请求云服务提供商来创建一个负载均衡器并将流量转发到集群中的 Service。

  • 访问范围:可以通过外部负载均衡器的 IP 地址或域名访问集群中的 Service。

  • 适用场景:适用于需要高可用、可伸缩、并且从外部可以访问的服务,如生产环境中的 Web 应用。

  • 示例 :

    yaml 复制代码
    kind: Service
    apiVersion: v1
    metadata:
      name: my-service
    spec:
      type: LoadBalancer
      selector:
        app: my-app
      ports:
        - port: 80
          targetPort: 8080
4. ExternalName
  • 作用 :通过一个 CNAME 记录,将 Service 映射到外部的 DNS 名称。这意味着该 Service 不会指向集群内的 Pod,而是指向外部的某个 DNS 记录。

  • 访问范围:用于从 Kubernetes 集群内部访问外部服务。

  • 适用场景:适用于需要将外部服务映射到集群内部的场景,例如访问外部的数据库或 API 服务。

  • 示例 :

    yaml 复制代码
    kind: Service
    apiVersion: v1
    metadata:
      name: my-service
    spec:
      type: ExternalName
      externalName: example.com  # 外部 DNS 名称

总结:ClusterIP、NodePort 和 LoadBalancer 的区别

类型 访问范围 适用场景 是否支持外部访问 使用场景例子
ClusterIP 集群内部访问 集群内服务间的通信 否 微服务之间的内部通信
NodePort 集群内外访问,外部通过 Node IP 和端口访问 需要从集群外部访问服务 是 测试环境或开发环境中访问服务
LoadBalancer 集群内外访问,提供外部负载均衡器 从外部访问服务,需要高可用、负载均衡 是 生产环境中需要外部访问的 Web 应用
ExternalName 外部 DNS 名称映射 将外部服务映射为 Kubernetes 内部服务 是 访问外部的数据库或 API 服务

小结

  • ClusterIP:只限内部访问,适合内部服务通信。
  • NodePort:允许外部通过指定端口访问集群,适合开发测试环境。
  • LoadBalancer:提供外部负载均衡器,适合生产环境。
  • ExternalName:通过外部 DNS 名称访问服务,适合连接外部资源。

https://github.com/0voice

相关推荐
罗小爬EX14 小时前
Helm 从概念到实战:以一个普通 Web 应用为例
云原生·helm
java_logo14 小时前
Docker 部署 DeepSeek Harness(moelin):轻松搭建带登录的本地 AI Agent 平台
运维·docker·容器·ai agent·deepseek·harness·轩辕镜像
xbzb15 小时前
容器 IP 每次重建都变?docker network 五种模式与自定义网桥固定地址
网络·docker·容器·ip·network·固定
打工仔折腾 AI19 小时前
Changedetection.io 网页变动监控:Docker 部署、通知配置与公网暴露实践
运维·人工智能·后端·python·docker·容器·性能优化
fengkai454520 小时前
Prometheus+K8s弹性伸缩综合项目
运维·kubernetes·k8s·prometheus·hpa·vpa
分布式存储与RustFS1 天前
镜像仓库的层别只堆本地盘:用 RustFS 给 Harbor 当 S3 后端
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
分布式存储与RustFS1 天前
工作流脚本和依赖 JAR 散在各节点本地盘:用 DolphinScheduler 资源中心接到 RustFS
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
Eyfcom1 天前
〖物流云原生实战 01〗K8s Operator 在物流定时任务中的实践:从“裸 CronJob”到“声明式任务编排”
云原生·物流管理系统·物流云原生实战
阿里云云原生2 天前
阿里云智能体白皮书开源进展
云原生
阿里云云原生2 天前
万联智策基于 AgentCore 构建数字员工团队,800+智能体规模化落地
云原生