【Docker/Kubernetes 実践コンテナ開発入門】を読んだ

今年は業務でKubernetesをがっつり扱っていくことになると思うので、先に概要だけでも掴みたく、いくつかKubernetes関連の書籍を読んでいくことにした。

今回は【Docker/Kubernetes 実践コンテナ開発入門】を読んだ。Dockerの基礎からKubernetesの入門部分までざっくり概要を掴むことができた。その中で気になった部分をメモとして残しておく。Docker Swarmは多分使わないだろうから、そこについては読み飛ばすことにした。

目次

  • 1.Dockerの基礎
    • 1.1 Dockerとは
    • 1.2 Dockerを利用する意義
    • 1.3 ローカルDocker環境を構築する
  • 2.Dockerコンテナのデプロイ
    • 2.1 コンテナでアプリケーションを実行する
    • 2.2 Dockerイメージの操作
    • 2.3 Dockerコンテナの操作
    • 2.4 運用管理向けコマンド
    • 2.5 Docker Composeでマルチコンテナを実行する
    • 2.6 Composeによる複数コンテナの実行
  • 3.実用的なコンテナの構築とデプロイ
    • 3.1 アプリケーションとコンテナの粒度
    • 3.2 コンテナのポータビリティ
    • 3.3 Dockerフレンドリなアプリケーション
    • 3.4 永続化データをどう扱うか
    • 3.5 コンテナ配置戦略
  • 4.Swarmによる実践的なアプリケーション構築
    • 4.1 Webアプリケーションの構成
    • 4.2 MySQL Serviceの構築
    • 4.3 API Serviceの構築
    • 4.4 Nginxの構築
    • 4.5 Webの構築
    • 4.6 コンテナオーケストレーションによる開発スタイル
  • 5.Kubernetes入門
  • 6.Kubernetesのデプロイ・クラスタ構築
    • 6.1 Google Kubernetes Engineのセットアップ
    • 6.2 GKE上にTODOアプリケーションを構築する
    • 6.3 Master Slave構成のMySQLをGKE上に構築する
    • 6.4 TODO APIをGKE上に構築する
    • 6.5 TODO WebアプリケーションをGKE上に構築する
    • 6.6 IngressでWebアプリケーションをインターネットに公開する
    • 6.7 オンプレミス環境でのKubernetesクラスタの構築
    • 6.8 kubesprayでKubernetesクラスタを構築する
  • 7.Kubernetesの発展的な利用
    • 7.1 Kubernetesの様々なリソース
    • 7.2 ユーザー管理とRole-Based Access Control (RBAC)
    • 7.3 Helm
    • 7.4 Kubernetesにおけるデプロイ戦略
  • 8.コンテナの運用
    • 8.1 ロギングの運用
    • 8.2 Dockerホストやデーモンの運用
    • 8.3 障害対策
  • 9.より軽量なDockerイメージを作る
    • 9.1 なぜ軽量なイメージを作るべきなのか
    • 9.2 軽量なベースイメージ
    • 9.3 軽量なDockerイメージをつくる
    • 9.4 multi-stage builds
  • 10.Dockerの様々な活用方法
    • 10.1 チーム開発で開発環境を統一・共有する
    • 10.2 コマンドラインツール(CLI)をDockerコンテナで利用する
    • 10.3 負荷テスト
  • Appendix-A セキュリティ
  • Appendix-B Dockerでの開発を支援するツール・サービス
  • Appendix-C 主要コマンドまとめ

1コンテナに1つの関心事

これを読むまでは自分の中でコンテナはある種1つのプロセスのようなもの、つまり1コンテナ=1プロセスと考えていたが、 それだと無理があるケースも存在する。

例えば、定期ジョブを実行するようなアプリケーションがあるとして、スケジューラーとアプリケーションが一体型となっていれば、 1つのコンテナで実現できそう(1コンテナ=1プロセス)だが、cronを使うなど外部にスケジューラを持つ場合、 1コンテナ=1プロセスを実現しようとすると、コンテナ間の通信を行う必要があり、そのためにAPIを準備したり等色々あるため、構成が複雑になってしまう。

この場合1コンテナ=1プロセスより、無理せず1つのコンテナで複数プロセスを実行する方がシンプルに完結するケースも多い。

Webアプリケーションのスタックにおいては、リバースプロキシ、アプリケーション、データストアがそれぞれ独立して役割を果たし、全体を構成することが多いと思うので、この粒度でのコンテナ化は違和感なさそう。

Docker化しやすいアプリケーションの特徴

Dockerフレンドリなアプリケーションはコンテナ化の恩恵を最大限に受けられる。

そのためには、ポータビリティの高いアプリケーションの構築が必要となっており、 再利用性や柔軟性を持たせ、それによって動作を制御できるようにしておくことが重要。

Dockerコンテナとして実行されるアプリケーションの挙動を制御するには以下のような手法が考えられる。

  • 実行時引数として値を渡す
  • 設定ファイルとして値を渡す
  • アプリケーションの挙動を環境変数で制御
  • 設定ファイルに環境変数を埋め込む

データの永続化手法としてのData Volumeコンテナ

Data Volume自体の仕組みよく使っていたが、それをコンテナとして扱う手法は今回初めて知った。

Data Volumeコンテナによって、Data Volume(コンテナ⇄ホスト間でのディレクトリ共有)への操作がカプセル化され、ホストをあまり意識せずにData Volumeを使用できるメリットがあるようだ。

Kubernetesの各種リソース・コンポーネント

  • クラスタ

    • Kubernetesの様々なリソースを管理する集合体
  • Node

    • クラスタの管理下に登録されているDockerホスト。コンテナをデプロイするために利用される
    • クラスタはMaster Node、Node群によって構成される
  • Namespace

  • Pod

    • コンテナの集合体
    • 少なくとも1つのコンテナを持つ
  • ReplicaSet

    • 同じ仕様のPodを複数生成・管理するためのリソース
  • Deployment

    • アプリケーションデプロイの基本単位となるリソース
    • ReplicaSetを管理・操作するためのリソース
  • Service

    • Podの集合に対する経路やサービスディスカバリを提供するためのリソース
      • サービスディスカバリ
        • クライアントから一貫した名前でアクセスできるようにする仕組み
  • Ingress

    • ServiceをHTTP/HTTPSベースでクラスタ外に公開できるようにするためのリソース
  • Job

    • 1つ以上のPodを作成し、指定された数のPodが正常に完了するまでを管理するリソース
    • Webアプリケーションなどの常駐型のアプリケーションではなく、大規模な計算やバッチ処理などに使われる
  • Secret

  • DaemonSet

    • クラスタで管理されている全てのNodeに対して必ず1つ配置されるPodを管理するためのリソース
    • ログ収集用のエージェントなどを配置したいときに使われる

デプロイについて

RollingUpdate

古いバージョンのアプリケーションを実行した状態で新しいアプリケーションを起動し、準備が完了したものから徐々にサービスインしていく仕組み。

BlueGreen Deployment

新旧2つのバージョンのサーバ群(ここではコンテナ)を一気に切り替えてデプロイする手法。ロールバックも容易。

感想

Kubernetesの概要や、各リソース・コンポーネント、またはそれらの役割について、全てではないがある程度ざっくり押さえることができたと思う。 この本はKubernetes以外にも、Dockerの基礎やDocker Swarm、Dockerのセキュリティや開発を支援するツールなどにも触れていて、結構ボリュームがある内容だった。

他にもいくつか書籍を当たってみたあと、実際に手を動かして慣れていきたい。