Kubernetes基础(二十一)-k8s的服务发现机制
1 概述
Kubernetes(K8s)是一个强大的容器编排平台,提供了丰富的功能来简化容器化应用的管理。其中之一重要的特性就是服务发现机制,它使得应用程序能够在K8s集群中动态地发现和访问其他服务。本文将深入研究K8s中的服务发现机制,探讨其原理、使用方法以及通过详细的示例演示其工作过程。
1.1 什么是服务发现?
服务发现是指系统中的各个组件如何找到并与彼此通信的过程。在容器编排平台中,服务发现变得尤为重要,因为容器化应用通常包含多个微服务,它们可能会以动态的方式进行扩展或缩减。服务发现机制允许这些微服务相互发现和通信,从而构建了弹性、可伸缩的应用。
Kubernetes通过一系列核心对象和机制提供了强大的服务发现功能,使得容器能够在集群中自动发现其他服务,而不需要硬编码服务的地址和端口。
1.2 Kubernetes服务发现的核心对象
在Kubernetes中,服务发现主要通过以下几个核心对象实现:
1.2.1 Service(服务)
Service是K8s中用于定义服务的对象,它为一组Pod提供一个稳定的网络入口,通过标签选择器将流量引导到这些Pod。Service的IP地址和端口是稳定的,其他服务可以通过该IP地址和端口访问服务。例如:
apiVersion: v1
kind: Service
metadata:name: backend-service
spec:selector:app: backendports:- protocol: TCPport: 8080targetPort: 8080
上述Service定义了一个名为backend-service的服务,选择了标签为app=backend的所有Pod,并将流量引导到它们的8080端口。
1.2.2 Endpoint(终端点)
Endpoint是Service背后真实运行应用程序的Pod的地址和端口的集合。K8s通过Endpoints对象动态地管理Service的后端Pod。例如:
kubectl get endpoints backend-service
上述命令的输出可能如下所示:
NAME ENDPOINTS AGE
backend-service 192.168.1.2:8080,192.168.1.3:8080,192.168.1.4:8080 1h
Endpoints列表了与backend-service相关联的Pod的IP地址和端口号。
1.2.3 DNS解析
K8s内置了一个DNS服务,允许在集群内使用域名进行服务发现。Service的名称将映射到DNS中,从而允许其他服务使用该域名来访问服务。例如,在一个Pod中,可以通过backend-service.default.svc.cluster.local来访问上述定义的backend-service。
2 Kubernetes服务发现的工作原理
Kubernetes的服务发现机制工作原理如下:
- Pod注册: 当Pod启动时,它会向K8s API服务器注册自己的IP地址和端口号。
- Service创建: 创建一个Service对象时,K8s会为该服务分配一个Cluster IP,并为其创建一个DNS记录。
- Endpoint更新: K8s通过Label Selector将Service与匹配的Pod关联起来,并更新相应的Endpoints对象。
- DNS解析: 其他Pod可以通过Service名称或Endpoint的DNS记录来解析服务的IP地址。
2.1 Kubernetes服务发现测试
为了演示Kubernetes服务发现的工作过程,我们将创建一个简单的Web应用,包含前端(frontend)和后端(backend)服务。
步骤1:定义后端服务
apiVersion: apps/v1
kind: Deployment
metadata:name: backend
spec:replicas: 3selector:matchLabels:app: backendtemplate:metadata:labels:app: backendspec:containers:- name: api-serverimage: my-backend-image:latestports:- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:name: backend-service
spec:selector:app: backendports:- protocol: TCPport: 8080targetPort: 8080
上述YAML文件定义了一个后端服务,包含3个Pod,它们被标记为app=backend。Service对象backend-service将流量引导到这些Pod的8080端口。
步骤2:定义前端服务
apiVersion: apps/v1
kind: Deployment
metadata:name: frontend
spec:replicas: 3selector:matchLabels:app: frontendtemplate:metadata:labels:app: frontendspec:containers:- name: web-serverimage: my-frontend-image:latestports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: frontend-service
spec:selector:app: frontendports:- protocol: TCPport: 80targetPort: 80
上述YAML文件定义了一个前端服务,包含3个Pod,它们被标记为app=frontend。Service对象frontend-service将流量引导到这些Pod的80端口。
步骤3:验证服务发现
在一个Pod中,我们可以通过Service名称和DNS解析来访问后端服务。例如,我们可以在前端Pod中发起HTTP请求到后端服务:
kubectl run -i --tty --rm debug --image=alpine --restart=Never -- sh
# 在容器中执行以下命令
apk add curl
curl backend-service.default.svc.cluster.local:8080/api
这个例子演示了在Kubernetes集群中,前端服务通过DNS解析的方式发现并访问了后端服务。
2.2 Kubernetes服务发现的优势
Kubernetes服务发现机制带来了多重优势:
- 弹性和动态扩展: 服务发现使得新的Pod能够动态地加入或离开服务,而其他服务无需修改配置即可感知这些变化。
- 解耦服务: 通过Service对象,服务之间的通信不再依赖于具体的IP地址和端口号,而是通过Service名称和DNS解析进行,提高了服务的解耦性。
- 负载均衡: Service对象自动提供了负载均衡,将流量分发到后端Pod。这有助于确保各个Pod能够均匀地处理请求。
- DNS解析: Kubernetes内置了DNS服务,使得在集群内部使用域名进行服务发现变得十分方便。
相关文章:
Kubernetes基础(二十一)-k8s的服务发现机制
1 概述 Kubernetes(K8s)是一个强大的容器编排平台,提供了丰富的功能来简化容器化应用的管理。其中之一重要的特性就是服务发现机制,它使得应用程序能够在K8s集群中动态地发现和访问其他服务。本文将深入研究K8s中的服务发现机制&…...
华纳云:docker更新容器镜像的常用方法
更新 Docker 容器镜像可以通过以下几种方法实现: 1. 使用 docker pull 命令手动拉取更新的镜像: docker pull <镜像名>:<标签> 这会拉取指定镜像的最新版本或者指定标签的版本到本地。然后您可以停止并删除现有的容器,使用新的镜…...
什么时候会触发FullGC?描述一下JVM加载class文件的原理机制?
什么时候会触发 FullGC? 除直接调用 System.gc 外,触发 Full GC 执行的情况有如下四种。 1. 旧生代空间不足 旧生代空间只有 在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行 Full GC 后空间仍然不 足,则…...
HCIP-MGRE实验配置、PPP的PAP认证与CHAP认证、MGRE、GRE网络搭建、NAT
实验要求 R5为ISP,只能进行IP地址配素,其所有地址均为公有IP地址R1和R5间使用PPP的PAP认证,R5为主认证方 R2与R5之间使用PPP的chap认证,R5为主认证方 R3与R5之间使用HDLC封装。R1/R2/R3构建一个MGRE环境,R1为中心站点;R1、R4间为…...
react【四】css
文章目录 1、css1.1 react和vue css的对比1.2 内联样式1.3 普通的css1.4 css modules1.5 在react中使用less1.6 CSS in JS1.6.1 模板字符串的基本使用1.6.2 styled-components的基本使用1.6.3 接受传参1.6.4 使用变量1.6.5 继承样式 避免代码冗余1.6.6 设置主题色 1.7 React中添…...
SpringIOC之support模块SimpleThreadScope
博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…...
气味是否能通过光缆、信号传播?
搜索资料,有一点点眉目, 参考:未来网络可以传送气味 如何产生并被感知--双鸭山新闻网...
安装部署k8s集群
系统: CentOS Linux release 7.9.2009 (Core) 准备3台主机 192.168.44.148k8s-master92.168.44.154k8s-worker01192.168.44.155k8s-worker02 3台主机准备工作 关闭防火墙和selinux systemctl disable firewalld --nowsetenforce 0sed -i s/SELINUXenforcing/SELI…...
曲线生成 | 图解B样条曲线生成原理(基本概念与节点生成算法)
目录 0 专栏介绍1 什么是B样条曲线?2 基函数的de Boor递推式3 B样条曲线基本概念图解4 节点生成公式 0 专栏介绍 🔥附C/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等)…...
CyberDAO:web3时代的引领者
Web3.0正在改写着世界运行的规则,AGI将为人类未来的生产效率、工作方式与目标带来改变,区块链经过十余年发展开启了去中心化新格局,带来生产关系的变革。人类正在从过往以时间换取收入、听命完成工作,转变为以个性化、自主追求人生…...
java以及android类加载机制
类加载机制 一、Java类加载机制 java中,每一个类或者接口,在编译后,都会生成一个.class文件。 类加载机制指的是将这些.class文件中的二进制数据读入到内存中并对数据进行校验,解析和初始化。最终,每一个类都会在方…...
【Go】四、rpc跨语言编程基础与rpc的调用基础原理
Go管理工具 早期 Go 语言不使用 go module 进行包管理,而是使用 go path 进行包管理,这种管理方式十分老旧,两者最显著的区别就是:Go Path 创建之后没有 go.mod 文件被创建出来,而 go module 模式会创建出一个 go.mod…...
Linux CentOS系统安装SQL Server并结合内网穿透实现公网访问本地数据
🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默&…...
输入捕获模式测频率PWM输入模式(PWMI)测占空比
一、概念介绍 输出比较: 比较电路输入的CNT、CCR大小关系 ,在通道引脚输出高低电平 二、*频率知识、测量方法补充 * N/fc得到标准频率的时长,也就是待测频率的周期 测频法代码实现:修改对射式红外传感器计次(上升沿…...
解锁VIP会员漫画:用Python爬虫轻松实现高清漫画下载
嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 环境使用: Python 3.10 Pycharm 模块使用: requests >>> pip install requests 数据请求模块 parsel >>> pip install parsel 数据解析模块…...
备战蓝桥杯---动态规划(入门3之子串问题)
本专题再介绍几种经典的字串问题。 这是一个两个不重叠字串和的问题,我们只要去枚举分界点c即可,我们不妨让c作为右区间的左边界,然后求[1,c)上的单个字串和并用max数组维护。对于右边,我们只要反向求单个字串和然后选左边界为c的…...
JavaScript:隐式类型转换与显式类型转换
文章目录 隐式类型转换(Implicit Type Conversion)1、字符串与数字的转换2、非布尔值到布尔值的转换3、在相等性比较中的转换4、对象到基础类型的转换5、在算术运算符中的其他转换 显式类型转换(Explicit Type Conversion)1、Numb…...
【电路笔记】-LR串联电路
LR串联电路 文章目录 LR串联电路1、概述2、示例1所有线圈、电感器、扼流圈和变压器都会在其周围产生磁场,由电感与电阻串联组成,形成 LR 串联电路。 1、概述 在本节有关电感器的第一个文章中,我们简要介绍了电感器的时间常数,指出流过电感器的电流不会瞬时变化,而是会以恒…...
Ansible 自动化运维工具的使用
目录 Ansible的简介 ansible 环境安装部署 ansible 命令行模块 command 模块 shell 模块 cron 模块 user 模块 group 模块 copy 模块 file 模块 hostname 模块 ping 模块 yum 模块 service/systemd 模块 script 模块 mount 模块 archive 模块 unarchive 模…...
亚马逊、ozon、速卖通、Lazada等跨境平台为什么评论老是被删
对于卖家而言,最难的并不是销售量,最难的是让客户在购买后能够留下一个高质量的review,毕竟现在的市场,以listing的排名为基准,以review数量多少和质量的高低来评判店铺的好坏 几乎所有的卖家都会有索评的烦恼&#x…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...
SE(Secure Element)加密芯片与MCU协同工作的典型流程
以下是SE(Secure Element)加密芯片与MCU协同工作的典型流程,综合安全认证、数据保护及防篡改机制: 一、基础认证流程(参数保护方案) 密钥预置 SE芯片与MCU分别预置相同的3DES密钥(Key1、Key2…...
【图片转AR场景】Tripo + Blender + Kivicube 实现图片转 AR 建模
总览 1.将 2D 图片转为立体建模 2. 3. 一、将 2D 图片转为立体建模 1.工具介绍 Tripo 网站 2.找图片 找的图片必须是看起来能够让 AI 有能力识别和推理的,因为现在的AI虽然可以补全但是能力还没有像人的想象力那么丰富。 比如上面这张图片,看起来虽…...
