kube-proxy的功能
Kube-proxy的功能
我们知道POD的IP是动态分配的而且经常会变,所以为了可以通过一个不太容易变化的IP访问POD就会使用一个叫做service的东西,通过标签选择器和POD进行关联。
Service提供常用的类型有:
- ClusterIP,也是默认方式。Service会分配一个集群内部的固定虚拟IP,实现集群内通过该IP来对POD进行访问。这个又有两类,上面说到的最普通的Service,ClusterIP还有一种是Headless Service,这种形式不会分配IP也不会通过kube-proxy做反向代理或者负载均衡,而是通过DNS提供稳定的网络ID来访问,DNS会将headless service的后端直接解析为POD的IP列表,这种主要是共StatefulSet类型使用。
- NodePort,这种类型的Service是除了使用ClusterIP的功能外还会映射一个宿主机随机端口到service上,这样集群外部可以通过宿主机IP+随机端口来访问。
- LoadBalancer:和nodePort类似,不过除了使用ClusterIP和NodePort之外还会向使用的公有云申请一个负载均衡器,从而实现集群外部通过LB来访问服务
- ExternalName:是Service的一种特例,此模式主要面对运行在集群外部的服务,通过它可以将外部服务映射到k8s集群,具备k8s内服务的一些特性,来为集群内部提供服务。
我们要说一下ClusterIP这个东西,这是通过yaml安装的一个coredns插件,它就的配置清单中就定义了service。

这个servic ip地址段是在部署API SERVER时API SERVER服务启动配置文件中定义的地址段。而且在Flannel中都没有这个地址段。相比之下POD的IP其实是实实在在配置在容器中的,最终要的是集群中任何节点上都没有关于这个网段的路由信息,那么集群内部是如何通过这个完全虚拟的IP来访问的呢?这就要说到kube-proxy了

你看在集群的任何机器上都可以PING通这个地址。我们来看看这个svc的详情

这个10.254.0.2 serviceIP关联了Endpoints(这里是2个endpoints因为POD开放了TCP和UDP的53号端口,所以是2个)。那么现在就有了一个大致的认识就是你访问10.254.0.2就是访问172.30.23.2,而这个172的IP就是POD的真实IP,这个IP段是在Flannel上配置过的。下面再来看一张图:

在IPVS规则中定义了访问10.254.0.2就会转发到172.30.23.2,而172.30.23.2就是POD的IP。
所以通过上面我们就知道它其实是通过IPVS规则来转发的根本不是通过路由来实现的。可是你想过没有这个规则是谁生成的呢?其实就是kube-proxy来生成的,而且这样的规则会同步到集群其他机器上,哪怕这个POD没有运行在自己的机器上也要有这样的规则,只有这样才能保证集群任何一台主机都可以通过这个serviceIP来访问到POD,当面临跨主机的时候才会用到路由规则,由Flannel的隧道来进行转发到真实POD所在主机,然后由该主机的kube-proxy来转发到具体的POD上。
这时候我们就明白了kube-proxy的大致作用,当service有了IP、端口以及POD的IP和端口对应关系以及宿主机随机端口到service的映射,就可以完成对内、外请求的转发,而转发就是,本地转发还是用IPVS规则,而远程则用了路由信息。
集群中每个NODE都运行一个kube-proxy进程,这个就是service的载体。它负责建立和删除包括更新IPVS规则、通知API SERVER自己的更新,或者从API SERVER哪里获取其他kube-proxy的IPVS规则变化来更新自己的。我们说了多次IPVS,其实kube-proxy支持3中模式
Userspace模式
userspace,这种模式时最早的,不过已经不推荐使用了,效率低,因为需要在内核空间和用户空间转换。
Iptables模式

这是默认方案,在内核中通过iptables的NAT实现本地转发和负载均衡。在大规模试用下存在性能问题。
Ipvs模式

可选方案,如果内核支持且用户指定那么kube-proxy将使用这种模式。在早期版本的K8S中不支持。
如果POD不在本机怎么办

本机是srv01而这个coredns是运行在srv02上,你从srv01访问会先进行ipvs找到目标POD的IP地址,发现不在本机就通过路由,访问的网段172.30.23.0走flannel.1这个网络接口,这个接口其实和其他主机的flannel.1通过物理链路做了隧道,所以就可以通。那么10.254.0.2是如何与这个172.30.23.2这个IP建立关系的呢?其实就是service,看下图

kube-proxy的功能的更多相关文章
- Java事务处理全解析(六)—— 使用动态代理(Dynamic Proxy)完成事务
在本系列的上一篇文章中,我们讲到了使用Template模式进行事务管理,这固然是一种很好的方法,但是不那么完美的地方在于我们依然需要在service层中编写和事务处理相关的代码,即我们需要在servi ...
- Apache开启Proxy代理,实现域名端口转发
今天帮客户迁移网站,客户一个是ASPX的一个是PHP的网站,这时候有2个域名,可是php网站是Apache下的伪静态,必须要用到Apache,但是ASPX网站还必要到IIS+Mssql 然后到了这个时 ...
- nova vnc proxy基本原理
先上图 VNC Proxy的功能: 将公网(public network)和私网(private network)隔离 VNC client运行在公网上,VNCServer运行在私网上,VNC Pro ...
- 自学Zabbix13.1 分布式监控proxy介绍
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix13.1 分布式监控proxy介绍 zabbix2.4版本之前,zabbix提供了 ...
- 【工作】Proxy Server的优化 - 检测目标网站URL变化
在工作中,我在组里负责一个Proxy(代理)的Module,这个Module是针对微软的Office 365的邮件门户OWA实现,工作起来后,用户访问Office 365 OWA,无需再输入Offic ...
- (33)zabbix proxy分布式监控配置
概述 zabbix proxy可以代替zabbix server检索客户端的数据,然后把数据汇报给zabbix server,并且在一定程度上分担了zabbix server的压力.zabbix pr ...
- 在ensp上的ARP及Proxy ARP
啥是ARP?啥又是Proxy ARP? ARP是用来将 IP 地址解析为 MAC 地址的协议. ARP 表项可以分为动态和静态两种类型.动态 ARP ,是利用 ARP 广播报文,动态执行并自动进行 I ...
- nginx Proxy Cache 配置
总结一下 proxy cache 设置的常用指令及使用方法: proxy_cache proxy_cache zone | off 配置一块公用的内存区域的名称,该区域可以存放缓存的索引数据.注意:z ...
- kubernetes容器编排系统介绍
版权声明:本文由turboxu原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/152 来源:腾云阁 https://www. ...
- Kubernetes 概念整理
注:以下大部分内容来自网上摘录,以便后期查阅. Kubernetes (通常称为 K8s) 是用于自动部署.扩展和管理容器化(containerized)应用程序的开源系统,是 Google 内部工具 ...
随机推荐
- SOFA 源码分析 — 连接管理器
前言 RPC 框架需要维护客户端和服务端的连接,通常是一个客户端对应多个服务端,而客户端看到的是接口,并不是服务端的地址,服务端地址对于客户端来讲是透明的. 那么,如何实现这样一个 RPC 框架的网络 ...
- 【转】javascript 浮点数运算问题
大多数语言在处理浮点数的时候都会遇到精度问题,但是在JS里似乎特别严重,来看一个例子 alert(45.6*13); 结果居然是592.800000000001,当然加法之类的也会有这个问题 那这是j ...
- 团队项目第二阶段个人进展——Day8
一.昨天工作总结 冲刺第八天,完成了发布页面数据与服务器数据的交互,基本实现了发布功能 二.遇到的问题 存在bug,有时候图片发布不了 三.今日工作规划 优化图片的上传机制,实现选择图片后就立即上传
- C# 发展史
C# 发展史 Intro 本文主要总结介绍C# 每个版本带来的不同的语言特性. C#,读作C Sharp,是微软推出的一种基于.NET平台的.面向对象的高级编程语言.是微软公司在2000年发布的一种新 ...
- JavaScript 之函数
刚开 始学习 JS 时,挺不习惯它函数的用法,就比如一个 function 里面会嵌套一个 function,对于函数里创建变量的作用域也感到很迷惑,这个的语法和 JAVA 相差太多,为此,阅读了&l ...
- java 保留字段volatile、transient、native、synchronized
1.volatile Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程.当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享 ...
- Spring Security 集成 CAS(基于HTTP协议版本)
Spring Security 集成 CAS(基于HTTP协议版本) 近段时间一直研究Spring Security 集成 CAS,网上资料相关资料也很多,不过大都是基于Https的安全认证;使用ht ...
- Executor, ExecutorService 和 Executors 间的区别与联系
UML简要类图关系: 下面详细看一下三者的区别: Executor vs ExecutorService vs Executors 正如上面所说,这三者均是 Executor 框架中的一部分.Java ...
- spring中jedis对redis的事务使用注意总结
spring的@Transactional不支持redis的事务,并且redis的事务和其它关系型数据库的事务概念不是太一样,redis事务不支持回滚,并且一条命令出错后,后面的命令还会执行. 所以不 ...
- 论文阅读 | CrystalBall: A Visual Analytic System for Future Event Discovery and Analysis from Social Media Data
CrystalBall: A Visual Analytic System for Future Event Discovery and Analysis from Social Media Data ...