1. 首页
  2. Kubernetes
  3. 正文

Kubernetes中的三种Service类型的区别

2020年1月10日 359点热度 0人点赞 0条评论

在 Kubernetes 中,Service 是用于将一组 Pod 网络映射到集群内或集群外部的网络访问的方式,其中Service 的 type 字段定义了服务方式。service存在三种类型:type: ClusterIP、type: LoadBalance、type: Nodeport,以下将详细介绍着三种类型的区别。

type: ClusterIP(默认值)

Service 的 type 字段为 ClusterIP 时,表示将服务映射为集群内部的一个虚拟 IP 地址,在集群内部的其他 Pod 中可以通过这个虚拟的ip地址访问该服务。这种方式使得你的服务可以被其他 Pod 使用,但不能从集群外部直接访问。


    apiVersion: v1
    kind: Service
    metadata:
      name: mysql-svc
    spec:
      type: ClusterIP # 默认值
      selector:
        app: mysql # 匹配 metadata.labels.app: my-app 值的Pod
      ports:
      - protocol: TCP # 使用的协议
        port: 3306 # 该Service暴露的端口
      targetPort: 3306 # 容器内部的暴露的端口

上述所定义的service资源将在默认的命名空间内生效,当我们需要与标签存在`app: my-app`的Pod上的Mysql通信时,使用该service.name作为Host访问,例如:mysql-svc:3306。更进一步,当一个service资源仅定义了一个映射暴露出来的端口时,不需要显示指定该service端口,直接使用host:mysql-svc来访问Mysql。

这种方式适用于集群内部的服务发现和内部通信。具体来说,type: ClusterIP 的 Service 会在底层执行以下操作:

  1. 分配 IP 地址: 当你创建一个 Service 并将 type 设置为 ClusterIP 时,Kubernetes 会为这个服务分配一个虚拟 IP 地址。这个 IP 地址只在集群内部可见。
  2. 选择器匹配: Service 通常通过选择器(labels 和 selectors)来选择一组后端 Pod。这些 Pod 是 Service 所代理的目标。
  3. 流量转发: 当其他 Pod 内部的应用程序想要访问该 Service 时,它们可以使用该虚拟 IP 地址。流量将从请求的 Pod 发送到后端 Pod。

需要注意以下几点:

  1. ClusterIP 类型的 Service 仅在集群内部可见,无法从集群外部直接访问。
  2. 如果你想将服务暴露到集群外部,可以使用其他 type,如 NodePort 或 LoadBalancer。
  3. 在 Kubernetes 中,ClusterIP 是默认的 Service 类型,如果不显式地指定 type,则会使用 ClusterIP。
  4. 通过 ClusterIP 类型的 Service,你可以实现微服务架构中的服务发现和内部通信。

type: LoadBalance

Service 的 type 字段为 LoadBalancer 时,表示该服务可以在集群外部访问到,这是可用于将服务暴露到集群外部的方式之一。该方式通常由云服务提供商(如AWS、Azure、GCP)或者本地部署的负载均衡器来支持实现。这对于需要公共 IP 地址和负载均衡功能的应用程序非常有用,例如 Web 应用程序、API 服务等。

将 type 设置为 LoadBalancer 时,Kubernetes 会在底层自动与云提供商的负载均衡器集成,以便将流量从集群外部引导到你的服务。具体的操作步骤可能会因云提供商而异,但基本流程如下:

  1. 创建 Service: 在 Kubernetes 中,创建一个 Service 并将 type 设置为 LoadBalancer。你还可以指定需要暴露的端口、后端 Pod 的选择器等。
  2. 云提供商操作: 一旦创建了带有 LoadBalancer 类型的 Service,Kubernetes 会与云提供商进行交互。云提供商会为你创建一个外部负载均衡器,并为它分配一个公共 IP 地址。
  3. 绑定负载均衡器: Kubernetes 会将外部负载均衡器配置为将流量转发到你的服务。当外部用户访问负载均衡器的 IP 地址和端口时,负载均衡器会将流量传递给你的服务的 Pod。
  4. 流量管理: 外部负载均衡器会将流量平均分发到多个运行中的 Pod 上,实现负载均衡。如果有新的 Pod 添加到 Service 的选择器范围内,负载均衡器会自动将其纳入流量分发。

type: Nodeport

在 Kubernetes 中,Service 的 type 字段可以设置为 NodePort,表示将服务暴露到集群的每个节点上的一个特定端口上。换句话说,我们可以使用集群内任何一个节点(物理主机、云服务器)上的IP地址访问(严格来说应该是运行有容器网络插件的Pod所处的节点),从而实现外部与集群内部该 Service 通信。这是一种相对简单的外部访问方式,适用于开发、测试或一些小规模场景。

具体来说,type: NodePort 的 Service 在底层执行以下操作:

  1. 分配端口: 当你创建一个 Service 并将 type 设置为 NodePort 时,Kubernetes 会为这个服务分配一个随机的端口号(通常在 30000-32767 范围内)。
  2. 绑定节点: Service 会将这个分配的端口绑定到每个集群节点的 IP 地址上。
  3. 转发流量: 当外部用户通过任何节点的 IP 地址和分配的端口访问服务时,流量会被转发到 Service 所代理的一组 Pod 上。

但需要注意以下几点:

  1. 每个节点都会监听相同的分配端口,所以你可以通过任何节点的 IP 地址和分配的端口来访问服务。
  2. 虽然 NodePort 提供了外部访问的方式,但并不是特别适合直接在生产环境中使用。通常会使用负载均衡器(如云提供商的负载均衡器)将外部流量引导到 NodePort。
  3. 由于分配的端口是随机的,可能会造成不方便。如果你想要指定端口号,可以创建带有 nodePort 字段的 Service 对象,但仍然需要确保端口在 30000-32767 范围内。
标签: K8s Kubernetes
最后更新:2023年10月22日

Evans Ann

It's no use crying over spilt milk.

点赞
< 上一篇

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

归档

  • 2023 年 11 月
  • 2023 年 10 月
  • 2021 年 1 月
  • 2020 年 8 月
  • 2020 年 1 月
  • 2019 年 8 月

分类目录

  • Docker
  • JavaScript
  • Kubernetes
  • Linux
  • PHP
  • Windows
  • 基础
  • 正则表达式
  • 英语

COPYRIGHT © 2018-2024 秋雨沥沥. ALL RIGHTS RESERVED.

赣ICP备18001671号-3