德必信生活网

您现在的位置是:首页 > 杂文随笔 > 正文

杂文随笔

PortMap(portMap 源码)

阿信2023-04-02杂文随笔66

本篇文章给大家谈谈PortMap,以及portMap 源码对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

如何用PortMap

分类: 电脑/网络 软件

问题描述:

我想用PortMap为BT提速。怎样设置端口映射

解析:

运行PortMap之后单击“增加”按钮,在弹出的“增加/修改端口映射”窗口中选择“Any IP”,把客户机使用的整个网段的IP添加进去。随后在“输入端口”栏里输入6881,“输出IP”为自己上网代理服务器的公网IP,输出端口里输入6881(输入端口和输出端口相同)。最后再用同样的方法把BT下载的端口6882~6889依次加入并启动即可。 通过这番设置,你的BT下载速度应该能够得到明显改观。

基于portmap CNI插件来实现端口映射

公司早期的K8S集群是基于flannel分配网段后,并没有在kubelet中启动cni插件功能,而是利用docker本身的网络管理功能,如下所示dockerd的启动命令为:

这利用了docker的自身的网络管理能力,我们知道docker本身是具备端口映射的功能,可以把容器中的服务通过端口映射的方式,如下所示,我们启动一个容器,把容器中的80端口映射到宿主机的8000端口上:

有些老业务为了让容器与外部系统互通,把容器的端口映射到了宿主机的端口上,通过对宿主机的端口进行管理,来防止容器调度的冲突,这种方式一定层度上解决了业务上的问题。

近期,我们对K8S的网络模型进行了升级,通过自定义的网络CNI插件,实现三层网络模型,可以让容器网络与主机网络系统打通,为了统一K8S集群方便管理,我们需要把一些老的业务迁移到新的K8S集群中来。

我们又不希望管理多个K8S集群,但是新集群中的CNI插件本身,不具备这种端口映射的能力,所以碰到了旧的业务无法迁移的难题。

K8S在框架层面是支撑了端口映射的功能,我们可以看看下面这个Pod的定义:

这个Pod要求把容器中80端口映射到宿主机的8080端口中,虽然我们能够这样申明,但是究竟能不能做到,就跟我们指定的网络模式有很大关系了。

如果按照我们老集群中,采用None的模式,让docker进程去管理网络,那么docker自身具备这种端口映射的能力,所以他就能够支持,而在我们新集群中应用的时候,发现不能达到目的,映射根本没有完成。

我们首先来看看我们自定义的插件配置:

基础插件自身是不具备端口映射的能力的,所以基于上述配置无法实现端口映射,但是CNI本身支持级联插件的功能,可以在配置中指定portmap作为级联插件来支持端口映射能力。

为了支持级联插件,我们配置不能采用前面的配置格式,而是基于conflist的配置,文件名改为:11-flannel.conflist,内容如下:

链式CNI插件与portmap端口映射

CNI插件支持依赖关系,有依赖关系的CNI插件会进行多次调用,譬如flannel插件调用bridge插件来完成网桥的创建和IP的获取等。这种CNI插件的依赖关系现实,每个插件依赖于上一次调度的插件的返回结果。

而链式插件也会执行多个插件的多次调用,每一个链式插件会依赖于都依赖于容器运行时信息,下图描述了插件的链式调用。

在进行ADD操作的过程中,在第一个插件运行后,运行时信息必须添加一个prevResult字段到接着运行的插件的配置中,prevResult内容为上一次查询运行的输出信息。

portmap 是一个链式插件,它的作用是把容器的IP和端口通过iptables映射到宿主机的端口上,让外部业务可以通过访问宿主机ip和端口来访问容器内的服务。

下面我们来测试一下链式CNI的效果,首先在/etc/cni/net.d目录下准备一个配置文件:

portmap是基于iptables来实现端口映射,所以在操作之前我们先看一下清空一下系统中的iptables规则和规则链。

下面我们来创建一个网络命名空间,并通过cnitool给它配置想用的网络。

这个命令会最终调用cni插件进行网络空间的网卡配置,我们可以通过下面命令来查看配置的网络信息:

网络配置是成功的,对应的网络空间的ip地址为:10.10.10.7,下面我们来分析一下,前面的portmap的执行情况。

portmap的配置参数,是通过环境变量CAP_ARGS传入的,其中指定了hostPort:8080,containerPort:80,那么就是要求我们把容器中的80端口映射到宿主机的8080端口上,portmap会生成相应的iptables规则来达到这个目的:

这些规则中,主要是实现DNAT的匹配完成端口的映射功能,并对外只会暴漏主机的ip和port信息。

关于PortMap和portMap 源码的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。