Cloud Native 読書会第5回 NGINX Ingress Controller
Cloud Native 読書会
前回
毎月第3水曜日に少人数で集まり一緒に Cloud Native 技術のコードを読む会です。
Connpass と Wantedly で募集しています。
Role
- @south37 司会 -> 全体進行
- @bgpat 裏方 -> 参加できてない人のケアなど
Timetable
- Introduction 5 min
- 自己紹介 15 min
- 読書 60 min
- 反省会/次回予告 10 min
概要
コードを読むことがなんだかんだ一番コスパの良い技術の学習方法だと我々は考えています。もともとは Kubernetes 読書会として Kubernetes のコードを読む会をしていた事がありましたが、今回はそれの復活版で更に Kubernetes 以外のコードも読んでいいじゃないか、という会です。
かなりカジュアルに行っていた会で進め方も固まっているわけではありません。
皆さんのいろんな意見を聞きながら良い会にしていければなと思ってます。
(ちゃんとやるのが面倒になって中止してしまっていましたが結構評判が良かったので「続けること」を目標に再開しています。)
うまくいったら下の発表のような知見が得られることを期待しています。
前提
ハードルは低く行きます。「少人数だからこそ何でも聞いて良い」を前提にします。どんなに馬鹿に思える質問でもコードを追うことで理解するという解決策を取れば必ず良い学びになると思っています。
多分人の顔と名前も覚えてられないと思うので、「名前は覚えられていない」という前提を共有して進みましょう。
進め方
誰か一人の PC の画面共有をしながら議論をしながら何らかのテーマを解決していきます。全員が非公開 Podcast の出演者のような気持ちで積極的に発言してくれることを期待しています。
テーマはまだ決めていないので「そういえばここの挙動が気になる」というようなものがあると嬉しいです。
@south37
「Wantedly で Kubernetes を管理しているチーム(= Infrastructure Team)」に所属しています。少し前まで仕事では「gRPC の利用を社内に広げるプロジェクト」をやっていました。
@bgpat
Wantedly のエンジニアです
先月までインフラチームで Kubernetes を触ってましたが今はプロダクト開発チームに移りました
nginx-ingress は使ってるけどコードは読んだことないです!
@bells17
普段はKubernetesコントローラーやコンポーネントを書いたりしてます。
Lead Software Engineer, Site Reliability at Quipper
nginx-ingress は社内で一部使いはじめたぐらいです。
nginx 自体は結構派手に使っています。
@kameneko
さくらインターネットという会社でエバンジェリストしながらPrometheusとイチャついてます🙋
コードリーディング初めてですが、面白そうなので参加してみました🙋
@gosarami
toCなサービスを提供している会社でインフラエンジニアをしています。
今回は@bgpatさんに招待いただきました。
コードリーディング会にガッツリ参加するのは今回初なので、足を引っ張ってしまったら大変申し訳ないですが、何卒よろしくお願いいたします。
@yamagai
Wantedly のインフラチームでインターンをしています。
Kubernetes 好きです
- nginx.conf を作ってる箇所
- yaml を parse をしている箇所
tag: controller-v0.44.0
URL: https://github.com/kubernetes/ingress-nginx/tree/controller-v0.44.0
controller を呼び出しているところ?
ちなみに先程のcommandは
で、nginx controller自体がnginxを起動しているようですreconcile loop っぽい
ingress-nginxについて調べてる方がいる
↑で ingress の parse をしてそう
backend configの更新
でやってるリクエストを受ける側の処理は以下
これから読むところ configureDynamically
集めてきた設定を nginx に反映させる処理だと思っている
syncIngress
-> ings := n.store.ListIngresses()
-> hosts, servers, pcfg := n.getConfiguration(ings)
- pcfg .. ingress.Configuration
- err := n.configureDynamically(pcfg) で nginx に反映しているのでは(仮説)
- n.runningConfig = pcfg で struct を更新
仮説: n.configureDynamically
は最終的に lua script の挙動を変えているのでは?
cf. https://github.com/kubernetes/ingress-nginx/blob/master/rootfs/etc/nginx/lua/configuration.lua#L245-L248
https://github.com/kubernetes/ingress-nginx/blob/59922afae3331ee76e44dd93f26c6ea0b2309986/internal/ingress/controller/nginx.go#L959 で「lua script で実装されてる /configurations/backend
への POST」をしている。これで繋がった。
いろんなところで呼ばれている plugins.run()
の実装
nginx.tmpl読んでそうなところ
https://github.com/kubernetes/ingress-nginx/blob/c90d33c313103cd35bf8d176ca4d5773ec24da27/internal/ingress/controller/nginx.go#L151-L167 で template file の更新を watch & n.t への設定をしてそう。
template に変数適用している部分?
Executeしてるところ
onupdate
https://github.com/kubernetes/ingress-nginx/blob/59922afae3331ee76e44dd93f26c6ea0b2309986/internal/ingress/controller/nginx.go#L645-L710 で nginx.conf の書き換えと nginx の reload をしてそう
nginx-ingress は custom template を設定できる
config map を更新したときに reload している?
感想
- 自分で手を動かして追いかけながら話についていくのは無理だと早々に判断したので聞くに徹した
- (自分で動かせれば学びもより多いと思うが)他人のコードを読むときの思考を追えるのが楽しかった
- 自分はこれまで目的ありきでコードを読むことしかしてなかったが、今回のようにある種それ自体を目的にする場合、どういうところがモチベーションになるのか聞いてみたい(単に知的好奇心?)
感想
- 強い方に導いていただいてありがたかったです
- Luaで立ってるエンドポイントにPOST投げてるところはびっくり
- Configの整形を一部Shellでやってるのはなんでだろう
感想/反省
- 途中移動が挟まったのでコードを追えてない時間ができてしまった
- goは調整ループのために使われていて、コアはluaっぽいのが結構つらいなという印象です
感想/反省 @bgpat
- lua を読むことになるとは思わなかった
- config 反映を JSON の POST でやっているとは思わなかった
- なんとなくは理解したけどどこでリクエストを捌いているのか突き止められなかったのが残念
- いつもよりディスプレイが少なかったので大変だった
感想/反省
- Chrome のタブが多くなるといろいろ大変(変換が遅い、ページ開くのも遅い、etc.)
- 「仮説を元に読み進む」という事が今回は多くて、それがよかったのか心配
- Zenn と Chat で情報が分散したかもしれないのは反省
- Zenn の書き込みで拾いきれてないものがあったのは申し訳ないです
- Zenn は「reload が必要」というのが少し難しいポイント
- GitHub はある程度優秀なコードジャンプが使えるのはメリット
- ただ、メソッド名の重複には気をつける必要あり
感想
- 初めてコードリーディングしたけど、意外と読めるものだと感じた(「読めば読める」
-
nginx.conf
の書き換えしてるんだろうなぁと思っていたけど、luaが出てくるとは思わなかった - いきなりコードに入ってしまって、全体像を掴むのに時間がかかってしまったので、次は普段使っている箇所(マニフェストのspecなど)から着手したら掴みやすそう
- VSCodeにBookmark Extensionを入れたら、会話に出てきた箇所をブクマできて便利でした
自分はこれまで目的ありきでコードを読むことしかしてなかったが、今回のようにある種それ自体を目的にする場合、どういうところがモチベーションになるのか聞いてみたい(単に知的好奇心?)
普段使っていて「これどういう挙動なんだろうなー」って思う箇所はあったのですが、コードを見るモチベーションまでは達していなかったので、そのきっかけになるので良きです。
感想/反省
- 使っていたものの中身が大枠だけでもわかるのはやはりおもしろかった
- コードリーディングってこういう流れでやってたんだという気づきになった
- 今回は追うのに必死だったので一人でもいろいろコードを読んで精進します
次読むもの
ArgoCD になりました!
Thanks!