最初に
この記事は、下記の書籍を読んだ上で自分の理解を整理するためにまとめたものです。
マルチホストでDockerを動かそう
- 単一ホストでサービスやってると、そのホストが落ちたらアウト
- マルチホストにして可用性と拡張性をあげる
- マルチホスト環境でコンテナ群のクラスタリングを行うためのツールを、コンテナオーケストレーションツールと呼ぶ
- Docker Machineは、クラウド/オンプレでマルチホスト環境を作成できるコマンドラインツール
- kubernetesは、クラウド環境でのDockerオーケストレーションツール
- Dockerコンテナの運用は難易度が高いため、パブリッククラウドが提供するマネージドサービスを利用するのが吉
- ECS, AKS, GKEがそれにあたる
GCPでのk8s活用について
- GKEを利用する上で必要なサービスは下記の通り
Google Container Build
- Docker Imageを作成するためのコマンドツール
- Imageを作るためのソースリポジトリは色々選べる
Google Kubernetes Engine
- Dockerコンテナを管理するフルマネージドサービス
- k8sを利用しているので、kubectlコマンドなどで操作可能
Google Container Registry
- Docker ImageをGCPのプロジェクト内で管理できるプライベートなレジストリサービス
- GCP版 DockerHubみたいなやつ
- イメージのアーカイブをCloud Storage Nearlineバケットに保存できる
Kubernetesの概要
- 複数のホストを束ねてDockerを利用するためのオーケストレーションツール
- コンテナ管理がめっちゃ楽になる
アプリケーションの構成管理
Pod
- 複数のコンテナをまとめたもの
- アプリケーションデプロイの単位
- 適切にスケールできるように、役割の異なるものは別ポッドにすること
- Podは必ず同じノード上にデプロイされる
ReplicaSet
- Kubernetesクラスタ上であらかじめ指定された数のPodを作成/起動しておくこと
- 何か問題が起きても、ここで指定した個数分Podが立ち上がるように動き続ける
Deployment
- ReplicaSetの履歴を管理するもの
- 定義されたレプリカの数を維持する役目を負うのがReplicaSet
- ReplicaSetの作成や更新を定義するのがDeployment
Service
- K8sのネットワークを管理する機能
- Podに対して、外部からアクセスするときに必要。
- Load Balancerは、Serviceに対応するIPアドレス+ポート番号にアクセスすると、複数のPodに対するレイヤー4レベルの負荷分散をする
- トランスポートレイヤー
- Borgとかと同じ話かな
- Cluster IP => クラスタ内のPod同士で通信するためのプライベートIPアドレス
- External IP => 外部のクライアントから接続するためのパブリックIPアドレス
K8sの構成要素
マスター
データストア etcd
クラスタ構成を保持するKVS
Node
- 実際にDockerコンテナを動作させるサーバ
- kubelet というエージェントが動いてる
- kubeletは、Podの定義ファイルに従ってDockerコンテナを実行したり、ストレージをマウントしたりする
- ノードのステータスを監視して、APIサーバーに通知する機能も持つ
manifestファイル
docker-compose.yml とか task definitionを思い出すなぁ。