docker集群网络理解
根据容器运行中显示的网卡,使用 docker network ls
查看了对应的docker网络:
10.255/16 ingress overlay swarn
172.21/16 mynets overlay swarn
172.18/16 docker_gwbridge bridge local
其中1、3是默认的,2是手动创建的,当然类型也是有所不同,1、2是overlay,3是bridge
这里来讲解下他们的异同、用处:
- 首先是1、2 它们的类型都是一样的,就只有默认、自定义的区别,那究竟有什么分别呢?
- 默认的 ingress 承担了堆外暴露和负载均衡功能,我们 publish 后即可通过宿主机 ip 端口访问此服务并且负载均衡,而自定义 overlay 是不提供堆外暴露的,及时 publish 也无法通过宿主机 ip 端口访问,需要再增加一个 nginx + ingress 来提供堆外服务
- 自定义的 overlay 主要是承担服务之间的通信,当然 ingress 网络类型一样,也是有此功能的,但不侧重,再就是 自定义的可以提供更加细粒度的控制,比如不同服务之间分配不同的 overlay 来隔离
- docker_gwbridge 主要提供了在不同宿主机上容器与容器、同一宿主机上容器与宿主机、容器与外部的访问,也就是除了同一宿主机下容器互访之外的其他网络需求,同一宿主机容器之间可以通过 overlay 直接互访
网络走向
请求是如何通过任意节点最终到达目的服务器的呢? 包括 docker 自带的负载均衡如何转发?大概是如下流程:
- 请求先到宿主机nat表,DNAT请求到本地172.18.0.2网络
- 通过本地路由到地址为172.18.0.1的网络docker_gwbridge,每个宿主机本地都有一个172.18.0.1地址
- docker_gwbridge网关找到172.18.0.2为ingress-sbox
- ingress-sbox接受请求后在mangle表的PREROUTING链打标记
- mangle表的INPUT链根据标记转发到服务(service)的虚拟ip地址(实际上所有服务的虚拟ip地址都在ingress-sbox上配置)
- 请求准备发送到此虚拟ip,当到达nat表POSTROUTING链的时候被拦截,执行源地址转换,规则是所有目的地址是集群网段都转发到本机的ipvs虚拟地址
- ingress-sbox的ipvs根据mangle的标记,再把请求发送到集群内指定服务容器的ip
参考文档
https://blog.csdn.net/weixin_36171533/article/details/81842036
https://www.jianshu.com/p/c83a9173459f
https://www.cnblogs.com/www1707/p/10872748.html
libnetwork 是 docker 容器网络库,最核心的内容是其定义的 Container Network Model (CNM),这个模型对容器网络进行了抽象,由以下三类组件组成:
Sandbox:Sandbox 是容器的网络栈,包含容器的 interface、路由表和 DNS 设置。 Linux Network Namespace 是 Sandbox 的标准实现。Sandbox 可以包含来自不同 Network 的 Endpoint
Endpoint:Endpoint 的作用是将 Sandbox 接入 Network。Endpoint 的典型实现是 veth pair,后面我们会举例。一个 Endpoint 只能属于一个网络,也只能属于一个 Sandbox
Network:Network 包含一组 Endpoint,同一 Network 的 Endpoint 可以直接通信。Network 的实现可以是 Linux Bridge、VLAN 等
评论