前: Pod
Podはそれ自体によって自動復旧しません。 もしノードのリソース不足や何らかの障害などで、Podが停止や削除された場合、自動復旧は行われません。 またPodにはスケールアウトの機能はありません。 例えば、負荷分散のためにNginxが起動するPodを複数作成したい場合、 人の手でPodを複数作成する必要があります。
これでは実運用としては問題です。このような問題を解決するために、
複数のPodを作成・管理し、レプリケーションやスケールアウト、自動復旧といった機能を提供する
Pod Controllerと呼ばれるAPIリソース群がK8sには用意されています。
Podコントローラーには次のようなものがあります。 (全てWorkloads APIsのカテゴリに所属します。)
- ReplicaSet
- Deployment
- StatefulSet
- DaemonSet
この章では、ReplicaSetおよびDeploymentについて解説します。 (StatefulSetとDaemonSetは中級で扱います。)
ReplicaSetはPodのレプリカを作成し、指定した数のPodを維持し続けるAPIリソースです。
Podのテンプレートと作成する数量を定義します。
次のmanifestはReplicaSetのサンプルです。
このサンプルでは、Nginxが起動するPodを3つ起動し、その状態を維持し続けます。
障害などの何らかの理由でPodの数が指定した数とずれた場合、自動的に指定した状態に修正してくれます。
ReplicaSetを使用することで、Podの自動復旧が可能になります。
ただし、このReplicaSetを実際に作成することは多くありません。 次に説明するDeploymentを介して使用することが多いためです。
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend
labels:
app: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.22Deploymentは複数のReplicaSetを管理することで、 ローリングアップデートやロールバックなどの機能を実現するAPIリソースです。
DeploymentがReplicaSetを管理し、ReplicaSetがPodを管理するという3層構造になっています。
Deploymentは次のような動作をします。
- 新しいReplicaSetを作成する
- 新しいReplicaSetにPod(v2)を徐々に増やし、最終的にPodの数をReplica数にする
- 古いReplicaSetにあるPod(v1)を徐々に減らし、最終的にPodの数を0にする ※古いReplicaSetはロールバックのために削除されず、一定数保持されます。
Deploymentを使用すると、これらの動作をK8s側で自動的に行ってくれます。 これによりサービス無停止でのローリングアップデートが容易に実現可能になります。
K8sではもっとも推奨されているコンテナの起動方法です。 たとえ1つのコンテナを起動するだけであっても、自動復旧やローリングアップデートの機能を使用するため、Deploymentを使用することが多いです。
では実際にDeploymentを作成してみましょう。 次の操作を実施してください。
- 次のmanifestを使用して、Deployment:nginxを作成する。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.22-
Deployment、ReplicaSet、Podそれぞれのオブジェクト一覧を表示する。
-
作成したnginx-XXXXXXという名前の
Podを削除する。(Deploymentは消してはダメ!) -
Podのオブジェクト一覧を表示する。(さきほどとは違う名前のPodが作成されていることを確認してください)
-
manifestを修正し、Deploymentのreplicasを
2に修正し、修正を適用する。 -
Podのオブジェクト一覧を表示する。(Podの数が増えていることを確認してください)
-
(次章
Service-Clusterで作成したDeployment:nginxを使用します。次章を実施しない場合はDeployment:nginxを削除してください。)
次にコンテナのローリングアップデートをやってみましょう。 nginxのバージョンを1.22から1.23へアップデートします。
- 次のmanifestを使用して、Deployment:nginx-rollupを作成する。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-rollup
labels:
app: nginx-rollup
spec:
replicas: 2
selector:
matchLabels:
app: nginx-rollup
template:
metadata:
labels:
app: nginx-rollup
spec:
containers:
- name: nginx
image: nginx:1.22
lifecycle:
preStop:
exec:
command: ['sh', '-c', 'sleep 30']
initContainers:
- name: busybox
image: busybox:1.28
command: ['sh', '-c', 'sleep 30']-
Deployment、ReplicaSet、Podそれぞれのオブジェクト一覧を表示する。
-
Podのimageを表示し、
nginx:1.22であることを確認する。 -
manifestの
nginx:1.22をnginx:1.23へと修正し、修正を適用する。 -
Deployment、ReplicaSet、Podそれぞれのオブジェクト一覧を繰り返し表示する。(順番にPodが再作成されることを確認してください。)
-
Podのimageを表示し、
nginx:1.23であることを確認する。 -
Deployment:nginx-rollupを削除する。
以上で本チュートリアルは終了です。
具体的な操作およびその結果に関する回答例はこちらにあります。 具体的な操作方法がわからなかった場合や、想定した結果にならなかった場合などに参照してください。