kubelet が CNI を呼び出すコードを読んだメモ
kubernertes version
branch: master
CommitID: 4e5c781b7dfe70026c1a8870f3e28c711bd57c08
dockershim/docker_sandbox.go
CNI 呼び出しを調査するための Pod 作成時のコードの読み始めは docker_sandbox
とした。
kubernetes/pkg/kubelet/dockershim/docker_sandbox.go
の RunPodSandbox()
で Pod 用ネットワークの作成が実施されている。
肝心な部分は下記の SetUpPod
の呼び出し。
err = ds.network.SetUpPod(config.GetMetadata().Namespace, config.GetMetadata().Name, cID, config.Annotations)
dockershim/network/plugins.go
kubernetes/pkg/kubelet/dockershim/network/plugins.go
の SetUpPod()
が呼び出される。
ここで重要なのは下記。
if err := pm.plugin.SetUpPod(podNamespace, podName, id, annotations); err != nil {
return fmt.Errorf("NetworkPlugin %s failed to set up pod %q network: %v", pm.plugin.Name(), fullPodName, err)
}
plugin
は cni
を指定しているのでここで呼び出す SetUpPod
は kubernetes/pkg/kubelet/dockershim/network/cni/cni.go
の SetUpPod()
になる。
dockershim/network/cni/cni.go
_, err = plugin.addToNetwork(plugin.getDefaultNetwork(), name, namespace, id, netnsPath, annotations)
上記の addToNetwork()
のコードが下記。
下記の AddNetworkList()
でようやく CNI のコードへ。
res, err := cniNet.AddNetworkList(netConf, rt)
libcni/api.go
下記の "ADD"
を見てわかる通り、CNI plugin のバイナリ実行時に使われる CNI_COMMAND
にあたるもの。
result, err := c.addOrGetNetworkList("ADD", nil, list, rt)
return invoke.ExecPluginWithResult(pluginPath, newConf.Bytes, c.args(command, rt), c.exec)
渡されたプラグインのパスとバイナリ実行時に先ほどインターフェースの追加を意味する ADD
が渡されている。これでプラグインが実行され、プラグインは Add
を見て CNI プラグインで定義されている cmdAdd()
を実行する。