Cloud Native 読書会第4回 kubelet
Cloud Native 読書会
前回
毎月第3水曜日に少人数で集まり一緒に Cloud Native 技術のコードを読む会です。
Connpass と Wantedly で募集しています。
Role
- @potsbo 司会 -> 全体進行
- @bgpat 裏方 -> 参加できてない人のケアなど
Timetable
- Introduction 5 min
- 自己紹介 15 min
- 読書 60 min
- 反省会/次回予告 10 min
概要
コードを読むことがなんだかんだ一番コスパの良い技術の学習方法だと @potsbo 考えています。もともとは Kubernetes 読書会として Kubernetes のコードを読む会をしていた事がありましたが、今回はそれの復活版で更に Kubernetes 以外のコードも読んでいいじゃないか、という会です。
かなりカジュアルに行っていた会で進め方も固まっているわけではありません。
皆さんのいろんな意見を聞きながら良い会にしていければなと思ってます。
(ちゃんとやるのが面倒になって中止してしまっていましたが結構評判が良かったので「続けること」を目標に再開しています。)
うまくいったら下の発表のような知見が得られることを期待しています。
前提
ハードルは低く行きます。「少人数だからこそ何でも聞いて良い」を前提にします。どんなに馬鹿に思える質問でもコードを追うことで理解するという解決策を取れば必ず良い学びになると思っています。
多分人の顔と名前も覚えてられないと思うので、「名前は覚えられていない」という前提を共有して進みましょう。
進め方
誰か一人の PC の画面共有をしながら議論をしながら何らかのテーマを解決していきます。全員が非公開 Podcast の出演者のような気持ちで積極的に発言してくれることを期待しています。
テーマはまだ決めていないので「そういえばここの挙動が気になる」というようなものがあると嬉しいです。
@potsbo
Wantedly で技術基盤チームで Istio や Ambassador をいじっています。
kubelet は「なんか node にいるなんでもやってくれる人だよね」くらいの認識です
@bgpat
Wantedly のインフラチームで YAML 職人をしています
@kyohmizu
先月からSREのようなことをしています。
コードはまだ読み始めたばかりです。
読む repository
VS Code 持ってる人向け
kubelet は node に一体ずついる
どんな事やっているか
- scheduler が pod を node に assign したらそれを etcd に書き込む
- kubelet がそれをみて「変更が必要なpod」を見つけてそれに合わせて container を起動したりする
https://github.com/kubernetes/kubelet は api 定義しかなくて今回読みたい実装とは違った
entrypoint
SyncPod を読む
@bells17
遅れました
kubeletについては以前調べたので
あたりを参考にできるかもしれないです
// SyncPod syncs the running pod into the desired pod by executing following steps:
//
// 1. Compute sandbox and container changes.
// 2. Kill pod sandbox if necessary.
// 3. Kill any containers that should not be running.
// 4. Create sandbox if necessary.
// 5. Create ephemeral containers.
// 6. Create init containers.
// 7. Create normal containers.
podActions
という struct を最初にとってくる
// podActions keeps information what to do for a pod.
type podActions struct {
// Stop all running (regular, init and ephemeral) containers and the sandbox for the pod.
KillPod bool
// Whether need to create a new sandbox. If needed to kill pod and create
// a new pod sandbox, all init containers need to be purged (i.e., removed).
CreateSandbox bool
// The id of existing sandbox. It is used for starting containers in ContainersToStart.
SandboxID string
// The attempt number of creating sandboxes for the pod.
Attempt uint32
// The next init container to start.
NextInitContainerToStart *v1.Container
// ContainersToStart keeps a list of indexes for the containers to start,
// where the index is the index of the specific container in the pod spec (
// pod.Spec.Containers.
ContainersToStart []int
// ContainersToKill keeps a map of containers that need to be killed, note that
// the key is the container ID of the container, while
// the value contains necessary information to kill a container.
ContainersToKill map[kubecontainer.ContainerID]containerToKillInfo
// EphemeralContainersToStart is a list of indexes for the ephemeral containers to start,
// where the index is the index of the specific container in pod.Spec.EphemeralContainers.
EphemeralContainersToStart []int
}
start (helper 関数)
ここで CRI を通じて container を作っている
RunPodSandbox
が dockershim だったりほかの CRI だったりする
dockershim の RunPodSandbox 実装
RunPodSandbox
が呼ばれるはず
imageservice と runtimeservice があるが前者が image の管理をやっていて後者がそれ以外全部をやる
kubeletが起動するまでの大まかな流れは
でも話してますRunPodSandbox は runtimeService の interface のものと、CRI のものの2つがあってややこしいがよく見ると dockershim がみている
感想/反省 @potsbo
- 強い人がいてくれたのでサクサク読めた
- 人数を絞った結果ちょっとさみしくなってしまったかもしれない?
- zenn の更新が必要なやり方はちょっとやっぱり面倒だけど検索されることを優先したい...
- 次回 gist にしてみるのはありかも?
感想
- 今日は遅刻しなかった :muscle:
- ケータイから参加していたのでコードが読みにくかった
- 多少知見を活かせてよかった気がする
感想・反省 by @bells17
- syncPodは一番闇だと思います
- カレンダーに予定を登録するのを忘れない
- 誰か一緒にdocker createのオプション研究しましょう
感想
- kubelet に詳しい人がいっぱいいて助かった
- 同じような type とか func が多くて読みづらい
- 定期的に手動 reload するのを頭に入れておけば zenn.dev でも問題なかった
感想、反省
- 読んだことない部分だったので勉強になりました
- 1時間くらいで気軽にできるのは良い(一人で読んでいると無限に時間かかる…)
- もう少し知ってる範囲だと会話に参加できるかな、予習した方が良いかも
次回予告
3/17 nginx-ingress!!
(その次は contour かな?)
この zenn の url が https://github.com/wantedly/kubernetes-code-reading-party に張られていると嬉しいという感想を得た
「このイベントを忘れない」という良い方法を確立したい、calendar 配るだけでいい説はある