K8s service 进阶

文章目录

  • K8s service 进阶
    • Service 工作逻辑
    • Service 具体实现
    • Service 资源类型
      • ClusterIP
      • NodePort
      • LoadBalancer
      • ExternalName
    • Service 与 Endpoint
      • Endpoint 与 容器探针
      • 自定义Endpoint
    • Service 相关字段
      • sessionAffinity
      • externalTrafficPolicy
      • internalTrafficPolicy
      • publishNotReadyAddresses

K8s service 进阶

Service 工作逻辑

Service 通过持续监控APIServer,监视Service标签选择器所匹配的后端Pod,并实时跟踪这些Pod对象的变动情况。

Service 与Pod 之间还有一个中间件 Endpoints, Endpoint 来管理pod 的 address 和 port

整个默认访问链路为: Service -> Endpoint --iptables–> pod

在这里插入图片描述

Service 具体实现

在Kubernetes中,service只是抽象的一个概念,真正起作用实现负载均衡规则的其实是Kube-Proxy这个进程。它在每个节点上都需要运行一个kube-Proxy,用来完成负载均衡规则的创建。

1. 创建Service资源后,会分配一个随机的ServiceIP,返回给用户,然后写入etcd;
2. endpoints controller负责生成和维护所有endpoints,它会监听Service和pod的状态,当 pod 处于running 且准备就绪
时,endpoints controller会将 pod ip更新到对应Service的 endpoints 对象中,然后写入Etcd;
3. kube-proxy通过API-Server监听Service、Endpoints的资源变动,一旦Service或Endpoints资源发生变化,Kube-Proxy会将最新的信息转换为对应的Iptables、IPVS访问规则,而后在本地主机上执行。
4. 当客户端想要访问Service的时候,其实访问的就是本地节点上的iptables、IPVS规则,由它们路由到对应节点;

在这里插入图片描述

Service 资源类型

ClusterIP

  • 定义:ClusterIP是Kubernetes中的默认Service类型,它在集群内部提供一个虚拟IP,作为一组Pod的访问入口。
  • 特点:
    • 仅为集群内部提供访问。
    • 通过标签选择器(Label Selector)与一组Pod关联。
    • 提供负载均衡功能,支持轮询或随机策略。
    • 支持会话亲和性(Session Affinity),如ClientIP,以确保来自同一客户端的请求被转发到同一Pod。
  • 用途:适用于集群内部服务间的通信,确保服务的稳定性和可访问性。
apiVersion: v1
kind: Service
metadata: name: demo-svc-clusterip
spec:type: ClusterIP  # 默认类型clusterIP:  10.96.1.1  # 设置ipselector:app: webports:- name: httpport: 80targetPort: 80

NodePort

  • 定义:NodePort类型在所有节点上打开一个特定的端口,外部流量可以通过<NodeIP>:<NodePort>的方式访问Service。
  • 特点:
    • 允许外部访问集群内的服务。
    • Kubernetes在30000-32767范围内自动为每个NodePort类型的Service分配一个端口。
    • 与ClusterIP类似,也提供负载均衡和会话亲和性支持。
  • 用途:适用于需要从集群外部访问服务的场景,如临时测试、开发环境等。
apiVersion: v1
kind: Service
metadata:name: demo-svc-nodeport
spec:type: NodePortselector:app: webports:- name: httpport: 80   # Service 的porttargetPort: 80  # Pod 的 portnodePort: 32001 

LoadBalancer

  • 定义:LoadBalancer类型基于NodePort实现,但进一步通过云服务商提供的负载均衡器将流量分发到各个Node。

  • 特点:

    • 适用于公有云环境,如AWS、Azure、GCE等。
    • 外部流量通过云服务商的负载均衡器转发到集群内的Service。
    • 提供高可用性、可扩展性和负载均衡等特性。
  • 用途:适用于生产环境中需要高可用性和可扩展性的服务。

ExternalName

  • 定义:ExternalName类型将Service映射到集群外部的DNS名称,而不是提供一个虚拟IP或端口。
  • 特点:
    • 不进行kube-proxy代理或流量转发。
    • 允许集群内的Pod通过Service名称直接访问外部服务。
  • 用途:适用于需要将Kubernetes集群内的服务与外部服务(如数据库、消息队列等)集成的场景。通过ExternalName,Pod可以像访问集群内服务一样访问外部服务,简化配置和管理。
apiVersion: v1
kind: Service
metadata:name: demo-svc-externalname
spec:type: ExternalNameexternalName: www.baidu.com

Service 与 Endpoint

Endpoint 与 容器探针

Service对象借助Endpoint资源来跟踪其关联的后端端点,Endpoint对象会根据Service标签选择器筛选出的后端端点的IP地址分别保存在subsets.address字段和subsets.notReady Address字段中,它通过APIServer持续、动态跟踪每个端点的状态变化,并即使反应到端点IP所属的字段中。

  • subsets.address:保存就绪的容器IP,也就意味着service可以直接将请求调度至该地址段。
  • subsets.notReadyAddress:保存末就绪容器IP,也就意味着service不会将请求调度至该地址段。

自定义Endpoint

service通过selector和pod建立关联,K8s会根据service关联到的pOdIP信息组合成一个endpoint。若service定义中没有selector字段,service被创建时,endpoint controller不会自动创建endpoint。

我们可以通过配置清单创建Service,而无需使用标签选择器,而后自行创建一个同名的endpoint对象,指定对应的IP。这种一般用于将外部MySQL\Redis等应用引1入KUbernetes集群内部,让内部通过Service的方式访问外部资源。

在这里插入图片描述

apiVersion: v1
kind: Service
metadata:name: mysql-external
spec:type: ClusterIPports:- port: 3366                  # 负载均衡的对外端口targetPort: 3306            # 后端MySQL的端口---
apiVersion: v1
kind: Endpoints
metadata:name: mysql-external
subsets:- addresses:- ip: 10.0.0.206#- ip: 10.0.0.205ports:- protocol: TCPport: 3306               # 定义后端的端口是多少

Service 相关字段

sessionAffinity

如果要将来自特定客户端的链接调度到同一Pod,可以通过sessionAffinity 基于客户端 IP 地址进行会话保持。还可以通过设置最大会话停留时间(默认10800秒,3个小时)

apiVersion: v1
kind: Service
metadata: name: session-svc
spec:type: NodePortselector:role: webports:- name: httpprotocol: TCPport: 80targetPort: 80  sessionAffinity:  ClientIp  # 配置 sessionAffinity 策略,默认为 NonesessionAffinityConfig:clientIP:timeoutSeconds: 60   # 设置最大会话时长

externalTrafficPolicy

外部流量策略:当外部用户通过NodePort请求Service,是将外部流量路由到本地节点上的Pod,还是路由到集群范围的Pod:

  • cluster(默认):将用户请求路由到集群范国的所有Pod节点,具有良好的整体负载均衡。
  • Local:仅会将流量调度至请求的目标节点本地运行的Pod对象之上,以减少网络跳跃,降低网络延迟,但当请求指向的节点本地不存在目标Service相关的Pod对象时直接丢弃该报文。

在这里插入图片描述

apiVersion: v1
kind: Service
metadata: name: session-svc
spec:type: NodePortselector:role: webports:- name: httpprotocol: TCPport: 80targetPort: 80externalTrafficPolicy: LocalsessionAffinity:  ClientIp  # 配置 sessionAffinity 策略,默认为 NonesessionAffinityConfig:clientIP:timeoutSeconds: 60   # 设置最大会话时长

internalTrafficPolicy

本地流量策略:当本地Pod对Service发起访问时,是将流量路由到本地节点上的Pod,还是路由到集群范国的Pod:

  • cluster(默认):将Pod的请求路由到集群范国的所有Pod节点,具有良好的整体负载均衡。
  • Local:将请求路由到与发起方处于相同节点的端点,这种机制有助手节省开销,提升效率。但当请求指向的节点本地不存在目标service相关的Pod对象时直接丟弃该报文。

在这里插入图片描述

注意:在一个Service上,当externalTrafficPolicy已设置为Local时,internalTrafficPolicy则无法使用。换句话说,在一个集群的不同 Service 上可以同时使用这两个特性,但在一个Service 上不行

apiVersion: v1
kind: Service
metadata: name: session-svc
spec:type: NodePortselector:role: webports:- name: httpprotocol: TCPport: 80targetPort: 80internalTrafficPolicy: Local

publishNotReadyAddresses

pubishNotReadyAddresses: 表示Pod就绪探针探测失败,也不会将失败的PodIP 加入到NotReadyAddresses列表中

apiVersion: v1
kind: Service
metadata: name: session-svc
spec:type: NodePortselector:role: webports:- name: httpprotocol: TCPport: 80targetPort: 80pubishNotReadyAddresses: true

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

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

相关文章

【微机原理及接口技术】可编程计数器/定时器8253

【微机原理及接口技术】可编程计数器/定时器8253 文章目录 【微机原理及接口技术】可编程计数器/定时器8253前言一、8253的内部结构和引脚二、8253的工作方式三、8253的编程总结 前言 本篇文章就8253芯片展开&#xff0c;详细介绍8253的内部结构和引脚&#xff0c;8253的工作方…

C++STL容器系列(三)list的详细用法和底层实现

目录 一&#xff1a;介绍二&#xff1a;list的创建和方法创建list方法 三&#xff1a;list的具体用法3.1 push_back、pop_back、push_front、pop_front3.2 insert() 和 erase()3.3 splice 函数 四&#xff1a;list容器底层实现4.1 list 容器节点结构5.2 list容器迭代器的底层实…

基于51单片机的交通灯设计

一.硬件方案 本设计能模拟基本的交通控制系统&#xff0c;用红绿黄灯表示禁行&#xff0c;通行和等待的信号发生&#xff0c;还能进行倒计时显示。按键可以控制禁行、深夜模式、复位、东西通行、南北通行、时间加、时间减、切换等功能。共四个二位阴极数码管&#xff0c;东南西…

人工智能初识

&#x1f31e;欢迎来到人工智能基础的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f4c6;首发时间&#xff1a;&#x1f339;2024年5月1…

C#多线程同步lock、Mutex

C#使用多线程可以通过System.Threading命名空间下的Thread类来实现 lock和Mutex用于实现线程同步的机制&#xff1a; 上代码&#xff1a; class People{public People(int idd){id idd;}public int id;public int age;}class TestHelper{public TestHelper() { }List<Peo…

uniapp h5项目切换导航栏及动态渲染按钮颜色

1.效果图 2.html,动态渲染按钮样式---三元判断 <!-- 切换栏 --><view class"statusList"><block v-for"(item,index) in list" :key"index"><view class"swiper-tab-list" :class"current item.id?activ…

【STL】C++ stack(栈) 基本使用

目录 一 stack常见构造 1 空容器构造函数&#xff08;默认构造函数&#xff09; 2. 使用指定容器构造 3 拷贝构造函数 二 其他操作 1 empty 2 size 3 top 4 push && pop 5 emplace 6 swap 三 总结 一 stack常见构造 1 空容器构造函数&#xff08;默认构造…

西储大学数据集学习

数据集下载地址&#xff1a;CWRU凯斯西储大学轴承数据数据集——附&#xff1a;下载链接_西储大学轴承数据集下载-CSDN博客 最近研究故障诊断&#xff0c;先对使用比较多的西储大学数据集研究。以资料【1】中的内容展开研究。 1、轴承的结构 轴承分为外圈、内圈、保持架和滚珠…

202474读书笔记|《我自我的田渠归来》——愿你拥有向上的力量,一切的好事都应该有权利发生

202474读书笔记|《我自我的田渠归来》——愿你拥有向上的力量 《我自我的田渠归来》作者张晓风&#xff0c;被称为华语散文温柔的一支笔&#xff0c;她的短文很有味道&#xff0c;角度奇特&#xff0c;温柔慈悲而敏锐。 很幸运遇到了这本书&#xff0c;以她的感受重新认识一些事…

端口扫描利器--nmap

目录 普通扫描 几种指定目标的方法 TCP/UDP扫描 端口服务扫描 综合扫描 普通扫描 基于端口连接并响应(真实) ​ nmap -sn 网段(0/24)-sn 几种指定目标的方法 单个IP扫描 IP范围扫描 扫描文件里的IP 扫描网段,(排除某IP) 扫描网段(排除某清单IP) TCP/UDP扫描 -sS …

windows系统电脑外插键盘驱动出现感叹号或者显示未知设备,键盘无法输入的解决办法

笔记本外插的键盘不能用&#xff0c;鼠标可以使用。 查找故障&#xff0c;结果打开设备管理器看到键盘那项里是一个的黄色惊叹号显示未知设备&#xff01;[图片]如下图所示 其实解决办法很简单&#xff0c;不要相信网上的一些博主说删除什么注册表&#xff0c;我开始跟着他们操…

C++笔试强训day36

目录 1.提取不重复的整数 2.【模板】哈夫曼编码 3.abb 1.提取不重复的整数 链接https://www.nowcoder.com/practice/253986e66d114d378ae8de2e6c4577c1?tpId37&tqId21232&ru/exam/oj 按照题意模拟就行&#xff0c;记得从右往左遍历 #include <iostream> usi…

React基础知识笔记

Reat简介 React&#xff1a;用于构建用户界面的 JavaScript 库。由 Facebook 开发且开源。是一个将视图渲染为html视图的开源库 第一章&#xff1a;React入门 相关js库 react.development.js &#xff1a;React 核心库react-dom.development.js &#xff1a;提供 DOM 操作的…

【分享】3种方法取消PPT的“限制保护”

PPT如果设置了有密码的“只读方式”&#xff0c;每次打开PPT&#xff0c;都会出现对话框&#xff0c;提示需要输入密码才能修改文件&#xff0c;否则只能以“只读方式”打开。 以“只读方式”打开的PPT就会被限制&#xff0c;无法进行编辑修改等操作。那如果后续不需要“限制保…

【Linux进程篇】Linux进程管理——进程创建与终止

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 目录 进程创建 fork函数初识 写时拷贝 fork常规用法 fork调用失败的原因 进程终止 进程退出场景 _exit函数 exit函数 return退出 进程创建 fork函数初识 在linux中fork函数时非常重要的函数&#xff0c;它从已…

Python Selenium 详解:实现高效的UI自动化测试

落日余辉&#xff0c;深情不及久伴。大家好&#xff0c;在当今软件开发的世界中&#xff0c;自动化测试已经成为保障软件质量和快速迭代的重要环节。而在自动化测试的领域中&#xff0c;UI自动化测试是不可或缺的一部分&#xff0c;它可以帮助测试团队快速验证用户界面的正确性…

huggingface的self.state与self.control来源(TrainerState与TrainerControl)

文章目录 前言一、huggingface的trainer的self.state与self.control初始化调用二、TrainerState源码解读(self.state)1、huggingface中self.state初始化参数2、TrainerState类的Demo 三、TrainerControl源码解读(self.control)总结 前言 在 Hugging Face 中&#xff0c;self.s…

Kong网关的负载均衡

安装java环境 查询 java安装包 196 yum list java* 安装java8197 yum install -y java-1.8.0-openjdk.x86_64 检验java8是否安装成功。198 java -version2个tomcat准备 另外一个tomcat区别在于&#xff1a;配置文件。conf/server.xml 启动tomcat [rootlocalhost bin]# ./…

JDBC使用步骤-小白入门

一.JDBC开发流程 加载并注册JDBC驱动创建数据库连接创建Statement对象遍历查询结果关闭连接,释放资源 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement;public class StandardJDBCSample {public static …

【busybox记录】【shell指令】unlink

目录 内容来源&#xff1a; 【GUN】【unlink】指令介绍 【busybox】【unlink】指令介绍 【linux】【unlink】指令介绍 使用示例&#xff1a; 删除文件 - 默认 常用组合指令&#xff1a; 指令不常用/组合用法还需继续挖掘&#xff1a; 内容来源&#xff1a; GUN &#x…