はじめに
コンテナグループの安藤 @chataro0です。
5月から隔週で有志とコンテナ/Kubernetes/Goなどに興味がある人々が集まっての社内勉強会を始めていて、
昨日6/5には第2回が開催されました。
同じくコンテナグループの松崎がソースコードリーディングを始めていて、
第1回ではそこで得られた知見を共有してくれました。
第1回のざっくりまとめ
- 膨大なソースコードをどこから読み始めるのがいいか?
- 適当に読み始めるといろんな処理に飛ぶことになって遭難する(した)
- マツザキ的にはcontrollerがオススメ
- どこに着目して読むと良いか?
- コメントに仕様や設計思想が書かれていることがある
- データの構造体を見てみると、k8sのAPIオブジェクトと対応したものがある!
- 可能ならメインルーチンの概要を把握する
- 読む上でのオススメのツール
sourcegraph
で関数などの定義にジャンプOctotree
でファイル一覧をツリー表示- 最終的にはcloneしてきてgrepする。。
- 実際にコードを読んでみたときのあれこれ
- kube-scheduler
- kube-controller-manager
などを紹介してくれました。
第2回のまとめ
第2回も同じく松崎からカスタムコントローラを作ろうとしている過程で得られた知見を共有してくれました。
スライドはAppendix含め140ページと正にDeep Diveの様相を呈してきました😅
client goでCLIツールを作ろう
- Operatorパターンが流行っているので作ってみたい
- いきなりControllerは辛い
- まずは簡単なCLIツールを作ってみよう
というモチベーションでclient-goを使って
Node一覧を表示するような簡単なツールを作ってみたら60行程度で作れたので、
その処理の流れやコード解説をしてくれました。
他のリソースも簡単に取得できるみたいなので、自分もやってみたいと思います。
kube-budilerでCustomController入門
CLIツールは作れたのでいよいよコントローラをやってみよう、ということで
現在CustomControllerを作成するフレームワークはいくつかありますが、
比較的日本語の文献が多いkube-builderを使ってみました。
なんと数コマンドでコントローラが作成できてしまったのですが、
抽象化されすぎていてどういう原理で動いているのかが理解できないということに…
リファレンス実装で学ぶInformer Framework
ここで
多少覚えるのに時間がかかってもちゃんと、 client-goを使った実装を覚えたほうがいいのでは?
と思い立ち、client-goに乗り換えて再入門。
そこでclient-goライブラリに実装されているInformer Fremeworkを通じて、
APIの変更イベントがControllerに処理される流れを解説し、
具体的にコードとしてどう実装されているかを掘り下げていきました。
Kubernetes標準のリソース(PodやDeploymentなど)を管理する標準のControllerも、細かい点で違いはあるものの、
概ね似たような仕組みで処理されているということで
- k8sのイベント情報の流通の仕組みがわかった
というのが最大の収穫だったということです。
聞いた感想
自分はPythonのAWSライブラリ(boto3)を多少触った程度でGo言語は入門したばかりなので
コードを読んでみても詳細な処理の内容が掴めなかったり、参照先を辿っていくうちに迷子になったりしてしまうことが多いですが、
コードや処理を理解していく一連の流れを見せてもらったことで、
今後読んでいく上でも大枠の筋道が掴め(た気になれ)ました!
今後は短めのLTなども織り交ぜて色々な人が話してナレッジを共有していければいいなと考えていますので、
また開催されたら紹介していきたいと思います。