Programming Kubernetesを読んで学んだこと
Programming Kubernetesの紹介
「Programming Kubernetes」はO’Reilly社から出版されているKuberntesのアーキテクチャやCustom Controllerの実装、Custom API Serverの実装などについて掘り下げている本です。
Kubernetesのハイレベルアーキテクチャに触れている本は、日本語でもいくつかありますが、ソースベースのローレベルアーキテクチャで触れている本は本書しかないのではないかと思います(私が知らないだけかもしれません)。
著者は元Red Hat → AWSのDeveloper AdvocateのMichael HausenblasさんとRed Hatのprincipal engineerのStefan Schimanskiさんです。
2019/07/21に購入し、2019/08/05に読み終わったので、感想をまとめたいと思います。
個人的な感想としては、控えめに言って最高です。
読み通したばかりですが、早速2週目に入ろうと思います。
Kubernetes拡張の前提
本書ではKubernetesの拡張機能に焦点が当てられています。
Kubernetesの拡張機能には主に次の2つの方法があります。
1のCRDは自分の独自Resouceを定義し、それをReconcileするControllerを実装する方法です。
2のAPI AggregationではKubernetesのAPI Aggregation Layerに自分で作成したCustom API Serverを登録することで、API Serverを拡張する方法です。
「Programming Kubernetes」は1と2をどちらも実装レベルで解説をしています。
私は勝手に1のCustom Controllerだけを対象にしているのかと勘違いしていました。
2のCustom API Serverを導入している企業事例などは聞いたことがなかったので(知っている人はぜひ教えてください)、人類にこの話題は早すぎるのでは、と一瞬思いましたが、API Serverの実装を通しで見ることで、API Serverのアーキテクチャに詳しくなることができました。
Programming Kubernetesを読むべきなのは誰?
- Kubernetesのアーキテクチャに詳しくなりたい人(特にControllerとAPI Server部分)
- Custom ControllerやOperatorの実装を読めるようになりたい人
- Custom ControllerやOperatorを自作できるようになりたい人
- API Serverの実装を読めるようになりたい人
- Custom API Serverを自作できるようになりたい人
- Kubernetesにコントリビュートしたい人
が対象になるかと思います。
Programming Kubernetesの章立て
- Introduction: Kubernetesがなぜ今のアーキテクチャを採用しているのか
- Kubernetes API Basics: API Objectの説明
- Basics of client-go: Informer, API Machinery, Schemeなどの説明
- Using Custom Resources: CRDと機能(Validation, SubResource)の説明
- Automating Code Generation: code-generatorの説明
- Solutions for Writing Operators: Controller実装方法の説明
- Shipping Controllers and Operators: Controller/Operatorのデリバリ
- Custom API Servers: Custom API Serverの説明と実装・デプロイ
- Advanced Custom Resources: convert, admission webhook, Structural Schemasなど
Programming Kubernetesを読んだ感想まとめ
「Programming Kubernetes」を読んだ全体の感想をまとめます。
一言でいうなら、「Programming Kubernetesを読むべきは誰?」に一つでも当てはまる人は読むべきだと思います。
Cutom Controllerの実装やCustom API Serverの実装などに興味がない人でも、
- なぜそのアーキテクチャを導入しているのか
- 複数のバージョンの整合性を合わせるために内部で何を行なっているのか
- Controller / API Serverがユーザに見えない裏側で何をしているのか
- Kubernetes自体の実装がどのようにされているのか
といったディープな内容が学べます。
自分自身、Kubernetes The-Hard WayやCKAの学習を通じて、Kubernetesのアーキテクチャについて詳しくなったつもりでいました。
しかし、実際に本を読んでみると知らないことだらけで、正直一度読んだだけでは理解できていないと感じることも多いです(特にローレベルな箇所)。
それでも通しで読んだことで、前述したディープな内容を、ある程度説明できるようになったと思います。
以下は、各章ごとの感想メモです。
1. Introduction
Introductionでありながらも非常に内容が濃いです。
抜粋ですが、次の内容が載っています。
- Event: Edge-driven-trigger vs Level-driven-trigger
- なぜControllerがReconcileを採用しているのか
- 悲観的ロックと楽観的ロック
よくKubernetesはImmutable Infrastructureを実現でき、Reconcileを行うことで理想の状態を現実に近づける、という説明は多くの方が聞いたことがあると思います。
しかし、なぜそうしたモデルやロジックを採用したのか、というアーキテクチャの背景に触れたものはほとんどありません。
そうした原点から説明してくれていたので、非常に好奇心をそそられました。
2. Kubernetes API Basics
API用語についてまとまっています。
Kind, Object, API Group, Version, ResourceなどREST APIとGoで必要な内容がまとまっています。
実例を用いてくれていますが、イメージがついていない箇所もあったので私は自分でも追加で調べました。
3. Basics of client-go
client-go, clientset, informer, deepcopy, apimachinery, workqueueなどの、Kubernetesの実装を見る上で避けて通れない要素を学びます。
この領域は本書以外にはドキュメントが全くない状態なので、この領域を調べる際は本書がバイブルになると思います。
(自分の読書メモを載せようと思っていましたが、とても量が多いので割愛)
よくCustom Controllerの登竜門としてSample Controllerが例として挙げられていますが、初見では全く意味が分からないでしょう。
本章を読んで初めて、コードの意味を読み取れるようになると思います。
また、KubebuilderやOperator SDKを使えば隠蔽されている領域ではありますが、この領域の内容を知らないと、オーパーツを動かしているかのように原理を知らないまま実装することになるのではないかと思っています。
4. Using Custom Resources
CRDについてまとまっています。
公式ドキュメントでも細かく触れられていますが、意外と機能が多いので、本章で頭の整理ができました。
次の内容が取り上げられています。
- CRD Type Definition
- Validation
- Sub Resource
- Dynamic Client, Typed Client
後半のDynamic Client, Typed Clientは1度目の読解では理解できませんでした
v1.15でbetaになったStructural Schema周りは9章で取り上げられています。
5. Automating Code Generation
code-generatorの内容がまとまっています。
code-generatorで使うタグの内容がまとまっています。
README含めて、ドキュメントがほとんどない領域だったので、こちらも本書がバイブルになると思います。
6. Solutions for Writing Operators
cnatというCustom ResourceのControllerを実装していきます。
- client-go + code-generator
- Kubebuilder v1
- Operator SDK
のそれぞれの方法で、実装方法が説明されています。
少し残念なのが、実装の詳細は、比較的 端的に書かれていることです。
これは本書がCustom Controllerだけでなく、それを取り巻く内容とCustom API Serverなどの幅広い内容を扱っているため、薄くならざるを得なかったのではないかと(個人的に)考えています。
やはりControllerを書くためには、自分で手を動かす必要があるのかな、というのが本章を読んだ感想です。
唐突な宣伝ですが、技術書典7で「実践入門 Kubernetesカスタムコントローラへの道」を出す予定です。
正直Custom Controllerを作りたい人は全員Programming Kubernetes読めばいいじゃんという気持ちもありますが、この本を読んでもやっぱりController自作は難しいなー、という気持ちから現在執筆中です。
当然Programming Kubernetesからもめちゃくちゃインスパイアを受けていますが、実践入門の名の通り、より簡易に入門できる本を目指しています(目指しているだけかもしれない)。
弊サークル「アルハンブラの畔」が技術書典7に当選しました
— バルゴ (@go_vargo) 2019年7月10日
Kubernetesのカスタムコントローラの入門書を書く予定です#技術書典 #技術書典7 pic.twitter.com/nW1Xt0F4bZ
7. Shipping Controllers and Operators
ControllerやOperatorをK8sクラスタにデリバリするための方法やツールがまとめられています。
Controllerを作って終わり、ではなく、その後のデリバリも考慮に入れているのが非常に素晴らしいです。
パッケージングやライフサイクルマネジメント、Production Readyなマニフェスト(RBACの考慮)などに焦点が当てられています。
よく、Controllerのバージョンアップはどうするんだ、といった意見をTwitterなどで見ることもありますが、そちらは第8章と第9章で書かれているConversion Webhookがその課題を解決する気がします。
8. Custom API Servers
API ServerとCustom API Serverについてまとまっています。
本書の中で一番難しかった気がします。
通常のマスターコンポーネントのAPI Serverについてもまとまっているため、どんな処理が内部で行われているかイメージがつきます。
A Pizza RestaurantというCustom API Serverを題材にCustom API Serverの実装とデプロイについても焦点を当てています。
API Server内のConversionとValidation, Admission(Defaulting)などの機能について詳細に書かれています。
知らないことが特に多かった章でした。
API ServerではConversionとValidation, Admissionがあり、CRDにも同じようにConversinやAdmissionの機能を、似た形で輸入しているらしいです(v1.15でbeta)
そのため第9章を読む前に、本章を読んで理解を深めることが推奨されています。
本章内でも触れられていますが、たとえCustom API Serverを使わないとしても読み通した方が良いです。
この領域の学び方についてもまとめられていたので、紹介します。
- KubernetesになんのAPIがあって、どのように実装されているか調べる
- 自分のCustom API Serverを作る
- Kubernetes内部の仕組みを学ぶ
- 将来、Kubernetesにコントリビュートする
9. Advanced Custom Resources
CRDの応用機能についてまとまっています。
第8章で触れていたConversionやAdmissionの、CRD版の機能について焦点が当たっています。
また、v1.15でbetaになったStructural Schemaについての説明もありました(簡単にいうとOpenAPI v3 shemeに則っているフォーマット)。
これと合わせて、DefaultingやPruningなどの機能がCRDで有効になります。
終わりに
以上が本書の感想です。
読書メモを見たら、非常に量が多くて驚きました(残念ながらここでは概要だけで詳細にはほとんど触れていません)。
読み通して学んだ・理解したことは多くあれど、それでもローレベルな箇所で理解ができていないところも多くあるので、今後も学んでいく所存です。
誰かと答え合わせしたいなー...