未解決
1 Rookie
•
67 メッセージ
0
112
コンテナ事始め(7) Kubernetesのワークロード管理を理解する
前回の投稿「コンテナ事始め(6) PowerScaleをOpenShiftのPersistent Volumeに利用する」はこちらから。
こんにちは。デル・テクノロジーズでクラウド、コンテナ関連を担当している平原です。今回は当社がKubernetes (以下K8s) 関連で提供するストレージ機能に絡んで前提となる、Kubernetesの知識をおさらいしておきたいと思います。これはKubernetesおよびOpenShift共通の話となります。
K8s上のワークロードはどのように管理するの?
K8sにアプリケーションをデプロイする時、アプリケーション特性に応じたワークロード管理APIを適切に使用することで効率的な運用が可能になります。ここでは代表的なワークロード管理APIを紹介します。
Pod
K8sにおけるワークロード管理の最小単位はPodと呼ばれるものになります。Podには最低一つのコンテナを含んでいます。例えば、下記のyamlファイルはhttpdコンテナをPodとして展開するための定義がされています。
このyamlファイルを実行してみるとOpenShift環境ではこのように見えます。基本的かつ一番シンプルなアプリケーション形態です。
ReplicaSet
では、httpdのようなアプリケーションで処理を増やすために、横にスケールさせたい時はどうしたら良いでしょうか?独立した複数のPodを水平展開する?それだと管理が煩雑になりますね。そんな時にはReplicaSetというワークロード管理APIを使用します。yamlファイル中に記述される ”replicas” の値によって複数のPodを効率的に管理できます。このyamlファイルでは最初に2つのPodを同時にデプロイしてくれます。
OpenShift環境ではこのように見えます。Pod名の枝番にあたる部分はユニークな値が割り当てられます。
ReplicaSetではPod数を増減することも可能です。このようにPod数を変更するとユニークな値が割り当てられたPodが生成されることが確認できます。またPod障害が起きた場合にもセルフヒーリングにより、設定したreplica数を維持するようにPodが生成されます。このようにニーズに応じて柔軟にリソース調整できるのがReplicaSetの特徴です。
Deployment
ReplicaSetはPodの数を柔軟に変更できるのですが、アプリケーションのアップグレード時はPodは一度破棄、再生成となりダウンタイムが生じます。このReplicaSetの機能を包含しながら、ローリングアップデート、ロールバック機能を持ったものがDeploymentと呼ばれる管理APIです。
このyamlファイルでは最初に3つのPodを同時にデプロイし、下部の記述にアップデート戦略としてローリングアップデートを設定しています。
OpenShift環境ではこのように見えます。ReplicaSet同様、Pod名の枝番にあたる部分はユニークな値が割り当てられます。
ローリングアップデートを実行すると、このように前バージョンの破棄と新バージョンの生成により新旧Podが入れ替わります。
メカニズムとしてはDeployment内部に2つのReplicaSetを作成し、このReplicaSet間で移行を行っていきます。アップデート後にコマンド一発で前バージョンにロールバックも可能です。
Deploymentは一般的にはステートレスアプリケーションの管理に向いているので、共有ストレージに置かれているウェブコンテンツを配信するような仕組みなどに使われます。
StatefulSet
最近のコンテナアプリケーションではデータ永続性や整合性を重視するものも増えてきており、前述のDeploymentのように起動順序やアップデートがどのPodが開始されるのか分からないと不都合を生じるものもあります。そのような場合にはStatefulSetと呼ばれる管理APIを使用します。
OpenShift環境ではこのように見えます。Deploymentとは異なり、StatefulSet名に枝番が割り当てられたPod名が0→1→2の順に作成されます。StatefulSet破棄時のPodの終了やローリングアップデートは逆に2→1→0の順に実行されます。なお、アップデートの際もこのPod名は維持されます。
StatefulSetが向いているアプリケーションとしては、Source (Primary)-Replica構成やActive-Standby構成のデータベース、起動順序を考慮しないといけないアプリケーション、ヘッドレスサービス (Pod名を内部DNSに登録し、DNSラウンドロビンで負荷分散を提供するサービス) を使用するアプリケーションなどがあります。
今回はKubernetes上のワークロード管理する手法について説明しましたが、一般的なアプリケーションであれば、この中のDeploymentとStatefulSetが良く使われるでしょう。次回はDeploymentとStatefulSetにおける障害時のふるまいについて説明します。