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 取决于你的具体需求和使用场景。

相关推荐
Shacoray4 小时前
K8s 中 Ingress 的 HTTPS 证书 如何生成?
容器·https·kubernetes
开发者联盟league4 小时前
使用Jenkins整合Sonarqube/Gitlab/Harbor/Kubernetes的Demo工程
kubernetes·gitlab·jenkins
Patrick_Wilson4 小时前
Node.js SSR 内存治理:为什么 --max-old-space-size 不等于进程内存
kubernetes·node.js·v8
开发者联盟league4 小时前
使用k8s安装Jenkins
容器·kubernetes·jenkins
成为你的宁宁6 小时前
【基于 Prometheus Operator 实现 K8s 环境下 Redis Cluster 集群监控部署】
redis·kubernetes·prometheus
是一个Bug6 小时前
Docker 与 Kubernetes:从“集装箱”到“远洋舰队”
docker·容器·kubernetes
java_cj6 小时前
阅读 k8s 源码的准备工作
云原生·容器·kubernetes
开发者联盟league7 小时前
使用Jenkins整合Sonarqube/Gitlab/Harbor/Kubernetes实现CICD
kubernetes·gitlab·jenkins
鹤落晴春20 小时前
【K8s】Pod调度、configMaps
云原生·容器·kubernetes
张忠琳20 小时前
【runc 1.4.2】(Part 2)runc 1.4.2 超深度分析 — CLI层:main.go、命令文件、runner、信号处理、TTY
云原生·kubernetes·runc