k8s-网络-CNI

k8s-网络-CNI

1. 简介

CNI(Container Network Interface)容器网络接口,CNCF项目,一种通用的基于插件的网络解决方案。CNI分为两个库,一个用于定义规范,另一个则实现一些标准插件。

CNI:https://github.com/containernetworking/cni

Plugins:https://github.com/containernetworking/plugins

2. CNI规范

CNI规范用于定义如何实现基于CNI的网络插件,比如网络配置使用什么格式,配置中包含哪些字段,插件必须实现的操作等等。

CNI规范要求描述网络配置文件为JSON格式,基于CNI的网络插件必须支持ADD,DEL,GET,VERSION操作。

3. CNI插件

CNI官方实现并维护了一些常用插件,如果想自己开发,依赖CNI规范也可以自己写网络插件

  • bridge:创建桥接,将主机和容器添加到它
  • ipvlan:在容器中添加一个ipvlan接口
  • loopback:创建一个lookback接口
  • macvlan:创建一个新的MAC地址,将所有流量转发到容器
  • ptp:创建一个veth对
  • vlan:分配一个vlan设备
  • dhcp:在主机上运行守护进程以代表容器发出DHCP请求
  • host-local:维护已分配IP的本地数据库
  • flannel:使用flannel配置文件生成接口
  • tuning:调整现有接口的sysctl参数
  • portmap:一个基于iptables的portmapping插件。将端口从主机的地址空间映射到容器

4. 验证

4.1 开始之前

本次使用centos7系统,确保ip指令已经安装(iproute包),在root用户下进行模拟

4.2 下载CNI插件

# mkdir -p /opt/cni/bin
# wget https://fileserver-1253732882.cos.ap-chongqing.myqcloud.com/cni-plugins-amd64-v0.6.0.tgz -P /opt/cni/bin
# cd /opt/cni/bin/
# tar -zxf cni-plugins-amd64-v0.6.0.tgz
# ls
bridge  cni-plugins-amd64-v0.6.0.tgz  dhcp  flannel  host-local  ipvlan  loopback  macvlan  portmap  ptp  sample  tuning  vlan

4.3 创建容器网络命名空间

# contid=12345678
# netnspath=/var/run/netns/$contid
# ip netns add $contid

# 查看网络命名空间^C
# ip netns list
12345678

# 查看网络命名空间的网口,新创建的命名空间应该是空的^C
# ip netns exec 12345678 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

4.4 创建网络配置文件

# mkdir -p /etc/cni/net.d
# cat >/etc/cni/net.d/10-bridge.conf <<EOF
{
    "cniVersion": "0.2.0",
    "name": "mynet",
    "type": "bridge",
    "bridge": "cni0",
    "isGateway": true,
    "ipMasq": true,
    "ipam": {
        "type": "host-local",
        "subnet": "10.22.0.0/16",
        "routes": [
            { "dst": "0.0.0.0/0" }
        ]
    }
}
EOF
# cat >/etc/cni/net.d/99-loopback.conf <<EOF
{
    "cniVersion": "0.2.0",
    "type": "loopback"
}
EOF

4.5 定义环境变量

# 根据CNI规范,CNI插件使用时必须定义的环境变量^C
# export CNI_PATH=/opt/cni/bin
# export CNI_CONTAINERID=$contid
# export CNI_NETNS=$netnspath
# export CNI_COMMAND=ADD
# export CNI_IFNAME=eth0

4.6 为容器创建网络接口

4.6.1 先创建一个eth0口连接到bridge网络,使用bridge插件进行创建
# /opt/cni/bin/bridge </etc/cni/net.d/10-bridge.conf 
{
    "cniVersion": "0.2.0",
    "ip4": {
        "ip": "10.22.0.3/16",
        "gateway": "10.22.0.1",
        "routes": [
            {
                "dst": "0.0.0.0/0",
                "gw": "10.22.0.1"
            }
        ]
    },
    "dns": {}
}
4.6.2 查看容器网络接口,此时多出一个eth0接口,ip隶属于bridge网络
# ip netns exec 12345678 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 0a:58:0a:16:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.22.0.3/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::3863:1eff:fe53:8bec/64 scope link 
       valid_lft forever preferred_lft forever
4.6.3 创建lookback接口,使用lookback插件进行创建
# /opt/cni/bin/loopback </etc/cni/net.d/99-loopback.conf 
{
    "dns": {}
}
4.6.4 查看容器网络接口,此时lookback接口被激活
# ip netns exec 12345678 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
3: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 0a:58:0a:16:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.22.0.3/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::3863:1eff:fe53:8bec/64 scope link 
       valid_lft forever preferred_lft forever

4.7 网络测试

主机多出cni0接口,并且使用bridge网络第一个ip地址,作为bridge网络的网关。容器网络ping主机,ping网关,ping外网都是通的。

# ip netns exec 12345678 ping 10.22.0.1
# ip netns exec 12345678 ping baidu.com

关于容器网络的接口如何能通外网的,查看iptables可以看出是创建了snat规则

# iptables -t nat -L
···
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
CNI-23f34ea74dae0bd02dd5ef12  all  --  10.22.0.0/16         anywhere             /* name: "mynet" id: "12345678" */

Chain CNI-23f34ea74dae0bd02dd5ef12 (1 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             10.22.0.0/16         /* name: "mynet" id: "12345678" */
MASQUERADE  all  --  anywhere            !base-address.mcast.net/4  /* name: "mynet" id: "12345678" */

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

Golang语言--日志库glog解析

glog简介 glog是著名的google开源C++日志库glog的golang版本,glog是一个轻量级的日志库,上手简单不需要配置文件并且稳定高效,但是可以...

4076
来自专栏静默虚空的博客

[Spring]01_环境配置

1.1 Spring jar包下载 (1)进入官网http://repo.spring.io (2)在资源库界面点击Artifacts标签,然后点击libs-...

1799
来自专栏雪胖纸的玩蛇日常

django 开发忘记密码通过邮箱找回功能

2215
来自专栏代码拾遗

Spring Boot 2.0 教程 - 日志详解

Spring Boot 内部使用commons logging 作为日志输出工具,同时也可以配置其他的工具例如,Java Logging,Log4j2,log...

1154
来自专栏史上最简单的Spring Cloud教程

史上最简单的SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)

Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来。它可以用于广播配置文件的更改或者服务之间的通讯,也可以用于监控。本文要讲述的是用Spr...

2157
来自专栏北京马哥教育

Python 发送邮件脚本

? 作者:Jesse-csdn 来源: http://blog.csdn.net/l2show/ar...

36910
来自专栏张善友的专栏

Jexus 5.8.2 正式发布为Asp.Net Core进入生产环境提供平台支持

Jexus 是一款运行于 Linux 平台,以支持  ASP.NET、PHP 为特色的集高安全性和高性能为一体的 WEB 服务器和反向代理服务器。最新版 5.8...

1906
来自专栏破晓之歌

python+mysql上传图片和上传文件 转

参考博客:http://www.cognize.me/2016/05/09/djangopic

672
来自专栏Brian

Linux 系统优化

概述 在Linux 学习笔记一大体介绍了一些简单的Linux知识和一些简单的优化。下面我们来学习一下Linux和Linux一些安全知识(Linux是基于内核为...

3396
来自专栏跟着阿笨一起玩NET

asp.net中为什么修改了配置文件后我们不需要重启IIS

本文转载:http://blog.itpub.net/12639172/viewspace-659819/

661

扫码关注云+社区