k8s 中的 Service 类型(ClusterIP、NodePort、LoadBalancer)详解

在 Kubernetes(k8s)中,Service 是一种抽象,它定义了一组逻辑上的 Pod 和一个访问它们的策略。Service 通过标签选择器(label selector)来发现后端的 Pod,并为这些 Pod 提供一个稳定的网络接口,使得外部客户端可以通过这个接口访问到这些 Pod。k8s 提供了几种不同类型的 Service,每种类型都有其特定的用途和特点,下面详细介绍 ClusterIP、NodePort 和 LoadBalancer 这三种类型。

1. ClusterIP

ClusterIP 是默认的 Service 类型。当创建一个 ClusterIP 类型的 Service 时,k8s 会为这个 Service 分配一个虚拟的 IP 地址(ClusterIP),这个 IP 地址只在集群内部有效,不能从集群外部访问。

特点

  • 内部访问:ClusterIP 类型的 Service 主要用于集群内部的通信。例如,一个 Pod 可以通过这个 Service 的 ClusterIP 和端口来访问其他 Pod。
  • 稳定的 IP 地址:即使后端的 Pod 发生变化(如 Pod 被删除或重新创建),Service 的 ClusterIP 和端口仍然保持不变。
  • 负载均衡:当有多个 Pod 匹配 Service 的标签选择器时,k8s 会自动实现负载均衡,将请求均匀地分配到这些 Pod 上。

使用场景

  • 微服务架构:在微服务架构中,不同的服务之间需要相互调用。通过 ClusterIP 类型的 Service,可以方便地实现服务之间的通信。
  • 内部通信:当应用需要在集群内部进行通信,但不需要从集群外部访问时,ClusterIP 是一个合适的选择。

示例

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

在上面的示例中,创建了一个名为 my-service 的 Service,它通过标签选择器 app: my-app 找到匹配的 Pod,并将访问端口 80 的流量转发到 Pod 的 9376 端口。

2. NodePort

NodePort 类型的 Service 会在集群的每个节点上开放一个固定的端口(NodePort),外部可以通过 <NodeIP>:<NodePort> 的方式访问到 Service。

特点

  • 外部访问:NodePort 类型的 Service 允许从集群外部访问 Service。
  • 固定端口:每个节点上开放的端口是固定的,范围通常在 30000-32767 之间。
  • 简单易用:不需要额外的负载均衡器,直接通过节点的 IP 和端口访问即可。

使用场景

  • 小型集群:在小型集群中,NodePort 是一种简单且成本较低的外部访问方式。
  • 测试环境:在开发和测试阶段,NodePort 可以快速地让外部访问到集群内的服务。

示例

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376
      nodePort: 30007

在上面的示例中,创建了一个 NodePort 类型的 Service,它会在每个节点上开放端口 30007,外部可以通过 <NodeIP>:30007 的方式访问到 Service。

3. LoadBalancer

LoadBalancer 类型的 Service 通常用于云服务提供商的环境中,它会创建一个外部的负载均衡器,并将流量转发到 Service 的后端 Pod。

特点

  • 外部访问:LoadBalancer 类型的 Service 提供了一个外部可访问的 IP 地址,外部客户端可以通过这个 IP 地址访问到 Service。
  • 高可用性:云服务提供商的负载均衡器通常具有高可用性,可以自动处理故障转移。
  • 自动扩展:一些云服务提供商的负载均衡器支持自动扩展,可以根据流量自动调整资源。

使用场景

  • 生产环境:在生产环境中,LoadBalancer 是一种常用的外部访问方式,可以提供高可用性和自动扩展。
  • 云服务环境:在使用云服务提供商(如 AWS、Azure、GCP 等)时,LoadBalancer 是一种方便的外部访问方式。

示例

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: LoadBalancer
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

在上面的示例中,创建了一个 LoadBalancer 类型的 Service。云服务提供商会自动创建一个外部负载均衡器,并将流量转发到 Service 的后端 Pod。

总结

  • ClusterIP:适用于集群内部通信,提供稳定的内部访问接口。
  • NodePort:适用于小型集群或测试环境,通过节点的 IP 和端口访问。
  • LoadBalancer:适用于生产环境和云服务环境,提供高可用性和自动扩展的外部访问方式。

选择哪种类型的 Service 取决于你的具体需求和使用场景。

相关推荐
李少兄4 小时前
Kubernetes 日志管理
docker·容器·kubernetes
秋饼5 小时前
【K8S测试程序--git地址】
git·容器·kubernetes
oMcLin5 小时前
如何在RHEL 9上配置并优化Kubernetes 1.23高可用集群,提升大规模容器化应用的自动化部署与管理?
kubernetes·自动化·php
ghostwritten5 小时前
Kubernetes 网络模式深入解析?
网络·容器·kubernetes
原神启动16 小时前
K8S(七)—— Kubernetes Pod 基础概念与实战配置
云原生·容器·kubernetes
不想画图6 小时前
Kubernetes(五)——rancher部署和Pod详解
linux·kubernetes·rancher
大都督老师6 小时前
配置 containerd 使用镜像加速器拉取 Docker Hub 镜像
容器·kubernetes·k8s
木童66217 小时前
Kubernetes 操作管理完全指南:从陈述式到声明式,覆盖全生命周期
云原生·容器·kubernetes
不想画图18 小时前
Kubernetes(三)——组网概念和基础操作指令
云原生·容器·kubernetes
weixin_4624462321 小时前
K8s 集群部署基础:Linux 三节点 SSH 互信(免密登录)配置指南
linux·kubernetes·ssh