入門 Kubernetesを読みました。
なぜ読んだのか
最近kubernetesの設定ファイルを触ることがあったんですが、コピペして雰囲気でやってしまったので、ちゃんと入門することにしました。全部読んで完全に理解するというよりは、読みながら仕事のコードでよく使う設定ファイルを読んでみようと思います。
対象読者
- Kubernetes入門したい人
- (ロードバランサやネットワークストレージの理解があるとより良い)
- (Linux、Linuxコンテナ、Dockerの経験があるとより良い)
この本で学べること
- Kubernetesクラスタオーケストレータについて
- 分散アプリケーションの開発、デリバリ、メンテナンスを改善するためにKubernetesのツールおよびAPIがどのように役立つのか
1章 Kubernetes入門
この章では、Kubernetesの利点について学びます。
Kubernetesとは
Kubernetesは、コンテナ化されたアプリケーションをデプロイするための、設定や管理を自動化・自律化するためのシステムのこと。
Kubernetesの利点① 開発速度を上げてくれる
理由① イミュータブルなインフラだから
Kubernetesは、イミュータブルなインフラです。一度システム上で成果物を作成したら、ユーザによる更新があってもその成果物は変更されません。既存のシステムを更新する代わりに、全く新しいイメージに置き換えます。既存のイメージを変更せずに新しいイメージを構築すると、古いイメージを残しておけるので、ロールバックが簡単になります。
理由② 宣言的設定のオブジェクトだから
またKubernetesは、宣言的設定のオブジェクトでもあります。「Aを起動、Bを起動、Cを起動してください」とお願いするのではなく、「レプリカ数は3に等しい」という設定を行います。そのため、間違えたときに元に戻すのが簡単です。
理由③ 自己回復するシステムだから
Kubernetesは、システムが望ましい状態に一致するように継続して動きます。例えばレプリカ数が3になるようにKubernetesに対して操作したとき、私がレプリカをもう一つ増やして4つにすると、Kubernetesは、数を3つに合わせるためにレプリカを一つ削除してくれます。
Kubernetesの利点② サービスもチームもスケールしやすい
Kubernetesでは、Pod、Service、Namespace、Ingress...など、分離されたマイクロサービスアーキテクチャの構築を簡単にする抽象化層やAPIを提供しています。色々分離されているので、サービスも開発もスケールしやすいということみたいです。
2章 コンテナの作成と起動
リポジトリcloneしてきて、Dockerfileもちゃんと書いて立ち上げようと思ったんですけど、結局動かせず...。デバックする気力はありませんでした...😇
この章では、アプリケーションのコンテナ構築について詳しく入門していきます。なぜDockerなのかというと、Kubernetes がサポートしている主要なイメージフォーマットの中で最も使われているのはDockerイメージフォーマットだからのようです。
アプリケーションコンテナ(Dokcerのこと)を使うと、アプリケーションを綺麗に抽象化できます。
(SREさんも「抽象化」という言葉を使っていたのですが、この「抽象化」ってどういう意味なんですかね...。アプリケーションの構成をファイルに落とし込むこと...? )
Dockerを使って、同じOS、同じバージョンのライブラリを使った環境についてビルドもデプロイも配布も簡単になることがわかりました。
3章 Kubernetesクラスタのデプロイ
この章では、先ほど作ったアプリケーションコンテナを、どのようにKubernetesをデプロイするのか、クラスタを作る簡単な方法を学びます。
Google Kubernetes Engine、Azure Container Service、Amazon Web Serviceへのインストール方法や、minikubeを使ったローカルへの Kubernetesのインストール、Raspberry Piで Kubernetesを動かす方法が紹介されています。
4章 よく使う kubectlコマンド
よく使うkubectlコマンドについて学びます。
Kubernetesオブジェクト
Kubernetes上にあるものは、すべてRESTfulリソースで表せ、これをKubernetesオブジェクトと呼ぶ。
kubectl get pods
Kubernetesオブジェクトをみる一番基本的なコマンド。動作中のPodのステータスを見ることができる。現在のNamespace内のそのリソースのすべてを一覧表示してくれる。
kubectl get <リソース名> <オブジェクト名> とかもみれる。
kubectl describe <リソース名> <オブジェクト名>
オブジェクトの詳細を人間に読めるフォーマットで複数行にわたって表示。
kubectl apply -f obj.yaml
obj.yamlに書かれたオブジェクトをKubernetes上に作成する。
kubectl delete -f obj.yaml
オブジェクトの削除。
kubectl label pods bar color=red
barという名前のPodにcolor=redというLabelをつける。
kubectl logs
デバッグ用コマンド。
kubectl exec -it --bash
コンテナ内でコマンドを実行したいときに使う。
kubectl help
ヘルプ。
5章 Pod
この章ではPodについて学びます。Podマニュフェストを書いて、Podを動かしたり、Podを一覧表示したり、Podにアクセスしたり、ちゃんと動いてるかチェックしたり、リソース管理をしたりします。
Podとは
Kubernetesクラスタ上では、コンテナではなくPodが最小のデプロイ単位。
「このコンテナはそれぞれ違うマシンに配置されても正常に動作するか」で答えが「動作しない」なら、Podとしてまとめて正解。
Podにアクセスする
Kubernetes APIとコマンドラインツールには、ポートフォワード機能が備えられており、以下のようなコマンドを実行すると、このコマンドが動いている間はPodにアクセスできる。
kubectl port-forward kuard 8080:8080
Kubernetesのマスタを経由して、ローカルマシンとワーカノードの内の1台で動いているPodのインスタンスの間にセキュアなトンネルを作ってくれる。
livenessProbe
Podが起動しているかどうかのヘルスチェック。
readinessProbe
Podが応答できるかどうかのヘルスチェック。
resources
Podのリソース管理の設定
volumes
永続的なディスクにアクセス可能にする仕組み。
6章 Labelと Annotation
Label
Kubernetesクラスタ上のオブジェクトを識別したり、グループ化したりするのに使う。
Annotation
Labelと似た機能。ツールやライブラリを便利に使用するために必要になる、オブジェクトを特定しない情報を入れられる。
7章 サービスディスカバリ
サービスディスカバリ
何かを見つけるという問題と、その解決策のこと。(?)
サービスディスカバリツールは、どのプロセスがどのアドレスでどのサービスのために待ち受けているのかを見つける際に起きる問題を解決する。(うーん、難しい。)
8章 ReplicaSet
水平スケール
レプリカを追加で作成すること。
垂直スケール
あるPodに必要なリソースを増やすこと。
9章 DaemonSet
DaemonSet
Kubernetesクラスタの全ノード、あるいは特定のノードの集合でPodを動かすための、手軽な抽象化の仕組み。
10章 Job
Jobオブジェクト
一回限りの、短時間だけ動かすタスクを扱うもの。
11章 ConfigMapと Secret
ConfigMapとSercret
アプリケーションで動的な設定を使うのに適した方法。これらの機能によって、コンテナイメージを一度作成したら、開発環境、ステージング環境、本番環境で全く同じイメージを使うことも可能。
kubectl get secrets
Namespace内の全Secretを一覧表示できる。
kuubectl get configmaps
Namespace内のConfigMapを一覧表示できる。
12章 Deployment
Deploymentオブジェクト
新しいバージョンのリリースを管理する仕組み。
DeploymentはReplicaSetを管理する。
kind: Deployment と書いてあったらDeploymentの設定ファイル。
kubectl describe deployments nginx
Deploymentの詳細情報を確認できる。
kubectl rollout history deployments nginx
ロールアウトした履歴が表示できる。
13章 ストレージソリューションとKubernetesの統合
まとめは割愛します\(^-^)/
14章 実用的なアプリケーションのデプロイ
まとめは割愛します\(^-^)/
まとめ
今回は、
- kubectlコマンドの使い方
- Podについて
- 仕事のコードで使われているKubernetes オブジェクト
を中心に本書を読みました。実際に(業務に支障のない範囲で)kubectlコマンドを打ってみたり、kubernetesの用語を確認しながらファイルを読んだりできてとても良かったです。個人的には、マニュフェストファイルにある kind: というところがKubernetesオブジェクトなんだ〜ということがわかっただけでも大きな収穫でした。Kubernetesの全体像に一歩近づくことができました。
しかしながら、自分は泥臭くサーバーを立てたり運用したことがないので、ピンと来ない説明も結構ありました。インフラのカタカナ用語が多くて意味が理解できない文章も結構ありました。これに関しては別の本で、インフラやkubernetesの歴史も補っていこうと思います。
ここまでお読みいただきありがとうございました!