LoginSignup
7
3

More than 5 years have passed since last update.

kubelet call cni memo

Last updated at Posted at 2018-07-24

kubelet が CNI を呼び出すコードを読んだメモ

kubernertes version
branch: master
CommitID: 4e5c781b7dfe70026c1a8870f3e28c711bd57c08

dockershim/docker_sandbox.go

CNI 呼び出しを調査するための Pod 作成時のコードの読み始めは docker_sandbox とした。

kubernetes/pkg/kubelet/dockershim/docker_sandbox.goRunPodSandbox() で 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.goSetUpPod() が呼び出される。

ここで重要なのは下記。

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)
}

plugincni を指定しているのでここで呼び出す SetUpPodkubernetes/pkg/kubelet/dockershim/network/cni/cni.goSetUpPod() になる。

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() を実行する。

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3