mkurokiのメモ

mkurokiのインフラとか仕事とか色々なメモ書きです。ここで書いている主張等は所属する会社とは関係がありません

Kubernetes完全ガイド(第2版)を読んだので感想とか

はじめに

こんにちは、mkurokiです。 タイトルの通りですが、Kubernetes完全ガイド(第2版)を読んだので、勉強になったポイントや参考になったポイント、感想などを章ごとにまとめて書いてみたいと思います。

最初にこれだけは書いておきますが、めっちゃいい本でした!

第1章 Dockerの復習と「Hello, Kubernetes

Dockerの基本が復習という形で書いてある。Dockerの仕組みやビルドの方法、各種ベースイメージの違いなども解説されている。基本を忘れてしまったら読み返したい。

第2章 なぜKubernetesが必要なのか?

k8sの概要として歴史と特徴が書かれている。 k8sを使うと何ができるのか:コードでの管理、オートスケーリング、スケジューリング、リソース管理、ロードバランシング、データの管理 etc… k8sに対応した連携システム・ミドルウェアの紹介も。

第3章 Kubernetes環境の選択肢

どのようなプラットフォームでk8sを利用する選択肢があるのか:

  • ローカルk8s:Minikube等。手元のマシン上で気軽に試せる
  • k8s構築ツール:kubeadm等。ツールを利用して任意の環境に構築
  • マネージドk8sサービス:GKE,EKS等。パブリッククラウド上で提供される

ローカルk8sは本番環境には適さない。

また、少なくともステージングとプロダクションでは同じ環境で揃えられるようにしておくとよい。

その他、k8sのサービスレベル目標(SLO)が満たせるクラスタの上限構成や、ブラウザ上で手軽に試せる k8s プレイグラウンドの紹介も。

第4章 APIリソースと kubectl

k8sの基礎、リソースとAPIリファレンス、kubectlの使い方など。

createではなくapplyを使う理由、アノテーションとラベルの解説、ログやデバッグなども含めオペレーションの基礎が詰まっている。

第5章 Workloads APIs カテゴリ

クラスタ上にコンテナを起動させる各種リソース(Pod,ReplicaSet,DaemonSet等)の解説。ReplicaSetはDeployment経由で使うのを推奨。k8sを運用する上では基本となるリソースの使い分け方で、内容もなかなかボリューミィ。

なお、この章で妙に印象的だったのがPodのDNS設定(spec.dnsPolicy)。

PodのDNS問い合わせの挙動を定義するのだが、デフォルトだと設定値「ClusterFirst」となるのに対し、それとは別で「Default」という値も設定できる。

Defaultはデフォルトの値ではないので注意が必要(ぐるぐる目)というなんとも不思議な設定値……。

第6章 Service APIsカテゴリ

ServiceリソースはPodのサービスディスカバリやL4バランシングを提供している:ClusterIPやLoadBalancer等。

似ているがIngressはL7を提供するサービス:クラスタ外のGCLB等を使う物と、クラスタ内にデプロイするNginx Ingressがある。

第7章 Config & Storage APIsカテゴリ

環境変数を利用した設定、機密情報を読み込むためのSecretリソース、key-valueで設定情報を保存しておくConfigMapリソースなど各種の利用方法。

PersistentVolumeClaimを使った永続化ボリュームの要求方法と、ディスクの拡張・subPathなどの紹介も。

第8章 Cluster APIsカテゴリとMetadata APIsカテゴリ

短い章で、ほぼ両カテゴリの概要の紹介とNodeリソース、Namespaceリソースの紹介。他の項目については次章以降で後述するということが書かれている。

第9章 リソース管理とオートスケーリング

Podの最低Requestsと上限Limitsを適切に設定すること、それによるQoS Classの適用、LimitRangeとResourceQuotaによる制限。

オートスケーリングの方法としてクラスタ自体のCluster AutoscalerとPodのHorizontal/Vertical Autoscalerの選択肢が紹介されている。

第10章 ヘルスチェックとコンテナのライフサイクル

Liveness Probe、Readiness Probe、Startup Probe の 3種類のヘルスチェックの種類と、それぞれに用意されているexec/httpGet/tcpSocketのヘルスチェック手法。

コンテナ起動時と終了時のスクリプト実行、initContainers、終了処理のタイミングなど。

第11章 メンテナンスとノードの停止

ノードを停止するためスケジューリング対象から除外するkubectl cordonコマンド、ノード上で実行中のPodを排出するdrain処理、PodDisruptionBudgetによる制御などの紹介。

Podを気軽に再起動できるようにしておくとメンテナンスの省力化に繋がる。

第12章 高度で柔軟なスケジューリング

Podの配置先Nodeを決定するために柔軟なスケジューリングが可能。

特定のノード上だけで/除外して実行する、特定のPodがいる/いないドメイン上で実行する、など。

実践的には、Nodeに付与したラベルとの組み合わせで、GPU使用とか本番環境とかの指定ができそう。

故障中ラベルを付けるとかも、かなり実際の運用で使われそうな内容で、なるほどーとなった。

第13章 セキュリティ

正直この章はふんわりとした理解……必要になったらまた読み返したい。 UserAccount と ServiceAccount の違い、RBAC、ClusterRole と ClusterRoleBinding、ネットワークに制限をかける手法、kubesecによるSecretリソースの暗号化の手法など。

第14章 マニフェストの汎用化を行うオープンソースソフトウェア

システムが大規模化したときの管理を助けてくれる代表的なツール、HelmとKustomizeの紹介。

Helmはk8sのパッケージマネージャ。chartとしてパッケージのinstall情報を管理してくれる。

Kustomizeはテンプレートから環境別にフィールドを上書きして、productionやstaging環境ごとにレプリカ数やCPU/memoryなどのリソースを変更するといったことが実現できる。

Ksonnetは今は開発が停止しているので使わないほうが良さそう。

第15章 モニタリング

DatadogとPrometheusの使い分け。

Datadogはノード上でDaemonsetで起動(もしくはサイドカー)、アラーティングも。余談だけどダッシュボードかっこいいなこれ。

Prometheusではマシンを用意すれば課金要素なし、Pull型なのでExporter経由でデータ取得したり。可視化はGrafana経由で。

第16章 コンテナログの集約

アプリケーションのログは基本的には標準(エラー)出力に出すべき、安定保存にはFluentdがおすすめ。転送先は各クラウドのマネージドサービス利用など。Fluent Bit もある。

もしくはDatadog Logs、Grafana Loki なども。集約して利便性を高めることが大事。

第17章 Kubernetes環境でのCI/CD

実運用では手動でのkubectl実行は可能な限り避けるべきで、そのためにGitOps、自動CI/CDの仕組みが必要。

  • CIツール:TektonやKaniko等、チェックにはKubeval、Conftest、Open Policy Agent/Gatekeeper
  • CDツール:ArgoCD:KustomizeやHelmのマニフェストも扱えるため完成度が高い

開発環境を整えるツールとしてTelepresense、Skaffoldなど。

このへんの、Kubernetes周辺のエコシステムはほんとに進化が早そうなところ。各システムの公式ドキュメント要チェック。

改めて手動オペレーションの排除は大事……。

第18章 マイクロサービスアーキテクチャとサービスメッシュ

k8sはマイクロサービスアーキテクチャと相性が良い。そのモニタリングのためにサービスメッシュがある。

代表的なプロダクトIstioではPodにサイドカーとしてEnvoyプロキシを埋め込み、トラフィックコントロール、通信の暗号化などが可能に。

第19章 Kubernetesアーキテクチャを知る

k8sを構成するetcd,kube-apiserverなどの説明。独自のリソースを追加して拡張もできるようになっている。

本の内容から逸れて余談(僕の見解)だが、このあたりはkubernetes the hard wayをやるとわりかし理解が深まるような気がする。

t.co

第20章 Kubernetesとこれから

CNCFによる開発と標準化、k8s上に展開するXaaSやKnativeなど周辺のエコシステム、動作確認のためのtestbedなどの紹介。

付録・あとがき

最後に、逆引き的にめちゃめちゃ便利な付録のFAQと、あとがき。

あとがきも短いながら沁みる内容となっていた。内容は是非キミの目で確かめてほしい(

まとめ

というわけでめっっっちゃ時間かかってしまった(2ヶ月ちょいかかった)けど読了!しかしこれで終わりではなく、触りながらまた読み返して理解を深めることになるだろうなぁ。

しかし流石はというかKubernetes完全ガイド、完全にガイドしていくぞという気概のようなものを読んでいて感じます。看板に偽りなし感。Kubernetesの入り口として、とてもよいものだと思いました。

なお、この記事は Twitter に書き溜めておいた章ごとのメモをまとめただけというものなのでたいへん楽でした。 読むのに時間がかかりそうな本は、少しずつでも読んで得た内容を記録しておくと思い出しやすくて良いかもしれません。