Kubernetes 四层代理Service:深入解析-程序员宅基地

技术标签: 云原生  Kubernetes航线图:从船长到K8s掌舵者  kubernetes  运维  四层代理  k8s  Service  

明明跟你说过:个人主页

个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 

行路有良友,便是天堂

目录

一、前言

1、k8s概述

2、四层代理的概念

二、Service的类型

1、ClusterIP

2、NodePort

3、LoadBalancer

4、ExternalName

三、四层代理Service的原理

1、Service的发现机制

2、iptables与ipvs代理模式的比较

3、kube-proxy的工作流程

4、kube-proxy三种工作模式 


一、前言

1、k8s概述

Kubernetes单词起源于希腊语, 是“舵手”或者“领航员、飞行员”的意思。

Kubernetes(简称K8s)的前世今生可以追溯到谷歌(Google)内部的一个项目,它起源于2003年,当时谷歌正面临着不断增长的应用程序和服务的管理挑战。这个项目最初被称为"Borg",是一个早期的容器编排系统。Borg 的成功经验成为 Kubernetes 开发的契机。

 有关k8s起源的介绍,请参考《初识K8s之前世今生、架构、组件、前景》这篇文章

Kubernetes的优点包括可移植性、可伸缩性和扩展性。它使用轻型的YAML清单文件实现声明性部署方法,对于应用程序更新,无需重新构建基础结构。管理员可以计划和部署容器,根据需要扩展容器并管理其生命周期。借助Kubernetes的开放源代码API,用户可以通过首选编程语言、操作系统、库和消息传递总线来构建应用程序,还可以将现有持续集成和持续交付(CI/CD)工具集成。

2、四层代理的概念

在Kubernetes (k8s) 中,四层代理是指在OSI七层网络模型中的第四层(传输层)进行的代理服务。这种代理主要处理基于TCP或UDP协议的流量,不涉及HTTP等应用层协议的具体内容。

在Kubernetes环境中,四层代理主要用于Service对象的网络通信。当创建一个Kubernetes Service时,可以选择不同的Service类型来暴露Pod的应用服务。

通过这样的机制,即使Pod的IP地址发生变化,客户端仍然可以通过稳定的Service IP地址访问服务,并且能够自动负载均衡,从而实现了服务的高可用性和无状态性,以及Pod层面的动态管理。

二、Service的类型

1、ClusterIP

在Kubernetes中,Service的ClusterIP类型是一种定义一组Pod网络访问规则的抽象方式。具体来说,ClusterIP为Service分配一个内部IP地址,使得该Service只能在集群内部被访问。这个IP地址是一个虚拟的IP地址,用于连接客户端和Pod。它主要用于服务发现和负载均衡,确保集群内部的流量能够按照预期的方式流动。

ClusterIP类型的Service通常用于后端服务,如数据库或缓存服务,这些服务主要供集群内部的其他组件使用,而不需要从集群外部直接访问。此外,由于ClusterIP仅在集群内部有效,它提供了一定程度的安全性,可以防止未经授权的外部访问。

2、NodePort

NodePort是Kubernetes中Service的一种类型,它提供了一种将Service暴露到集群外部的方式。具体来说,NodePort会在每个集群节点上打开一个特定的端口,然后将来自该端口的流量转发到对应的Service。NodePort会为Service分配一个静态的端口号(通常是30000-32767的范围),并将该端口映射到Service的端口。

通过集群节点的IP地址和指定的NodePort端口号,可以从集群外部访问到相应的Service。这使得NodePort类型的Service特别适合需要从外部访问集群中的服务的场景,例如开发和测试环境。并且,NodePort也可以用于将Kubernetes内部的服务与集群外的现有服务进行关联,例如连接到外部的数据库或其他资源。

3、LoadBalancer

Service的LoadBalancer类型是Kubernetes中用于将流量从集群外部的负载均衡器路由到集群内的服务的一种机制。这种Service类型通常用于公共云环境,如AWS、GCP、Azure等,或其他支持这种负载均衡机制的环境中。

当创建一个LoadBalancer类型的Service时,Kubernetes会根据云提供商的支持自动创建一个负载均衡器,并为该Service分配一个外部IP地址。这个负载均衡器会动态地将外部流量转发到后端Pod。通过这种方式,用户可以通过分配的外部IP地址直接访问Kubernetes集群中的服务。

除了自动创建负载均衡器和分配IP地址外,LoadBalancer类型的Service还提供了负载均衡和动态调整的能力。负载均衡器会根据Pod的健康状况和负载情况进行动态调整,确保流量能够均匀地分发到各个Pod上,并提供高可用性和可扩展性

4、ExternalName

在Kubernetes中,Service的类型ExternalName是一种特殊的类型,它用于将服务映射到一个外部的DNS名称,而不是典型的选择器(如Pod标签)来选择一组Pod实例来提供服务。通过使用ExternalName,可以在Kubernetes集群内部为外部服务创建一个别名,这样集群内的Pod就可以通过这个名字来访问外部服务。

具体来说,当为Service指定ExternalName类型时,需要使用spec.externalName字段来指定要映射的外部DNS名称。一旦创建了这个Service,Kubernetes就会将对该Service的DNS查询解析为指定的外部DNS名称,从而允许集群内的Pod通过该Service名称来访问外部服务。

三、四层代理Service的原理

1、Service的发现机制

k8s在创建Service时,会根据标签选择器selector(lable selector)来查找Pod,据此创建与Service同名的endpoint对象,当Pod 地址发生变化时,endpoint也会随之发生变化,service接收前端client请求的时候,就会通过endpoint,找到转发到哪个Pod进行访问的地址。(至于转发到哪个节点的Pod,由负载均衡kube-proxy决定)。

2、iptables与ipvs代理模式的比较

iptables与ipvs代理模式在Kubernetes环境中各自扮演着不同的角色,具有不同的特点和适用场景。

下面是对这两种代理模式的比较:

1. 性能:

  • IPVS:IPVS是一种高效的Layer-4交换机,专为负载均衡设计。它使用基于哈希的负载均衡算法,能够快速处理大量的并发连接,因此在性能方面通常表现更好。适用于集群规模较大或Service数量较多的场景,能够提供更好的吞吐和速度。
  • iptables:iptables是社区传统的kube-proxy模式,性能可能会受到规则数量和链的复杂度的影响。当集群中Service数量较少或客户端会出现大量并发短连接时,iptables可能是一个合适的选择。然而,当集群规模扩大或Service数量增多时,iptables可能会出现网络延迟的情况。

2. 工作原理:

  • IPVS:IPVS基本上是一种高效的Layer-4交换机,它提供负载平衡的功能。当一个TCP连接的初始SYN报文到达时,IPVS就选择一台服务器,将报文转发给它。此后,通过查发报文的IP和TCP报文头地址,确保此连接的后继报文被转发到相同的服务器。
  • iptables:iptables并不是实现防火墙功能的软件,而是一个中间代理程序。用户通过iptables软件写入的安全规则,最终会被netfilter包过滤型防火墙写入到内核空间的安全框架中。iptables主要工作在网络层,实现客户端到目标端的安全策略,通过过滤数据包中的header信息来匹配防火墙规则,决定是否放行或阻止进入。

3. 支持的协议:

  • IPVS:支持TCP、UDP和SCTP协议的负载均衡。
  • iptables:通常用于处理IP层和TCP/UDP层的防火墙规则。

4. 配置方式:

  • IPVS:配置是基于集群中的Service和Endpoint对象,由Kube-proxy直接与内核交互进行配置。
  • iptables:模式下的Kube-proxy会生成一系列的iptables规则来实现服务代理。

iptables和IPVS在性能、工作原理、支持的协议和配置方式等方面都存在差异。在选择使用哪种代理模式时,需要根据具体的需求和集群环境的特点来决定。对于大规模集群或需要处理大量并发连接的场景,IPVS可能更适合;而对于较小规模的集群或需要处理防火墙规则的场景,iptables可能是一个更合适的选择。 

3、kube-proxy的工作流程

首先,kube-proxy会在每个节点上运行,并监听Kubernetes API Server中的Service和Endpoints对象的变化。当新的Service或Endpoint被添加、更新或移除时,API Server会将这些更改通知给kube-proxy。

接下来,kube-proxy会根据配置的模式(iptables或IPVS)来更新节点的网络规则。在iptables模式下,kube-proxy会动态地修改iptables规则,确保每个Service都能够正确路由到对应的后端Pod。而在IPVS模式下,kube-proxy则使用Linux内核提供的IPVS技术来进行高效的负载均衡,支持多种负载均衡算法。

一旦网络规则更新完成,kube-proxy就会将Service的IP和端口映射成节点本地的一个端口进行代理。这样,当客户端发送请求到Service的IP和端口时,kube-proxy会根据网络规则将请求转发到相应的后端Pod。

在转发过程中,kube-proxy还会根据配置的负载均衡策略(如轮询或会话亲和力)来选择具体的后端Pod进行请求分发。这样可以确保流量的均匀分布和服务的稳定性。

4、kube-proxy三种工作模式 

kube-proxy在Kubernetes集群中有三种主要的工作模式:Userspace模式、iptables模式和IPVS模式。

1. Userspace模式:

  • 在这种模式下,kube-proxy通过在主机上创建一个userspace进程来实现服务代理。该进程会拦截所有服务流量,并根据服务配置信息将流量转发到后端Pod。具体地说,kube-proxy会观察Kubernetes中service和endpoint对象的变化,当有新的service创建时,所有节点的kube-proxy会在node节点上随机选择一个端口,并在iptables中追加一条把访问service的请求重定向到这个端口的记录。然后,kube-proxy开始监听这个端口的连接请求。然而,这种模式的缺点是性能损耗,因为请求数据需要到kube-proxy的用户空间中才能决定真正要转发的实际服务地址。
  • 在Userspace模式下,kube-proxy收到报文后,会通过Round Robin(轮询)或者Session Affinity(会话亲和力,即同一Client IP都走同一链路给同一Pod服务)分发给对应的Pod。


2. iptables模式:

  • 从Kubernetes 1.2开始,iptables模式被引入并在之后的版本中作为默认模式。在这种模式下,kube-proxy不再使用用户空间代理进行转发,而是直接利用Linux内核的iptables规则来实现服务的转发。当创建或删除服务时,kube-proxy会动态更新主机上的iptables规则,以将服务的虚拟IP地址映射到后端Pod的IP地址。
  • 由于iptables模式直接在内核层面进行转发,因此性能通常比Userspace模式要高。


3. IPVS模式:

  • IPVS模式是基于Linux内核中的IPVS模块实现的。IPVS是一个高效的Layer-4交换机,专为负载均衡设计,它允许kube-proxy在大量服务和高并发环境下实现高性能的负载均衡。
  • 与iptables模式相比,IPVS模式具有更好的性能,特别是在处理大量服务和连接时。此外,IPVS还提供了更丰富的负载均衡算法和更灵活的转发策略。

 

每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Kubernetes的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!

让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!    

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_53269650/article/details/137411280

智能推荐

【资源搜集】7 款不错的聊天机器人 API 接口搜集_免费的chatai接口-程序员宅基地

文章浏览阅读2.6w次,点赞29次,收藏146次。前段时间玩微信爬虫,仿佛打开了新世界的大门。使用 wxpy 库调用微信的接口,可以获取好友信息,聊天消息收发等功能。脑洞一开,这样不就可以用来做 聊天消息防撤回,红包提醒,自动回复这些有意思的玩意儿了嘛!言归正传,这次我搜集整理了一些比较好用的 ”聊天机器人“ 的 API 接口。如果后期有机会的话,把它们接入我的程序中,做一个陪聊小助手,也是一个不错的选择。小 i 机..._免费的chatai接口

毕业设计:基于深度学习的网课学生坐姿检测系统-程序员宅基地

文章浏览阅读889次,点赞24次,收藏36次。毕业设计:基于深度学习的网课学生坐姿检测系统利用深度学习算法对摄像头捕捉的学生图像进行特征提取和分类,以判断学生的坐姿是否正确。首先,通过图像采集模块获取学生的实时视频流,判断学生的坐姿状态。为计算机毕业设计提供了一个创新的方向,为毕业生提供了一个有意义的研究课题。对于计算机专业、软件工程专业、人工智能专业、大数据专业的毕业生而言,提供了一个具有挑战性和创新性的研究课题。无论您对深度学习技术保持浓厚兴趣,还是希望探索机器学习、信息安全、算法或人工智能的领域的同学,能为您提供灵感和指导;_坐姿检测系统

include详解 shell_thinkphp诸多限制条件下如何getshell详解-程序员宅基地

文章浏览阅读300次。前言先说说2020_n1CTF的web题Easy_tp5复现问题。这个题在保留thinkphp的RCE点的同时,并且RCE中ban掉许多危险函数,只能允许单参数的函数执行。对于现在在网络中流传的文件包含的点也增加了限制。smile yyds!先说一下这个题限制条件:thinkphp版本:5.0.0php版本:7对于包含文件增加了限制ban掉所有的单参数危险函数设置open_basedir为web目..._thinkphp5.x getshell 禁用函数

【好文推荐】Gradle-源码全解析(1)_gradle源码分析-程序员宅基地

文章浏览阅读741次,点赞14次,收藏20次。希望本文对你有所启发,有任何面试上的建议也欢迎留言分享给大家。好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。好了~如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。_gradle源码分析

第 6 章 URDF、Gazebo与Rviz综合应用(自学二刷笔记)-程序员宅基地

文章浏览阅读424次,点赞11次,收藏10次。kinect信息仿真以及显示

okv5 API常见问题_v5okv5-程序员宅基地

文章浏览阅读7.8k次,点赞2次,收藏9次。发起请求所有REST请求头都必须包含以下内容:(公共数据不需要)OK-ACCESS-KEY字符串类型的APIKey。OK-ACCESS-SIGN使用HMAC SHA256哈希函数获得哈希值,再使用Base-64编码(请参阅签名)。OK-ACCESS-TIMESTAMP发起请求的时间(UTC),如:2020-12-08T09:08:57.715ZOK-ACCESS-PASSPHRASE您在创建API密钥时指定的Passphrase。所有请求都应该含有application/json类型内容,并且是_v5okv5

随便推点

《Android App开发入门与项目实战》资源下载和内容勘误_android app开发入门与项目实战pdf-程序员宅基地

文章浏览阅读3.2k次。下面是《Android App开发入门与项目实战》一书用到的工具和代码资源:1、本书使用的Android Studio版本为4.1,最新的安装包可前往。2、本书提供所有示例源码的demo工程下载,源码(适配Android4.4到Android11)的下载方式见该书前言末尾的二维码,获取ppt课件同样扫描前言末尾的二维码。最新的源码也可访问我的gitee获取。_android app开发入门与项目实战pdf

< 前端性能优化: 资源加载优化 >_前端资源加载优化-程序员宅基地

文章浏览阅读991次,点赞2次,收藏6次。众所周知,前端是由HTML、CSS、JS等文件资源共同作用下渲染构建出来的。现今前端项目,大多为单页面应用,单页面应用的优点非常多(点击跳转 SPA单页面讲解),但是也并非没有缺点。由于单页面的原因,项目所需资源都需要在初次加载首屏时被加载,这就造成了首屏加载性能受到影响!对于首屏性能优化,就衍生出了相关需要思考的问题。如何将首屏加载的资源,分段将需要的资源及时加载出来,避免页面内容不显示的同时,又能避免加载多余并非立刻需要使用的资源呢?_前端资源加载优化

在CentOS上为Docker开启SELinux_docker selinux-enabled-程序员宅基地

文章浏览阅读3.7k次。现在公司生产服务器一般都使用CentOS 7系统,安装Docker也一直都是使用yum命令直接从CentOS自己的源安装。自从Docker项目改名为moby,进而诞生CE和EE两个不同版本后。不知是因为版权还是其他的什么原因,CentOS源中的Docker版本不再更新了,default维持在1.12.6,latest为1.13.1。为了使用新版本的Docker,只能添加官方repo,然后安装d..._docker selinux-enabled

【数据结构与算法】图的存储_领接矩阵上三角-程序员宅基地

文章浏览阅读853次。介绍图的 4 中存储方式:邻接矩阵、邻接表、十字链表和多重链表_领接矩阵上三角

智能运维探索:告警指标异常检测算法_运维领域关于故障,异常,告警的说法-程序员宅基地

文章浏览阅读3k次。IT运维领域要保障服务正常运行,通常第一步是将运维的对象监控起来,这其中主要就是对运维对象的指标进行实时监控:通过设定的(算法)规则对指标进行实时检测,当某个指标值不符合设定的规则时,则判定为异常,然后发送相应的告警到告警平台。告警平台收到告警后,会分配给对应的运维人员进行处理,运维人员根据告警信息来排查问题所在,最终定位故障的根本原因,并对故障进行修复。从这个流程可以看出,整个过程是以告警为中心,所以告警的质量至关重要。那么,如何保证指标类告警的质量呢,这就需要使用准确有效的(算法)规则来对指_运维领域关于故障,异常,告警的说法

数据库笔记2——数据模型_pcr关系是什么-程序员宅基地

文章浏览阅读295次。数据模型任何一个数据系统都必须支持某种数据模型,数据模型是我们在数据库系统中用来描述现实世界的一种方法以及方法的数据结构。层次数据模型用树的结构来表达,其中最主要用PCR(parent-chid relationship)关系来表达一对多的关系。数据模式:用很多的PCR关系组成一个大型的PCR关系。每个PCR关系代表着一个一对多的关系,且每个记录都只能有一个父节点。但现实世界除了一对多的关系还有很多多对多的关系。且每个记录很可能有两个双亲节点,如一个学生可能既是某个班级的学生,又是某个学生会的成_pcr关系是什么

推荐文章

热门文章

相关标签