承接上文深入理解K8S网络原理上

Service 应用是K8s集群内部可见的而我们发布的应用需要外网甚至公网可以访问K8s如何将内部服务暴露出去?

四层网络只有Node节点网络可以对外通讯现在问题是第2层的Service网络如何通过第0层Node节点网络暴露出去呢?

需要再思考一个问题 在k8s服务发现原理图中 哪个组件既知道service网络的所有信息又可以和pod网络互通互联同时又可以与节点网络打通呢?那就是Kube-Proxy 对外暴露服务也是通过这个组件实现的

只需要让Kube-Proxy在节点上暴露一个监听端口就可以了 所以NodePort就闪亮登场了

NodePort


将service type设置为NodePort 端口范围在30000~32767之间k8s发布以后 会在每个节点上都会开通NodePort端口 这个端口的背后就是Kube-Proxy

当外部流量想要访问k8s服务的时候先访问NodePort端口 然后通过Kube-Proxy转发到内部的Service抽象层然后再转发到目标Pod上去

LoadBalancer 负载均衡器


如果在阿里云上有一套k8s环境将service type设置为LoadBalancer阿里云K8s会自动创建NodePort进行端口转发 同时也会申请一个SLB 有独立的公网IP 并且也会自动映射K8s集群的NodePort上以上是生产环境 就可以通过SLB暴露出去的公网IP访问到K8s集群内部的NodePort但在开发测试环境可以直接通过NodePort访问

这种方式的劣势:

如果暴露一个服务就需要购买一个LB+IP如果暴露10个服务就需要购买10个LB+IP所以成本比较高那有没有办法购买一个LB+IP能不能将更多的服务暴露出去呢?那么Ingress就闪亮登场了也就是在K8s内部部署一个独立的反向代理服务 让它做代理转发

Ingress


Ingress是一个特殊的service 通过节点80/443暴露出去Ingress可以通过path或者域名转发到Service抽象层然后转发到Pod只需要设置好转发的路由表即可本质上和Nginx没有差别service kind设置为ingressingress提供的主要功能是七层反向代理 如果暴露的是四层服务还是需要走LB+IP方式还可以做安全认证、监控、限流、证书等高级功能有了Ingress就可以购买一个LB+IP就可以将k8s集群中的多个service暴露出来

本地环境想要快速的开发调试方法


kubectl proxy

通过kubectl proxy在本机创建一个代理服务 通过这个代理服务可以访问k8s集群内任意的http服务通过master上的api server间接的去访问k8s集群内的服务因为master是知道集群内所有服务的信息这种方式仅限于七层的http转发

kubectl Port-Forwarding

在本机上开启一个转发端口间接转发到k8s内部某个pod端口上去这种方式支持http转发和tcp转发

kubectl exec

通过该命令直接连接到pod上去执行命令

小结


深入理解Kube-Proxy

Kube-Proxy主要实现服务发现和负载均衡以及ClusterIP到PodIP的转换

Kube-Proxy通过linux内核提供的2个机制间接实现

"Netfilter"和"iptables"

通过这2个机制的配合来实现IP地址的转换以及流量的路由

Netfilter是linux内核支持的一种钩子方法 允许内核的其他模块注册回调方法

这些回调方法可以截获网络包 可以改变它们的目的地路由

iptables是一组用户空间程序 

通过它可以设置Netfilter中的路由规则 

iptables程序可以检查、转发、修改、重定向或者丢弃ip网络包

iptables是Netfilter用户空间接口 可以间接操作Netfilter中的路由规则


Kube-Proxy可以通过iptabels程序可以去操作内核空间的Netfilter里面的路由规则而Netfilter可以截获底层的IP网络包就可以修改它们的路由

Kube-Proxy的工作模式

  • 用户空间代理模式
大部分的网络功能 包括设置包路由规则、负载均衡都是由运行在用户空间的Kube-Proxy直接完成的它监听请求 执行路由和负载均衡 将请求转发到目标pod在该模式下 kube-proxy还需要频繁在用户空间和内核空间切换因为它需要和iptables交互来实现负载均衡

1、kube-proxy 监听 master 服务创建、更新、删除事件   也监听这些服务对应的端点的地址   如果pod ip发生了变化 kube-proxy也会同步这种变化

2、当有一个类型为ClusterIp的新服务被创建 Kube-Proxy会在节点上创建一个随机的端口 比如在10.100.0.2上开启一个随机端口10400通过这个端口可以将目标请求转发到对应的端点上即pod上面

3、通过iptables设置转发规则 比如请求ip是10.104.14.67:80这个请求转发到10.100.0.2:10400这个地址上去

4、当节点上面有客户端对10.104.14.67:80这个service ip以及对应的podip10.100.0.2:10400发起调用的话  

5、这个请求会被netfilter截获到并且转发到10.100.0.2:10400这个上面 也就是kube-proxy正在监听的端口

6、kube-proxy接受这个请求 通过负载均衡 转发到pod上面

上面1-3步是服务发现阶段

4-6部是运行阶段

将请求转发到10400端口 kube-proxy先切换到内核接受这个请求包

然后切换到用户空间进行负载均衡调用

由于频繁的上下文切换 这种模式的性能并不理想

所以又引入了iptabels模式

iptables模式


1、kube-proxy会监听master上面的服务创建或者删除也会监听服务背后所对应的pod ip地址2、当有一个类型为clusterip的新服务被创建 kube-proxy通过iptables直接设置转发规则 并直接负载均衡转发到目标pod上面

不穿透kube-proxy 性能高但iptables不支持高级的负载均衡策略也不支持失效自动重试机制一般需要就绪探针进行配合

这种模式仅适用于中小模式的k8s集群 不适用大规模的k8s集群

假设有5000个节点的集群 集群有2000个服务 每个服务有10个pod 就需要在每个节点同步大约2万条记录 同时在云环境中 后端pod ip可能会随时变化 会给linux内核带来巨大的开销 

为了支持更大规模的k8s集群 引入了IPVS Proxy模式

IPVS Proxy模式


该模式是linux内核支持的虚拟化构建技术 是建立在netfilter基础之上的 是为了内核传输层高性能的负载均衡设计的技术也是LVS主要的组成技术 

不仅支持缺省的Round Robbon(加权轮询)还支持最小连接、目标源hash 负载均衡算法 

使用高效的hash算法来存储网络路由规则 可以显著减少iptables的同步开销  大大提升集群的扩展规模 

Kube-Proxy通过调用Netfilter接口来创建和同步IPVS规则的实际的路由转发和负载均衡由IPVS负责

IPVS效率最高 扩展性最好 配置也是最复杂的

小结

  • 用户空间代理模式 已淘汰
  • Iptables模式 生产适用 中小规模k8s集群
  • IPVS模式 生产使用 大规模K8s集群 配置复杂

深入理解K8S网络原理下相关推荐

  1. 深入理解K8S网络原理上

    K8s四层网络 抽象成四层网络 Node节点网络 底层基础设施支持节点主机之间网络的互通 Pod网络 能够相互做IP寻址.相互通讯 同一节点上的Pod网络 大多数场景下一个pod下面有1个容器 也有一 ...

  2. 深入理解 Docker 网络原理

    作者 | 渡. 来源 | CSDN博客 Docker网络原理 容器是相对独立的环境,相当于一个小型的Linux系统,外界无法直接访问,那他是怎么做的呢,这里我们先了解下Linux veth pair. ...

  3. 深入理解计算机系统:网络编程 下 一个简单的web服务器

    编写一个web服务器的基础是熟悉套接字接口.笔者因为还没有对其进行实践,只对其有一些粗浅的了解.本文重点记录一个web服务的核心功能主要由哪几部分组成. 1. main函数 之前写到,从客户端到服务器 ...

  4. 通俗理解GRU网络原理

    GRU介绍 上篇文章提到了RNN(循环神经网络)的变体LSTM(长短期记忆网络),现在说一下它们的另一个变体GRU(Gate Recurrent Unit)--门控循环单元.虽然LSTM能够解决循环神 ...

  5. 带你玩转kubernetes-k8s(第46篇:深入分析k8s网络原理[CNM、CNI]网络模型)

    随着容器技术在企业生产系统中的逐步落地,用户对容器云的网络特性要求也越来越高.跨主机容器间的网络互通已经成为基本要求,更高的要求包括容器固定IP地址.一个容器多个IP地址.多个子网隔离.ACL控制策略 ...

  6. 一文理解 K8s 容器网络虚拟化

    简介:本文需要读者熟悉 Ethernet(以太网)的基本原理和 Linux 系统的基本网络命令,以及 TCP/IP 协议族并了解传统的网络模型和协议包的流转原理.文中涉及到 Linux 内核的具体实现 ...

  7. Kubernetes(k8s)底层网络原理刨析

    目录 1 典型的数据传输流程图 2 3种ip说明 3 Docker0网桥和flannel网络方案 4 Service和DNS 4.1 service 4.2 DNS 5 外部访问集群 5.1 外部访问 ...

  8. K8s系列之:网络原理

    K8s系列之:网络原理 一.K8s网络模型 二.Docker的网络模型 三.网络的命名空间 1.网络命名空间的实现 2.网络命名空间的操作 3.网络命名空间的一些技巧 四.Veth设备对 1.Veth ...

  9. 【阿里云课程】残差网络原理,结构发展及有效性理解

    大家好,继续更新有三AI与阿里天池联合推出的深度学习系列课程,本次更新内容为第10课中的一节,介绍如下: 残差网络原理与结构演变 本次课程是阿里天池联合有三AI推出的深度学习系列课程第10期,深度学习 ...

最新文章

  1. 如何安装python3.7.4_银河麒麟安装Python3.7.4以及升级自带OpenSSL
  2. Extreme 交换机基础配置命令
  3. 前端到后端的整体流程介绍
  4. 剑指Offer:包含main函数的栈(借助辅助栈)
  5. Image classification with deep learning常用模型
  6. python求三个整数最大值_怎么用python比较三个数大小
  7. Redis 命令--Redis有序集合(sorted set)
  8. React Native项目自动化打包发布
  9. [Angularjs]视图和路由(四)
  10. Canonical发布信息图:Ubuntu Linux连接一切
  11. find命令结合exec和xargs使用的区别
  12. 动态代理和静态代理的区别_动态代理与静态代理
  13. sw工程图导出bom_solidworks怎么导出带缩略图的BOM材料明细表?
  14. 韩语在线翻译图片识别_3个OCR文字识别工具,最后一个许多人都不知道!
  15. 大型架构学习——美团猫眼模块化实践
  16. 格局炸裂,程序员必看的十部纪录片
  17. css审查元素一直有一块html,css父元素定位后子元素审查元素位置错乱
  18. js监听浏览器关闭事件(区分刷新和关闭,兼容IE9,10,11,Edge,Chrome和Firefox)
  19. 解决办法:.bat文件运行不了,管理员运行后闪退
  20. csgo调出参数_CSGO参数设置

热门文章

  1. Ajax(一)——Ajax基础概念,HTTP头部(重点)
  2. 如何判断一个new出来的空对象
  3. log4j2+ELK
  4. Radware LP 增加线路接口操作
  5. windows下ping命令的结果前加上系统的当前时间
  6. 微信小程序周报(第十一期)-极乐商店出品
  7. cloudsim样例描述
  8. oracle创建job权限
  9. Android进入商店并跳转到指定应用
  10. cdoj 1252 24点游戏 dfs