宮水の日記

宮水の日記

主に書評や資格取得について記事を書いています。

入門 Kubernetes を読みました

f:id:kattyan53:20210525204403p:plain

入門 Kubernetesを読みました。

なぜ読んだのか

最近kubernetesの設定ファイルを触ることがあったんですが、コピペして雰囲気でやってしまったので、ちゃんと入門することにしました。全部読んで完全に理解するというよりは、読みながら仕事のコードでよく使う設定ファイルを読んでみようと思います。

対象読者

  • Kubernetes入門したい人
  • (ロードバランサやネットワークストレージの理解があるとより良い)
  • LinuxLinuxコンテナ、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 PiKubernetesを動かす方法が紹介されています。

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章 サービスディスカバリ

サービスディスカバリ

何かを見つけるという問題と、その解決策のこと。(?)
サービスディスカバリツールは、どのプロセスがどのアドレスでどのサービスのために待ち受けているのかを見つける際に起きる問題を解決する。(うーん、難しい。)

Serviceオブジェクト

クラスタ内外に対してサービスを公開するための方法。サービス間を接続したり、サービスをクラスタ外に公開したりできる。

8章 ReplicaSet

ReplicaSet

指定したテンプレートに従った正しい数のPodが常に動いているようにする、クラスタ全体のPodマネージャ。冗長化のためにレプリカを複数作り、サービスを作る方法。

水平スケール

レプリカを追加で作成すること。

垂直スケール

ある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の歴史も補っていこうと思います。

ここまでお読みいただきありがとうございました!