k8s source code readingの#0〜2に参加させて頂きました。
k8s source code reading #0 ツイートまとめ
「日本からのコントリビュータがもっと増えるように」という目的で開催されたとのことです。
Kubernetesに強い方々が参加される中、KubernetesでちょっとPodを動かした、Goは触ったこと無いというレベルの俺が参加してみました。
簡単に感想を言うと最高です。
普段触ってるだけでは得られない知識をもらえるし、わからないところは教えてもらえるし。
今後も可能な限り参加したいと思います。
進め方としては「テーマを決めて、テーマごとにグループを作ってコードリーディング」という形式です。
#0 はAPIサーバ
#1, 2 はkubectlをテーマにしてみました。
k8s source code reading #0
API Server関連のコードを読んでみました。
なんとなく「KubernetesはすべてAPIサーバ経由で操作を行う」みたいなことを聞いたことがあったので「じゃあAPIサーバから見てみようかな」くらいの軽い気持ちで選びました。
どのように読んだらよいかわからず、1行1行調べながら読み進めましたが、結局「CobraというCLIを作れるツールを使っている」程度にしかわかりませんでした。
goをまとも触ったことがないので1行読むにもすごい時間が掛かってしまいます。
発表の前にグループ単位で共通の画面を見ながらコードを読む形式に変わりました。
ここでの説明は正直理解できていなかったですが、「コード全体をざっくり読んで、全体の動きを掴む」ということを学びました。
1行1行じゃ結局先に何があるのか見えないまま、読んでも理解が進まないと思いました。
k8s source code reading #1
今回は一番使うことが多い「kubectl」を選択しました。
発音も「キューブコントロール」と完璧です。
「kubectl」って何て発音するのかな?
— 𝔎𝔞𝔧𝔦@魔人ママチャリライダー (@Anorlondo448) January 29, 2019
「クベコントロール」って言ってたけど「くべしーてぃーえる」って言ってる人もいたし・・・
明日発生しないといけないので何て言ったら良いのか
前回の学びの通り「まずざっくり全体を読む」をやってみました。
入り口のコードはここです
ざっくり読んでわかったことは、
- Cobraでコマンドを生成
- オプションの形を統一している
- Goのflagパッケージを追加
- ログの初期化
- コマンド実行
こんな感じです。
細かいところはあとで読みます。
まずは全体を理解するのが大事。
一番時間を使ったのは
pflag.CommandLine.SetNormalizeFunc(utilflag.WordSepNormalizeFunc)
というところでオプションの形を変更しているところでした。
"_"のところを"-"にする、みたいな。
でも何で変更しているのか?
それはそのうちわかるかもしれないから飛ばします。
他にざらっと読んで気になったのはalpha.goというやつでした。
「何だこれ、囲碁のやつか?」と思いながら読んでみたところ、 デフォルトでは有効になっていないalpha機能
を登録するコードのようでした。
そこで過去にどのようなalpha機能があったのか、commit履歴を見てみると、
History for pkg/kubectl/cmd/alpha.go - kubernetes/kubernetes · GitHub
diff
という機能しかありませんでした。しかもmerge済み。
これからalpha機能ができたらここの履歴が増えていくのかもしれません。
k8s source code reading #2
前回に引き続き「kubectl」を読みました。
気になる単語として「flag」と「profile」があり、一体何してんだ?というところを深くおっていました。
結果として「flag」はKubernetesじゃなくてgoの話でした。
flag - The Go Programming Language
簡単に言うとコマンドラインを作るときのオプションを実装するパッケージでした。
サンプルコードを書いてみて挙動を確認!(完全に理解した)
やはり手を動かすと理解が早いですね。
次に「profile」を調べていましたが時間切れでした。
公式ドキュメントには、
Name of profile to capture. One of (none|cpu|heap|goroutine|threadcreate|block|mutex)
とあるのでコマンド実行時のCPU使用率とか見れるのかな?程度の理解でした。
発表の際にこの旨を伝えるとやはりコマンド実行時のプロファイル情報が取れるとのことでした。
(こういう基礎的なことも教えてもらえるの最高では?)
またPR情報も教えて頂きました!
https://github.com/kubernetes/kubernetes/pull/68681
(これがすぐ出てくるって凄いのでは・・・)
あとで以下のようなコマンドを打ってみると、
% kubectl get nodes --profile=block -v6
おお、APIの実行時間とか取れる!!
I0222 23:39:13.587949 1396 loader.go:359] Config loaded from file /Users/AnorLondo/.kube/config I0222 23:39:13.590525 1396 loader.go:359] Config loaded from file /Users/AnorLondo/.kube/config I0222 23:39:13.656553 1396 round_trippers.go:438] GET https://localhost:6443/api?timeout=32s 200 OK in 61 milliseconds I0222 23:39:13.661790 1396 round_trippers.go:438] GET https://localhost:6443/apis?timeout=32s 200 OK in 3 milliseconds I0222 23:39:13.678093 1396 round_trippers.go:438] GET https://localhost:6443/apis/apps/v1?timeout=32s 200 OK in 12 milliseconds I0222 23:39:13.680703 1396 round_trippers.go:438] GET https://localhost:6443/apis/batch/v1beta1?timeout=32s 200 OK in 15 milliseconds I0222 23:39:13.709121 1396 round_trippers.go:438] GET https://localhost:6443/apis/authentication.k8s.io/v1?timeout=32s 200 OK in 40 milliseconds I0222 23:39:13.709204 1396 round_trippers.go:438] GET https://localhost:6443/apis/apps/v1beta1?timeout=32s 200 OK in 42 milliseconds I0222 23:39:13.709236 1396 round_trippers.go:438] GET https://localhost:6443/api/v1?timeout=32s 200 OK in 43 milliseconds I0222 23:39:13.709265 1396 round_trippers.go:438] GET https://localhost:6443/apis/apiregistration.k8s.io/v1beta1?timeout=32s 200 OK in 42 milliseconds I0222 23:39:13.709291 1396 round_trippers.go:438] GET https://localhost:6443/apis/apiregistration.k8s.io/v1?timeout=32s 200 OK in 43 milliseconds I0222 23:39:13.709321 1396 round_trippers.go:438] GET https://localhost:6443/apis/storage.k8s.io/v1beta1?timeout=32s 200 OK in 41 milliseconds I0222 23:39:13.709340 1396 round_trippers.go:438] GET https://localhost:6443/apis/extensions/v1beta1?timeout=32s 200 OK in 41 milliseconds I0222 23:39:13.709346 1396 round_trippers.go:438] GET https://localhost:6443/apis/authentication.k8s.io/v1beta1?timeout=32s 200 OK in 39 milliseconds I0222 23:39:13.709364 1396 round_trippers.go:438] GET https://localhost:6443/apis/networking.k8s.io/v1?timeout=32s 200 OK in 42 milliseconds I0222 23:39:13.709382 1396 round_trippers.go:438] GET https://localhost:6443/apis/rbac.authorization.k8s.io/v1?timeout=32s 200 OK in 39 milliseconds I0222 23:39:13.709381 1396 round_trippers.go:438] GET https://localhost:6443/apis/rbac.authorization.k8s.io/v1beta1?timeout=32s 200 OK in 40 milliseconds I0222 23:39:13.709400 1396 round_trippers.go:438] GET https://localhost:6443/apis/autoscaling/v1?timeout=32s 200 OK in 39 milliseconds I0222 23:39:13.709386 1396 round_trippers.go:438] GET https://localhost:6443/apis/admissionregistration.k8s.io/v1beta1?timeout=32s 200 OK in 41 milliseconds I0222 23:39:13.709415 1396 round_trippers.go:438] GET https://localhost:6443/apis/apiextensions.k8s.io/v1beta1?timeout=32s 200 OK in 40 milliseconds I0222 23:39:13.709414 1396 round_trippers.go:438] GET https://localhost:6443/apis/storage.k8s.io/v1?timeout=32s 200 OK in 40 milliseconds I0222 23:39:13.709430 1396 round_trippers.go:438] GET https://localhost:6443/apis/batch/v1?timeout=32s 200 OK in 38 milliseconds I0222 23:39:13.709435 1396 round_trippers.go:438] GET https://localhost:6443/apis/events.k8s.io/v1beta1?timeout=32s 200 OK in 41 milliseconds I0222 23:39:13.709430 1396 round_trippers.go:438] GET https://localhost:6443/apis/apps/v1beta2?timeout=32s 200 OK in 43 milliseconds I0222 23:39:13.709452 1396 round_trippers.go:438] GET https://localhost:6443/apis/authorization.k8s.io/v1?timeout=32s 200 OK in 38 milliseconds I0222 23:39:13.709458 1396 round_trippers.go:438] GET https://localhost:6443/apis/certificates.k8s.io/v1beta1?timeout=32s 200 OK in 43 milliseconds I0222 23:39:13.709458 1396 round_trippers.go:438] GET https://localhost:6443/apis/policy/v1beta1?timeout=32s 200 OK in 42 milliseconds I0222 23:39:13.728220 1396 round_trippers.go:438] GET https://localhost:6443/apis/autoscaling/v2beta1?timeout=32s 200 OK in 57 milliseconds I0222 23:39:13.728337 1396 round_trippers.go:438] GET https://localhost:6443/apis/authorization.k8s.io/v1beta1?timeout=32s 200 OK in 57 milliseconds I0222 23:39:13.728729 1396 round_trippers.go:438] GET https://localhost:6443/apis/compose.docker.com/v1beta2?timeout=32s 200 OK in 58 milliseconds I0222 23:39:13.739549 1396 round_trippers.go:438] GET https://localhost:6443/apis/compose.docker.com/v1beta1?timeout=32s 200 OK in 74 milliseconds I0222 23:39:13.773700 1396 loader.go:359] Config loaded from file /Users/AnorLondo/.kube/config I0222 23:39:13.782674 1396 loader.go:359] Config loaded from file /Users/AnorLondo/.kube/config I0222 23:39:13.795729 1396 round_trippers.go:438] GET https://localhost:6443/api/v1/nodes?limit=500 200 OK in 9 milliseconds I0222 23:39:13.797695 1396 get.go:563] no kind is registered for the type v1beta1.Table in scheme "k8s.io/kubernetes/pkg/api/legacyscheme/scheme.go:29" NAME STATUS ROLES AGE VERSION docker-for-desktop Ready master 2d v1.10.11
なるほど、これはいつか使うことになりそう。
挙動がわかったので、次回もう一度profile周りを読んでみよう。
まとめ
Kubernetesはアプリからインフラまでいろんなことを学べる良い題材だと思います。
まだインフラ初めて2年の若輩者ですが、Kubernetesを通じていろんなことを学んでいきたいと思います。