链式CNI插件与portmap端口映射

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链式CNI插件与portmap端口映射相关的知识,希望对你有一定的参考价值。

参考技术A 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信息。

安装cni网络插件-非必须

安装cni网络插件


安装cni
# 安装 cni
# 百度云链接:https://pan.baidu.com/s/1-PputObLs5jouXLnuBCI6Q 密码:tzqm
cd /server/software/k8s
wget https://github.com/containernetworking/plugins/releases/download/v0.7.1/cni-plugins-amd64-v0.7.1.tgz
mkdir -pv /opt/cni/bin
tar xf cni-plugins-amd64-v0.7.1.tgz -C /opt/cni/bin
ls -l /opt/cni/bin
cd $HOME


vi /etc/cni/net.d/10-mynet.conf

{
    "cniVersion": "0.7.0",
    "name": "mynet",
    "type": "bridge",
    "bridge": "cni0",
    "isGateway": true,
    "ipMasq": true,
    "ipam": {
        "type": "host-local",
        "subnet": "172.30.0.0/16",
        "routes": [
            { "dst": "0.0.0.0/0" }
        ]
    }
}


cat >/etc/cni/net.d/99-loopback.conf <<EOF
{
    "cniVersion": "0.6.0",
    "name": "lo",
    "type": "loopback"
}
EOF



获取subnet:


etcdctl   --endpoints=${ETCD_ENDPOINTS}   --ca-file=/etc/kubernetes/cert/ca.pem   --cert-file=/etc/flanneld/cert/flanneld.pem   --key-file=/etc/flanneld/cert/flanneld-key.pem   ls ${FLANNEL_ETCD_PREFIX}/subnets

/kubernetes/network/subnets/172.30.43.0-24
/kubernetes/network/subnets/172.30.49.0-24
/kubernetes/network/subnets/172.30.30.0-24
/kubernetes/network/subnets/172.30.44.0-24


echo 1 > /sys/devices/virtual/net/docker0/bridge/nf_call_iptables

插件必须设置net/bridge/bridge-nf-call-iptables sysctl为1,以确保iptables代理功能正常。

参照地址: k8s这区文档:   https://k8smeetup.github.io/docs/concepts/cluster-administration/network-plugins/

 

以上是关于链式CNI插件与portmap端口映射的主要内容,如果未能解决你的问题,请参考以下文章

CNI portmap插件实现源码分析

内网怎么利用工具上线

WIndows 远程与路由访问怎么端口映射

docker端口映射与容器互联

端口映射与容器互联

端口映射与容器互联