kubelet
kubeletのコードを読むぞ〜!
コードベース
実行前提条件
- Linux
- DynamicConfigDir=true: DynamicConfig機能が動作する
- standaloneMode=false: API Serverに接続するか否か?
エントリーポイント
エントリーポイント
へびさん
ここらへんはコマンドラインオプション設定とそれをkubelet側に渡す系だけっぽい
Runが長い
Feature Gate
kubeletFlags.ContainerRuntime == "remote" && cleanFlagSet.Changed("pod-infra-container-image")
TODO dynamic kubelet config を知らん気がするので今度調べる
mounterや各VolumePluginなどOSに依存するコンポーネントの初期化処理を行ってるっぽい
TODO 終了処理用のctxを生成してるっぽい
log formatを設定できるようになったらしい
OS固有の処理を行ってるっぽい
(WindowsOSの場合のみ処理を行うよう)
utilfeature.DefaultMutableFeatureGate.SetFromMap(s.KubeletConfiguration.FeatureGates)
(4回目)
これdynamic kubelet config含めるとこの前までに3回呼ばれてて、
かつdynamic kubelet configが適用されてからも呼ばれてるんだけど、
ここでも呼ぶ必要あるん??
BootstrapKubeletConfigController
ここらへんから
読んでみたけど
& 定期的にdynamic configを読み込んでるっぽいけど、処理が中途半端な感じで終わってるような印象
中途半端って言ってるのは10秒毎くらいで実行され続けてる
でLastKnownGoodまでしか値が設定されていないところのことを言ってる
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 というのが内部で
にあるような /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的なイメージ取得をするやつ?)の生成をしているっぽい
コンテナランタイム/イメージサービスのクライアントの生成をしているっぽいので、これが直接コンテナランタイムとやり取りをするクライアントを管理している??
https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet_dockershim.go#L30-L83
runDockershimdockershim(≒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らしい
これをどのように設定していくのかは調べてないので不明
このページ?(中身ちゃんと見てない)
一応処理としては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に起動したことを通知してるっぽい
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用とわかれてる感じ?)
https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L1096-L1126
createAndInitKubelethttps://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L1201-L1231
NewMainKubeletここにまとめた
https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L1233
ログ出ししてるだけ
https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L1235
StartGarbageCollectioncontainerGC/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/kubelet.go#L1210-L1230
GarbageCollect()の中身
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
RunOnce
RunOnceはkubeletで --runonce オプションをつけたときの挙動のようで、一度API Serverやstatic podのPodを起動したら終了するものっぽい
なのでRunOnceじゃないのが基本形のよう
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/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のことのよう
mirrorPodClientというのはそのresourceをAPI Serverに登録するためのクライアント?
https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L574
podManager というのを生成している
podManager には
のインスタンスが入る
↑の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は
を返すのだけど- 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というものらしい
見ている限り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を利用して行われるよう
そして
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://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のデフォルトステータスを設定する関数群を取得
startKubelet
https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L1153-L1154
Run()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を起動してる
ただ直接cloud providerのメソッドを読んでるので、これはcloud providerがin-treeの場合の処理のように見える
https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1327-L1330
initializeModuleshttps://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#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の起動
期限が来たら新しい証明書をリクエストする処理
dynamicTemplateが有効な場合にtemplateの動的な更新を行う処理?
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の起動
で を呼んでる
実体となるgo routineの無限ループで呼ばれるのはこれ
パッと見る感じpod毎にvolumeStatCalculatorというのを生成~これの中でpodのボリュームの利用状況を収集し続けるgo routineがそれぞれ起動
→それらのvolumeStatCalculatorをcachedVolumeStatsというオブジェクトに保存してる
ので取得したpodの数だけvolumeStatCalculatorによるボリューム利用状況を収集するgo routineが動作することになるっぽい
https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1332-L1333
volumeManagerhttps://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://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#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://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1358-L1361
TODO runtimeClass Manager resourceのinformerを起動してるだけ??
https://github.com/kubernetes/kubernetes/blob/release-1.19/pkg/kubelet/kubelet.go#L1363-L1364
がStart()
が起動している
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
メイン処理
https://github.com/kubernetes/kubernetes/blob/release-1.19/cmd/kubelet/app/server.go#L1156-L1161
ListenAndServe()最終的に
のハンドラーをインストールしていて- 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サーバーを起動しているみたい
syncLoopIteration
コメントが書かれてるけど日本語訳するとこんな感じ
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追加時の処理
pod更新時の処理
pod削除時の処理
pod reconcile時の処理
TODO ここでいうreconcileって何?
その他
TODO removeとは別にdeleteって何?
HandlePodUpdatesが呼ばれてるっぽいけど、podのコンテナが削除されたとかそういうこと??TODO これが何か不明
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を実行
といったことを実行する