Bootstrap

k8s 四种Service类型(ClusterIP、NodePort、LoadBalancer、ExternalName)详解

🐇明明跟你说过:个人主页

🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅

🔖行路有良友,便是天堂🔖

目录

一、引言

1、k8s概述

2、Service在Kubernetes中的作用

二、ClusterIP类型

1、ClusterIP 类型的特点和用途

2、ClusterIP 的工作机制

3、创建示例

4、ClusterIP 使用场景 

三、NodePort类型

1、NodePort 类型的特点和用途

2、NodePort 的工作机制

3、创建示例

4、NodePort 使用场景

5、注意事项

四、LoadBalancer类型

1、LoadBalancer 类型的特点和用途

2、LoadBalancer 的工作机制

3、创建示例

4、使用场景

5、注意事项

五、ExternalName类型

1、ExternalName 类型的特点和用途

2、ExternalName 的工作机制

3、创建示例

4、使用场景

5、注意事项


一、引言

1、k8s概述

Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动化应用程序的部署、扩展和管理。它最初由谷歌开发,并在2014年捐赠给云原生计算基金会(CNCF)。Kubernetes为容器化应用提供了一个灵活、可扩展和高效的管理平台。

2、Service在Kubernetes中的作用

在 Kubernetes 中,Service 是一种抽象方式,用于定义一组逻辑上的 Pod 以及访问这些 Pod 的策略。Service 解决了 Pod 的生命周期管理和通信问题,提供了稳定的网络端点和负载均衡机制,确保应用程序的高可用性和可扩展性。

主要作用
1. 稳定的访问入口:

  • 每个 Pod 都有自己的 IP 地址,但是这些地址是动态分配的,当 Pod 被删除或重新创建时,IP 地址会发生变化。Service 为一组 Pod 提供一个稳定的 IP 地址和 DNS 名称,使得应用程序可以通过固定的端点进行访问。


2. 负载均衡:

  • Service 会自动将流量分发到后端的一组 Pod 上,进行负载均衡。这样可以均匀分配流量,防止某个 Pod 过载,并提高整体应用的性能和可靠性。


3. 服务发现:

  • Kubernetes 内部有一个 DNS 服务,所有 Service 都会在这个 DNS 中注册。当应用程序需要访问某个 Service 时,可以通过 DNS 名称进行访问,而无需关心具体的 Pod IP 地址。


4. 跨节点通信:

  • Service 可以将请求转发到集群中不同节点上的 Pod,实现跨节点通信。这对于分布式系统和跨节点的应用程序来说非常重要。

二、ClusterIP类型

在 Kubernetes 中,ClusterIP 类型的 Service 是最基本和默认的 Service 类型。它在集群内部为一组 Pod 提供一个稳定的 IP 地址和 DNS 名称,使得其他服务可以通过固定的网络端点进行访问,而无需关心 Pod 的动态 IP 地址。

1、ClusterIP 类型的特点和用途

1. 内部访问:

ClusterIP 类型的 Service 只能在 Kubernetes 集群内部访问,无法从集群外部直接访问。它适用于集群内部的服务通信,如微服务之间的调用。


2. 稳定的访问端点:

ClusterIP 为 Service 分配一个稳定的虚拟 IP 地址。无论背后的 Pod 如何变化,访问 Service 的 IP 地址始终不变,提供了稳定的访问端点。


3. 自动负载均衡:

ClusterIP 会将流量均匀分发到其后端的所有 Pod 上,实现负载均衡。这样可以有效地分散负载,提高应用的性能和可靠性。


2、ClusterIP 的工作机制

1. 标签选择器:

ClusterIP Service 使用标签选择器(Selector)来确定与哪些 Pod 关联。符合选择器条件的所有 Pod 会成为该 Service 的后端。


2. Endpoints 对象:

Kubernetes 会自动维护一个 Endpoints 对象,记录与 ClusterIP Service 关联的所有 Pod 的 IP 地址和端口。当关联的 Pod 状态发生变化时,Endpoints 对象会自动更新。


3. kube-proxy:

kube-proxy 是 Kubernetes 集群中的网络代理,负责实现 Service 的网络规则。对于 ClusterIP 类型的 Service,kube-proxy 会在每个 Node 上设置 iptables 规则或 IPVS 规则,将访问 ClusterIP 的流量转发到相应的 Pod 上。

3、创建示例

以下是一个创建 ClusterIP 类型 Service 的示例:

apiVersion: v1
kind: Service
metadata:
  name: my-clusterip-service
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: ClusterIP
  • kind: Service 表示这是一个 Service 资源。
  • metadata 包含 Service 的元数据,例如名称。
  • spec 定义了 Service 的行为和配置。
    •  selector 指定了 Pod 的标签选择器,选择带有 app=MyApp 标签的 Pod。
    •  ports 定义了服务的端口映射,将 Service 的 80 端口映射到 Pod 的 8080 端口。
    •  type 明确指定了 Service 的类型为 ClusterIP。

4、ClusterIP 使用场景 

1. 微服务架构:

在微服务架构中,不同的服务通常会通过 ClusterIP 类型的 Service 相互调用,确保服务之间的稳定通信。


2. 内部负载均衡:

集群内的负载均衡,通过 ClusterIP Service 将流量均匀分配到后端的多个 Pod,提高应用的可靠性和可扩展性。


3. 后端服务:

对于数据库、缓存等后端服务,可以使用 ClusterIP 类型的 Service 进行访问,确保集群内所有服务都可以通过稳定的端点访问这些后端服务。

   

三、NodePort类型

NodePort 类型的 Service 是 Kubernetes 中的一种 Service 类型,用于将集群内部的服务暴露给外部访问。NodePort 通过在每个 Node 上打开一个特定端口,将外部请求转发到集群内部的 Service,进而到达后端的 Pod。

1、NodePort 类型的特点和用途

1. 外部访问:

NodePort 使集群内部的服务能够通过集群外部的请求访问。它在每个 Node 上分配一个固定端口,将流量转发到 Service。


2. 固定端口:

NodePort 类型的 Service 会在每个 Node 上分配一个从 30000 到 32767 范围内的端口。这个端口在整个集群内是固定的,可以通过 <NodeIP>:<NodePort> 进行访问。


3. 简单易用:

NodePort 是一种简单的方式来暴露集群内的服务,适用于开发和测试环境,也可以作为负载均衡器或 ing  ress 控制器的基础。


2、NodePort 的工作机制

1. NodePort 分配:

当创建一个 NodePort 类型的 Service 时,Kubernetes 会在每个 Node 上分配一个固定的端口,并配置 iptables 或 IPVS 规则,将外部请求转发到 Service。


2. 流量转发:

外部请求通过 <NodeIP>:<NodePort> 访问集群内的服务。kube-proxy 会将这些请求转发到对应的 Service IP,进而分发到后端的 Pod 上。


3. 负载均衡:

和 ClusterIP 类似,NodePort 类型的 Service 也会进行负载均衡,将流量均匀分发到后端的 Pod 上。

3、创建示例

以下是一个创建 NodePort 类型 Service 的示例:

apiVersion: v1
kind: Service
metadata:
  name: my-nodeport-service
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
      nodePort: 30001
  type: NodePort

  • kind: Service 表示这是一个 Service 资源。
  • metadata 包含 Service 的元数据,例如名称。
  • spec 定义了 Service 的行为和配置。
    • selector 指定了 Pod 的标签选择器,选择带有 app=MyApp 标签的 Pod。
    • ports 定义了服务的端口映射。
    • port 是 Service 的端口(集群内部使用)。
    • targetPort 是 Pod 上的端口(容器内部应用监听的端口)。
    • nodePort 是在每个 Node 上分配的固定端口,通过这个端口可以从外部访问 Service。
  • type 明确指定了 Service 的类型为 NodePort。


4、NodePort 使用场景

1. 开发和测试环境:

在开发和测试环境中,NodePort 提供了一种简单的方式来暴露集群内部的服务,方便测试和调试。


2. 临时访问:

在需要临时访问集群内部服务的情况下,NodePort 提供了一种快速解决方案。


3. 基础设施的负载均衡:

NodePort 可以作为负载均衡器或 ingress 控制器的基础,将流量转发到集群内部的服务。


5、注意事项

1. 端口范围:

NodePort 端口范围为 30000 到 32767,确保在配置时避免冲突。


2. 安全性:

暴露到外部的 NodePort 端口存在一定的安全风险,建议在生产环境中使用更高级的解决方案(如 LoadBalancer 或 Ingress)来确保安全性。


3. 负载均衡限制:

NodePort 提供的负载均衡是基于简单的轮询算法,不如专业负载均衡器复杂和高效。

四、LoadBalancer类型

在 Kubernetes 中,LoadBalancer 类型的 Service 是一种常见的服务暴露方式,主要用于将集群内部的服务暴露给外部,并且由云提供商自动配置外部负载均衡器。LoadBalancer 类型的 Service 提供了一个外部 IP 地址,可以直接通过这个地址访问集群内的服务,适用于需要高可用性和自动扩展的场景。

1、LoadBalancer 类型的特点和用途

1. 外部访问:

LoadBalancer 为集群内部的服务提供一个外部 IP 地址,使得外部客户端可以直接访问。


2. 自动配置:

在公有云环境中(如 AWS、Azure、Google Cloud),Kubernetes 会自动配置云提供商的负载均衡器,将外部流量转发到集群内部的服务。


3. 高可用性:

LoadBalancer 结合云提供商的负载均衡服务,能够提供高可用性和自动扩展功能,确保服务的可靠性和性能。


2、LoadBalancer 的工作机制

1. 云提供商集成:

当在公有云环境中创建 LoadBalancer 类型的 Service 时,Kubernetes 会与云提供商的 API 进行交互,自动创建并配置一个外部负载均衡器。


2. 流量转发:

云提供商的负载均衡器接收外部流量,并将其转发到 Kubernetes 集群中的 Node 上,再由 Node 上的 kube-proxy 转发到相应的 Pod。


3. 健康检查:

云提供商的负载均衡器通常会对后端 Pod 进行健康检查,确保只将流量发送到健康的 Pod 上。


3、创建示例

以下是一个创建 LoadBalancer 类型 Service 的示例:

apiVersion: v1
kind: Service
metadata:
  name: my-loadbalancer-service
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: LoadBalancer


在这个示例中:

  • kind: Service 表示这是一个 Service 资源。
  • metadata 包含 Service 的元数据,例如名称。
  • spec 定义了 Service 的行为和配置。
  • selector 指定了 Pod 的标签选择器,选择带有 app=MyApp 标签的 Pod。
  • ports 定义了服务的端口映射。
  • port 是 Service 的端口(外部客户端访问的端口)。
  • targetPort 是 Pod 上的端口(容器内部应用监听的端口)。
  • type 明确指定了 Service 的类型为 LoadBalancer。

4、使用场景

1. 生产环境:

LoadBalancer 类型的 Service 适用于生产环境中需要高可用性和自动扩展的服务。


2. 外部访问:

当需要将集群内的服务暴露给外部客户端时,可以使用 LoadBalancer 类型的 Service。


3. 自动化运维:

结合云提供商的负载均衡服务,简化了运维工作,如流量管理、健康检查和故障转移等。


5、注意事项

1. 成本:

使用 LoadBalancer 类型的 Service 可能会产生额外的云提供商费用,特别是在大量使用外部负载均衡器的情况下。


2. 云依赖:

LoadBalancer 类型的 Service 依赖于云提供商的负载均衡服务,因此在本地集群或不支持负载均衡的环境中可能无法使用。


3. 配置限制:

云提供商的负载均衡器可能有一些配置限制,如最大连接数、带宽限制等,需要根据具体需求进行调整和优化。

五、ExternalName类型

在 Kubernetes 中,ExternalName 类型的 Service 是一种特殊的 Service 类型,它不通过 Kubernetes 的网络代理(如 kube-proxy)进行流量转发,而是将请求转发到指定的外部 DNS 名称。ExternalName 类型的 Service 主要用于将集群内的服务请求重定向到集群外部的服务,使得 Kubernetes 内部的服务可以透明地访问外部资源。

1、ExternalName 类型的特点和用途

1. DNS 名称映射:

ExternalName 类型的 Service 通过 DNS CNAME 记录将请求重定向到指定的外部 DNS 名称,而不是集群内部的 Pod IP 地址。


2. 无负载均衡:

ExternalName 只是简单地将请求重定向到外部服务,不提供负载均衡、健康检查或服务发现等功能。


3. 透明访问:

集群内的服务可以通过访问 ExternalName 类型的 Service 像访问集群内的其他服务一样透明地访问外部服务。


2、ExternalName 的工作机制

1. CNAME 记录:

ExternalName 类型的 Service 在 Kubernetes 内部 DNS 服务器中创建一个 CNAME 记录,将服务名称映射到指定的外部 DNS 名称。


2. DNS 查询:

当集群内的服务请求 ExternalName Service 时,DNS 查询会返回外部服务的 DNS 名称,客户端会直接访问该外部服务。


3、创建示例

以下是一个创建 ExternalName 类型 Service 的示例:

apiVersion: v1
kind: Service
metadata:
  name: my-external-service
spec:
  type: ExternalName
  externalName: external-service.example.com


在这个示例中:

  • kind: Service 表示这是一个 Service 资源。
  • metadata 包含 Service 的元数据,例如名称。
  • spec 定义了 Service 的行为和配置。
  • type 明确指定了 Service 的类型为 ExternalName。
  • externalName 是外部服务的 DNS 名称,例如 external-service.example.com。

4、使用场景

1. 访问外部 API:

当 Kubernetes 集群内的应用程序需要访问外部 API 或服务(如第三方 API 服务、外部数据库)时,可以使用 ExternalName 类型的 Service 进行透明访问。


2. 混合架构:

在混合云或多集群环境中,可以使用 ExternalName 类型的 Service 将请求重定向到外部或其他集群中的服务。


3. 简化配置:

ExternalName 类型的 Service 可以简化应用程序的配置,通过 Kubernetes 内部的 DNS 名称访问外部服务,而无需在应用程序代码中指定外部 DNS 名称。


5、注意事项

1. 无负载均衡和健康检查:

ExternalName 类型的 Service 不提供负载均衡和健康检查功能,依赖于外部服务的可用性和稳定性。


2. 外部服务依赖:

使用 ExternalName 类型的 Service 会引入对外部服务的依赖,确保外部服务的 DNS 名称解析和访问是稳定可靠的。


3. 网络延迟:

访问外部服务可能会引入额外的网络延迟,影响应用程序的性能,需要进行适当的性能评估和优化。

💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Kubernetes的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!  

;