docker网络原理,k8s网络原理

2023-05-16

我们知道docker安装完之后,每个docker容器里面都有自己单独的网络,那么docker的网络是怎么工作的呢 ?
首先我们需要了解的是Linux提供了基于NameSpace的隔离机制,主要包含如下NameSpace隔离:

  • Mount Namespace隔离了一组进程所看到的文件系统挂载点的集合,因此,在不同Mount Namespace的进程看到的文件系统层次结构也不同。
  • UTS Namespace隔离了uname()系统调用返回的两个系统标示符nodename和domainname,在容器的上下文中,UTS Namespace允许- 每个容器拥有自己的hostname和NIS domain name,这对于初始化和配置脚本是很有用的,这些脚本根据这些名称来定制它们的操作。
  • IPC Namespace隔离了某些IPC资源(interprocess community,进程间通信),即System V IPC和POSIX消息队列,这些IPC机制的共同特点是,IPC对象由文件系统路径名以外的机制来识别。每个IPC命名空间都有自己的一套System V IPC标识符和自己的POSIX消息队列文件系统。
  • PID Namespace隔离了进程ID号空间,不同的PID Namespace中的进程可以拥有相同的PID。PID Namespace的好处之一是,容器可以在主机之间迁移,同时容器内的进程保持相同的进程ID。PID命名空间还允许每个容器拥有自己的init(PID 1),它是 “所有进程的祖先”,负责管理各种系统初始化任务,并在子进程终止时收割孤儿进程。
    从特定的PID Namespace实例来看,一个进程有两个PID:Namespace内的PID和主机系统上命名空间外的PID。PID命名空间可以嵌套:一个进程从它所在的PID Namespace一直到根PID Namespace,每一层的层次结构都有一个PID,一个进程只能看到他自己PID Namespace和嵌套在该PID Namespace下面的Namespace中包含的进程。
  • Network Namespace提供了网络相关系统资源的隔离,因此,每个Network Namespace都有自己的网络设备、IP地址、IP路由表、/proc/net目录、端口号等。
    网络命名空间使得容器从网络的角度来看是很有用的:每个容器可以有自己的(虚拟)网络设备和自己的应用程序,并与每个命名空间的端口号空间绑定;主机系统中合适的路由规则可以将网络数据包引导到与特定容器相关联的网络设备。因此,例如,可以在同一个主机系统上拥有多个容器化的网络服务器,每个服务器都绑定到其(每个容器)网络命名空间的80端口。
  • User Namespace隔离了用户和组ID号空间,一个进程的用户和组ID在用户命名空间内外可以是不同的,一个进程可以在用户命名空间外拥有一个正常的无权限用户ID,同时在命名空间内拥有一个(root权限)的用户ID。

而docker中的网络则使用了 Network Namespace命名空间隔离,docker的网络提供了如下四种模型:

  • Bridge模式,docker容器会拥有一个自己独立的Network Namespace,然后会建立一个veth对,另外一端连接docekr0网桥
  • Host 模式,docker容器不会拥有自己独立的Network Namespace,而是和宿主机共享同一个Network Namespace,使用同样的环境
  • Container模式,docker容器会跟应存在的容器共享同一个Network Namespace
  • None 模式,docker容器会拥有独立的Network Namespace,但是不会进行任何的网络设置,只有一个网络回环地址

先大致介绍上面这些内容,然后引出下面要介绍的一个点:Linux网桥、veth对

  • Veth pair
    在Linux中,根据之前的介绍,Network Namespace提供了不同的网络环境隔离,不同Network Namespace中,网络环境不同,这两个Network Namespace该如何通信?为此,Linux提供了虚拟网络设备Veth pair 对,一端连着一个Network Namespace,一端连着另外一个Network Namespace,这样这两个Network Namespace通过Veth对就可以实现通信了。

  • Linux网桥
    Linxu网桥同veth pair一样,也是一个虚拟网桥设备,这里首先说一下桥接的概念:桥接就是把一台服务器上的不同网络端口连接起来,从而使得一个端口接收到的数据能从另外一个端口发送出去,这样端口之间能够进行报文的转发。看过之前的网络介绍
    TCP三次握手详解,滑动窗口,网络包路由过程,全连接队列,半连接队列
    其中交换机就实现了这样的功能,连接在同一个交换机上的不同服务器能够通过交换机的桥接可以互相通信。
    Linux从内核级别支持了桥接功能,其实现就是前面说的网桥。veth pair对可以将两个不同Network Namespace进行连通,但是超过两个则无法实现,这时候可以使用网桥,veth pair一端连着网桥,另外一端连着Network Namespace,这样当主机上多个不同的Network Namespace进行通信时,通过网桥进行转发,这时候网桥相当于是交换机,每个Network Namespace相当于是一台机器,在同一个网段的机器之间通过网桥实现相互之间的通信。
    docker在安装完之后,就会在host主机上添加一个docker0网桥,通过docker0网桥,host宿主机上的不同容器之间可以相互通信。

在这里插入图片描述

如上图所示,这里大概简单描述了下网络交互。
实际上除了上面说的veth pari和网桥,还有一个比较重要的工作机制是iptables路由

iptables和Netfilter

Linux内核中提供了一套机制,让用户自定义处理自己关心的数据包,在linux网络协议栈中有一组回调函数挂载点,通过这些挂载点挂在的回调函数,可以对Linux网络栈处理处举报的过程中对数据包进行一些操作,如:过滤、修改、丢弃等。这个技术就是俗称的Netfiler和iptables。
Netfilter负责在内核中执行各种挂接的规则,运行在内核模式中,而iptables则是在用户模式下运行,负责协助和维护内核中Netfilter的各种规则表,二者相互配合。
在这里插入图片描述

如上图所示,iptables主要在5条链上:

  • INPUT链,一般用于处理输入本地进程的数据包
  • OUTPUT链,一般用于处理本地进程的输出数据包
  • FORWARD链,一般用于转发到其他机器或者Network Namespace的数据包
  • PREROUTING链,可以在此进行DNAT
  • POSTROUTING链,可以在此进行SANT
    另外iptables还有5张表:
  • filter表,用于过滤某条链路上的数据包,是继续往下传输还是丢弃或者拒绝
  • nat表,用于修改数据包的源和目的地址
  • mangle表,用于修改数据包的ip头信息
  • raw表,去除iptables对数据表的连接追踪
  • security表,在数据包上应用SELINUX

5张表的优先级从高到低是 raw > mangle > nat > filter > security
一般iptables在匹配到规则之后会有如下几种操作:

  • DROP,直接将数据包丢弃,不在进行后续的处理
  • REJECT,返回Connection refused或者destination unreachable报文
  • QUEUE,将数据包放入用户空间队列,供用户空间的程序处理
  • RETURN,跳出当前链,后续的规则不在处理
  • ACCEPT,同意数据包通过,继续执行后续的规则

这里说下几个概念:

  • DNAT,根据指定条件修改数据包的目标IP地址和目标端口,
  • SNAT,可以理解为DNAT的反向操作,即修改数据包的源IP地址和端口

现在我们在回到我们开始说的docker的网络模型,docker启动的时候默认采用的bridge模式,docker daemon启动后会安装一个docker0网桥,然后会为每个容器分配一个Network Namespace,然后通过veth pair模式,一端连接到docker0网桥上,另外一端连接到我们的容器里。
这样,在单个host主机上,通过网桥、veth pair对、iptables就能够实现不同容器之间的网络通信,但是跨主机之间如何进行通信呢 ?

接下来我们说下k8s中的网络,我们知道k8s中调度单元是基于pod的,而一个pod内是可以存在多个容器的,我们首先在pod级别查看网络是怎么工作的。
在单个pod内部,实际上k8s会默认的给我们启动一个pause容器,这个容器有什么作用呢 ?这里需要说下的就是在一个pod内部是共享一个Network Namespace的,k8s将单个pod内部的网络设置都放在了这个pause容器内部,可以将paues容器理解为这个pod内部所有容器的父容器。
这就是我们说的,在同一个pod内部,不同服务之间可以通过localhost来进行通信。

我们知道在docker中如果要访问不同主机/机器上的容器,需要通过host主机端口映射来实现,但是在k8s中,在同一个集群中,每个docker0网桥都是可以被路由到的,同一个集群中,每台主机都可以访问其他主机上的pod的IP地址,并不需要在主机上做端口映射。
在同一个集群内部,不同主机上的POD是可以直接通过POD IP相互访问的,无需通过主机端口映射来访问

k8s在pod上层封装了一个Servce的概念,这个概念实际上类似发现代理的概念,请求service,然后service将请求转发到对应的POD上。
一般默认创建的service

kube-proxy

kube-proxy是k8s的核心组件,每个Node节点都会部署一份。
访问service的虚拟地址,即clusterIP+port,是通过kube-proxy来实现的。在每个k8s节点Node上都会运行kube-proxy进程,其核心功能是将某个service的访问请求转发到后端的多个POD实例上。kube-proxy将service的clusterIP+port通过iptables的NAT转换到具体的POD实例上,kube-proxy会动态的在iptables中创建该service的相关规则,而这些规则将访问当前节点请求分发到后端的POD的功能。由于在集群内部每个节点上都有kube-proxy服务,这样我们在集群内部任意一个节点上都可以发起对服务的请求访问。
如果是集群外部想要访问集群内部的service,则可以基于kube-proxy和NodePort来实现集群外部访问集群内部的pod
kube-proxy会定期从etcd中获取service的信息

总结来说,kube-proxy的作用如下:

  • 监听kube-api,获取service信息
  • 修改所有node上的iptables规则,维护路由信息
  • 将请求转发到对应的pod上

在k8s 1.8版本之前,都是基于iptables实现,但是iptables有个问题,如果集群规模比较大,则iptabels规则表会很大,可能会导致内核忙不过来,假如集群有5000个节点,一共有2000个服务,每个服务有10个POD,则会在每个节点上产生20000个iptables记录
因此在k8s 1.8版本引入了ipvs支持,IPVS相对于iptables来说效率会更加高,使用ipvs模式需要在允许proxy的节点上安装ipvsadm,ipset工具包加载ipvs的内核模块。并且ipvs可以轻松处理每秒 10 万次以上的转发请求。

k8s中集群外部访问集群内部服务

在k8s中一般通过如下方式可以在集群外部访问集群内部服务:

  • NodePort,这时候集群中每个Node节点上都会指定监听端口,可以通过访问任意节点端口即可访问到指定服务,但是如果服务过多,大量端口难以维护
  • LoadBalance,LoadBalance一般由云服务厂商提供
  • Ingress,相当于是一个7层的转发器,创建一个Ingress Controller,例如nginx-ingress-controller,在每个Node节点都会启动一个nginxpod,采用hostPort模式,这样外部客户端可以通过访问Node节点上的nginx服务来代理到实际的服务。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

docker网络原理,k8s网络原理 的相关文章

  • 移植nandflash驱动并更改分区信息

    LINUX2 6 32 2已经自带了大部分NANDFLASH的驱动 xff0c 在linux2 6 32 2 drivers mtd nand nand ids c文件中 1 本人开发板上的NANDFLASH型号为 xff1a K9F2G0
  • 移植yaffs2

    一 安装git 从网络中下载git 1 6 6 tar gz安装包 1 tar xvzf git 1 6 6 tar gz 2 cd git 1 6 6 3 configure prefix 61 usr local 4 make 运行到此
  • mini2440学习之(三)-------移植LCD驱动

    转载请注明 hongshaoone http www arm9home com 1 修改arch arm mach s3c2440 mach smdk2440 c CODE static struct s3c2410fb display s
  • STM32学习心得五:GPIO实验-基于位操作

    记录一下 xff0c 方便以后翻阅 实验内容 xff1a 跑马灯 蜂鸣器和按键输入 官方资料 xff1a 1 xff09 STM32中文参考手册V10 第8章 通用和复用功能IO GPIO和AFIO 2 xff09 Cortex M3权威指
  • STM32学习心得十一:ST-LINK调试原理+软硬件仿真调试方法

    记录一下 xff0c 方便以后翻阅 主要内容 xff1a 1 xff09 JTAG SWD调试原理 xff1b 2 xff09 软件仿真调试 xff1b 3 xff09 ST LINK硬件仿真调试 官方资料 xff1a STM32中文参考手
  • python函数--介绍

    Python 函数 函数是组织好的 xff0c 可重复使用的 xff0c 用来实现单一 xff0c 或相关联功能的代码段 函数能提高应用的模块性 xff0c 和代码的重复利用率 你已经知道Python提供了许多内建函数 xff0c 比如pr
  • CAS单点登录服务器的搭建与验证码功能的实现(一)

    CAS单点登录服务器的搭建与验证码功能的实现 xff08 版本6 1 X xff09 前言环境准备下载项目并编译配置https登录 前言 关于SSO单点登录的原理和CAS的认证流程百度上有很多 xff0c 这里不再啰嗦 xff0c 直接上具
  • CSS的块级元素和内联元素区别

    块级元素 xff08 block level element xff09 lt center gt lt h1 gt lt ul gt 等 内联元素 xff08 inline element xff09 xff1a lt a gt lt i
  • Linux操作系统下查询NVMe盘符、Slot ID和Bus ID的对应关系

    在拆卸NVMe PCIe 固态硬盘时 xff0c 需要查询Linux操作系统下NVMe盘符 Slot ID和Bus ID的对应关系 操作步骤打开操作系统命令终端 依次执行cd sys bus pci slots和ll命令 xff0c 找到如
  • 图像特征之傅里叶描述子

    使用C 43 43 opencv获取轮廓的傅里叶描述子 傅里叶描述子是一种图像特征 xff0c 具体来说 xff0c 是一个用来描述轮廓的特征参数 其基本思想是用物体边界信息的傅里叶变换作为形状特征 xff0c 将轮廓特征从空间域变换到频域
  • 性能测试1

    概念 xff1a 验证高并发下的系统表现 价值 xff1a 1 性能评估 2 性能验证 2 容量检查 xff08 检查最多能同时支持多少 xff0c 容量预期 xff09 3 性能测试 xff08 边压边调试 调优 多加机器 xff09 4
  • linux /var/log/httpd 清理错误日志方法

    报错 xff1a 启动httpd报错 Job for httpd service failed 没有空间 linux中var磁盘满了的问题 BugSayNo的博客 CSDN博客 var目录满了有什么影响
  • 接口测试流程

    接口测试全流程笔记 接口测试基础 什么是接口 xff1f 一个物体用于和外界连接的部分 汽车油箱口 手机的充电口 计算机硬件 xff1a USB HDMI 计算机软件 xff1a 为了实现代码复用 xff0c 或者说功能重复使用 本地调用
  • 接口测试啊

    接口测试全流程笔记 接口测试基础 什么是接口 xff1f 一个物体用于和外界连接的部分 汽车油箱口 手机的充电口 计算机硬件 xff1a USB HDMI 计算机软件 xff1a 为了实现代码复用 xff0c 或者说功能重复使用 本地调用
  • 性能测试方案

    XX 5 0系统 性能测试方案 修订历史记录 1 项目概述 1 1 背景说明 1 2 测试目的 为保证在日常运行及大型活动期间 xff0c 稳定运行 应用快速 xff0c 对进行性能测试 xff0c 验证系统是否能够达到业务所需的性能指标
  • 新歌能测试方案2

    性能测试方案 文档编号 xff1a 文档名称 xff1a 编 写 xff1a 审 核 xff1a 批 准 xff1a 批准日期 xff1a 性能测试项目组 修改历史 版本 日期 修改说明 修改人 备注 目 录 项目背景 1测试目的 1测试范
  • python函数--len()方法

    len 方法 作用 xff1a 返回字符串 列表 字典 元组等长度语法 xff1a len str 参数 xff1a str xff1a 要计算的字符串 列表 字典 元组等 返回值 xff1a 字符串 列表 字典 元组等元素的长度 实例 1
  • 接口测试用例模板

    接口测试用例模板及参考
  • 什么是性能测试

    性能测试基本概念 1 1 什么是性能测试 测试系统是否可以满足指定的性能 xff08 多并发访问下 xff09 要求 测试系统在 34 多并发 34 状态下的 34 表现 34 第一次理解 xff1a 我的某个功能在100 34 人 34
  • 测试用例学习

随机推荐

  • 测试用例学习

  • 性能测试fangan

    XX 5 0系统 性能测试方案 修订历史记录 1 项目概述 1 1 背景说明 1 2 测试目的 为保证在日常运行及大型活动期间 xff0c 稳定运行 应用快速 xff0c 对进行性能测试 xff0c 验证系统是否能够达到业务所需的性能指标
  • 性能测试fangan

    XX 5 0系统 性能测试方案 修订历史记录 1 项目概述 1 1 背景说明 1 2 测试目的 为保证在日常运行及大型活动期间 xff0c 稳定运行 应用快速 xff0c 对进行性能测试 xff0c 验证系统是否能够达到业务所需的性能指标
  • 性能测试fangan

    XX 5 0系统 性能测试方案 修订历史记录 1 项目概述 1 1 背景说明 1 2 测试目的 为保证在日常运行及大型活动期间 xff0c 稳定运行 应用快速 xff0c 对进行性能测试 xff0c 验证系统是否能够达到业务所需的性能指标
  • 性能测试fangan

    XX 5 0系统 性能测试方案 修订历史记录 1 项目概述 1 1 背景说明 1 2 测试目的 为保证在日常运行及大型活动期间 xff0c 稳定运行 应用快速 xff0c 对进行性能测试 xff0c 验证系统是否能够达到业务所需的性能指标
  • 性能测试fangan

    XX 5 0系统 性能测试方案 修订历史记录 1 项目概述 1 1 背景说明 1 2 测试目的 为保证在日常运行及大型活动期间 xff0c 稳定运行 应用快速 xff0c 对进行性能测试 xff0c 验证系统是否能够达到业务所需的性能指标
  • 性能测试fangan

    XX 5 0系统 性能测试方案 修订历史记录 1 项目概述 1 1 背景说明 1 2 测试目的 为保证在日常运行及大型活动期间 xff0c 稳定运行 应用快速 xff0c 对进行性能测试 xff0c 验证系统是否能够达到业务所需的性能指标
  • python函数--range()方法

    range 方法 range 是python内置函数它能返回一系列连续增加的整数 xff0c 它的工作方式类似于分片 xff0c 可以生成一个列表对象 range函数大多数时常出现在for循环中 xff0c 在for循环中可做为索引使用 其
  • 性能测试fangan

    XX 5 0系统 性能测试方案 修订历史记录 1 项目概述 1 1 背景说明 1 2 测试目的 为保证在日常运行及大型活动期间 xff0c 稳定运行 应用快速 xff0c 对进行性能测试 xff0c 验证系统是否能够达到业务所需的性能指标
  • 性能测试fangan

    XX 5 0系统 性能测试方案 修订历史记录 1 项目概述 1 1 背景说明 1 2 测试目的 为保证在日常运行及大型活动期间 xff0c 稳定运行 应用快速 xff0c 对进行性能测试 xff0c 验证系统是否能够达到业务所需的性能指标
  • 性能测试fangan

    XX 5 0系统 性能测试方案 修订历史记录 1 项目概述 1 1 背景说明 1 2 测试目的 为保证在日常运行及大型活动期间 xff0c 稳定运行 应用快速 xff0c 对进行性能测试 xff0c 验证系统是否能够达到业务所需的性能指标
  • linux VNCserver配置

    在Linux操作系统最流行的图形化操作软件是VNC 正如windows下的mstsc远程桌面 xff0c 在大多数 Linux 发行版都带了 VNC Server 的发行包 通过rpm qa grep vnc检查 xff0c 若没有 xff
  • TouchGFX系列 番外篇 Unicode编码

    目录 前言一 什么是Unicode二 Unicode中文编码范围三 GB2312 BIG5 GBK GB18030简介四 Unicode完整编码范围附录最后 前言 TouchGFX为了便于兼容所有的字符 xff0c 采用的是unicode编
  • Python SMTP 发送邮件

    SMTP Simple Mail Transfer Protocol 即简单邮件传输协议 xff0c 它是一组用于由源地址到目的地址传送邮件的规则 xff0c 由它来控制信件的中转方式 Python的smtplib提供了一种很方便的途径发送
  • mkdir() 函数

    查看更多 https www yuque com docs share 99a6e7fa 44c8 4d85 afe2 17a28d117ab0
  • strrev() 函数

    查看更多 https www yuque com docs share 07d175fb 06a5 4efe 99b1 c08caf369ae1
  • 简单的LED恒流电路

    利用三极管 43 MOS管做LED的恒流电路 xff1a 工作原理 xff1a 1 Q1没有导通的情况下 xff0c Q2的B极电压为0V xff0c Q2截止 xff0c Q1的G极由R1施加电压 xff0c Q1导通 xff1b 2 Q
  • 为matlab GUI添加背景图片

    为matlab GUI添加背景图片 为GUI添加一个背景图片 xff0c 不仅可以让我们的界面变得漂亮大气上档次 xff0c 而且软件对与用户的交互更加友好 用C或者C 43 43 写过软件界面的人都知道 xff0c 这件事情可以轻而易举的
  • python函数--isalnum()方法

    isalnum 方法 描述 xff1a 检测字符串是否由字母和数字组成 语法 xff1a str isalnum gt bool 返回值为布尔类型 xff08 True False xff09 str中至少有一个字符且所有字符都是字母或数字
  • docker网络原理,k8s网络原理

    我们知道docker安装完之后 xff0c 每个docker容器里面都有自己单独的网络 xff0c 那么docker的网络是怎么工作的呢 xff1f 首先我们需要了解的是Linux提供了基于NameSpace的隔离机制 xff0c 主要包含