kubernetesのデプロイメントでポッドをレプリカする!
はじめに
くーばねてすをやっつけるために新たなステージに上がるためについにdockerさんに会いに行くことにした。dockerさんと仲良くなることでコンテナシステムの仕組みの理解とくーばねてすを倒すための調査をする。今回はkubernetesのデプロイメントのマニフェストの作成とマニフェストからデプロイメントの作成を勉強する。
概要
■デプロイメントの役割を確認する
■デプロイメントのマニフェストを作成する
をまとめた!(^^)!
■デプロイメントの役割を確認する
デプロイメントの役割は簡単にいうとおもにポッドの稼働数を管理する。
これはロードバランサーがリクエストを処理できるよう処理負荷がたかいときはサーバーの台数を増やして対応したり、障害で一つのサーバーが使えなくなっても処理できるようにするために可用性を提供したりするのと同じように、デプロイメントはポッドのコントロールの役割を担う。
またアプリケーションのバージョンアップの際は自動的にポッドをバージョンしてくれたりする。
ローリングアップデートやロールバックといったデプロイ管理を行う。
デプロイメントは単独で動作さず、「レプリカセット」と連携することでポッド数をコントロールする。
レプリカセットはマニフェストの「replicas」の値を受け取りポッドの数をコントロールする。
レプリカセットによるポッドのコントロールの特徴は
・水平スケールをする
・異常終了したら再スタートする
・要求を待ち続けて終了しない
などがある。
■デプロイメントのマニフェストを作成する
今回もマニフェストファイルをできるだけ簡単に設定できるように大枠をワンライナーで作る。
デプロイメントの作成はコマンドではkubectl create deploymentを使用する。
kubectl createコマンドで指定できるオプションはkubectl runコマンドと比べると少ないので、オプションの指定もファイルを編集する必要がある。
ここではレプリカセットの数は設定できないので、簡単な大枠だけ作成する。
ここではポッドのnginxコンテナが3つレプリカするように設定してみたい。
大枠の設定をweb-deploy.yamlファイルに書き出す。
$ kubectl create deployment web-deploy --image=nginx --dry-run=client -o yaml > web-deploy.yaml
web-deploy.yaml↓
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: web-deploy
name: web-deploy
spec:
replicas: 1
selector:
matchLabels:
app: web-deploy
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: web-deploy
spec:
containers:
- image: nginx
name: nginx
resources: {}
status: {}
マニフェストファイルの必須項目のapiVersion, kind, metadata, specのほかに
デプロイメントの設定項目を確認する。
|デプロイメント設定項目|意味|
| --- | --- | --- |
|replicas|templatで設定したポッドを起動する数を設定する。デプロイメントはこの数を維持する|
|selector|デプロイメント制御下のレプリカセットとポッドを関連付けるラベルの設定をする|
|template|デプロイメントが起動するポッドの設定を記述する|
|strategy|Podを置き換える際の戦略を指定する|
matchLabels
指定したLabelと全て一致したものが対象になる。
strategy
strategyには Recreate と RollingUpdate がある。 デフォルトは RollingUpdate だ。
strategy をRecreateにした際は、全てのPodを削除してから新しいPod Templateを元にPodを作成する。
strategy をRollingUpdateにした際は、Podの数を指定した個数ずつ増減させてアップデートしていく。ポッドが停止しないようにアップデートをする。
デプロイメントの制御下のレプリカセットを関連付けるために
デプロイメントのメタデータのラベル(app: web-deploy)とテンプレートのメタデータラベル(app: web-deploy)が一致しないとapply時にエラーになってしまうので確認する。
「replicas: 3」に変更してデプロイメントマニフェストを適用する。
$ kubectl apply -f web-deploy.yaml
deployment.apps/web-deploy created
デプロイメントの確認をする。
$ kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
web-deploy 3/3 3 3 65s
レプリカセットの確認をする。
$ kubectl get rs
NAME DESIRED CURRENT READY AGE
web-deploy-d586595dc 3 3 3 2m2s
ポッドの確認をする。
$ kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-deploy-d586595dc-cffd4 1/1 Running 0 3m21s 10.244.0.12 kind-control-plane <none> <none>
web-deploy-d586595dc-gwwpl 1/1 Running 0 3m21s 10.244.0.14 kind-control-plane <none> <none>
web-deploy-d586595dc-zq57g 1/1 Running 0 3m21s 10.244.0.13 kind-control-plane <none> <none>
3つにちゃんとレプリカされている。
レプリカ数を変更する。
マニフェストファイルをvimで編集してレプリカ数5つに変更して
$ kubectl apply -f web-deploy.yaml
で変更を実行すると
$ kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
web-deploy 5/5 5 5 16m
$ kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-deploy-d586595dc-bjhzk 1/1 Running 0 19s 10.244.0.15 kind-control-plane <none> <none>
web-deploy-d586595dc-cffd4 1/1 Running 0 16m 10.244.0.12 kind-control-plane <none> <none>
web-deploy-d586595dc-fdtr9 1/1 Running 0 19s 10.244.0.16 kind-control-plane <none> <none>
web-deploy-d586595dc-gwwpl 1/1 Running 0 16m 10.244.0.14 kind-control-plane <none> <none>
web-deploy-d586595dc-zq57g 1/1 Running 0 16m 10.244.0.13 kind-control-plane <none> <none>
$ kubectl get rs
NAME DESIRED CURRENT READY AGE
web-deploy-d586595dc 5 5 5 16m
5つに変更できた!(^^)!
kubectl scale --replicas ...
でレプリカを変更することもできる。
スケールを実行する場合はCPUやメモリが資源不足にならないように残量を確認する。
まとめ
マニフェストファイルかくの大変だからちゃんと勉強しようと思った。
Discussion