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

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

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

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

目录

一、引言

1、k8s概述

2、Service在Kubernetes中的作用

二、ClusterIP类型

[1、ClusterIP 类型的特点和用途](#1、ClusterIP 类型的特点和用途)

[2、ClusterIP 的工作机制](#2、ClusterIP 的工作机制)

3、创建示例

[4、ClusterIP 使用场景](#4、ClusterIP 使用场景)

三、NodePort类型

[1、NodePort 类型的特点和用途](#1、NodePort 类型的特点和用途)

[2、NodePort 的工作机制](#2、NodePort 的工作机制)

3、创建示例

[4、NodePort 使用场景](#4、NodePort 使用场景)

5、注意事项

四、LoadBalancer类型

[1、LoadBalancer 类型的特点和用途](#1、LoadBalancer 类型的特点和用途)

[2、LoadBalancer 的工作机制](#2、LoadBalancer 的工作机制)

3、创建示例

4、使用场景

5、注意事项

五、ExternalName类型

[1、ExternalName 类型的特点和用途](#1、ExternalName 类型的特点和用途)

[2、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 名称,使得应用程序可以通过固定的端点进行访问。
  1. 负载均衡:
  • Service 会自动将流量分发到后端的一组 Pod 上,进行负载均衡。这样可以均匀分配流量,防止某个 Pod 过载,并提高整体应用的性能和可靠性。
  1. 服务发现:
  • Kubernetes 内部有一个 DNS 服务,所有 Service 都会在这个 DNS 中注册。当应用程序需要访问某个 Service 时,可以通过 DNS 名称进行访问,而无需关心具体的 Pod IP 地址。
  1. 跨节点通信:
  • Service 可以将请求转发到集群中不同节点上的 Pod,实现跨节点通信。这对于分布式系统和跨节点的应用程序来说非常重要。

二、ClusterIP类型

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

1、ClusterIP 类型的特点和用途

  1. 内部访问:

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

  1. 稳定的访问端点:

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

  1. 自动负载均衡:

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

2、ClusterIP 的工作机制

  1. 标签选择器:

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

  1. Endpoints 对象:

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

  1. 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 相互调用,确保服务之间的稳定通信。

  1. 内部负载均衡:

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

  1. 后端服务:

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

三、NodePort类型

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

1、NodePort 类型的特点和用途

  1. 外部访问:

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

  1. 固定端口:

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

  1. 简单易用:

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

2、NodePort 的工作机制

  1. NodePort 分配:

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

  1. 流量转发:

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

  1. 负载均衡:

和 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 提供了一种简单的方式来暴露集群内部的服务,方便测试和调试。

  1. 临时访问:

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

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

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

5、注意事项

  1. 端口范围:

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

  1. 安全性:

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

  1. 负载均衡限制:

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

四、LoadBalancer类型

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

1、LoadBalancer 类型的特点和用途

  1. 外部访问:

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

  1. 自动配置:

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

  1. 高可用性:

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

2、LoadBalancer 的工作机制

  1. 云提供商集成:

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

  1. 流量转发:

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

  1. 健康检查:

云提供商的负载均衡器通常会对后端 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 适用于生产环境中需要高可用性和自动扩展的服务。

  1. 外部访问:

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

  1. 自动化运维:

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

5、注意事项

  1. 成本:

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

  1. 云依赖:

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

  1. 配置限制:

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

五、ExternalName类型

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

1、ExternalName 类型的特点和用途

  1. DNS 名称映射:

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

  1. 无负载均衡:

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

  1. 透明访问:

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

2、ExternalName 的工作机制

  1. CNAME 记录:

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

  1. 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 进行透明访问。

  1. 混合架构:

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

  1. 简化配置:

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

5、注意事项

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

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

  1. 外部服务依赖:

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

  1. 网络延迟:

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

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

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

相关推荐
心灵彼岸-诗和远方5 分钟前
DevOps业务价值流:架构设计最佳实践
运维·产品经理·devops
一只哒布刘10 分钟前
NFS服务器
运维·服务器
苹果醋31 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
小松学前端1 小时前
第六章 7.0 LinkList
java·开发语言·网络
二十雨辰1 小时前
[linux]docker基础
linux·运维·docker
城南vision1 小时前
计算机网络——TCP篇
网络·tcp/ip·计算机网络
Jason-河山2 小时前
【自动化更新,让商品信息跳舞】——利用API返回值的幽默编程之旅
运维·自动化
Ciderw2 小时前
块存储、文件存储和对象存储详细介绍
网络·数据库·nvme·对象存储·存储·块存储·文件存储
lihuhelihu2 小时前
第3章 CentOS系统管理
linux·运维·服务器·计算机网络·ubuntu·centos·云计算
哲讯智能科技2 小时前
SAP Business One市场价格解析
运维·sap·erp