Kubernetes从零到精通(10-服务Service)

news2024/12/25 9:13:49

Service简介

        Deployment这种工作负载能管理我们应用Pod的副本数,并实现动态的创建和销毁,所以Pod本身是临时资源(IP随时可能变化)。现在如果某组Pod A需要访问另一组Pod B,A就需要在应用的配置参数里动态跟踪并更改B的ip和端口,把这种需求放在业务端去实现显然是非常不合理的。Kubernetes给我们提供了解决方案:Kubernetes Service。

        Kubernetes Service的一个关键目标是让你无需修改现有应用以使用某种不熟悉的服务发现机制。Service是Kubernetes集群中用来提供负载均衡、服务发现和通信的关键组件,能够让Pod之间以及外部流量和内部应用进行稳定通信。

Service底层工作原理

ClusterIP和kube-proxy组件

        Service的核心机制依赖于Kubernetes的虚拟IP概念和kube-proxy组件(除非我们已经部署了自己的替换组件来替代kube-proxy)。每个Service都会分配一个ClusterIP,作为服务的固定入口。kube-proxy在每个节点上运行,负责维护IP关系表,将到达ClusterIP的流量转发到对应的Pod。

iptables和IPVS

        kube-proxy负责设置网络规则,常用的机制有:

iptables:通过添加大量的NAT规则来进行流量转发,但当服务数量增大时,性能下降较明显。

IPVS:相比iptables,IPVS提供了更高效的流量转发机制。IPVS使用更高效的哈希表来存储转发规则,具有更高的性能,适合大规模集群中的服务发现和负载均衡。

忘记Linux中iptables和IPVS概念的小伙伴可以到这里了解:

Linux技术03-Netfilter、Iptables、Nftables、Firewalld

Linux技术04-IPVS

EndpointSlice

        Service本身并不直接维护Pod的IP地址,而是通过EndpointSlice对象记录符合Service选择器的Pod列表。每当符合条件的Pod发生变更,Kubernetes控制器会更新EndpointSlice,对应的kube-proxy也会随之调整路由规则,并操作iptables或IPVS。

负载均衡

        Service提供了默认的轮询负载均衡(Round Robin),即将流量均匀分配到后端Pod。具体的流量分配方式依赖于kube-proxy的转发机制,如iptables或IPVS。

Service示例

        定义一个Deployment和一个Service:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app-container
        image: my-app:latest
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  selector:
    app: my-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  type: ClusterIP
  • Deployment 定义了应用Pod的副本数(replicas),并通过标签选择器 app:my-app进行匹配。
  • Service 定义了一个ClusterIP类型的服务,通过标签选择器 app:my-app将流量分发到符合条件的Pod。Service使用端口80对外提供服务,并将流量转发到Pod内部8080端口。

Service 类型

ClusterIP

        仅在集群内部可以访问,提供一个虚拟IP地址供集群中的其他Pod访问,如上面的示例。

NodePort

        在每个节点上暴露一个固定端口,并通过该端口访问服务。例如管理员需要访问监控组件prometheus的web ui,可以通过这种方式。

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

        示例中这个服务会在每个node节点的30007端口暴露服务,我们通过任一node的IP和30007端口即可从外部访问服务。

LoadBalancer

        使用外部负载均衡器,在云服务提供商上动态创建。在支持 LoadBalancer的云环境中,这种服务类型可以自动创建负载均衡器(依赖相关的cloud-controller-manager组件),并为其分配一个外部IP地址供外部访问。

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb" # 使用AWS Network Load Balancer (可选)
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP

ExternalName

        映射到外部服务的DNS名称,而不是映射到Kubernetes内部的Pod。该映射将集群的DNS服务器配置为返回具有该外部主机名值的cname记录;集群不会为之创建任何类型代理。

        例如Pod需要访问位于集群外的数据库、API 或者其他第三方服务;为外部的服务创建一个集群内部的别名,以便简化服务调用。

apiVersion: v1
kind: Service
metadata:
  name: google-service
spec:
  type: ExternalName
  externalName: www.google.com

Headless Services(无头服务)

        有时我们并不需要负载均衡,也不需要单独的Service IP。遇到这种情况,可以通过显式设置 集群 IP(spec.clusterIP)的值为"None" 来创建无头服务(Headless Service)。

        无头Service不会获得集群 IP,kube-proxy不会处理这类Service, 而且平台也不会为它们提供负载均衡或路由支持。

        无头Service通过内部DNS记录报告各个Pod的端点IP地址,这些DNS记录是由集群的DNS服务所提供的。

        无头Service一个常见的使用场景是StatefulSet管理的有状态服务。其他应用的Pod,需要直接访问各个节点DNS(例如kafka-0,kafka-1,kafka-2)。

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

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

相关文章

java(1)数据类型,运算符,逻辑控制语句以及基本应用

目录 ​编辑 1.前言 2.正文 2.1数据类型与变量 2.1.1字面常量 2.1.2数据类型 2.1.3变量 2.1.3.1整型 2.1.3.2浮点型 2.1.3.3字符型 2.1.3.4布尔型 2.1.4类型转换与类型提升 2.1.4.1字符串的拼接 2.1.4.2整型转字符串 2.1.4.3字符串转整数 2.2运算符 2.2.1算术运…

【效果+教程】免费!实操用AI设计图标Logo,不仅省了设计费,还是副业新赛道!

Logo是一个品牌或公司的视觉标识 一个好的logo可以帮助消费者快速识别品牌,增强品牌的可见性和记忆度。 一个专业设计的logo能够提升品牌的可信度,给人一种专业和可靠的印象。 一个设计精美且富有意义的logo能够与消费者建立情感联系,增强…

10887辆 捷途旅行者8月再夺方盒子销冠

近日,8月汽车销量排行榜正式出炉。捷途旅行者年内第四次实现月销过万,以10887辆的优异成绩,持续领跑方盒子市场。作为名副其实的畅销车型,捷途旅行者自去年上市以来,不仅连续三个季度卫冕方盒子销量冠军,创…

C++类与对象(下)--最后的收尾

内部类 • 如果⼀个类定义在另⼀个类的内部&#xff0c;这个内部类就叫做内部类。内部类是⼀个独⽴的类&#xff0c;跟定义在 全局相⽐&#xff0c;他只是受外部类类域限制和访问限定符限制&#xff0c;所以外部类定义的对象中不包含内部类。 #include<iostream> using…

C++中string使用

目录 介绍 使用 迭代器&#xff08;Iterator&#xff09; begin&#xff0c;end rbegin&#xff0c;rend 容量&#xff08;Capacity&#xff09; size&#xff0c;length capacity empty clear resize reserve 元素访问&#xff08;Element access&#xff09; ope…

美国陆军发布下一代目标识别和感知倡议

文章目录 前言一、下一代目标识别与感知倡议的内容二、下一代目标识别与感知倡议重点关注领域(1)目标标记、跟踪和定位 (TTL)(2)侦察和监视 (R&S)(3)无人系统 (UMS)前言 2024年7月23日,美国陆军发布了下一代目标识别与感知倡议,希望工业界能够开发战场态势感知、侦…

LeetCode 692.前K个高频单词

LeetCode 692.前K个高频单词 C 思路&#x1f9d0;&#xff1a; 首先用map存储该字典&#xff0c;然后放进vector进行排序&#xff0c;注意sort的排序规则与我们想要的规则不一致&#xff0c;所以我们需要写一个伪函数来判断second(value值)&#xff0c;由于该题要求了稳定性&am…

Rider使用习惯

1.修改rider的快捷方式为VSCode样式的&#xff0c;修改设置方式 2.在项目中点击某个脚本文件&#xff0c;即在项目视图中选中这个文件&#xff0c;设置方式如下&#xff1a; 暂时先记录这么多&#xff0c;以后有零碎的随时记录

VUE,element-ui,优化tabs组件每次点击,所有子页面都重新渲染问题

1.在data中定义每个子组件相应的值&#xff0c;ture为加载&#xff0c;false为不加载。 2.在子组件中使用v-if来判断是否渲染当前页面 3.在函数中对子组件的值进行切换。 handleClick(){if(this.activeNamefirst){this.pageOne truethis.pageTwo false}else if(this.active…

通过 4EVERLAND 的终极 4EVER Boost 活动增强你的活动能力!

介绍 近日&#xff0c;4EVERLAND宣布启动最新、最激动人心的计划 — 4EVER Boost 活动&#xff01;4EVER Boost 活动旨在吸引更多社区成员加入并加速去中心化物理基础设施4EVER 网络的发展。用户可以参与节点质押、日常任务和 T4EVER/NFT 质押&#xff0c;以加快获得 $4EVER 积…

Spring Security认证与授权

1 Spring Security介绍 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。由于它是Spring生态系统中的一员&#xff0c;因此它伴随着整个Spring生态系统不断修正、升级&#xff0c;在spring boot项目中加入springsecurity更是…

隔离DCDC模块B0505/B0503对RS485和CAN总线进行电源隔离

CAN和485都是工业通信中常用的现场总线&#xff0c;做好通信总线的隔离防护是产品可靠、稳定的重要前 提。 一、通信总线为什么要隔离&#xff1f; 目前大多数产品对外通讯部分可总结为&#xff1a; MCU收发器外部总线&#xff0c;其中大多数常用的MCU都集成有CAN或UART链路层…

Linux中的简单命令2

一.echo指令 echo的作用是显式文本内容 #echo ‘字符串’ #echo “字符串” echo会将后面的内容当作字符串直接打印在屏幕上&#xff0c;后面的内容需要用单引号或者双引号括起来 注意&#xff1a;echo会自动在字符串后面加上一个换行符。 可以与printf进行对比&#xff1a; …

从Zotero6到Zotero7的数据迁移尝试?(有错勿喷,多多指教!)

从Zotero6到Zotero7的数据迁移尝试 0 前言 之前在主机上一直用的Zotero6&#xff08;实验室主机&#xff09;&#xff0c;最近发现在个人笔记本上看论文更频繁&#xff0c;尝试重新部署Zotero&#xff0c;才发现竟然更新了&#xff01;所以这里简单记录一下数据迁移过程&…

水厂中的反冲洗工艺

滤池作为水厂的重要的处理单元之一,滤池的形式多种多样,但其截留水中杂质的原理基本相同。我们以常见的V型滤池为例,介绍一下水厂中的反冲洗工艺。 V型滤池是快滤池的一种形式,因为其进水槽形状呈V字形而得名,也叫均粒滤料滤池(其滤料采用均质滤料,即均粒径滤料)、六阀滤…

代码随想录算法训练营第14天|226. 翻转二叉树、101. 对称二叉树、104. 二叉树的最大深度、111. 二叉树的最小深度

目录 226. 翻转二叉树1、题目描述2、思路3、code&#xff08;后序递归&#xff09; 101. 对称二叉树1、题目描述2、思路3、code 104. 二叉树的最大深度1、题目描述2、思路3、code 111. 二叉树的最小深度1、题目描述2、思路3、code 226. 翻转二叉树 题目链接&#xff1a;link …

2024年最新软件测试学习路线图(从入门到精通)

六维全息课程注重综合能力培养&#xff0c;从入学到职后一站式服务测试开发人才。2024年最新软件测试学习路线图&#xff0c;从入门到精通一应俱全。 9阶段专业课11大专项测试项目 适应互联网企业测试开发需求。 对于想入行学软件测试的新手来说&#xff0c;首先就需要一个高效…

GESP等级考试 C++二级-if语句

if语句是C中的选择语句&#xff0c;通过if语句程序可以在一种可能、二种可能或者多种可能中做出选择&#xff0c;对于不同的可能进行不同的处理。 1 一种可能 使用if语句对一种可能进行处理的格式如下所示&#xff1a; if (表达式) {语句; } 其中&#xff0c;if后面跟一个圆…

预报名来啦!25届考研所有重要时间节点和注意事项一览

预报名即将开始&#xff0c;学姐给大家准备了&#xff0c;详细的报考流程及常见问题&#xff0c;每年都有学生因为报名出问题导致没法参加考试&#xff0c;大家一定要认真对待哦~ 一.报名时间及流程 01 预报名时间 2024年9月24日至9月27日&#xff0c;9:00—22:00 02 预报名…

高校课堂教学管理系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;课程分类管理&#xff0c;课程资源管理&#xff0c;互动论坛&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;课程资源&#xff0…