kubernetes Service(SVC)几种4层代理的不同用法,ClusterIP、Headless、NodePort、LoadBalancer

2023-11-11

kubernetes Service(SVC)

service 概念

​ SVC 通过 Label Selector 标签选择的方式,匹配一组 Pod,对外访问服务。每一个 SVC可以理解成为一个微服务。
在这里插入图片描述

​ service 能够提供负载均衡的能力,但是在使用上有以下限制:

  • 只提供4层负载均衡能力(只有 RR 轮询算法),而没有7层功能,如果需要更多的匹配规则来转发请求,4层上的负载均衡是不支持的。

service 类型

Clusterip:默认类型,自动分配一个仅 Cluster 内部可以访问的 虚拟IP,一般用作集群内部负载均衡。

NodePort(service向外暴露):在ClusterIP 基础上为 Service 在每台机器上绑定一个映射端口,外网客户端可以通过 NodeIP,Nodeport访问。

LoadBalancer(service向外暴露):在 NodePort 基础上,借助 cloud provider 创建一个外部负载均衡器,并将请求转发到 NodeIP 和 NodePort

ExternalName:把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型代理被创建,只有1.7之后版本的 kube-dns支持。


SVC 访问流程组件

在这里插入图片描述

  1. 首先 apiserver 监听 kube-proxy 去进行服务和端口的发现。
  2. 通过kube-proxy监控,kube-proxy监控所有 Pod 节点信息,标签、IP、port 等,并负责把它们写入到 iptables 规则当中。
  3. client 访问 SVC,其实访问的是 iptables规则。再由 iptables 导向后端 Pod 节点。
  4. ipvs,图片上没有,现在的ClusterIP,NodePort 都是采取 ipvs 调度算法对后端 Pod 节点进行调度访问。

VIP 和 Service 代理

​ 在kubernetes集群中,每个 Node 运行一个 Kube-porxy 进程。kube-proxy负责为 service 实现了一种 VIP (虚拟IP) 的形式,而不是 ExternaName 的形式。

  • ​ 1.0版本,代理完全在 userspace

  • ​ 1.1版本,新增 iptables 代理,但并不是默认的运行模式

  • ​ 1.2版本,默认采用 iptables 代理

  • ​ 1.4版本,默认采用 ipvs 代理

service 是 “4层(TCP/UDP over IP)概念”,在1.1版本 新增了 Ingress API(beat 版),用来表示“7层代理”。

代理模式分类

Ⅰ、userspace 代理模式

在这里插入图片描述
client Pod 想要访问 Server Pod

  1. ​ 首先经过 Service IP(iptables),由 iptables
    转发至kube-proxy,kube-proxy根据访问的地址,端口进行转发,需要 kube-proxy 充当代理功能。
  2. ​ 其次 kube-apiserver 也会去监听 kube-proxy,kube-proxy 是否进行所有 Pod 信息的写入。
  3. ​ 导致 kube-proxy 的工作负载量过大,压力过大。


Ⅱ、Iptables 代理模式

在这里插入图片描述
client Pod 访问 Server Pod

​ 所有的请求,代理全部由 iptables 来完成,不再需要 kube-proxy 充当代理角色。

​ 提高了 稳定性和访问效率,压力减少


Ⅲ、ipvs 代理模式

ipvs (IP Virtual Server) 实现了传输层负载均衡,也就是我们常说的4层LAN交换,作为 Linux 内核的一部分。ipvs运行在主机上,在真实服务器集群前充当负载均衡器。ipvs可以将基于TCPUDP的服务请求转发到真实服务器上,并使真实服务器的服务在单个 IP 地址上显示为虚拟服务。

ipvs 对比 iptables

我们知道kube-proxy支持 iptables 和 ipvs 两种模式, 在kubernetes v1.8 中引入了 ipvs 模式,在 v1.9 中处于 beta 阶段,在 v1.11 中已经正式可用了。iptables 模式在 v1.1 中就添加支持了,从 v1.2 版本开始 iptables 就是 kube-proxy 默认的操作模式,ipvs 和 iptables 都是基于netfilter的,那么 ipvs 模式和 iptables 模式之间有哪些差异呢?

  • ipvs 为大型集群提供了更好的可扩展性和性能
  • ipvs 支持比 iptables 更复杂的复制均衡算法(最小负载、最少连接、加权等等)
  • ipvs 支持服务器健康检查和连接重试等功能

ipvs为负载均衡提供算法:

  • rr:轮询带哦都
  • lc:最小连接数
  • dh:目标地址哈希
  • sh:源地址哈希
  • sed:最短期望延迟
  • nq:不排队调度

注意:ipvs 模式假定在运行 kube-proxy 之前在节点上都已经安装了 IPVS 内核模块。当 kube-proxy 以 ipvs 代理模式启动时,kube-proxy 将验证节点上是否安装了 IPVS 模块,如果未安装,则 kube-proxy 将回退到 iptables 代理模式
在这里插入图片描述

client Pod 访问 Server Pod​

  1. 首先,service IP 的 iptables代理变成了 ipvs 模块,实现负载均衡和流量导向。
  2. ​ client 访问到 IPvs 服务,将流量分发到不同的 Pod 上运行。


Cluster IP( service 的暴露IP,提供内部负载均衡 )

​ clusterIP 主要在每个 node 节点使用 ipvs,将发向 Cluster IP对应端口的数据,转发到 Service-ipvs,ipvs通过调度算法将请求进行负载均衡,发送至后端 Pod节点。

1、先创建 Deployment 控制器 3个Nginx 应用

apiVersion: apps/v1
kind: Deployment			#创建Deployment控制器
metadata: 
 name: myapp-deploy
 namespace: default
spec:
 replicas: 3				#创建三个副本
 selector: 
   matchLabels:
     app: myapp				#副本标签
     release: stabel			#副本标签
 template: 
   metadata:
     labels:
       app: myapp			#副本标签
       release: stabel			#副本标签
       env: test
   spec:
   	containers: 
   	  - name: myapp
   	    image: nginx:1.9.1
   	    imagePullPolicy: IfNotPresent   
        ports: 
         - name: http
           containerPort: 80

kubectl apply -f nginx.yaml --record

kubectl get pod -o wide

在这里插入图片描述

2、为这三个 Nginx 应用创建 Service 暴露IP、Port

apiVersion: v1
kind: Service
metadata:
 name: myapp
 namespace: default
spec:
 type: ClusterIP		#Cluster IP
 selector:				#选择器
  app: myapp            #service匹配标签
  release: stabel       #service匹配标签
  ports:
    - name: http		#匹配Deployment.spec.ports名称
      port: 80          #暴露端口
      targetPort: 80    #后端真是服务器端口

kubectl apply -f myapp-service.yaml

kubectl get svc
在这里插入图片描述

kubectl describe service myapp 查看集群虚拟IP 和 后端 Pod地址

在这里插入图片描述

访问这个 10.98.227.26 Cluster IP地址,轮询调度三个 nginx 副本的页面

在这里插入图片描述


Headless Service(DNS解析)

​ Headless Service 属于 Cluster IP的一种,Pod 通过 service_name 方式直接解析到后端 Pod IP。

​ 有时不需要或者不想要负载均衡的 Service,遇到这种情况,可以通过指定 Cluster IP的值为 None,来创建 Headless Service。这类Service 并不会分配 ClusterIP,kube-proxy 不会处理他们,而且平台也不会为他们进行负载均衡和路由。

apiVersion: v1
kind: Service
metadata:
  name: myapp-headless
  namespace: default
  labels: 
  	app: myapp
spec:
  selector:
   app: myapp
  clusterIP: "None"
  ports:
   - protocol: TCP
   	 port: 80
     targetPort: 80

1、查看 headless service详细信息

kubectl describe service myapp-headless

在这里插入图片描述

2、解析 该 headless 域名

nslookup myapp-headless.default.svc.cluster.local 10.244.0.2

10.244.0.2 是集群的DNS解析地址

在这里插入图片描述


NodePort (将内部暴露外部)

​ nodePort 的原理在于在 node 上开了一个端口,将向该端口的流量导入到 kube-proxy,然后由kube-proxy 进一步给到对应的 Pod。

apiVersion: v1
kind: Service
metadata:
 name: myapp-nodeport
 namespace: default
spec:
 type: NodePort         #NodePort
 selector:              #选择器
  app: myapp            #service匹配标签
  release: stabel       #service匹配标签
 ports:
   - name: http        #匹配Deployment.spec.ports名称
     port: 80          #暴露端口
     targetPort: 80    #后端真是服务器端口

kubectl get svc 查看 NodePort IP地址

在这里插入图片描述

kubectl describe svc myapp-nodeport 查看详细 svc 后端 Pod 节点IP地址
在这里插入图片描述


LoadBalancer(从内部暴露外部)

​ loadBalancer 和 nodePort 其实是同一种方法。区别在于 loadBalancer 比 nodePort 多了一步,就是可以调用 cloud provider 去创建 LB 来向节点导流。
在这里插入图片描述

每一个 Node 节点同样会暴露 一个 NodePort,只不过在外网存在一个 LB 供应商的调度层。
客户端访问的是 LB 供应商的 IP & PORT ,由 LB 提供负载均衡。


ExternalName (将外部流量引入集群内部)

对外部服务设定别名,通过别名直接访问

​ 这种类型的 Service 通过返回 CNAME 和它的值,可以将服务映射到 externalName 字段的内容(例如自定义域名:hub.shmguigu.com) 引入外部服务到内部流量。

​ ExternalName service 是 Service 的特例,它没有selector,也没有定义任何的端口和 Endpoint。相反的,对于运行在集群外部的服务,它通过返回该外部服务的别名这种方式来提供服务。

Kind: Service
apiVersion: v1
metadata: 
  name: my-service-1
  namespace: default
spec:
  type: ExternalName
  externalName: hub.shmguigu.com

kubectl get svc
my-service-1 ExternalName <none> hub.shmguigu.com <none> 9s

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

kubernetes Service(SVC)几种4层代理的不同用法,ClusterIP、Headless、NodePort、LoadBalancer 的相关文章

随机推荐

  • 144项ppt制作技术

    1 两幅图片同时动作 PowerPoint的动画效果比较多 但图片只能一幅一幅地动作 如果你有两幅图片要一左一右或一上一下地向中间同时动作 可就麻烦了 其实办法还是有的 先安置好两幅图片的位置 选中它们 将之组合起来 成为 一张图片 接下来
  • 用Python建立可进可退的多级菜单系统

    coding utf 8 功能 可进可退的多级菜单系统 作者 XxLyle 日期 2021 12 16 def add record print 添加记录功能模块尚待开发 def find record print 查询记录功能模块尚待开发
  • Photoshop cs6 如何让图层渐变透明

    点击图层面板下方的蒙板工具 再选择左侧工具栏的渐变填充 选择黑 白渐变色 在图层上拖动 1 点击面板下方蒙板工具 在需要处理的图层上添加蒙板 2 选择渐变工具 快捷键G 选择黑白渐变 然后按住shift拖动鼠标拉个渐变就出来了 3 另外可以
  • 小程序的父子之间的传值调用

    前言 我们在小程序中父子组件之间的传值方法 目录 父传子 properties 步骤 1 在父组件 index wxml里面给调用子组件的地方绑定一个字段map 2 在父组件 index js中定义字段map 并用this setData改
  • Hbase批量查询-scan介绍

    1 scan原理 HBase的查询实现只提供两种方式 1 按指定RowKey 获取唯一一条记录 get方法 org apache hadoop hbase client Get Get 的方法处理分两种 设置了ClosestRowBefor
  • 桌面软件自动化测试小记

    什么是软件自动化测试 如何学习软件自动化及几个例子 Py UiAutomation
  • Swagger的使用详细教程

    Swagger的使用详细教程 Swagger是一款开源的API文档工具 它提供了一种简单且强大的方式来描述 展示和测试RESTful风格的Web服务接口 本文将详细介绍Swagger的使用方法 包括安装配置和使用示例 步骤 1 添加Swag
  • 基于Python的机器学习实践(portein)

    目录 数据集 简介 代码 1 数据的读入 2 数据理解 3 数据规整化处理 数据准备 4 数据建模 5 查看模型 6 模型预测 7 结果输出 数据集 https download csdn net download llf000000 86
  • JMeter使用命令行模式生成HTML测试报告

    自动生成html图形化报告 win r 输入 cmd 说明 jmeter n t Jmx脚本位置 l 结果文件result jtl存放的位置 e o 生成HTML报告指定文件夹 n 表示non gui mode 就是非图形化模式 t 指定J
  • 怎么更改dns_ESHOP连不上?SWITCH最新实用DNS地址分享

    虽然任天堂Switch采用的是不锁区的方式 但是由于各种虚拟墙的存在已经网络延迟等问题 经常导致玩家连不上eshop 买不了游戏 更新个游戏显示都要好几万小时 当然这个可以使用各种加速器等方式来解决 但是好的加速器需要付费 免费的又会经常抽
  • Receive port always be disabled.

    I configured a receive port in FILE to a local folder Biztalk administration console keep show that port is disables I f
  • 支付宝个人收款解决方案之支付宝签约方案

    关键词 签约支付 签约收款 支付宝收款 个人签约收款 背景 有做网赚或者在网上售卖个人小产品小服务的 需要进行收款 如果零星个别的收款可能直接走个人转账然后手动发货即可 但是一旦流程标准下来 量走起来之后 付款发货就需要自动化了 以提高人效
  • TCP实现socket通信(python)

    socket简介 UDP实现socket通信 python TCP实现socket通信 python 1 套接字工作流程 服务器端先初始化Socket 建立一个套接字 与端口绑定 bind 用 bind 函数来绑定一个端口号和 IP 地址
  • Java开发中的23种设计模式详解

    设计模式 Design Patterns 可复用面向对象软件的基础 设计模式 Design pattern 是一套被反复使用 多数人知晓的 经过分类编目的 代码设计经验的总结 使用设计模式是为了可重用代码 让代码更容易被他人理解 保证代码可
  • Hibernate Validator的使用以及自定义

    Hibernate Validator的英文官方文档 https hibernate org validator documentation Hibernate Validator的作用 Hibernate Validator是一个校验框架
  • Java五子棋的实现(附源码)

    学习目的 熟悉java中swing类与java基础知识的巩固 文末有源代码文件和打包的jar文件 效果图 思路 1 首先构建一个Frame框架 来设置菜单选项与按钮点击事件 MyFrame java文件代码如下 package StartG
  • http传输字符编码与转义(深度好文)

    一 引言 最近陆陆续续看了好多关于字节 字符 字符编码 字符转义的文章 终于对这个过程有了比较清晰深刻的认识 和后台开发相结合知道了乱码出现的理论具体原因 和前台开发结合知道了get与post请求的过程 这里分析下供大家学习分享 字符转义指
  • centos7离线安装sql server2019

    关闭SELINUX root localhost sed i SELINUX s enforcing disabled g etc selinux config setenforce 0 上传rpm包和依赖包 下载地址 https pkgs
  • SQL create file遇到操作系统错误5拒绝访问

    客户操作系统重新安装之后 也重新安装的了SQL Server2008R2 但是附加原来的数据的时候出现下面的错 尝试打开或创建物理文件 E liudaxitong D Data MDF 时 CREATE FILE 遇到操作系统错误 5 拒绝
  • kubernetes Service(SVC)几种4层代理的不同用法,ClusterIP、Headless、NodePort、LoadBalancer

    kubernetes Service SVC 个人学习记录 kubernetes Service SVC service 概念 service 类型 SVC 访问流程组件 VIP 和 Service 代理 代理模式分类 userspace