Bridge

独立netns隔离了网络,容器间网络不互相影响,容器内的IP地址是私有网段,仅本地可见,通过NAT与外部交互

Bridge 模式可以看作服务被放在一个独立的网络空间里,它的 IP 是一个虚拟 IP,任何的端口都是可以使用的。但是对外提供服务的时候,需要通过 NAT 转发。

需要进行的配置:

  • 配置服务信息中需要填写一个服务主端口

  • 配置以后的实例列表:

    可以看到,Bridge 模式下的实例会有不同的 NodeIP 和内部 IP,内部 IP 是一个虚拟 IP,它通过 NAT 转发映射到 NodeIP。内部端口是配置的固定端口,访问端口是动态配置的转发端口。

Host

标准的Host网络

Host 模式使用的是宿主机的端口,相比 Bridge 而言,少了一次内核栈的调用,也没有 NAT 转发的损耗。对于高吞吐,或有大文件传输的业务服务而言,Bridge 模式不符合性能要求,所以架构组又推出来了 Host 模式。

在 Host 模式下,服务端口都是平台自动分配的,因此不同的实例端口可能不同。平台会根据每台机器的可用端口,按照服务的需要,分配给实例对应的端口并保存在环境变量中,从 PORT0 开始保存。

例如,服务需要一个端口(配置的是 4608),平台会分配两个可用端口(9001、9002),写到环境变量 PORT0 和 PORT1 中,因此需要服务自己进行动态的配置和替换。

在环境变量中,”$IS_HOST_NETWORK” == “1” 表示 Host 模式。

Auto Host

通过hookbind重映射bind的端口号,其他行为同Host

在上面的 Host 模式中,平台把动态分配端口的使用权下放给了应用,需要应用自己进行复杂的配置,并在应用中动态修改配置,有比较高的维护成本。另外,如果选择 Host 模式,但是依旧按照 Bridge 的方式进行配置,则有产生端口冲突的风险。于是架构组又推出了 Auto Host 模式。

Auto Host 模式的做法是在内核层对 syscall 的 listen api 进行截获,然后替换上动态分配的端口。

Auto Host 模式需要进行的配置与 Bridge 模式有两点不同:

  • 选择不同的模式
  • 需要配置的端口数与 Host 模式相同,是 Bridge 模式的两倍,Bridge 模式只要配置 uwsgi 的端口,这边需要 uwsgi 和 nginx 的端口

Auto Host 模式启动以后的实例列表,这边由于不需要进行 NAT 转发,因此 NodeIP 和 内部 IP是一样的,9003 和 9006 是平台动态分配的端口。

以下全文仅讨论Bridge网络模式,Host网络的隔离性以及功能扩展性远不如Bridge,且Bridge在BPF加速后,性能略高于Host网络。