Skip to content

Commit

Permalink
update network docs
Browse files Browse the repository at this point in the history
  • Loading branch information
fengzhao committed Jan 19, 2025
1 parent c457284 commit e77dd93
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 11 deletions.
49 changes: 45 additions & 4 deletions docker/1、docker系列之docker容器入门.md
Original file line number Diff line number Diff line change
Expand Up @@ -1892,9 +1892,7 @@ nameserver 8.8.8.8

### host网络

host 网络,其实就是去除网络隔离,让容器直接使用宿主机的网络。

从网络的角度看,这个进程就像直接运行在宿主机上一样。但是其他的存储,进程和用户空间,又跟宿主机进行隔离。
host 网络,其实就是去除网络隔离,让容器直接使用宿主机的网络。从网络的角度看,这个容器内的进程就像直接运行在宿主机上一样。但是其他的存储,进程和用户空间,又跟宿主机进行隔离。

### overlay网络

Expand Down Expand Up @@ -1933,7 +1931,9 @@ overlay网络可以让两个运行在不同宿主机上的容器直接通讯,
# 创建一个swarm集群,

~ docker swarm init
Swarm initialized: current node (slwgtq37q2d51739ln5up6f10) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-0evohu0bywvpdrmeqap5m2uwr4qpddkyilp3l60yv8u9dbobfm-bk6hc1kjjjayuequ2ugc9bvbu 192.168.2.83:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. ➜ ~
Swarm initialized: current node (slwgtq37q2d51739ln5up6f10) is now a manager.
To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-0evohu0bywvpdrmeqap5m2uwr4qpddkyilp3l60yv8u9dbobfm-bk6hc1kjjjayuequ2ugc9bvbu 192.168.2.83:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
~
```


Expand Down Expand Up @@ -1962,6 +1962,47 @@ macvlan 可以给容器分配 mac 地址,在网络中就像一个物理设备





## TAP/TUN网络设备



**对于一个网络设备来说,就像一个管道(pipe)一样,有两端,从其中任意一端收到的数据将从另一端发送出去。**

比如一个物理网卡eth0,它的两端分别是**内核协议栈**(通过内核网络设备管理模块间接的通信)和**外面的物理网络**,从物理网络收到的数据,会转发给内核协议栈,而应用程序从协议栈发过来的数据将会通过物理网络发送出去。



那么对于一个虚拟网络设备呢?首先它也归内核的网络设备管理子系统管理,对于Linux内核网络设备管理模块来说,虚拟设备和物理设备没有区别,都是网络设备,都能配置IP。

从网络设备来的数据,都会转发给协议栈,协议栈过来的数据,也会交由网络设备发送出去,至于是怎么发送出去的,发到哪里去,那是设备驱动的事情,跟Linux内核就没关系了。

所以说虚拟网络设备的一端也是协议栈,而另一端是什么取决于虚拟网络设备的驱动实现。



在计算机中TUN与TAP是Linux操作系统内核中的虚拟网络设备。不同于硬件设备这些虚拟的网络设备全部用软件实现,但提供了与硬件设备完全相同的功能。

所有主机物理网卡收到的数据包时,会先将其交给内核的 `网络协议栈(Network Stack)` 处理,然后通过 `Socket API` 通知给用户态的用户程序。

Linux 中 `Tun/Tap` 驱动程序为应用程序提供了两种交互方式:

- 虚拟网络接口和字符设备 `/dev/net/tun`。写入字符设备 `/dev/net/tun` 的数据会发送到虚拟网络接口中;
- 发送到虚拟网络接口中的数据也会出现在该字符设备上;



用户态应用往字符设备 `/dev/tunX` 写数据时,写入的数据都会出现在TUN虚拟设备上,当内核发送一个包给 TUN 虚拟设备时,通过读这个字符设备 `/dev/tunX` 同样可以拿到包的内容。





`tun/tap` 的最主要应用场景就是 `vpn`。 基实现原理就是用到隧道技术,将无法直接发送的包通先封成允许通过的合法数据包,然后经过隧道的方式传递给对方,对方收到数据包再解包成原始数据包,再继续传递下去,直到接收端收到,然后响应并原路返回。



## docker-compose

docker-compose 是定义多个容器的编排工具。通过 yaml 文件来描述一组容器。
Expand Down
22 changes: 15 additions & 7 deletions k8s/k8s基础.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -1466,21 +1466,27 @@ spec:
为了实现这个网络模型,CoreOS 团队发起了 CNI 项目(后来 CNI 进了 CNCF 孵化)。CNI (Container Network Interface) 定义了实现容器之间网络连通性和释放网络资源等相关操作的接口规范,这套接口进而由具体的 CNI 插件的去实现,CNI 插件负责为 Pod 分配 IP 地址,并处理跨节点的网络路由等具体的工作。
为了实现这个网络模型,CoreOS 团队发起了 CNI 项目(后来 CNI 进了 CNCF 孵化)。
CNI (Container Network Interface) 定义了实现容器之间网络连通性和释放网络资源等相关操作的接口规范,这套接口进而由具体的 CNI 插件的去实现,CNI 插件负责为 Pod 分配 IP 地址,并处理跨节点的网络路由等具体的工作。
Kubernetes 定义了一种简单、一致的网络模型,基于扁平网络结构的设计,无需将主机端口与网络端口进行映射便可以进行高效地通讯,也无需其他组件进行转发。该模型也使应用程序很容易从虚拟机或者主机物理机迁移到 Kubernetes 管理的 pod 中。
所谓网络栈:网卡(Network Interface)、回环设备(LoopbackDevice)、路由表(Routing Table)和 iptables 规则
所谓**网络栈**:网卡(Network Interface)、回环设备(LoopbackDevice)、路由表(Routing Table)和 iptables 规则
对于一个进程来说,这些要素,其实就构成了它发起和响应网络请求的基本环境。
在docker场景下,被限制在 `NetworkNamespace` 里的容器进程,实际上是通过 Veth Pair 设备 + 宿主机网桥的方式,实现了跟同宿主内其他容器的数据交换。
在docker场景下,被限制在 `NetworkNamespace` 里的容器进程,实际上是通过 `Veth Pair` 设备 + **宿主机网桥**的方式,实现了跟同宿主内其他容器的数据交换。
当从宿主机上直接访问该宿主机内其他容器的 IP 地址时,这个请求的数据包,也是先根据路由规则到达 docker0 网桥,然后被转发到对应的 Veth Pair 设备,最后出现在容器里。
当一个容器试图连接到另外一个宿主机时,比如:ping 10.168.0.3,它发出的请求数据包,首先经过 docker0 网桥出现在宿主机上。然后根据宿主机的路由表里的直连路由规则(10.168.0.0/24 via eth0)),对 10.168.0.3 的访问请求就会交给宿主机的 eth0 处理。
当一个容器试图连接到另外一个宿主机时,比如:ping 10.168.0.3,它发出的请求数据包,首先经过 docker0 网桥出现在宿主机上。
然后根据宿主机的路由表里的直连路由规则(10.168.0.0/24 via eth0)),对 `10.168.0.3` 的访问请求就会交给宿主机的 `eth0` 处理。
Expand All @@ -1494,11 +1500,11 @@ Kubernetes 定义了一种简单、一致的网络模型,基于扁平网络结
从 Pod 的视角来看,Pod 是在其自身所在的 network namespace 与同一宿主节点上另外一个pod的 network namespace 进程通信。
从 Pod 的视角来看,Pod 是在其自身所在的 `network namespace` 与同一宿主节点上另外一个pod的 `network namespace`进程通信。
由于network namespace隔离了网络相关的全局资源,因此从网络角度来看,一个network namespace可以看做一个独立的虚机
由于`network namespace`隔离了网络相关的全局资源,因此从网络角度来看,一个`network namespace`可以看做一个独立的虚拟机
即使在同一个主机上创建的两个network namespace,相互之间缺省也是不能进行网络通信的。
即使在同一个主机上创建的两个`network namespace`,相互之间缺省也是不能进行网络通信的。
Expand Down Expand Up @@ -1530,6 +1536,8 @@ Linux Bridge 是工作在链路层的网络交换机,由 Linux 内核模块 `b
为了解决这个**容器跨主通信**的问题,k8s 制定了 CNI 规范,然后社区里依据该规范出现了各种各样的容器网络方案。
其中 Flannel 是最早实现的,也是最简单的一个。
Expand Down

0 comments on commit e77dd93

Please sign in to comment.