【Kubernetes】
クラウドインフラ上に、コンテナと Kubernetes を導入することにより、常に最適な環境設定を自動化
SLOを実現する際に、最適なリソース配置の自動化の仕組み化としてのコンテナオーケストレーション
Kubernetes
デプロイやスケーリングを自動化したり、コンテナ化されたアプリケーションを管理したりするための、 オープンソースのシステム
- コンテナオーケストレーションとは
- コンテナ:独立した箱を設けてアプリケーションその中で実行する仕組み
- オーケストレーション:デプロイ、スケーリング、管理 ...etc
- これまでマニュアル化されていた作業を自動化!!
- 理想状態を維持し続けるようにしてくれる!
- コンテナオーケストレーションの機能
- デプロイメント:どのように異なるバージョンのコンテナを入れ替えるか
- スケジューリング:どのマシン上で動かすのか
- オートスケーリング:コンテナ数やマシン数の増減
- ネットワーク:コンテナ間のロードバランスやコンテナ間の通信のサービスディスカバリ
- リソースマネジメント:使用可能なリソースを環境ごとにリミットやデフォルトを定義
- セキュリティ: ネットワークポリシー、リソースへの権限定義
kubectl
yamlやコマンドをAPIリクエストに変えてapi-serverにHTTPリクエストを送る
- (こちらは改めて学習します)
Kubernetes リソース概要
Pod
Kubernetes上のデプロイの最初単位
- 1つまたは複数のコンテナを持つ
- ネットワークやストレージを共有リソースとして持つ
- コンテナの実行方法に関する仕様を持つ
- 例) entrypoint, ENV, command, healthcheck ...etc
Pod単位でデプロイされる
- Podが使えなくなった場合には、他のノードにデプロイされることもある
- 1つのアプリケーションを複数のPodでデプロイする
- 特段の事情がない限り、複数のアプリケーションを1つのPodに入れない
- 本番運用の場合、個別のPodを直接操作してはならない
- ワークロードリソース(Deployment, StatefulSet, DaemonSet)を利用しよう
共有コンテキスト
- 同一Pod内のコンテナは同じストレージへアクセスが可能
- 例) mainのコンテナがストレージへログを書き込み、ヘルパーコンテナがそのログをログ収集基盤へ飛ばす
- 同一Pod内のコンテ案はIPアドレスとPortを含むネットワーク名前空間を共有
Kubernetes オブジェクト
Podの作成 = Kubernetesオブジェクトを作成
- クラスタの状態を表現する
- どんなコンテナアプリケーンが動いているか
- 利可能なリソースはどれだけか
- アプリケーションの振る舞いうに関するポリシー
Kubernetesオブジェクトのフィールド
- spec:理想状態
- Kubernetes オブジェクトの操作には Kubernetes API(kubectlやプログラム)が使われている
- 例) kubectl apply -f pod.yaml
- status:現実状態
- Kubernetesにより更新
コントロールプレーンは、 理想状態と現実状態が一致するように管理!!
Kubernetesオブジェクト作成
- オブジェクト作成時の必須フィールド
- apiVersion:どのバージョンのKubernetes API
- kind:どの種類のオブジェクトか(Pod, Deployment ...etc)
- metadata:オブジェクトを一意に特定するための情報(name, UID, namespace)
- spec:理想状態
Namespace
- 同一の物理クラスター上で複数の仮想クラスターの動作をサポート
- 仮想クラスター:実際には同じマシンの上で動いているかもしれないが、 仮想的に環境が分けられている状態
- 参考:公式ドキュメント
- 1つのクラスタを論理的に別けて使う
- 特定の目的別や、チームごと、環境ごとに切り分けることが考えられる
Namespaceを切り分けるメリット
設定忘れやミスの防止、リソースの制限、権限管理をする。
- Namespaceごとに制限を設定可能
- Podやコンテナのリソースの範囲設定(LimitRange)
- Podやコンテナにメモリ、 CPUやストレージの上限、下限を設定
- コンテナのデフォルトのメモリ、 CPUやストレージを設定
- Namespace全体の総リソース制限(Resource Quota)
- Namespace内のメモリ、 CPUの合計の上限
- Podなど、Objectの数の上限
- 権限管理
- 特定のNamespace内のリソースに限って権限を付与
- Podやコンテナのリソースの範囲設定(LimitRange)