已发表的技术专栏(订阅即可观看所有专栏) 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环境下的容器,添加额外的虚拟网卡呢?
实现,多网络功能?