Open8

kubelet

bells17bells17

エントリーポイント

エントリーポイント
https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/kubelet.go#L34

へびさん
https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L112-L287

ここらへんはコマンドラインオプション設定とそれをkubelet側に渡す系だけっぽい
https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L270-L286

Runが長い
https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L152-L268

Feature Gate
https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L180-L183

kubeletFlags.ContainerRuntime == "remote" && cleanFlagSet.Changed("pod-infra-container-image")
https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L190-L192

https://twitter.com/bells17_/status/1330444288291860481
https://twitter.com/bells17_/status/1330444001921654784

TODO dynamic kubelet config を知らん気がするので今度調べる
https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L218-L242

mounterや各VolumePluginなどOSに依存するコンポーネントの初期化処理を行ってるっぽい
https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L250-L254

TODO 終了処理用のctxを生成してるっぽい
https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L256-L257

log formatを設定できるようになったらしい
https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L407-L409

OS固有の処理を行ってるっぽい
(WindowsOSの場合のみ処理を行うよう)
https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L412-L414

utilfeature.DefaultMutableFeatureGate.SetFromMap(s.KubeletConfiguration.FeatureGates) (4回目)
これdynamic kubelet config含めるとこの前までに3回呼ばれてて、
かつdynamic kubelet configが適用されてからも呼ばれてるんだけど、
ここでも呼ぶ必要あるん??
https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L473-L474

bells17bells17

BootstrapKubeletConfigController

ここらへんから
https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L1268-L1289

読んでみたけど
https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L1284
で初期化してる
& 定期的にdynamic configを読み込んでるっぽいけど、処理が中途半端な感じで終わってるような印象

中途半端って言ってるのは10秒毎くらいで実行され続けてる
https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubeletconfig/controller.go#L297-L324

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubeletconfig/controller.go#L321
でLastKnownGoodまでしか値が設定されていないところのことを言ってる

bells17bells17

run~

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L474

utilfeature.DefaultMutableFeatureGateにs.KubeletConfiguration.FeatureGatesの有効設定を保存してる
なお utilfeature.DefaultMutableFeatureGate はグローバル変数のよう

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L479

色々バリデーション

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L483-L499

ロックファイルの処理

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L501-L505

これなんか意味あるん?

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L507-L509

メトリクス設定

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L511-L515

スタンドアローン?

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L517-L522

kubeDepsが渡されてなければデフォルト?のを作るってこと?

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L524-L536

external以外のクラウドプロバイダーの設定

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L538-L545

hostname & nodename

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L547-L553

だからスタンドアローンモードってなによ?
クラスター構築前のkubelet起動とか?

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L555-L593

ここはスタンドアローンにも限らず

  • KubeClient
  • EventClient
  • HeartbeatClient
    のいずれかが無かったら初期化処理する的な?

EventClientはまだ想像できるけどHeartbeatClientって何??

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L595-L602

Auth

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L604-L625

色んなランタイムのcgroupのパス情報を収集してる?
TODO cgroup rootとかがよくわからんからあまりピンとこない

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L627-L633

cadvisor周りの設定
でもcadvisorは非推奨とかになってた気はするので基本はスルーでok?

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L635-L636

eventRecorderをkubeDepsに埋め込むっぽい
TODO EventClientが無い場合というのは実質まだcontrol planeが出来上がってない段階になる??

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L638-L745

ContainerManagerのセットアップ

TDOO ただそのContainerManager自体の責務がようわからんのでなんともという感じ
TODO またその仮定でCPUリソースとかの情報取得をしてるけど、そこらへんについてもよくわからない

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L747-L749

パーミッションというかpidが1かをチェックしてる

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L751

コメント読んだけどこのReallyCrashというの自体の説明があまり無いのでよくわからん
HandleCrashの挙動制御をしてるっぽいけど

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L753-L757

ApplyOOMScoreAdj というのが内部で
https://armadillo.atmark-techno.com/blog/1913/2767
にあるような /proc/<pid>/oom_score_adj を設置してOOM Killer対象から外すという処理をしてくれるやつっぽい

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L759-L768

dockershimの起動とコンテナランタイムサービス/イメージサービス(docker pull的なイメージ取得をするやつ?)の生成をしているっぽい

コンテナランタイム/イメージサービスのクライアントの生成をしているっぽいので、これが直接コンテナランタイムとやり取りをするクライアントを管理している??

runDockershim https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet_dockershim.go#L30-L83

dockershim(≒CRI?)だと主に以下の3つのことをやってるっぽい

  • streaming serverの起動: コンテナにportforwardしたりattachしたりを中継してくれるっぽいtcpサーバーのよう
  • container managerの起動: 起動したコンテナにApplyOOMScoreAdjを適用したりする調整ループの実行をgo routineで行う
  • RuntimeService/ImageServiceの処理を行うgRPCサーバーの起動: こいつが実質CRIとして振る舞う中継サーバー?

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L770-L772

メインの1つだと思うので別のページに分ける

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L774-L780

TIPS: このサーバーの実行でHandlePanicというのを利用しているっぽいんだけど、こいつとHandleCrashとかを学んでgoの良いクラッシュ処理について調査したい

DynamicKubeletConfigというのはコードを見た限り実態としては

  • namespace/name の configmapにkubeletのconfigmを保存しておき
  • configmapの更新やnodeの更新をイベントにその情報を取得して(10秒毎の定期チェックも別にある)
  • 変更があればDynamicKubeletConfig用のディレクトリにダウンロードしてきて
  • kubeletのプロセスを終了する(終了すればsystemdなどで再起動がかかるという想定?)
    というだけだった

このConfigMapのデータ取得元はnodeのNode.Spec.ConfigSourceらしい
これをどのように設定していくのかは調べてないので不明
https://kubernetes.io/docs/tasks/administer-cluster/reconfigure-kubelet/
このページ?(中身ちゃんと見てない)

一応処理としては4つに別れてて

  • 10秒毎にNodeのステータスを更新して、ConfigMapによるkubeletのconfig更新エラーを通知するReconciler
  • Nodeをinformerで監視して、イベント更新で発火するconfig更新をするReconciler
  • ConfigMapをinformerで監視して、イベント更新で発火するconfig更新をするReconciler
  • 10秒毎に動作して、config更新をするReconciler

がそれぞれgo routineで動作する

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L782-L791

/healthz エンドポイントを提供するhttpサーバーを起動するだけ
特になんのチェックもせずにレスポンスするっぽいので、ほんとにただkubeletが起動していることを返すだけのお仕事っぽい

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L793-L795

TODO このRunOnceがいまいちわかってない

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L797-L798

systemdに起動したことを通知してるっぽい

bells17bells17

RunKubelet ~

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L1072-L1081

データ取得

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L1082-L1083

またmakeEventRecorderするの??

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L1085-L1087

TODO よくわかんない

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L1089-L1090

credentialproviderの設定?

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L1092-L1094

リアルじゃないOSってなんだよ
(多分unit test用とわかれてる感じ?)

createAndInitKubelet https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L1096-L1126

NewMainKubelet https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L1201-L1231

ここにまとめた
https://zenn.dev/bells17/scraps/c351f36a94e72f74c3c8#comment-fb5bdbe59c3c5a

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L1233

ログ出ししてるだけ

StartGarbageCollection https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L1235

containerGC/imageGCそれぞれのGarbageCollect()をgo routineとwait.Untilで実行を繰り返してる

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1187-L1202

GarbageCollect()の中身
https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kuberuntime/kuberuntime_gc.go#L390-L417

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1210-L1230

GarbageCollect()の中身
https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/images/image_gc_manager.go#L273-L318

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L1128-L1133

podCfg のチェック

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L1135-L1137

linuxの場合はrlimitでリソース制限を行う

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L1139-L1149

RunOnceでの起動またはstartKubeletによる起動を行う
TODO RunOnce
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/getrlimit.2.html

RunOnce

RunOnceはkubeletで --runonce オプションをつけたときの挙動のようで、一度API Serverやstatic podのPodを起動したら終了するものっぽい
なのでRunOnceじゃないのが基本形のよう

https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/
https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/apis/config/types.go#L250-L252

bells17bells17

createAndInitKubelet

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L361-L378

validation

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L380-L386

kubeDeps.PodConfig を生成をしている
kubeDeps.PodConfigに生成するにあたって

  • Podのステータス管理を行うPodStorageの生成
  • StaticPodPath/StaticPodURL があった際にこれらのパス/URLの更新を監視し、変更があった際に cache.store に更新を反映する goroutine の起動
  • KubeClient があった際に API Server に kubelet が起動しているnodeのpodを監視するReflectorを生成~起動

を行っている

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L388-L392

containerGCPolicy の生成

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L394-L396

KubeletEndpoint 情報を持った daemonEndpoints の生成

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L398-L402

imageGCPolicy の生成

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L404-L419

thresholds/evictionConfig の生成
TODO thresholds の生成処理

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L421-L432

serviceLister/serviceHasSynced の生成
KubeClientがあればKubeClientを使ってAPI Serverへと接続する形式
なければcacheを使って生成

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L434-L441

nodeIndexer/nodeLister を生成
これもKubeClientがあればnodeIndexer用のReflectorを生成~起動して自分のnode resourceの同期を行う

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L443-L451

nodeRef

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L453-L456

oomWatcher

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L458-L473

ネットワーク/DNS周りの設定生成

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L475-L529

kubelet本体?生成

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L531-L533

cloudResourceSyncManager

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L535-L554

設定のConfigMapAndSecretChangeDetectionStrategyに従ったstrategyの
secretManager/configMapManagerが生成される

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L556-L558

ここではログを出してるだけ

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L560-L564

https://github.com/kubernetes/kubernetes/blob/release-1.19/vendor/github.com/google/cadvisor/info/v1/machine.go#L174-L270
のようなマシンのリソース情報を取得している

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L566

imageBackOffを生成
TODO image取得のときのエラー処理かなにかをするやつ?

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L568-L570

livenessManager/startupManager/podCache を生成
TODO startupManagerって何?なんでlivenessManagerと同じの使ってる?
TODO podCacheって何?

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L573

mirror podというのはAPI Serverに登録されたstatic podのpod resourceのことのよう
https://kubernetes.io/docs/tasks/configure-pod-container/static-pod/

mirrorPodClientというのはそのresourceをAPI Serverに登録するためのクライアント?

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L574

podManager というのを生成している
podManager には
https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/pod/pod_manager.go#L30-L94
のインスタンスが入る

↑のstructの説明を見ている限りpodManagerはmirrorPodClientを使ってstatic podの情報をmirror podとしてAPI Serverに同期するのが役割のように見える

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L576

statusManager は pod resourceの status 管理を行うやつっぽく見える

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L578

resourceAnalyzer という node のリソース消費量の統計情報を管理したりするやつっぽいのを作ってる

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L580-L582

dockerLegacyService というのはinterfaceのメソッドを見る限りcontainer runtimeがdockerの際に利用されるコンテナログを取得するためのものっぽい

TODO criHandler は http.Handler インターフェイスを満たしただけのもののようなんだけどdockershimのやつかなんか??

TODO runtimeService はもう出てきてると思うけど忘れた

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L584-L586

RuntimeClass は RuntimeClass によって起動するコンテナのruntimeを切り替えるやつだったはず

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L588-L602

CRIContainerLogRotation featuregateが有効な際にコンテナログのログローテートをするためのコンポーネントを生成するっぽい
ちなみに有効でない場合に生成するNewStubContainerLogManagerだと何もしないやつを返すっぽい

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L604-L632

container runtime の managerを生成してる

RuntimeManagerは
https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kuberuntime/kuberuntime_manager.go#L141-L146
を返すのだけど

  • kubecontainer.Runtime: コンテナの管理や削除を行う(何故かコンテナの作成っぽいメソッドだけはないみたい)
  • kubecontainer.StreamingRuntime: exec/attach/portforwardなどを担当
  • kubecontainer.CommandRunner: コンテナ内部で同期的にコマンドを実行するためのもの

の3つのinterfaceを実装したものっぽい

それで生成したruntimeを

klet.containerRuntime = runtime
klet.streamingRuntime = runtime
klet.runner = runtime

のようにそれぞれに同じものを入れてるんだけど、それなら始めから別々でruntime生成したら良いのではという感じがする

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L634-L638

runtimeCache というのを生成してるっぽい
TODO 中身みてる限りpod resourceのキャッシュ管理してるみたいなんだけど、なにに使うの??

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L640-L658

StatsProviderという

  • node
  • pod
  • コンテナ

などのリソース使用状況取得を行うためのやつを生成してるっぽい

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L660

GenericPLEG というのを生成している
PLEG=Pod Lifecycle Event Generatorというものらしい
https://kubernetes.io/ja/docs/concepts/
https://developers.redhat.com/blog/2019/11/13/pod-lifecycle-event-generator-understanding-the-pleg-is-not-healthy-issue-in-kubernetes/
https://github.com/kubernetes/community/blob/master/contributors/design-proposals/node/pod-lifecycle-event-generator.md

見ている限りPLEGというのはnode/containerの状態を管理してdesired stateを管理するもののように感じる

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L661-L662

runtimeのステータス管理管理をするruntimeStateというのを生成して、そのヘルスチェックに↑で生成したPLEGをセットしてる

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L663-L665

podCIDRをruntimeとruntimeStateにセットしてる

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L667-L672

コンテナのGCを行うrealContainerGCを生成してklet.containerGCにセット

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L673

podContainerDeletorというのを生成
生成時にgo routineを起動しており、podContainerDeletor.worker のチャネルに受け取ったコンテナIDのコンテナを削除するようなループ処理が動き続けてる

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L675-L680

コンテナイメージのGCを行う realImageGCManager というのを生成している

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L682-L694

https://github.com/kubernetes/kubernetes/blob/release-1.19/staging/src/k8s.io/client-go/util/certificate/certificate_manager.go#L49-L67

kubeletがAPI Serverと通信するための証明書を生成/維持管理するserverCertificateManagerを生成している

この証明書の生成についてはCertificateRequestを利用して行われるよう
https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/

そして

kubeDeps.TLSOptions.Config.GetCertificate に現在の証明書を取得する関数をセットしてる

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L696-L701

podに各種probe処理を実際に実行するprobeManagerを生成

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L703

service accountのkey tokenを管理する tokenManager を生成

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L705-L712

volume plugin managerを生成
各種

  • volume plugin
  • flexvolume plugin
  • CSI Driver

を管理しているやつっぽい
TODO 管理してるplugin種別あってる?

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L713-L716

plugin managerを生成

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L718-L725

TODO DNSのresolve.conf周りの設定?

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L727-L742

voluleManagerを生成

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L744

ReasonCacheというのを生成している
TODO ReasonCacheというのはコンテナの起動が失敗したりした場合のエラー理由などを管理するやつっぽい

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L745-L746

podWorkersを生成
TODO 長くてあまり見れてないけどpodWorkersがAPI ServerのPod情報とか(もしかしたらPLEGも?)からPod情報を取得してあるべき状態になるようになるようにするやつ?

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L748

backOffというのを生成
TODO backOffってコンテナの起動に一定回数失敗したりするとエラーになるbackOffのこと?

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L749

podをkillするリクエストをハンドリングするらしいpodKillerを生成

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L751

node側から見た対象podの /etc/host パスを返す関数を設定

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L752-L756

evictionManager, evictionAdmitHandler を生成してる
evictionManager, evictionAdmitHandler 両方とも実態としてはevictionManagerっぽい
eviction
TODO eviction ってリソースが不足したときにpodとかを退避させられるやつだっけ??

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L758-L767

sysctl の処理をadmitHandlersに追加してる
TODO このadmitHandlersはpod→コンテナ化する際にかけるadmission webhookみたいなやつ?

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L769-L775

active deadline を処理するhandlerを追加してるっぽい
active deadlineについてはここらへんかも
https://kubernetes.io/docs/concepts/workloads/controllers/job/#job-termination-and-cleanup

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L777

TODO ?

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L779-L780

criticalPodAdmissionHandler の設定
TODO Podのadmit handlerについて

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L781-L784

TODO optionのapply?

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L786-L789

TODO appArmorValidator 関連のhaldlerの追加?
TODO softAdmitHandlers とか色々出てきた
TODO adminの種類?も NewAppArmorAdmitHandler/NewNoNewPrivsAdmitHandler/NewProcMountAdmitHandler とか色々出てきた

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L791

nodeLeaseControllerを生成している

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L793-L795

kubeCfgをkubeletConfigurationに保存

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L797-L799

nodeのデフォルトステータスを設定する関数群を取得

bells17bells17

startKubelet

Run() https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L1153-L1154

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1315-L1320

設定値チェック

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1322-L1325

cloud providerからnodearressesを取得し続けるgo routineを起動してる
https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/cloudresource/cloud_request_manager.go#L90-L135

ただ直接cloud providerのメソッドを読んでるので、これはcloud providerがin-treeの場合の処理のように見える

initializeModules https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1327-L1330

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1236-L1243

prometheusの各種メトリクスを登録
TODO ここで登録してるmetrics/servermetricsはどこで登録されている??

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1245-L1255

プラグインやpodなどの各種ディレクトリを生成したり権限調整をしたり

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1257-L1258

imageManagerを起動
https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/images/image_gc_manager.go#L177-L202

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/images/image_gc_manager.go#L178-L190

現在使われていないコンテナイメージの削除と現在利用されているイメージ情報のログ出力

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/images/image_gc_manager.go#L192-L200

ローカルの?コンテナイメージの一覧を取得してimageCacheオブジェクトにキャッシュ

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1260-L1263

serverCertificateManagerの起動

2つの go routineの起動

期限が来たら新しい証明書をリクエストする処理

https://github.com/kubernetes/kubernetes/blob/release-1.19/staging/src/k8s.io/client-go/util/certificate/certificate_manager.go#L285-L321

dynamicTemplateが有効な場合にtemplateの動的な更新を行う処理?

https://github.com/kubernetes/kubernetes/blob/release-1.19/staging/src/k8s.io/client-go/util/certificate/certificate_manager.go#L323-L341

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1265-L1268

oomWatcherの起動

2つのgo routineを起動

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/oom/oom_watcher_linux.go#L69

Linux のdmesg(/dev/kmsg)の追記を取得して、それぞれの行ごと?でもしOOM Killerに関するログがあれば outStream のチャネルに投げる、ということをしている

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/oom/oom_watcher_linux.go#L71-L85

こっちのgo routineではoutStreamからイベントを受け取ったらrecorderにOOM Killerのイベントを記録してるっぽい
TODO これは wait.Untilとかを使ってないんだけど、一度イベント処理したらそれで終わりになる??
それともイベントを for ~ range で処理しているとイベントが来るたびにループが実行される??
チャネル周りに弱くてようわからん

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1270-L1271

resourceAnalyzerの起動

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/server/stats/resource_analyzer.go#L46-L49

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/server/stats/fs_resource_analyzer.go#L57-L67
を呼んでる

実体となるgo routineの無限ループで呼ばれるのはこれ
https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/server/stats/fs_resource_analyzer.go#L69-L92

パッと見る感じpod毎にvolumeStatCalculatorというのを生成~これの中でpodのボリュームの利用状況を収集し続けるgo routineがそれぞれ起動
→それらのvolumeStatCalculatorをcachedVolumeStatsというオブジェクトに保存してる

ので取得したpodの数だけvolumeStatCalculatorによるボリューム利用状況を収集するgo routineが動作することになるっぽい

volumeManager https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1332-L1333

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/volumemanager/volume_manager.go#L260

HandleCrash

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/volumemanager/volume_manager.go#L262-L263

TODO desiredStateOfWorldPopulator.Run はvolumeに関するあるべき状態のデータの取得・同期みたいなことをしてる??

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/volumemanager/volume_manager.go#L265-L266

desiredState と actualState の比較をしてPodのVolumeのmount/unmountをする

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1336-L1337

go routine とwait.Untilを使って

  • API Serverへのnode resourceの登録
  • node status の更新

が定期的に行われる

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1338

  • runtimeのステータス
  • nodeのステータス
  • podCIDRの更新

などnodeの情報アプデを1度行う

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1340-L1341

nodeLeaseControllerを起動する

node lease についてはここらへん?

https://kubernetes.io/docs/concepts/architecture/nodes/#heartbeats
https://github.com/kubernetes/enhancements/blob/master/keps/sig-node/0009-node-heartbeat.md
https://stackoverflow.com/questions/59659966/what-is-the-kube-node-lease-namespace-for

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1343

fastStatusUpdateOnceでも1度実行してるけどコンテナランタイムとの通信状況を更新する処理っぽい

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1345-L1347

TODO iptablesルールの初期化と監視っぽいことをしてる?
TODO CNIを通してないっぽい感じがするんだけど何に使われる??

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1350-L1352

コメントにある

ポッド(ポッドワーカーによって適切に処理されていない)を殺す責任のあるゴルーチンを開始します。

の通りのことをしてるっぽきがする...

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1355

statusManagerを起動
statusManagerはどうやらpod statusをAPI Server側に同期するのが仕事っぽい

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1356

probeManagerを起動

TODO readinessprobe/startupprobeを使ってのpod/コンテナのステータスチェック??
https://kubernetes.io/ja/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1358-L1361

TODO runtimeClass Manager resourceのinformerを起動してるだけ??

https://kubernetes.io/ja/docs/concepts/containers/runtime-class/

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1363-L1364

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/pleg/generic.go#L129-L132
がStart()

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/pleg/generic.go#L188-L301
が起動している

relistは、コンテナランタイムにポッド/コンテナのリストを照会し、内部ポッド/コンテナと比較して、それに応じてイベントを生成します。

というコメント以上のことはまだ理解ができてない
多分Watch()で返すeventChannelを別の何かが受信してイベントに応じた処理をしてる??

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1365

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1741-L1744

ログ

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1742-L1748

TODO

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1749

ここでplegのeventChannelを取ってる

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1750-L1755

各種変数を定義

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1756-L1761

DNSのresolve.confのSearchのドメイン数やドメイン全体の文字数の長さチェックをしている

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1763-L1780

syncLoopのメインっぽい

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1764-L1770

ランタイムでエラーステータスだったらスキップ

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1774-L1778

メイン処理

ListenAndServe() https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L1156-L1161

最終的に
https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/server/server.go#L221-L257
のハンドラーをインストールしていて

  • pod情報の取得
  • statsの取得
  • メトリクスの取得
  • 各種システムログ情報取得
  • run/exec/attach/debug などの各種コンテナデバッグ

などを行えるそれぞれのエンドポイントを用意しているみたい

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L1162-L1164

上記サーバーのread-only版のよう

https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L1165-L1167

ローカルのpod resourceを取得するためのローカル向けgRPCサーバーを起動しているみたい

bells17bells17

syncLoopIteration

コメントが書かれてるけど日本語訳するとこんな感じ
https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1782-L1813

syncLoopIterationはさまざまなチャネルから読み取り、ポッドを指定されたハンドラーにディスパッチします。

引数:
1. configCh:構成イベントを読み取るチャネル
2.ハンドラー:ポッドをディスパッチするSyncHandler
3. syncCh:定期的な同期イベントを読み取るチャネル
4. housekeepingCh:ハウスキーピングイベントを読み取るためのチャネル
5. plegCh:PLEGの更新を読み取るチャネル

イベントは、kubelet livenessmanagerの更新チャネルからも読み取られます。

ワークフローは、チャネルの1つから読み取り、そのイベントを処理し、
同期ループモニターのタイムスタンプを更新します。

ここに、switchステートメントと構文的に類似しているにもかかわらず、selectの評価時に読み取る準備ができているチャネルが複数ある場合、selectのcaseステートメントが疑似ランダムな順序で評価されることに注意してください。つまり、caseステートメントはランダムな順序で評価され、複数のチャネルにイベントがある場合、caseステートメントが順番に評価されるとは限りません。

そのことを念頭に置いて、まったく特定の順序ではなく、さまざまなチャネルは次のように処理されます。

* configCh:構成変更のポッドをイベントタイプの適切なハンドラーコールバックにディスパッチします
* plegCh:ランタイムキャッシュを更新します。同期ポッド
* syncCh:同期を待機しているすべてのポッドを同期します
* housekeepingCh:ポッドのクリーンアップをトリガーします
*活性マネージャー:失敗したポッドまたは同期ポッド
 コンテナが活性チェックに失敗しました

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1817-L1851

PodConfigのイベント処理の部分

pod追加時の処理

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1960-L1996

pod更新時の処理

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1998-L2013

pod削除時の処理

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L2015-L2035

pod reconcile時の処理

TODO ここでいうreconcileって何?
https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L2037-L2059

その他

TODO removeとは別にdeleteって何?
https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1842-L1845
HandlePodUpdatesが呼ばれてるっぽいけど、podのコンテナが削除されたとかそういうこと??

TODO これが何か不明
https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1853

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1855-L1877

plegによるコンテナの状態の同期やdesired stateになるべくの調整、死んだコンテナ情報をkubelet側に同期するなど、コンテナ状況の管理

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1878-L1885

syncCh は syncTicker := time.NewTicker(time.Second) なので毎秒イベントが飛ぶっぽい

getPodsToSyncでは

  • 作業の準備ができているポッド。
  • ポッドの同期を要求する内部モジュール

を取得してくるよう

そしてそれらをHandlePodSyncsでコンテナ起動を行うよう

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1886-L1900

見てる感じlivenessprobeに失敗したpodをHandlePodSyncsで再度同期するっぽい感じ

https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1901-L1912

これはsyncChと似てて housekeepingTicker := time.NewTicker(housekeepingPeriod) で2秒毎にイベントが飛ぶっぽい

!kl.sourcesReady.AllReady() で削除中のpodのvolumeなどの処理が全部終わってるかチェックしてるっぽい
それでOKならHandlePodCleanupsを呼ぶ

HandlePodCleanupsでは

  • podWorkers からdesiredPodsじゃないpodを全て削除
  • probeManagerが管理してるprobe workerから削除するpod用のworkerを全て停止させる
  • statusManager からdesiredPodsじゃないpodを全て削除
  • 削除されたpodのvolumeが全てunmount済のボリュームディレクトリを全て削除
  • 削除した(する?)static podに対応するmirror podをAPI Serverから全て削除
  • 削除されたpodに割り当てられたcgroupリソースを全て削除
  • backoffのGCを実行

といったことを実行する