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: MyAppports:- protocol: TCPport: 80targetPort: 8080type: 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: MyAppports:- protocol: TCPport: 80targetPort: 8080nodePort: 30001type: 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: MyAppports:- protocol: TCPport: 80targetPort: 8080type: 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: ExternalNameexternalName: 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的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/52694.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型本地化部署2-Docker部署MaxKB

大模型本地化部署2-Docker部署MaxKB 0、MaxKB简介1、安装docker2、在docker中拉取MaxKB镜像3、运行镜像4、访问MaxKB5、创建应用6、使用应用进行对话 0、MaxKB简介 MaxKB是一款基于LLM大预言模型的知识库问答系统。具有以下特点&#xff1a; 多模型支持&#xff1a;支持对接主…

开放式耳机怎么戴?佩戴舒适在线的几款开放式耳机分享

开放式耳机的佩戴方式与传统的入耳式耳机有所不同&#xff0c;它采用了一种挂耳式的设计&#xff0c;提供了一种新颖的佩戴体验&#xff0c;以下是开放式耳机的佩戴方式。 1. 开箱及外观&#xff1a;首先&#xff0c;从包装盒中取出耳机及其配件&#xff0c;包括耳机本体、充电…

什么是密码学?

什么是密码学&#xff1f; 密码学是一种通过使用编码算法、哈希和签名来保护信息的实践。此信息可以处于静态&#xff08;例如硬盘驱动器上的文件&#xff09;、传输中&#xff08;例如两方或多方之间交换的电子通信&#xff09;或使用中&#xff08;在对数据进行计算时&#…

设计模式-结构性模式-桥接模式

1.桥接模式定义 桥接模式就是将抽象部分与他的实现部分分离&#xff0c;使他们都可以独立的变化&#xff1b; 桥接模式用一种巧妙地方式处理多层继承存在的问题&#xff0c;用抽象关联来取代传统的多层继承&#xff0c;将类之间的静态继承关系转变为动态的组合关系&#xff0c;…

Leetcode JAVA刷刷站(99)恢复二叉搜索树

一、题目概述 二、思路方向 要解决这个问题&#xff0c;我们可以采用中序遍历二叉搜索树&#xff08;BST&#xff09;的方法&#xff0c;因为中序遍历BST会返回一个有序的数组。由于只有两个节点被错误地交换了&#xff0c;所以中序遍历的结果中将有两个位置上的元素是逆序的。…

什么是数据库 DevOps?

原文地址 https://www.bytebase.com/blog/what-is-database-devops/ 在深入研究数据库 DevOps 之前&#xff0c;先回顾一下什么是 DevOps。它没有统一的定义&#xff0c;但我们知道它起源于软件开发方法与部署和运维的结合。 大约 2007 年和 2008 年&#xff0c;软件开发和 I…

.NET8 Web 利用BAT命令 一键部署 IIS - CI-CD基础

1. Windows Server 前置准备 1.1 IIS安装好 1.2 .NET8 Sdk 运行时 安装 官方下载地址&#xff1a;https://dotnet.microsoft.com/zh-cn/download/dotnet/8.0 1.3 创建一个.NET8 WebMvc项目 生成发布包 微软MVC这个项目模板直接创建&#xff0c;发布 2. 利用 BAT 来一键部署…

【STM32】FMC

FMC功能与FSMC类似&#xff0c;但比FSMC更强大&#xff0c;但仅在F4 / F7 / H7等高级一点的MCU上支持&#xff0c;F1不支持。虽然我的是F103&#xff0c;但顺便都看了。 大部分图片来源&#xff1a;正点原子HAL库课程 专栏目录&#xff1a;记录自己的嵌入式学习之路-CSDN博客 目…

Vue 和 Element Plus 弹框组件详解:从基本实现到异步数据加载与自定义内容(实战)

目录 前言1. 基本知识2. 模版3. 实战 前言 主要是通过一个按钮触发一个按钮框&#xff0c;多种方式的逻辑&#xff0c;多种场景 原先通过实战总结&#xff0c;基本的知识推荐阅读&#xff1a; 详细分析Element Plus中的ElMessageBox弹窗用法&#xff08;附Demo及模版&#x…

秋招复习笔记——嵌入式裸机开发

底层相关的内容&#xff0c;之前掌握的不扎实&#xff0c;现在重新把相关重点记录一下&#xff0c;做个笔记记诵。 相关基础知识 ST简单内容 用的F103ZET6&#xff0c;72MHz&#xff0c;FLASH是512KB&#xff0c;SRAM是64KB&#xff0c;144个引脚&#xff0c;2基本定时器&am…

目标 CDC实例数据库更改密码,预定启动报错SQL 错误代码为“-30082”。SQL 状态为:08001。

更改完CDC目标端实例密码后&#xff0c;登录MC更新存储器密码&#xff0c;存储器可正常连接&#xff0c;启动预定报错如下&#xff1a; 源 IBM Data Replication 未获授权&#xff0c;无法复制到该目标。 登录认证失败。 发生 SQL 异常。SQL 错误代码为“-30082”。SQL 状态…

嵌入式学习——ARM学习(1)

1、存储器 高速缓存&#xff08;Cache&#xff09;通常分为三级&#xff1a;L1、L2 和 L3。它们的主要功能和特点如下&#xff1a; 这三级缓存的设计旨在通过层次化存储来优化数据访问速度和处理器性能。 1、L1 缓存&#xff1a; 位置&#xff1a;直接集成在处理器核心内。 大小…

打手机检测算法源码样本展示打手机检测算法实际应用场景介绍

打手机检测算法是一种利用计算机视觉技术来监测和识别人们在特定区域如驾驶舱、考场或其他敏感区域非法使用手机的行为。这种算法对于提高安全性和确保规则的遵守具有重要意义。以下是关于打手机检测算法源码及其实际应用的详细阐述&#xff1a; 1. 算法实现 - 深度学习框架&a…

【selenium点选下拉框】解决无法选中对应选项的问题

需求 使用selenium点击下拉框&#xff0c;选中【是】选项。 代码 方法1 # 点击下拉框 driver.find_element(xpath,//*[id"basicProcessDetail"]/div[2]/div[2]/div[1]/div/div[2]/div/div/div/div[1]/div[2]/form/div[11]/div[1]/div/div/div[1]/div[1]/div/i).…

雷达图概述以及实例

目录 一.雷达图概述1.何为雷达图2.雷达图的构成要素 二.实例&#xff08;以Excel、Python为例 &#xff09;1.Excel&#xff08;2021版&#xff09;2.Python 一.雷达图概述 1.何为雷达图 雷达图&#xff0c;是一种展现多维度数据间相对重要性或程度的可视化图形。以中心点为起…

LabVIEW高速数据采集关键问题

在LabVIEW进行高速数据采集时&#xff0c;需要关注以下几个关键问题&#xff1a; 数据采集硬件的选择: 高速数据采集需要高性能的数据采集硬件&#xff0c;例如NI PXIe、USB DAQ等模块。硬件的选择应根据采集速率、通道数、精度、以及应用场景的具体需求来确定。 采集速率与带…

ByteBuffer详解

文章目录 1. ByteBuffer是抽象类&#xff0c;他的主要实现类为2. 获取方式3. 核心结构4. 核心API5. 字符串操作 1. ByteBuffer是抽象类&#xff0c;他的主要实现类为 HeapByteBuffer 堆ByteBuffer JVM内的堆内存 —> 读写操作 效率低 会受到GC影响MappedByteBuffer(DirectB…

桥接模式-多类型登录方式的思考

桥接模式-SSO单点登录 背景:(业务细节已脱敏)需求:问题:解决方式: OAuth2.0 实现单点登录四种授权模式桥接模式优化问题代码实现 背景:(业务细节已脱敏) 基于实习期间的一个代码重构的思考——业务细节已脱敏 基于内部旧框架实现业务toB管理系统&#xff0c;需要迁移数据并新的…

uni-app 手记集。

1、uni-app 是一个使用 Vue.js 开发的前端应用的框架&#xff0c;所以不会Vue.js的小伙伴可以先去看看Vue.js的基础教学。 2、.vue文件结构 <template><div class"container"></div> </template><script type"text/ecmascript-6&q…

【DiskGenius硬盘分区】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…