kubeadmの実装の処理の流れを先に理解しておくと、個々の処理の実装を読むときに楽なので、そこらへんについてまとめたメモ
kubeadmはkubernetes v1.19にあるkubeadmをベースに書く
(kubeadm的には v1.10?)
https://github.com/kubernetes/kubernetes/tree/release-1.19/cmd/kubeadm/app
kubeadmの実行フロー
- エントリーポイントは cmd/kubeadm/kubeadm.goエントリーポイントは cmd/kubeadm/kubeadm.go
- kubeadmutil.CheckErr()はCLIの単なるエラーハンドリング処理なのでスキップ
- app.Run()でkubeadmを実行 https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubeadm/app/kubeadm.go#L31-L51
- app.Run()ではklogの初期化とpflagでコマンドライン引数などの設定を行い、最終的にcmd.NewKubeadmCommand().Execute()を実行 https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubeadm/app/cmd/cmd.go#L33-L97
- NewKubeadmCommand は他のKubernetesコンポーネントと同じく https://github.com/spf13/cobra が使われている
- kubeadmだとkubeadm initなど様々なサブコマンドが登録されていて、これらのサブコマンドが https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubeadm/app/cmd/cmd.go#L84-L92 で登録されている
- kubeadm initの場合はNewCmdInit(https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubeadm/app/cmd/cmd.go#L86)で登録がされている
- kubeadm initを実行した場合はRunE(https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubeadm/app/cmd/init.go#L140-L154)で登録した関数が実行される
kubeadmのrunner
- kubeadmではapp/cmd/phases/workflowパッケージのRunnerが利用されているよう
- これはkubeadmの各処理フェーズを分割して実行するのと(Preflight, Certsなど)、コマンドラインから特定のフェーズだけを指定して実行するために利用されているっぽい(e.g. kubeadm init phase preflight)
- このrunnnerで実行される処理(preflightなど)はAppendPhaseメソッドでそれぞれ登録されている
- kubeadm initでいうと https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubeadm/app/cmd/init.go#L175-L188 で登録されている
- これらの登録されたフェーズはRunメソッドでまとめて実行される(https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubeadm/app/cmd/init.go#L149-L151)
- ここのフェーズのみを実行するphaseサブコマンドは https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubeadm/app/cmd/phases/workflow/runner.go#L293-L399 で登録されている
まとめ
ここまでがkubeadmの実行にあたっての共通の実装の部分で、各サブコマンド(e.g. init, join)が個々のフェーズでどんな処理を行っているのかについては個々のフェーズで登録されているメソッドを読めば良いということになる