Kubelet CNI 源码解析

  • cmd/kubelet/kubelet.go

  • pkg/kubelet/kubelet.go

注: 基于 Kubernetes release-1.9

网络

Kubernetes 容器使用的网络规范为 CNI(容器网络接口),CNI 包括方法规范和参数规范。Kubernetes 并不实际去操作容器的网络,而是通过遵循 CNI 规范的各种网络插件去管理容器网络资源,如 CalicoFlannelContiv 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.gocniNetworkPlugin 实现了这套接口:

  • pkg/kubelet/network/cni/cni.go

步骤 2:初始化网络插件

  • pkg/kubelet/kubelet.go

  • pkg/kubelet/network/plugins.go

上文 hairpinMode 设置 haripin NAT 方式,使得服务后端 endpoints 访问服务自身时负载到本地,配置项为 --hairpin-mode,默认值 promiscuous-bridge

  • 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

参考

最后更新于

这有帮助吗?