Kubelet CNI 源码解析
cmd/kubelet/kubelet.gopkg/kubelet/kubelet.go
注: 基于 Kubernetes release-1.9
网络
Kubernetes 容器使用的网络规范为 CNI(容器网络接口),CNI 包括方法规范和参数规范。Kubernetes 并不实际去操作容器的网络,而是通过遵循 CNI 规范的各种网络插件去管理容器网络资源,如 Calico、Flannel、Contiv netplugin 网络插件等。
CNI 接口
github.com/containernetworking/cni/libcni/api.go
CNI 接口只需要实现以下方法,实际就是两种,一个添加网络调用,一个删除调用:
type CNI interface {
AddNetworkList(net *NetworkConfigList, rt *RuntimeConf) (types.Result, error)
DelNetworkList(net *NetworkConfigList, rt *RuntimeConf) error
AddNetwork(net *NetworkConfig, rt *RuntimeConf) (types.Result, error)
DelNetwork(net *NetworkConfig, rt *RuntimeConf) error
}网络初始化
Kubelet 启动过程中针对网络主要做以下步骤,分别是探针获取当前环境的网络插件以及初始化网络。
步骤 1:探针获取当前环境的网络插件
cmd/kubelet/app/server.go
cmd/kubelet/app/plugins.go
pkg/kubelet/network/plugins.go
以下是 kubelet NetworkPlugin 接口,pkg/kubelet/network/cni/cni.go 中 cniNetworkPlugin 实现了这套接口:
pkg/kubelet/network/cni/cni.go
步骤 2:初始化网络插件
pkg/kubelet/kubelet.go
pkg/kubelet/network/plugins.go
pkg/kubelet network/cni/cni.go
网络操作
网络操作主要是 Pod 创建的网络添加以及删除的网络回收操作,上文中介绍了 NetworkPlugin 接口,其中包含了添加网络和删除网络的方法:
pkg/kubelet/network/plugins.go
以下为 Kubelet 调用 CNI 网络的具体操作实现:
添加网络
pkg/kubelet/network/cni/cni.go
github.com/containernetworking/cni/libcni/api.go
删除网络
pkg/kubelet/network/cni/cni.go
github.com/containernetworking/cni/libcni/api.go
参考
最后更新于
这有帮助吗?