血と汗となみだを流す

個人の思ったこと、やったことの吐き出し口です。

k8s source code readingに参加しました

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」を選択しました。
発音も「キューブコントロール」と完璧です。

前回の学びの通り「まずざっくり全体を読む」をやってみました。
入り口のコードはここです

ざっくり読んでわかったことは、

  • 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を通じていろんなことを学んでいきたいと思います。

プライバシーポリシー