当前位置: 首页 > news >正文

【K8S系列】Kubernetes的网络模型

  

目录

 一、k8s的三种网络

二、service网络

 2.1 netfilter

2.2 iptables 

2.3 clustip 


 一、k8s的三种网络

Node Network: 与外部网络接口

Service Network: ipvs规则当中的网络、路由提供调度

 Pod Network: 节点当中pod的内部网络无法与外界通信

其中:

Node Network 集群节点所在的网络,这个网络就是你的主机所在的网络,通常情况下是你的网络基础设施提供。

如果node处于不同的网段,那么你需要保证路由可达。如上图中的 192.168.10.0/24和10.0.0.0/8这两个网络

Service Network第二个是K8S服务网络, service_cluster_ip_range(如图,默认的配置是的10.0.0.1/24)

在上图中,扩充的节点(基础网络是10.0.0.0/8)和 服务网络(10.0.0.1/24)冲突,会造网络问题。

Pod Network第三个网络是Pod的网络, K8s中一个Pod由多个容器组成,但是一个pod只有一个IP地址,Pod中所有的容器共享同一个IP。

       这个IP启动pod时从一个IP池中分配的, 叫做 pod CIDR, 或者叫network_cidr(如图,默认配置是10.1.0.0/16)。 可以在配置文件中配置。

kubernetes对于pod的网络定制了下列三个要求,所有网络插件支持这几个要求即可:

  • 所有节点上所有的pod可以互相通信,并且不依赖NAT
  • 节点上的进程可以和该节点上的所有pod通信
  • 运行在主机网络空间下的pod可以和所有节点上的所有pod互相通信,并且不依赖NAT

注意: 一个Pod会包含多个container, 但是这些containers共享一个网路IP,也就是说,Container A如果占了80, Container B就不能用80 了
 

用一个pod

优点:

  • 在同一个pod,将关系紧密的容器放在一起,通过挂载同一数据卷来共享数据
  • 共享网络,内部相互调用访问更高效

缺点:

  • 共享网络,每个容器的端口需要规划
  • 一个容器需要升级,会影响到整个pod滚动升级

二、service网络

为了解决Pod IP地址不是持久性的,可能会进行更改,k8s采用service对pod进行抽象

service为pod组提供虚拟ip,任何路由到这个虚拟ip的,都将转发到对应关联的pod上,而且service还提供高可用与负载均衡

 2.1 netfilter

为了在群集内执行负载平衡,Kubernetes依赖于Linux内置的网络框架netfilter

Netfilter是Linux提供的框架,它允许以自定义处理程序的形式实现与网络相关的各种操作数据包筛选,网络地址转换和端口转换的操作,提供了通过网络引导数据包所需的功能,并提供了禁止数据包到达计算机网络内敏感位置的功能。

2.2 iptables 

默认采用iptables,其是一个用户空间程序,它提供了一个基于表的系统,用于定义netfilter模块的处理和转换数据包的规则;

iptables规则监视发往服务虚拟的流量IP,并从一组可用的Pod中随机选择一个Pod IP地址,并且iptables规则将数据包的目标IP地址从服务的虚拟IP更改为所选Pod的IP。

2.3 clustip 

nodeport,在node上面开启一个监听端口,负责将service暴露给外面访问,通过访问这个service的这个端口可以确认访问这个service,会有iptables做地址转换
pod去访问service是需要通过宿主机的,不然没法通过宿主机的内核net_filter模块做nat地址转换

 如上图:

  • 数据包通过eth0离开pod1
  • 数据包来到网桥,arp协议不了解服务,发往默认路由eth0
  • 在到达eth0前,iptables改写目标ip为特点的pod ip,并记录下来这次的pod选择,以便将来的相同事件

基于 IP-per-Pod 的基本网络原则,Kubernetes 设计出了 Pod - Deployment - Service 这样经典的 3 层服务访问机制,极大地方便开发者在 Kubernetes 部署自己的服务。在生产实践中,可以根据自己的业务需要选择合适的 CNI 插件。
 

相关文章:

  • CTFHub | 报错注入
  • Python-代码封装思想
  • 基于MATLAB的指纹识别算法仿真实现
  • Spring Boot中异步消息JMS的讲解与通信实例
  • JeecgBoot 3.4.3-GA 版本发布,开源免费的企业级低代码平台
  • 代码随想录38——动态规划:动态规划理论基础、509斐波那契数列、70爬楼梯、746使用最小花费爬楼梯
  • 基于大数据平台的毕业设计01:基于Docker的HDP集群搭建
  • YOLOv5剪枝 | 模型剪枝理论篇 | 1/2
  • 结构体、枚举类型和联合体
  • 【兄弟反目成仇系列】:我只是写了一个爆炸信息窗口脚本,好兄弟追了我几条街~
  • 参加微软学生开发者峰会,了解Azure和GitHub……
  • 【数据结构练习题——查找】
  • imx6ull-arm开发板和电脑网线直连通信
  • 【目标检测】YOLOv5遇上知识蒸馏
  • 【每日渗透笔记】覆盖漏洞+修改隐藏数据实战尝试
  • Angular4 模板式表单用法以及验证
  • Facebook AccountKit 接入的坑点
  • HTML5新特性总结
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Java知识点总结(JavaIO-打印流)
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Mybatis初体验
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • 测试开发系类之接口自动化测试
  • 关于字符编码你应该知道的事情
  • 记录:CentOS7.2配置LNMP环境记录
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 前端
  • 提醒我喝水chrome插件开发指南
  • 携程小程序初体验
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 用Visual Studio开发以太坊智能合约
  • 原生JS动态加载JS、CSS文件及代码脚本
  • UI设计初学者应该如何入门?
  • 积累各种好的链接
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • # include “ “ 和 # include < >两者的区别
  • #define
  • #define,static,const,三种常量的区别
  • #pragma pack(1)
  • (js)循环条件满足时终止循环
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (论文阅读30/100)Convolutional Pose Machines
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)创业家杂志:UCWEB天使第一步
  • (转载)利用webkit抓取动态网页和链接
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET Reactor简单使用教程
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NET中使用Redis (二)