链式CNI插件与portmap端口映射

CNI插件从0.3.0版本开始支持链式插件,这一一个能够解决潜在多样场景的功能,与此同时能够保证容器网络栈的统一性。本文主要分析一下链式插件的功能,并重点研究一下portmap插件的原理。

链式CNI插件

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

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

image.png

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

使用portmap CNI插件

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

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

root@herrypc:/etc/cni/net.d# cat cat /etc/cni/net.d/10-chaintest.conflist 
cat: cat: 没有那个文件或目录
{
  "cniVersion": "0.3.1",
  "name": "mynet",
  "plugins": [
     {
        "type": "bridge",
        "isGateway": true,
        "ipMasq": true,
        "bridge": "br0",
        "ipam": {
            "type": "host-local",
            "subnet": "10.10.10.0/24",
            "routes": [
                { "dst": "0.0.0.0/0" }
            ],
         "dataDir": "/run/ipam-out-net"
        },
        "dns": {
          "nameservers": [ "8.8.8.8" ]
        }
    },
    {
      "type": "portmap",
      "capabilities": {"portMappings": true},
      "snat": true
    }
  ]
}

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

root@herrypc:/# iptables -t nat -F 
root@herrypc:/# iptables -t nat -X
root@herrypc:/# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 1 packets, 36 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 1 packets, 36 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination  

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

export CAP_ARGS='{ "portMappings": [ { "hostPort": 9090, "containerPort": 80, "protocol": "tcp" } ]}'

root@herrypc:/etc/cni/net.d# ip netns add herry
root@herrypc:/etc/cni/net.d# cnitool add mynet /var/run/netns/herry 
{
    "cniVersion": "0.3.1",
    "interfaces": [
        {
            "name": "br0",
            "mac": "0a:58:0a:0a:0a:01"
        },
        {
            "name": "veth6ccf2145",
            "mac": "52:09:23:72:0f:70"
        },
        {
            "name": "eth0",
            "mac": "0a:58:0a:0a:0a:07",
            "sandbox": "/var/run/netns/herry"
        }
    ],
    "ips": [
        {
            "version": "4",
            "interface": 2,
            "address": "10.10.10.7/24",
            "gateway": "10.10.10.1"
        }
    ],
    "routes": [
        {
            "dst": "0.0.0.0/0"
        }
    ],
    "dns": {
        "nameservers": [
            "8.8.8.8"
        ]
    }
}

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

root@herrypc:/etc/cni/net.d# ip netns exec herry ifconfig        
eth0      Link encap:以太网  硬件地址 0a:58:0a:0a:0a:07  
          inet 地址:10.10.10.7  广播:0.0.0.0  掩码:255.255.255.0
          inet6 地址: fe80::f438:6bff:fe7b:4523/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1
          接收数据包:29 错误:0 丢弃:0 过载:0 帧数:0
          发送数据包:8 错误:0 丢弃:0 过载:0 载波:0
          碰撞:0 发送队列长度:0 
          接收字节:4912 (4.9 KB)  发送字节:648 (648.0 B)

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

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

root@herrypc:/# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 CNI-HOSTPORT-DNAT  all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 10 packets, 620 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    3   186 CNI-HOSTPORT-DNAT  all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT 10 packets, 620 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 CNI-ce40e14b3f32baff9f7b3f44  all  --  *      *       10.10.10.0/24        0.0.0.0/0            /* name: "mynet" id: "cnitool-cc0eaafbb90e7e27ea49" */

Chain CNI-DN-ce40e14b3f32baff9f7b3 (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:9090 to:10.10.10.8:80

Chain CNI-HOSTPORT-DNAT (2 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 CNI-DN-ce40e14b3f32baff9f7b3  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* dnat name: "mynet" id: "cnitool-cc0eaafbb90e7e27ea49" */ multiport dports 9090

Chain CNI-ce40e14b3f32baff9f7b3f44 (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            10.10.10.0/24        /* name: "mynet" id: "cnitool-cc0eaafbb90e7e27ea49" */
    0     0 MASQUERADE  all  --  *      *       0.0.0.0/0           !224.0.0.0/4          /* name: "mynet" id: "cnitool-cc0eaafbb90e7e27ea49" */

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

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容

  • 不管是 docker 还是 kubernetes,在网络方面目前都没有一个完美的、终极的、普适性的解决方案,不同的...
    shinwing阅读 14,837评论 1 7
  • 引自:http://www.10tiao.com/html/217/201708/2649694873/1.htm...
    潘晓华Michael阅读 842评论 0 12
  • "轰轰轰…"一辆沉重如年迈的老黄牛的班车开在乡间小道上,被车卷起的滚滚黄烟在毒辣的阳光照耀下显得格外浓烈...
    华氏喔阅读 142评论 0 0
  • 晚自习第一节,因为生地会考,我让学生都读生物。期间,我忙着收费和整理费用。在第一节下课前十五分钟左右,我去另一栋楼...
    96大阳阅读 208评论 0 2
  • 水乡华港镇,位置于姜堰市西北隅。不必说卤汀河如同卧龙,衣襟长江,不必说水道纵横如演八卦。也不必说接天莲叶无穷碧,也...
    小雅爱书画阅读 1,759评论 0 0