K8s service 进阶

news/2024/7/25 3:12:36/文章来源:https://blog.csdn.net/qq_55752792/article/details/139267741

文章目录

  • 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.luyixian.cn/news_show_1054225.aspx

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

相关文章

学习笔记——动态路由协议——OSPF(OSPF区域)

四、OSPF区域 OSPF路由器在同一个区域(Area)内网络中泛红LSA(链路状态通告)。为了确保每台路由器都拥有对网络拓扑的一致认知&#xff0c;LSDB需要在区域内进行同步。如果OSPF域仅有一个区域&#xff0c;随着网络规模越来越大&#xff0c;LSDB越来越庞大&#xff0c;OSPF路由器…

【MySQL数据库】 MySQL主从复制

MySQL主从复制 MySQL主从复制主从复制与读写分离的意义主从数据库实现同步&#xff08;主从复制&#xff09;三台mysql服务器搭建主从复制&#xff0c;要求不可以用root帐号同步&#xff0c;要求第三台服务器在测试过1、2的主从复制之后进行主从复制配置 MySQL主从复制 主从复…

SQL学习小记(三)

SQL学习小记&#xff08;三&#xff09; 功能实现思路代码部分名词解释 代码打包为可执行文件 功能说明&#xff1a;使用python代码&#xff0c;将数据库database1中的表格table1同步到数据库database2中 功能实现 思路 #mermaid-svg-R1pWrEWA799M299a {font-family:"tre…

计算机组成原理----原码,反码与补码

1.原码的出现 我们通常使用"","-"判断数字的正负,而在计算机中,则将二进制的首位当作标记符号,"0"表示正数,"1"表示负数,这样就解决了在计算机中表示数值正负的问题,唯一的缺点就是第1位被占作符号位。 0 0000001 原 0 0000010 原 …

密码学基础概念

加密性 什么是加密&#xff1f; 1.对原有的明文数据&#xff0c;执行某种运算&#xff0c;得到密文数据。 2.密文数据对于未授权人员而言&#xff0c;在一定上程度上加大了解读的难度 3.加密功能用于实现机密性 什么是密钥&#xff1f; 1.如同持有保险柜钥匙才能打开保险柜…

如何在Spring Boot中整合PageHelper实现分页功能

1.前言 在开发web应用程序时&#xff0c;经常会遇到需要对数据库中的数据进行分页查询的情况。为了简化分页查询的实现过程&#xff0c;我们可以利用PageHelper这个优秀的分页插件来实现分页功能。本文将介绍如何在Spring Boot项目中整合PageHelper&#xff0c;并演示如何使用它…

Thinkphp3.2.3网站后台不能访问如何修复

我是使用Thinkphp3.2.3新搭建的PHP网站&#xff0c;但是网站前台可以访问&#xff0c;后台访问出现如图错误&#xff1a; 由于我使用的Hostease的Linux虚拟主机产品默认带普通用户权限的cPanel面板&#xff0c;对于上述出现的问题不清楚如何处理&#xff0c;因此联系Hostease的…

深入分析 Android Activity (十一)

文章目录 深入分析 Android Activity (十一)1. Activity 的内存管理和优化1.1 内存泄漏的常见原因1.2 避免内存泄漏的方法1.3 内存泄漏检测工具 2. Activity 的配置变更处理2.1 处理配置变更2.2 保存和恢复状态2.3 使用 ViewModel 3. Activity 的测试3.1 单元测试3.2 UI 测试 4…

Centos安装nvm管理node版本(让安装变得可控又快捷)

Centos安装nvm管理node版本&#xff08;让安装变得可控又快捷&#xff09; 没有找到一个对的人&#xff0c;有可能是你没有走对那条路&#xff0c;也有可能是你没有睁开眼睛&#xff0c;而更大的可能是&#xff0c;你根本就没有出发去找。 安装说明 nvm安装目录&#xff1a;/us…

[ue5]建模场景学习笔记(1)——混合材质

卷首&#xff1a;这部分会记录建模场景等相关学习内容&#xff0c;与ue引擎学习笔记不同的是&#xff0c;可能会略过一些基础内容&#xff0c;因为部分知识在blender中已经学习过了&#xff0c;不再继续记录。 1.需求分析&#xff1a; 想构建一个山地的场景&#xff0c;在ue5中…

为什么要学习c++?

你可能在想&#xff0c;“C&#xff1f;那不是上个时代的产物吗&#xff1f;” 哎呀&#xff0c;可别小看了这位“老将”&#xff0c;它在21世纪的科技舞台上依旧光芒万丈&#xff0c;是许多尖端技术不可或缺的基石&#xff01; 1. 无可替代 c源于c语言&#xff0c;它贴近于硬…

gif帧数修改怎么操作?一键掌握GIF帧数修改技巧!

gif帧数修改怎么操作&#xff1f;在数字化信息爆炸的时代&#xff0c;GIF动图因其生动有趣的特性而备受广大网友喜爱。然而&#xff0c;很多时候我们可能会遇到GIF动图帧数过多或过少&#xff0c;导致动画效果不尽如人意的情况。那么&#xff0c;如何对GIF动图的帧数进行修改呢…

如何利用Firebase Hosting来托管网站

文章目录 如何利用Firebase Hosting来托管网站前提条件详细步骤1. 安装 Firebase CLI2. 登录 Firebase3. 初始化 Firebase 项目4. 准备网站文件5. 部署到 Firebase6. 配置自定义域名&#xff08;可选&#xff09; 常见问题 如何利用Firebase Hosting来托管网站 以下是更详细的…

【Python】进阶学习:pandas--describe()函数的使用介绍

&#x1f40d;【Python】进阶学习&#xff1a;pandas——describe()函数的使用介绍 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&am…

关于锂电池短路测试

了解锂电池短路测试 电池短路试验测试标准有哪些&#xff1f;宏展告诉你 - 哔哩哔哩 (bilibili.com) 电池电芯上架亚马逊美国站认证标准和要求UL1642测试 - 知乎 (zhihu.com) CR123A电池的短路试验: CR123A电池为例_锂锰电池所需通过的安全性能测试_纽扣电池_锂锰电池_松下电…

若依启动run-modules-system.bat报错问题解决方案

在启动run-modules-system.bat时遇到了一些问题,在网上搜索无果后,排查解决完毕 1.启动nacos时,报错如下 Error creating bean with name grpcClusterServer: Invocation of init method failed; nested exception is java.io.IOException: Failed to bind to address 0.0.0.0…

Linux Tcpdump抓包入门

Linux Tcpdump抓包入门 一、Tcpdump简介 tcpdump 是一个在Linux系统上用于网络分析和抓包的强大工具。它能够捕获网络数据包并提供详细的分析信息&#xff0c;有助于网络管理员和开发人员诊断网络问题和监控网络流量。 安装部署 # 在Debian/Ubuntu上安装 sudo apt-get install…

《TCP/IP网络编程》(第十二章)I/O复用(1)

本章将讨论实现并发服务器的第二种办法&#xff0c;基于I/O复用的服务器端构建。 I/O复用它允许单个进程或线程同时处理多个输入/输出&#xff08;I/O&#xff09;操作&#xff0c;而无需为每个I/O操作创建一个独立的线程或进程。这种技术可以显著提高应用程序的效率和性能&…

每日复盘-20240528

今日重点关注&#xff1a; 20240528 六日涨幅最大: ------1--------300956--------- 英力股份 五日涨幅最大: ------1--------301361--------- 众智科技 四日涨幅最大: ------1--------301361--------- 众智科技 三日涨幅最大: ------1--------301361--------- 众智科技 二日涨…

【全开源】CMS内容管理系统源码(ThinkPHP+FastAdmin)

基于ThinkPHPFastAdmin的CMS内容管理系统&#xff0c;自定义内容模型、自定义单页、自定义表单、专题、统计报表、会员发布等 提供全部前后台无加密源代码和数据库私有化部署&#xff0c;UniAPP版本提供全部无加密UniAPP源码。 ​构建高效内容管理的基石 一、引言&#xff1a…