什么是 Kubernetes 中的 Service?

在现代微服务架构中,服务之间的通信和负载均衡是至关重要的。尤其是在 Kubernetes 环境中,由于 Pod 是动态创建和销毁的,如何为一组 Pod 提供稳定的访问入口,成为了架构设计中的一个关键问题。为了解决这个问题,Kubernetes 引入了 Service 资源。

Service 是 Kubernetes 中用于为一组 Pod 提供稳定访问入口的资源类型。Pod 是短暂的,并且它们的 IP 地址是动态变化的。因此,Service 的作用是通过定义一个稳定的 虚拟 IP 地址DNS 名称,为外部或集群内的应用提供一致的访问方式。无论后端的 Pod 如何变化,Service 都能保持访问接口的一致性。

Service 提供了以下几种核心功能:

  1. 稳定的访问入口:Service 会为一组 Pod 提供一个稳定的 IP 地址和 DNS 名称,避免因为 Pod 的 IP 变动导致无法访问。
  2. 负载均衡:Service 会自动将流量分配到后端的多个 Pod 上,实现负载均衡。
  3. 服务发现:集群内部的应用可以通过 Service 名称来发现并访问目标服务。

Kubernetes 中的 Service 类型

在 Kubernetes 中,Service 主要有四种类型,每种类型适用于不同的场景。下面我们逐一分析这四种 Service 类型及其应用场景。

1. ClusterIP:集群内部访问

ClusterIP 是 Kubernetes 中的默认 Service 类型,它为 Service 创建一个 集群内部的虚拟 IP 地址,并且只有集群内部的应用可以通过这个 IP 地址来访问该 Service。外部无法直接访问该服务。

使用场景:

  • 适用于集群内部的服务通信,常见于微服务架构中,服务之间需要互相访问。
  • 如前端服务需要访问后端 API 服务,或者服务与数据库之间的连接。

示例:

apiVersion: v1
kind: Service
metadata:name: my-service
spec:selector:app: my-appports:- protocol: TCPport: 80       # 对外暴露的端口targetPort: 8080  # 后端 Pod 上的端口

在上面的示例中,Service 会自动分配一个 IP 地址并暴露给集群内部的 Pod。集群内部的应用可以通过 my-service:80 来访问这个服务。

2. NodePort:集群外部访问

NodePort 类型的 Service 会在每个集群节点上打开一个端口,任何流量通过该端口访问集群时,都会被路由到对应的 Service 上。这样,你就可以通过节点的外部 IP 地址和指定端口来访问这个 Service。

使用场景:

  • 当你希望将服务暴露到集群外部,或者希望通过某个端口直接访问 Service。
  • 适用于开发和测试阶段,或者在没有负载均衡器的环境中。

示例:

apiVersion: v1
kind: Service
metadata:name: my-service
spec:selector:app: my-appports:- protocol: TCPport: 80      # 对外暴露的端口targetPort: 8080  # 后端 Pod 上的端口nodePort: 30001    # 节点端口type: NodePort

在这个例子中,Kubernetes 会在每个节点上打开 30001 端口。外部访问时,可以通过任意节点的 IP 地址和该端口来访问服务,比如 http://<node-ip>:30001

3. LoadBalancer:云环境外部访问

LoadBalancer 类型的 Service 适用于云环境,它会为 Service 配置一个外部的负载均衡器,将流量引导到后端的 Pod 上。云服务提供商(如 AWS、Azure、GCP 等)通常会为你创建一个外部负载均衡器,并为你分配一个公共的 IP 地址。

使用场景:

  • 当你希望将 Service 暴露给外部,并且希望使用负载均衡来分发流量。
  • 适用于生产环境,尤其是云环境中对外提供访问的场景。

示例:

apiVersion: v1
kind: Service
metadata:name: my-service
spec:selector:app: my-appports:- protocol: TCPport: 80      # 对外暴露的端口targetPort: 8080  # 后端 Pod 上的端口type: LoadBalancer

配置该 Service 后,云提供商会自动为你分配一个外部 IP 地址,用户可以通过该 IP 地址访问服务。例如,http://<load-balancer-ip>:80

4. ExternalName:外部服务集成

ExternalName 类型的 Service 是将 Kubernetes 集群中的服务映射到外部 DNS 名称,它不涉及 Kubernetes 集群内部的负载均衡,而是将流量直接转发到外部服务的 DNS 名称上。

使用场景:

  • 当你希望将外部服务纳入 Kubernetes 集群的服务发现机制时。例如,你希望通过 my-db-service 访问外部的数据库服务。

示例:

apiVersion: v1
kind: Service
metadata:name: my-service
spec:type: ExternalNameexternalName: example.com  # 外部服务的 DNS 名称

在这种配置下,my-service 会解析为 example.com,集群内部的 Pod 可以通过 my-service:80 来访问 example.com


如何配置 Kubernetes Service?

1. 使用选择器(Selector)

Service 是通过 选择器 来确定将流量路由到哪些 Pod。选择器使用标签来匹配 Pod,因此你需要确保 Service 的标签选择器与目标 Pod 的标签匹配。

示例:

selector:app: my-app  # 选择标签为 app=my-app 的 Pod

这样,Service 会将流量路由到所有标签为 app=my-app 的 Pod。

2. 指定端口

每个 Service 都会指定一个端口 (port),它是外部应用访问服务时使用的端口。还可以指定 targetPort,它是 Pod 内部服务监听的端口。通常,porttargetPort 可以相同,但你也可以设置不同的端口映射。

示例:

ports:- protocol: TCPport: 80        # Service 对外暴露的端口targetPort: 8080  # 后端 Pod 上的端口

3. 选择 Service 类型

根据实际需求,选择合适的 Service 类型。如果你只需要集群内访问,可以选择 ClusterIP。如果需要暴露到外部,可以选择 NodePortLoadBalancer

示例:

type: NodePort  # 可以选择 ClusterIP, NodePort, LoadBalancer, ExternalName

Service 与 Pod 的关系

在 Kubernetes 中,Pod 是应用的基本部署单元,它包含一个或多个容器,这些容器共享同一个网络、存储和命名空间。Pod 是 短暂的,这意味着它们的生命周期是动态的:Pod 的 IP 地址会随着 Pod 的启动和销毁而变化。因此,直接通过 Pod 的 IP 地址进行访问并不是一个稳定的解决方案。

Service 的引入,正是为了克服这种动态变化的问题。Service 为一组 Pod 提供了一个稳定的 虚拟 IP 地址DNS 名称,并且它通过负载均衡的方式将流量路由到合适的 Pod 上。Service 的目的是确保即使 Pod 发生了变动,客户端也能始终通过相同的接口访问服务,而无需关心后端 Pod 的变化。

  • 稳定的访问入口:通过提供虚拟 IP 或 DNS 名称,Service 避免了 Pod IP 地址变化对客户端访问的影响。
  • 负载均衡:当有多个 Pod 提供相同服务时,Service 会自动将流量均匀分配到这些 Pod 上。
  • 自动适配 Pod 的动态变化:Service 会自动识别和适应 Pod 的创建、销毁和扩缩,确保流量始终被转发到健康的 Pod。
  • 简化服务发现:通过 DNS 名称和标签选择器,Service 提供了易于管理和使用的服务发现机制。

ServicePod 的关系使得 Kubernetes 能够高效地管理和扩展应用服务,同时保证服务的稳定性和高可用性。无论是简单的单一 Pod 服务,还是复杂的多副本负载均衡场景,Service 都为它们提供了强大的支持。

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

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

相关文章

使用Samba网络磁盘作为MacOS时间机器的远程备份磁盘

最近考虑MacOS系统升级&#xff0c;所以需要做磁盘备份&#xff0c;MacOS里有个备份磁盘很方便的工具&#xff1a;时间机器&#xff0c;可以自动定期备份磁盘&#xff0c;但是一般需要一个大点的移动硬盘插在macbook上选择其为备份磁盘&#xff0c;可惜我并没有移动硬盘&#x…

智能头盔实时监控系统设计与实现

智能头盔实时监控系统设计与实现 源码 https://gitee.com/intostars/csdn-demo/tree/master/src/views/smartHelmet 预览 一、功能概述 智能头盔实时监控系统是基于Vue 3和TypeScript开发的一套用于远程监控和控制智能头盔设备的前端应用模块。该系统通过WebSocket与后端服务…

Docker 学习笔记(八):容器运行时工具实践及 OpenStack 部署基础

容器管理工具Containerd nerdctl 实践 nerdctl管理存储 nerdctl命令创建容器的时候&#xff0c;可以使用-v选项将本地目录挂载给容器实现数据持久化 示例&#xff1a; [rootlocalhost ~]# mkdir /data [rootlocalhost ~]# nerdctl run -d -v /data:/data busybox -- sleep infi…

Unity键盘控制角色运动

以下是一个完整的Unity角色移动和跳跃脚本,支持WASD或方向键移动: 使用说明 确保组件设置正确: 确保您的游戏对象有一个CharacterController组件 如果没有,可以通过菜单 "Component -> Physics -> Character Controller" 添加 相机设置: 确保场景中有一…

linux 宏 DEVICE_ATTR

理解 DEVICE_ATTR DEVICE_ATTR 是 Linux 内核中用于创建设备属性的宏&#xff0c;通常用于 sysfs 文件系统。通过 sysfs&#xff0c;用户空间的程序可以读取或修改内核中的设备属性。DEVICE_ATTR 宏定义在 <linux/device.h> 头文件中&#xff0c;用于声明和定义一个设备属…

MCP模型上下文协议以及交互流程

1. MCP 是什么全称&#xff1a;Model Context Protocol定位&#xff1a;让大语言模型&#xff08;LLM&#xff09;能在“上下文”之外&#xff0c;按统一格式访问外部数据、调用插件、持久化状态。动机&#xff1a;以前每家框架&#xff08;LangChain、LlamaIndex 等&#xff0…

MySQLTransactionRollbackException

问题描述mysql部署1主3从&#xff0c;昨天发现主库有大量报警错误&#xff1a;Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction ; Deadlock found when trying to get lock; …

Redis环境搭建指南:Windows/Linux/Docker多场景安装与配置

Redis环境搭建指南&#xff1a;Windows/Linux/Docker多场景安装与配置 1. Redis安装方式概览 1.1 安装方式对比 安装方式适用场景优点缺点难度Windows直接安装开发调试安装简单&#xff0c;Windows兼容好性能不如Linux&#xff0c;生产不推荐⭐Linux源码编译生产环境性能最佳…

leetcode.80删除有序数组中的重复项2

题目描述 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。…

运动卡新手入门及常见问题处理

1.新手入门1.1 插卡打开包装&#xff0c;拿出PCI板卡&#xff0c;如下图&#xff1a;打开电脑机箱盖&#xff0c;找到PCI插槽&#xff0c;如下图&#xff08;红色框部分是PCI槽&#xff0c;有些主板上PCI槽是白色或其他颜色&#xff09;&#xff1a;插入板卡&#xff0c;如下图…

PRINCE2与PMP项目管理体系对比

在全球范围内&#xff0c;PRINCE2与PMP是两大最具影响力的项目管理体系。PRINCE2注重流程和治理结构&#xff0c;强调“控制”与“规范”&#xff1b;而PMP基于PMBOK指南&#xff0c;强调知识体系和方法论的全面性&#xff0c;更关注“工具”与“实践”。 不同体系的侧重点&…

在UniApp跨平台开发中实现相机自定义滤镜的链式处理架构

以下是进阶方案&#xff1a;架构核心设计分层结构$$Pipeline Capture \otimes Filter_1 \otimes Filter_2 \otimes \cdots \otimes Filter_n \otimes Render$$ 其中&#xff1a;$\otimes$ 表示链式处理操作符$Capture$ 为原始图像采集层$Filter_n$ 为可插拔滤镜单元$Render$ 为…

Mark5 穿越机电调深度解析:设计、选型、控制与实战(下)

TIM_SetCompare3 (TIM1, T0 + T1 + T2); // W+​ break;​ case 3:​ // U - 导通,V - 导通,W + 导通​ TIM_SetCompare1 (TIM1, T0); // U-​ TIM_SetCompare2 (TIM1, T0); // V-​ TIM_SetCompare3 (TIM1, T0 + T1 + T2); // W+​ break;​ case 4:​ // U - 导通…

背包问题从入门到入土

我在这里介绍4种常见的背包问题&#xff0c;这里我想按易 --> 难程度从01背包&#xff0c;完全背包&#xff0c;分组背包&#xff0c;多重背包的顺序介绍。&#xff08;封面附在最后&#xff09;一&#xff0c;01背包问题&#xff08;后面三个背包问题的基础&#xff09;01背…

Leetcode 18 java

​​​​​1​​​​​​​141. 环形链表1 题目 ​​​​​1​​​​​​​141. 环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表…

Linux 正则表达式详解(基础 + 扩展 + 实操)

Linux 正则表达式详解&#xff08;基础 扩展 实操&#xff09; 正则表达式&#xff08;Regular Expression&#xff0c;简称 RE&#xff09;是 Linux 文本处理的核心工具&#xff0c;用于定义字符匹配模式&#xff0c;配合 grep、sed、awk 等工具可实现文本过滤、查找、替换等…

Json-rpc通信项目(基于C++ Jsoncpp muduo库)

一、介绍RPC RPC&#xff08;Remote Procedure Call&#xff09;远程过程调用&#xff0c;一种通过网络从远程计算器上请求服务&#xff0c;而不需要了解底层网络通信细节&#xff0c;RPC可以使用多种网络协议进行通信&#xff0c;并且在TCP/IP网络四层模型中跨越了传输层和应…

RL【9】:Policy Gradient

系列文章目录 Fundamental Tools RL【1】&#xff1a;Basic Concepts RL【2】&#xff1a;Bellman Equation RL【3】&#xff1a;Bellman Optimality Equation Algorithm RL【4】&#xff1a;Value Iteration and Policy Iteration RL【5】&#xff1a;Monte Carlo Learnin…

Redis是什么?一篇讲透它的定位、特点与应用场景

Redis是什么&#xff1f;一篇讲透它的定位、特点与应用场景 1. Redis的定义与核心概念 1.1 什么是Redis&#xff1f; Redis&#xff08;Remote Dictionary Server&#xff09; 是一个开源的、基于内存的数据结构存储系统&#xff0c;可以用作数据库、缓存和消息代理。Redis由…

一款免费开源轻量的漏洞情报系统 | 漏洞情报包含:组件漏洞 + 软件漏洞 + 系统漏洞

工具介绍 bug_search一款免费开源轻量的漏洞情报系统 基于python3 Amis2.9 开发&#xff0c;仅依赖Flask,requests&#xff0c;无需数据库&#xff0c;Amis是百度开源的低代码前端框架漏洞情报包含&#xff1a;组件漏洞 软件漏洞 系统漏洞 增加邮件发送消息报警功能增加钉钉…