k8s中的Pod网络;Service网络;网络插件Calico

Pod网络;Service网络;网络插件Calico

Pod网络

在K8S集群里,多个节点上的Pod相互通信,要通过网络插件来完成,比如Calico网络插件。

使用kubeadm初始化K8S集群时,有指定一个参数–pod-network-cidr=10.18.0.0/16 它用来定义Pod的网段。

而我们在配置Calico的时候,同样也有定义一个CALICO_IPV4POOL_CIDR的参数,它的值同样也是Pod的网段。

容器网络尤其是在跨主机容器间的网络是非常复杂的。目前主流的容器网络模型主要有Docker公司提出的Container Network Model(CNM)模型和CoreOS公司提出的Container Network Interface(CNI)模型,而Kubernetes采用了由CoreOS公司提出的CNI模型。

1)CNI

首先我们介绍一下什么是 CNI,它的全称是 Container Network Interface,即容器网络的 API 接口。

CNI本身并不能提供网络服务,它只是定义了对容器网络进行操作和配置的规范。CNI仅关注在创建容器时分配网络资源,和在销毁容器时删除网络资源,这使得CNI规范非常轻巧、易于实现,得到了广泛的支持。

而真正实现和落地这些规范的是CNI插件。常见的CNI插件包括Calico、flannel、Terway、Weave Net 以及 Contiv。

2)K8S如何使用CNI插件

K8s 通过 CNI 配置文件来决定使用什么 CNI。

基本的使用方法为:

  • 首先在每个节点上配置 CNI 配置文件(/etc/cni/net.d/xxnet.conf),其中 xxnet.conf 是某一个网络配置文件的名称;

  • 安装 CNI 配置文件中所对应的二进制插件;

  • ls /opt/cni/bin/
    
  • 在这个节点上创建 Pod 之后,Kubelet 就会根据 CNI 配置文件执行前两步所安装的 CNI 插件;

具体的流程如下图所示:

img

在集群里面创建一个 Pod 的时候,首先会通过 apiserver 将 Pod 的配置写入。apiserver 的一些管控组件(比如 Scheduler)会调度到某个具体的节点上去。Kubelet 监听到这个 Pod 的创建之后,会在本地进行一些创建的操作。当执行到创建网络这一步骤时,它首先会读取刚才我们所说的配置目录中的配置文件,配置文件里面会声明所使用的是哪一个插件,然后去执行具体的 CNI 插件的二进制文件,再由 CNI 插件进入 Pod 的网络空间去配置 Pod 的网络。配置完成之后,Kuberlet 也就完成了整个 Pod 的创建过程,这个 Pod 就在线了。

3)基于Calico的Pod网络

img
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Service网络

在介绍Service这个api资源对象时,我们已经汇总过Service的几个type:ClusterIP、NodePort、LoadeBalancer,除了这三个还有其它的类型,在本章节我们暂且不去讨论。

这三种类型的Service,LoadBalancer依赖NodePort,而NodePort通常要和ClusterIP一起使用,如果在Service的yaml文件里定义type为LoadBalancer,则它会自动创建NodePort,而NodePort也会自动创建ClusterIP。

在这里插入图片描述

下面,再来演绎一下从Pod到Service的网络变化情况:

1)单个Pod之间通信

单个Pod和Pod之间通信只能通过Pod的IP和Port来通信,如下图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2)Pod有多个

当引入了Deployment,并为Pod设置多个副本时,那么提供某一个服务(如Nginx服务)的Pod就不止一个了,此时即使知道了这些Pod的IP,那访问起来也并不方便。所以,这里需要有一个统一入口,其它Pod通过这个统一入口去请求该服务(Nginx)对应的所有Pod。 这时就有了Service这个资源对象,它主要作用就是用来提供统一入口,也就是说只需要一个IP就能访问所有的Pod,而这个入口IP就是ClusterIP,也就是Service的IP。

在这里插入图片描述

3)外部资源访问内部Pod

有了Service,的确可以很方便为内部的Pod提供入口,但是在集群外面访问这个内部的资源就没办法了。于是,就有了这个NodePort,使用Service的NodePort类型,可以将Service的ClusterIP对应的Port映射到每一个Node的IP上,映射出去的Port范围为30000~32767

在这里插入图片描述

4)借助公有云的负载均衡器

使用这个NodePort并不方便,毕竟它带着一个长长的端口号,而且还有一个非常尴尬的问题,就是访问时还得带着Node的IP,如果这个Node挂掉,那么就无法访问此资源,虽然可以通过另外一个Node去访问,但这样太麻烦了!所以,此时的解决方案是:借助三方的负载均衡器,将请求分发到所有的Node上,其底层还是NodePort。

在这里插入图片描述

总结:Service为内部Pod的统一入口,内部资源之间可以通过最简单的ClusterIP进行通信,而外部资源访问需要借助NodePort的形式,但是带着长长端口不方便,于是又衍生了LoadBalancer的形式,这种形式需要借助三方的负载均衡器,将请求分发到每一个NodePort上。

网络插件Calico

参考 https://www.cnblogs.com/goldsunshine/p/10701242.html

1)Calico是什么

Calico 是一个用于容器、虚拟机和主机的开源网络和网络安全解决方案。它是一个纯三层(L3)解决方案,利用 BGP(Border Gateway Protocol)协议为容器或虚拟机提供 IP 地址,并提供网络安全功能,包括网络策略和加密。

Calico 通过将网络策略应用于标签和选择器,提供了一种简单而强大的方法来保护容器或虚拟机之间的通信,并限制容器或虚拟机可以访问的网络资源。它还支持基于 Kubernetes 和 OpenStack 等平台的网络自动化和集成。

Calico 的另一个重要特点是其可扩展性。它使用了基于 BGP 的路由技术,这使得它能够轻松地扩展到非常大规模的网络中,而不会降低性能。

由于Calico是一种纯三层的方案,因此可以避免与二层方案相关的数据包封装的操作,中间没有任何的NAT,没有任何的overlay,所以它的转发效率是所有方案中最高的,因为它的包直接走原生TCP/IP的协议栈,它的隔离也因为这个栈而变得好做。因为TCP/IP的协议栈提供了一整套的防火墙的规则,所以它可以通过IPTABLES的规则达到比较复杂的隔离逻辑。

2)Calico架构

在这里插入图片描述

各组件介绍:

  • Felix:Calico Agent,跑在K8S集群中的每台节点上,主要负责管理和维护该节点上的网络和安全策略,如 网络接口管理和监听、路由、ARP 管理、ACL 管理和同步、状态上报等;
  • Etcd:分布式键值存储,用来存储网络元数据、安全策略以及节点的状态信息,确保Calico网络状态的一致性和准确性,可以和K8S的etcd合用;
  • BGP Client(BIRD):跟Felix一样,每一个节点上都会部署BGP Client,主要负责把Felix写入Kernel的路由信息分发到当前Calico网络,确保各节点间的通信的有效性;
  • BGP Route Reflector(BIRD): 在大型网络规模中,如果仅仅使用BGP Client 形成mesh全网互联的方案就会导致规模限制,因为所有节点之间俩俩互联,需要 N^2 个连接,为了解决这个规模问题,可以采用 BGP 的 Router Reflector 的方法,使所有BGP Client仅与特定RR节点互联并做路由同步,从而大大减少连接数大规模部署时使用。

关键点:

  • Felix会定期查询Etcd数据库,从而获取到IP变化信息,比如说用户在这台机器上创建了一个容器,增加了一个IP等。当它发现数据变更后,比如用户创建pod后,Felix负责将其网卡、IP、MAC都设置好,然后在内核的路由表里面写一条,注明这个IP应该到这张网卡。同样如果用户制定了隔离策略,Felix同样会将该策略创建到ACL中,以实现隔离。
  • BIRD是一个标准的路由程序,它会从内核里面获取哪一些IP的路由发生了变化,然后通过标准BGP的路由协议扩散到整个其他的宿主机上,让外界都知道这个IP在这里,你们路由的时候得到这里来。

3)calico三种网络工作模式

模式说明特点
VXLAN封包, 在vxlan设备上将pod发来的数据包源、目的mac替换为本机vxlan网卡和对端节点vxlan网卡的mac。外层udp目的ip地址根据路由和对端vxlan的mac查fdb表获取只要k8s节点间三层互通, 可以跨网段, 对主机网关路由没有特殊要求。各个node节点通过vxlan设备实现基于三层的“二层”互通, 三层即vxlan包封装在udp数据包中, 要求udp在k8s节点间三层可达;二层即vxlan封包的源mac地址和目的mac地址是自己的vxlan设备mac和对端vxlan设备mac。
IPIP封包,在tunl0设备上将pod发来的数据包的mac层去掉,留下ip层封包。 外层数据包目的ip地址根据路由得到。相当于建立了隧道,把两个本来不通的节点网络通过点对点连接起来。只要k8s节点间三层互通, 可以跨网段, 对主机网关路由没有特殊要求。解包、封包都会造成一定的资源损耗。 适用于互相访问的pod不在同一个网段中、跨网段访问的场景。外层封装的ip能够解决跨网段的路由问题。
BGP边界网关协议(Border Gateway Protocol, BGP)是互联网上一个核心的去中心化自治路由协议。通俗的讲就是讲接入到机房的多条线路(如电信、联通、移动等)融合为一体,实现多线单IP不用封包解包,通过bgp协议可实现pod网络在主机间的三层可达, k8s节点不跨网段时和flannel的host-gw相似,支持跨网段,跨网段时,需要主机网关路由也充当BGP Speaker能够学习到pod子网路由并实现pod子网路由的转发。总之bgp适用于大规模网络场景。

4)IPIP模式说明

默认网络模式即IPIP模式,在所有节点上查看网卡,会有tunl0网卡。

5)BGP模式说明

将IPIP模式改为BGP

更改calico-node配置

kubectl edit ds calico-node -n kube-system #会进入vim编辑模式

搜索下面两行

​ - name: CALICO_IPV4POOL_IPIP

​ value: Always

在它的下面增加:

​ - name: CALICO_AUTODETECTION_METHOD

​ value: interface=eth0

保存即可生效

更改ippool,保存即可生效

kubectl edit ippool #会进入vim编辑模式

搜索ipipMode

将ipipMode: Always 改为 ipipMode: Never

查看ip,会发现三台机器的tunl0都没有IP地址了

ip add

再查看route,使用BGP模式不再显示tunl0

ip route

同样还是ng-deploy的两个Pod,对比之前Pod的IP已经发生了变化,因为我重启过机器,但IP段依然是68和206

如果使用BGP模式,68.188访问206.193时,它的路由是10.18.206.192/26 via 192.168.222.102 dev ens33 proto bird

但此时并不需要借助tunl0了,而是直接通过ens33来。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/227323.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【react】动态页面转换成html文件下载,解决样式问题

需求 今天遇到一个需求,挺恶心人的,将一个在线文档页面,可以导出成为html页面查看。 看到网上有使用fs模块,通过react的ReactDOMServer.renderToStaticMarkup将组件转成html字符串,输出文件了。 但是我尝试了&#x…

返回列表中满足指定条件的连续元素:只返回第一个不符合条件元素之前的各元素itertools.takewhile()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 返回列表中满足指定条件的连续元素: 只返回第一个不符合条件元素之前的各元素 itertools.takewhile() [太阳]选择题 请问以下代码输出的结果是? import itertools a …

在VSCode中运行Python脚本文件时如何传参

以下实验所处的操作系统环境说明: OS版本MacOSMonterey 12.1VSCodeOctober 2023 (version 1.84.2) 一、背景 在 VSCode 中写好 Python 脚本后,如果要运行起来,可以怎么做呢? 一般有以下几种方式: 1、直接在 VSCode…

【ARM Trace32(劳特巴赫) 使用介绍 11 -- Trace32 ARMv8/v9 系统寄存器读写】

文章目录 Trace32 ARMv8/v9 系统寄存器读写 Trace32 ARMv8/v9 系统寄存器读写 本文主要介绍如何使用trace32 来对 ARMv8 的系统寄存器及debug 寄存器进行配置,具体配置方法如下: 步骤1: 步骤2: 步骤3: 步骤4&#xf…

商务与经济统计案例分析:3-1Pelican 商店——python 实现

商务与经济统计案例分析:3-1Pelican 商店 要求Python实现 要求 1.净销售额的描述统计量和各种不同类型顾客的净销售额的描述统计量。 2.关于年龄与净销售额之间关系的描述统计量。 Python实现 0.相关分析:2-1案例 1.净销售额的描述统计量和各种不同类型顾客的净销…

【Docker二】docker网络模式、网络通信、数据管理

目录 一、docker网络模式: 1、概述 2、docker网络实现原理: 3、docker的网络模式: 3.1、bridge模式: 3.2、host模式: 3.3、container模式: 3.4、none模式: 3.5、自定义网络模式&#xf…

stateflow——如何查看状态机中参数变化及状态机断点调试

法一:使用Data Inspector 点击“符号图窗”和“属性”,如图;在选择变量n并右键点击inspector,最后在logging,如图 法二:log active state 和法一类似使用data inspector查看,类似的查看方法和…

《机器学习实战》MNIST 数据集的导入方法

1、在网上下载数据集 mnister 数据集有两个类型, (1)一个是手写的阿拉伯数字图片:MNIST 下载地址: 链接:https://pan.baidu.com/s/1dd-I-laysPbT8wxbyvxTvg 提取码:1234 (2…

【Flink系列五】Checkpoint及Barrier原理

本章内容 一致性检查点从检查点恢复状态检查点实现算法-barrier保存点Savepoint状态后端(state backend) 本文先设置一个前提,流处理的数据都是可回放的(可以理解成消费的kafka的数据) 一致性检查点(che…

基于ssm少儿编程管理系统源码和论文

idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 环境: jdk8 tomcat8.5 开发技术 ssm 基于ssm少儿编程管理系统源码和论文744 摘要 网络的广泛应用给生活带来了十分的便利。所以把少儿编程管理系统与现在网络相结合,利用java技术建设…

安装python第三方库后,在pycharm中不能正常导入

python小白学习opencv,使用pip安装完opencv库后import cv2报错,按照如下设置解决: 需要正确设置python解释器路径

VC++使用GetProcessTimes获取进程创建时间、销毁时间、用户态时间、内核态时间

一、GetProcessTimes函数简介(微软MSDN) 微软提供了一个非常有用的API函数GetProcessTimes用来获取进程创建时间、销毁时间、用户态时间、内核态时间,msdn连接为:GetProcessTimes 函数 (processthreadsapi.h) 其函数原型为&#…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux文件管理(3)》(27)

《Linux操作系统原理分析之Linux文件管理(3)》(27) 8 Linux文件管理8.6 文件管理和操作8.6.1 系统对文件的管理8.6.2 进程对文件的管理 8 Linux文件管理 8.6 文件管理和操作 8.6.1 系统对文件的管理 Linux 系统把所有打开的活动…

智能优化算法应用:基于北方苍鹰算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于北方苍鹰算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于北方苍鹰算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.北方苍鹰算法4.实验参数设定5.算法结果6.参考…

12.07

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//窗口设置//去掉表头this->setWindowFlags(Qt::FramelessWindowHint);//重新设置大小this->resize(800,420);//设置背景颜色this->setStyleSheet("background-color:whi…

mfc140.dll丢失的解决方法,以及解决方法的优缺点

如果你在使用电脑时遇到了“mfc140.dll丢失”的错误提示,这可能会阻止你运行特定的应用程序或游戏。这篇文章将向你介绍导致此错误出现的原因以及mfc140.dll丢失的解决方法,让你的电脑系统恢复正常运行。 一.mfc140.dll丢失的解决方法以及优缺点 方法 1…

Hadoop3.x完全分布式环境搭建Zookeeper和Hbase

先在主节点上进行安装和配置,随后分发到各个从节点上。 1. 安装zookeeper 1.1 解压zookeeper并添加环境变量 1)解压zookeeper到/usr/local文件夹下 tar -zxvf /usr/local2)进入/usr/local文件夹将apache-zookeeper-3.8.0-bin改名为zookeep…

【Linux】进程通信之命名管道mkfifo

1.认识命名管道 匿名管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道。命名管道是一种特殊类型的文件 2.在命…

学会使用这个魔法棒,再也不用在容器里安装乱七八糟的命令工具了!

在构建镜像的时候,我总是倾向于极简构建,一切没有必要的软件包都不安装,以此来缩小镜像的容量。但是这种做法为后续运维带来了一些困难,如在日常查询、排查问题的时候发现很多命令用不了,不得不在容器中安装额外的命令…

配置BFD状态与接口状态联动示例

BFD简介 定义 双向转发检测BFD(Bidirectional Forwarding Detection)是一种全网统一的检测机制,用于快速检测、监控网络中链路或者IP路由的转发连通状况。 目的 为了减小设备故障对业务的影响,提高网络的可靠性,网…