【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

相关推荐
灰勒塔德12 小时前
ubuntu 部署 gitlab docker服务
docker·容器·gitlab
啟明起鸣13 小时前
【Go 与云原生】先从 Go 对与云原生的依赖关系讲起,再讲讲 一个简单的 Go 项目热热身
开发语言·云原生·golang
@不会写代码的小张13 小时前
传统的企业服务如何部署在k8s集群中
云原生·容器·kubernetes
Juchecar16 小时前
超越经典23种设计模式:新模式、反模式与函数式编程
设计模式·云原生·函数式编程
深蓝电商API17 小时前
云原生爬虫:使用Docker和Kubernetes部署与管理分布式爬虫集群
docker·kubernetes
啟明起鸣18 小时前
【Go 与云原生】让一个 Go 项目脱离原生的操作系统——我们开始使用 Docker 制造云容器进行时
docker·云原生·golang
橙色云-智橙协同研发1 天前
【PLM实施专家宝典】离散制造企业MBD与无纸化制造实施方案:从“图纸驱动”到“数据驱动”的革命
云原生·解决方案·数字化转型·plm·国产plm·专家经验·无纸化
victory04311 天前
K8S重启之后无法启动故障排查 与 修复
云原生·容器·kubernetes
研究司马懿1 天前
【ETCD】ETCD常用命令
网络·数据库·云原生·oracle·自动化·运维开发·etcd
java_logo1 天前
SGLANG Docker容器化部署指南
linux·运维·docker·容器·eureka·1024程序员节