😺

kubernetesのデプロイメントでポッドをレプリカする!

2021/02/22に公開

はじめに

くーばねてすをやっつけるために新たなステージに上がるためについに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↓

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