ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

「入門Kubernetes」を読んだ

はじめに

読んだ。

入門 Kubernetes

入門 Kubernetes

最近ようやくKubernetesを触ってみている。次の職場で使うのでキャッチアップ中。まだまだGCPで軽く動かしてみた程度だから、これからより応用的なことや、実際に中で動いている技術、実際に本番想定でアプリケーションを動かしてみることをしていきたい、という状況。

この本は最初の1冊にちょうどいい。まさに入門。コンセプトからはじまり、基本的な動作をチュートリアル的にやりつつ、Kubernetesで存在する概念が順に説明されている。

なおマニフェストファイルのAPIのバージョンが書籍のものと違っていて都度修正が必要なケースがあった。forkして修正している。

github.com

動かしたGKE上でのkubernetesのバージョンは1.8.8-gke.0

とりあえず概念が多いのでその整理を本書の掲載順に振り返っておく。

1章 Kubernetes入門

Kubernetesの特徴、およびコンセプト

  • Immutability
  • Declarative Configuration
  • Online self-healing system

2章 コンテナの作成と起動

Dockerコンテナの復習なのでskip

3章 Kubernetesクラスタのデプロイ

この本でも勧めている通り、クラウドベースのソリューションがオススメだと思う。僕はGKEを使いました。1年間で300ドルまで無料なので。

ちなみに本2冊分作ったり消したりして一月700円分だったので、無料枠なくても出してもいいかなーって感じのコストです。

この章は各Kubernetesソリューションの導入の紹介と、Kubernetesを構成するコンポーネントが記載されている。

  • Kubernetes proxy ... Kubernetesクラスタ内のロードバランスされたServiceにネットワークトラフィックをルーティングする役割。各ノードで動いている
  • Kubernetes DNS ... クラスタ内で定義されているServiceのネーミングとディスカバリを行うためのDNSサーバ。
  • KubernetesのUI ... GUI

4章 よく使うkubectlコマンド

コマンドの前に、コマンドで使われる概念。

  • Namespace ... クラスタ内のオブジェクトを構造化するNamespace(そのまんま)デフォルトはdefaultというnamespace。
  • Context ... $HOME/.kube/configにあるkubectlの設定ファイルに保存される。クラスタの接続情報と認証情報。

他よく使うkubectlコマンド

  • get ... 情報取得
  • delete ... オブジェクトの削除
  • apply ... -fでファイル内容の適用
  • logs ... podのログ
  • exec ... podでのコマンド実行
  • cp ... ファイルをpodへのコピー(逆も可)
  • help ... ヘルプ

5章 Pod

Kubernetesの扱う最小のリソース単位で、アプリケーションコンテナとストレージボリュームを含む。

Podに何をいれるべきか

同一Pod内のコンテナは

  • 同じIPアドレスとポート(ネットワークネームスペース)を使用
  • 同じホスト名(UTSネームスペース)を持つ
  • System V IPCやPOSIXメッセージキューを経由したネイティブなプロセス間通信チャネル(IPCネームスペース)を使って通信できる
  • 同じ共生関係を持つこと

各コンテナが別のノードに配備されて正常に動作しないなら、1つのPodにまとめるべき。

Podのヘルスチェック

  • Liveness probe ... 正常かどうか(再起動するべきか)を確認する方法
  • Readiness probe ... 要求を処理できるかを確認する方法(Ready + ness)

6章 LabelとAnnotation

  • Label ... オブジェクトのメタデータを特定するもの。オブジェクトを識別してグループ化する。
  • Annotation ... ツールやライブラリを手助けするためのもの。オブジェkとがどこから来たのか、どのように使うのか、どのようなポリシーなのかといった追加情報を提供する。

どちらも似ているが、用途が違うみたい。

セレクタとして他から呼ぶときに使うようなものはLabelで、追加情報がAnnotationといった役割分担みたいですね。

7章 サービスディスカバリ

Serviceオブジェクトでサービスディスカバリを実現する。

ここがわかりづらい。Serviceはservice名を元に、kubernetesクラスタ上で一意のホスト名と、ServiceのIPアドレスを持つ。これによって外部からAPIを通じてpod群にアクセスするための入り口となる。Endpointはpod個別にIPアドレスを持たせるための、Serviceと関連づいたオブジェクト。

という理解であってるかな?

8章 ReplicaSet

Podのレプリカを管理するためのオブジェクト。レプリカ数をマニフェストに宣言的に設定する。podのヘルスチェックを用いて自己回復させる。

kubectl scaleコマンドで命令的にレプリカ数をスケールさせることができるが、(おそらく)バージョン管理システムで管理されているであろうマニフェストファイルの数値と実態が異なることになるので注意すること。(ファイルを修正して、kubectl applyでスケールさせるほうがよい)

水平スケーリングができる。CPU使用率やメモリ使用率を用いて、最小/最大pod数を宣言することで実現できる。

9章 DaemonSet

各ノードに1つずつ割り当てるための、podの集合を定義するオブジェクト。ReplicaSetと似ているが、ReplicaSetは冗長化のため。

ログコレクタや監視エージェントなど、それぞれのノードで動く必要があるものに使う。

10章 Job

短時間だけ動くタスクを扱うオブジェクト。バッチ処理や、データベースマイグレーションなど。

並列実行数や、リトライの数など、ワークロードを制御できる。

11章 ConfigMapとSecret

設定情報を保存しておくオブジェクト、Secretはそれを機密管理するもの。

keyをファイル名、中身をvalueとして、ファイルシステムとしてpodにマウントすることもできるし、環境変数としてpodに渡すこともできる。

12章 Deployment

新しいバージョンのリリースを管理する仕組みを提供するオブジェクト。

DeploymentはReplicaSetを管理する。

Deploymentマニフェストファイルを更新し、applyすることでアップデートする。ダウンタイムを出さないような、ローリングアップデートができるのが最大の利点のようだ。

ただし、ここで重要なのは、ローリングアップデートを行うためには、一時的に新旧のpodが共存してしまう。そのため、どちらのバージョンとも連携できるようにアプリケーションを構築することが必要。クラウドネイティブアプリケーションの要件の1つと言えるでしょう。

アップデートのスピードもコントロールできる。

13章 ストレージソリューションとKubernetesの統合

最後が1番難しい。

永続的なストレージとの連携

これまでのオブジェクトはほぼすべてステートレスが前提だった。しかし、たいていのアプリケーションがステートレスであり、ボリュームがその代表だろう。

  • PersistentVolume ... Podあるいはコンテナとは独立した寿命を持つストレージ。
  • PersistentVolumeClaim ... PersisitentVokumeを指定するオブジェクト。

StatefulSet

ReplicaSetに似た、複製されたPodのグループ。各レプリカには、一意なインデックスを含む永続的なホスト名がつけられる。

データベースクラスタで使えるだろう。

個人的にはやっぱり現状だとクラウドが提供するマネージドなDBと接続し、DB自体の信頼性はKiubernetesの外(クラウド)に任せるのが現状は一番良い気がした。

14章 実用的なアプリケーションのデプロイ

Parse、ghost、redisを使った実用例。

まとめ

図にしてみよう。

gitlab.com

この図は継続的に更新していきたい。なんでも図にしよう。

おわりに

次はKubernetes By Exampleを動かしてみる予定。

kubernetesbyexample.com

以下はどちらかというとKubernetesだけでなく、コンテナ・オーケストレーションツール全般取り扱ったもの。

コンテナ・ベース・オーケストレーション Docker/Kubernetesで作るクラウド時代のシステム基盤

コンテナ・ベース・オーケストレーション Docker/Kubernetesで作るクラウド時代のシステム基盤

blog.chaspy.me