已发表的技术专栏(订阅即可观看所有专栏) 0 grpc-go、protobuf、multus-cni 技术专栏 总入口


本篇文章主要是想通过golang编程来实现,为veth pair链接的网络命名空间添加网卡,配置veth pair的IP

测试环境介绍

一台centos虚拟机


在这里插入图片描述


创建命名空间-->启动一个进程-->获取进程号

打开xshell一个终端,输入下面的命令:

相关命令如下


在这里插入图片描述


获取到ns1使用的进程号

此终端,不要关闭。

重新再打开一个终端,编译,运行下面的测试代码。

编写代码,为ns1网络命名空间,添加veth2虚拟网卡,并设置IP

下面代码的主要过程:

创建veth pair --->获取ns1的进程号--->将veth2网卡移动到ns1网络命名空间里--->获取当前二进制文件所在主网络命名空间--->切换到ns1网络命名空间里--->给veth2网卡设置IP--->再切换到主网络命名空间里--->给veth1网卡设置IP

```go {.line-numbers} package main

import ( "flag" "fmt" "http://github.com/vishvananda/netlink" "http://github.com/vishvananda/netns" "http://golang.org/x/sys/unix" "net" "os" "runtime" )

const ( veth1Name = "veth1" veth2Name = "veth2" )

var pid int

func main() {

}

func GetCurrentNS() (*os.File, error) { runtime.LockOSThread() defer runtime.UnlockOSThread() return GetNS(getCurrentThreadNetNSPath()) }

func getCurrentThreadNetNSPath() string { currentNetNSPath := fmt.Sprintf("/proc/%d/task/%d/ns/net", os.Getpid(), unix.Gettid()) return currentNetNSPath }

func GetNS(nspath string) (*os.File, error) {

}

build: CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o createveth main.go

scp: scp createveth root@10.211.55.122:/root

all: make build && make scp

make all ```

将编译后二进制文件,上传到目标服务器上

在服务器上,运行createveth二进制文件


在这里插入图片描述


总结

本篇文章最主要的几点:(仅供参考) - 如何获取某个网络的命名空间, - 就是获取 /proc/容器进程号/ns/net - 如何获取某个线程的网络命名空间 - 就是获取 /proc/进程号/task/线程号/ns/net - 如何进入到某个网络命名空间里

  • 在cni插件中,创建网桥时,就用到了这个知识点。

这样的话,就实现了为某个网络命名空间,添加虚拟网卡的目的。

既然,可以给ip netns创建的网络命名空间,添加虚拟网卡,

那么,能不能为docker环境下的容器,添加额外的虚拟网卡呢?

实现,多网络功能?