linux network namespace

通常情况下/var/run/netns存放network namespace,但是docker没有将数据同步到linux runtime.

因此ip netns list看不到docker容器的network namespace.

如何手动同步至liunx runtime呢?

$ docker run --rm -it busybox /bin/sh
$ docker ps
CONTAINER ID   IMAGE     COMMAND     CREATED       STATUS       PORTS     NAMES
6e0f6fb84c09   busybox   "/bin/sh"   2 hours ago   Up 2 hours             cranky_margulis
$ docker inspect 6e0
[{"Id": "6e0f6fb84c09e02a1b3ad5a17cfc5b26136f1f6e46fdfcbe05b4c0ff36d90410","Created": "2022-12-23T01:49:43.823821345Z","Path": "/bin/sh","Args": [],"State": {"Status": "running",# 容器在os上的pid"Pid": 49155,},

下面接下来PID获取其network namespace的位置,通过软连接链接到/var/run/netns, ip netns list就可以获取到了:

# 通过pid 获取network namespace
$ ls /proc/49155/ns/net
/proc/49155/ns/net
$ ls -al /proc/49155/ns/net
lrwxrwxrwx. 1 root root 0 Dec 23 09:49 /proc/49155/ns/net -> net:[4026532576]# 同步至/var/run/netns
$ ln -s /proc/49155/ns/net /var/run/netns/box# 查看容器的网络设备
$ ip netns exec box ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever# `ip netns list`就可以获取到了
$ ip netns list
box (id: 0)
test

/run/docker/netns

/run/docker/netns是docker存放网络命名空间的文件系统位置,类型为tempfs.

kubernetes Pod中的pause容器的network namepace被pod中其他容器共享。

$ docker ps
38695ecd7d1b   registry.aliyuncs.com/google_containers/pause:3.4.1   "/pause"                 24 hours ago   Up 24 hours             k8s_POD_coredns-59d64cd4d4-z5m8w_kube-system_319c5a05-4fc1-4dc3-9b7d-7652b083f4b4_0

当然容器ID并非network namepace的名字,而是SandBox:

$ docker inspect 38695ecd7d1b
[{"Id": "38695ecd7d1b4e1bbf40d7712b45a983037345b3cd57dd9b132cf80fda5d45ad",# ..."NetworkSettings": {"Bridge": "",# network namepsace "SandboxID": "bf34b01e754603d472844af7ca53943f0f70b0cac23e2bde50981e2095d9e791","HairpinMode": false,# ...}}
]

查看/run/docker/netns/,可以发现SandboxID对应的network namespace.

[root@node1 ~]# ls /run/docker/netns/ |grep bf34b01e75
bf34b01e7546

下面这个程序可以验证这一点,打印出此network namespace的网络设备(通过ip a).

package mainimport ("fmt""github.com/containernetworking/plugins/pkg/ns""log""os/exec"
)func main() {containerNs,err:=ns.GetNS("/run/docker/netns/1eaefed87449")if err != nil {log.Fatal(err.Error())}err = containerNs.Do(func(hostNS ns.NetNS) error {cmd:=exec.Command("/bin/sh","-c","ip a")outputBytes,err:=cmd.CombinedOutput()if err != nil {return err}fmt.Println(string(outputBytes))fmt.Println("-------------------host namespace---------------")hostNS.Do(func(ns.NetNS) error {cmd:=exec.Command("/bin/sh","-c","ip a")outputBytes,err:=cmd.CombinedOutput()if err != nil {return err}fmt.Println(string(outputBytes))return nil})return nil})if err != nil {log.Fatal(err.Error())}
}

输出:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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
9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever-------------------host namespace---------------
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:a2:5f:57 brd ff:ff:ff:ff:ff:ff
# ...

golang版 ip netns list

那基于上面的认识,我们可以写出一个golang版的ip netns list,列出节点的所有网络命名空间,并打印出其网卡。

package mainimport ("fmt""github.com/containernetworking/plugins/pkg/ns""io/fs""log""os/exec""path/filepath""strings"
)var NETNS_FS_PATH="/run/docker/netns"func main() {var nslist []stringerr := filepath.Walk(NETNS_FS_PATH, func(path string, info fs.FileInfo, err error) error {// skip if dirif info.IsDir() {return nil}containerNs,err:=ns.GetNS(path)if err != nil {log.Fatal(err.Error())}nsName:=strings.TrimPrefix(path,NETNS_FS_PATH+"/")nslist=append(nslist,nsName)log.Println(fmt.Sprintf("namespace:%s, path: %s",nsName,path))log.Println("network devices:")err = containerNs.Do(func(hostNS ns.NetNS) error {cmd:=exec.Command("/bin/sh","-c","ip a")outputBytes,err:=cmd.CombinedOutput()if err != nil {return err}fmt.Println(string(outputBytes))return nil})if err != nil {log.Fatal(err.Error())}return nil})if err != nil {log.Fatal(err.Error())return}fmt.Println("network namespace list:")for _, nsName := range nslist {fmt.Println(nsName)}}

查看输出:

2022/12/23 11:36:15 namespace:15012fbbbcca, path: /run/docker/netns/15012fbbbcca
2022/12/23 11:36:15 network devices:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
3: eth0@if20: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group defaultlink/ether f2:c0:1c:a9:25:d3 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 10.8.92.194/32 brd 10.8.92.194 scope global eth0valid_lft forever preferred_lft forever# ...2022/12/23 11:36:15 namespace:default, path: /run/docker/netns/default
2022/12/23 11:36:15 network devices:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:50:56:95:98:4d brd ff:ff:ff:ff:ff:ffnetwork namespace list:
15012fbbbcca
3b4f42da2e6b
5608268f8292
5f821446162b
7d87be0df957
bf34b01e7546
default
f22717441520

可以发现default是宿主机的网络命名空间,其他的是pod pause容器的网络命名空间。

Reference List

  1. Container Namespaces – Deep Dive into Container Networking

Kubernetes network namespace位置在哪里?相关推荐

  1. 容器编排技术 -- Kubernetes Network Policy

    容器编排技术 -- Kubernetes Network Policy 1 前提条件 2 隔离的与未隔离的 Pod 3 NetworkPolicy 资源 4 默认策略 4.1 下一步 网络策略说明一组 ...

  2. Linux网络虚拟化基石 network namespace

    1 网络虚拟化基石 network namespace Linux的namespace的作用就是"隔离内核资源". 在Linux的世界里,文件系统挂载点.主机名.POSIX进程间通 ...

  3. linux网络命名空间详解,Linux Network Namespace (netns) 详解

    Linux Network Namespace (netns) 详解 Network Namespace (以下简称netns)是Linux内核提供的一项实现网络隔离的功能,它能隔离多个不同的网络空间 ...

  4. linux 的ip 设置lo_linux网络虚拟化: network namespace 简介及实验

    namespace(命名空间)和cgroup是软件容器化(想想Docker)趋势中的两个主要内核技术.简单来说,cgroup是一种对进程进行统一的资源监控和限制,它控制着你可以使用多少系统资源(CPU ...

  5. Network Namespace

    在linux上,网络的隔离是通过network namespace来管理的,不同的network namespace是互相隔离的 ip netns list:查看当前机器上的network names ...

  6. Linux namespace之:network namespace

    理解network namespace network namespace用来隔离网络环境,「在network namespace中,网络设备.端口.套接字.网络协议栈.路由表.防火墙规则等都是独立的 ...

  7. 容器编排技术 -- Kubernetes 为 Namespace 配置最小和最大 CPU 限制

    容器编排技术 -- Kubernetes 为 Namespace 配置最小和最大 CPU 限制 1 Before you begin 2 创建一个 namespace 3 创建一个 LimitRang ...

  8. 容器编排技术 -- Kubernetes 为 Namespace 配置CPU和内存配额

    容器编排技术 -- Kubernetes 为 Namespace 配置CPU和内存配额 1 Before you begin 2 创建名字空间 3 创建ResourceQuota对象 4 创建一个Po ...

  9. Kubernetes 为 Namespace 配置CPU和内存配额

    Kubernetes 为 Namespace 配置CPU和内存配额 1 Before you begin 2 创建名字空间 3 创建ResourceQuota对象 4 创建一个Pod 5 尝试创建第二 ...

最新文章

  1. 用Python打造一款文件搜索工具,所有功能自己定义
  2. 06.Java虚拟机问题
  3. Python编程基础:第三十六节 模块Modules
  4. 利用Docker搭建Redis主从复制集群
  5. 前端jenkins打包编译发布项目流程
  6. 从“谈芯”走向“用芯” RISC-V 未来前景光明?
  7. 怎么用QQ截取右击出来的内容
  8. 修改Win10右键菜单
  9. html大屏可视化边框怎么弄的,做大屏可视化,你需要知道这几点
  10. 法国西南华人华侨商会:进军区块链行业,促进技术创新项目落地
  11. 计算机车辆识别检测毕业设计,计算机毕业设计(论文)-基于视频的车辆检测系统【全套设计】.doc...
  12. Android WebView 不能弹出alert的对话框
  13. 2020东南大学网络空间安全复试经验分享
  14. 教你用Python画一棵圣诞树
  15. 数据库,计算机网络、操作系统刷题笔记20
  16. 编译原理-6-LR语法分析器
  17. 1.7 积分上限函数的图形
  18. 两会特稿 | 项国就书法学术论文入编《中国民族博览》国家一级大型文化类期刊
  19. Python继承字典dict,请使用UserDict 作为基类
  20. 程序中有游离的...

热门文章

  1. Layui 使用 TinyMCE 富文本编辑器
  2. 晋中中学计算机学院怎么样,山西晋中称霸一方的5所高中,其中3所是省重点中学,你知道几所?...
  3. 软件自动化测试工具的历史演进
  4. Linux命令:ld
  5. Android数据存储和读取的三种方法
  6. 天融信堡垒机怎么结合国密OTP动态令牌实现双因子身份认证?
  7. 带文件名和行号的信息输出宏
  8. 中国桥牌在线 android,中国桥牌在线cbo手游
  9. 会声会影最新网盘资源搜索下载如何使用转场功能制作宠物电子相册
  10. c语言如何编程出声音,C/C++知识点之C语言播放声音最简单的两种方法