初めての Kubernetes も5回目となりました。前回が5月14日・・・え!?そんな前なの!これは反省ですね・・・
いよいよ Deployment です。Deploymentは、今まで学習した Pod、ReplicaSets を宣言的更新を提供するコントローラー※1です。
※1 公式サイトで Deployment は、”A Deployment controller”と記載されていたので、ここではコントローラーと記載します。
Deployment 機能
Pod、ReplicaSets を宣言的更新を提供するコントローラー。と言われても、これだけだと抽象的過ぎて良く分かりません。日々のお仕事を少しイメージしながら考えてみます。
お仕事のあれこれ
- セキュリティ対策や新機能を利用するために Nginx、Apache をバージョンアップしたい
- 開発したアプリケーションをバージョンアップしたい
- トラフィックが増えたので負荷分散したい
- アプリケーションをバージョンアップしたが、すぐに解決できない問題があったのでロールバックしたい
こんな感じのタスクはよくある話だと思います。
では、上記のタスクをKubernetes 環境下では主に Deployment で実現できます(Service リソースも必要になりますが、これは次回で)。では、このタスクを実現する Deployment の機能はどんなのがあるのでしょうかね。
機能
- Updating a Deployment
- Rolling Back a Deployment
- Scaling a Deployment
たくさんあります。かつ重要なので Deployment は何回に分けます。今回は次の項目について紹介します。
- Deployment の仕組み
- Deployment をデプロイ
Deployment の仕組み
初心者でも Kubernetes のうれしいことが分かる-ReplicaSetでは、ReplicaSet は Pod を管理するが、所有はしないと説明しましたが、Deployment も同様に ReplicaSet を管理します。所有はしません。ということは、Deployment と ReplicaSet の関連付けは、ReplicaSet と Pod の関連付けと同様に Label セレクタで定義します。
Deployment ReplicaSet Pod の関係
Deployment と ReplicaSet と Pod の関係をイメージ図にすると下のような感じになります。

Deployment をデプロイ
nginx の Docker イメージ
nginx(エンジンエックス)の Docker イメージを使用して Deployment のマニフェストファイルを作成します。nginx はオープンソース Webサーバです。
nginx とは
Nginx (pronounced “engine-x”) is an open source reverse proxy server for HTTP, HTTPS, SMTP, POP3, and IMAP protocols, as well as a load balancer, HTTP cache, and a web server (origin server). The nginx project started with a strong focus on high concurrency, high performance and low memory usage. It is licensed under the 2-clause BSD-like license and it runs on Linux, BSD variants, Mac OS X, Solaris, AIX, HP-UX, as well as on other *nix flavors. It also has a proof of concept port for Microsoft Windows.
Nginx( “engine-x”と発音)は、HTTP、HTTPS、SMTP、POP3、およびIMAPプロトコル用のオープンソースリバースプロキシサーバー、およびロードバランサ、HTTPキャッシュ、およびWebサーバー(オリジンサーバー)です。 nginxプロジェクトは、高い並行性、高いパフォーマンス、そして低いメモリ使用量に重点を置いて始めました。 2条項のBSDライクなライセンスでライセンスされており、Linux、BSDの変種、Mac OS X、Solaris、AIX、HP-UX、その他の* nixフレーバーで動作します。 Microsoft Windows用の概念実証ポートもあります。
ASP.NET Core もホスト可能
この Kubernetes シリーズの他に、【初心者向け】はじめての ASP.NET Coreもちょこちょこ書いていますが、ASP.NET Core(Kestrel) のリバースプロキシサーバーとして Nginx を使用できます。
マニフェストファイル作成
では、マニフェストファイル(宣言的設定)を作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
apiVersion: apps/v1 kind: Deployment metadata: labels: run: nginx name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.16.0-alpine ports: - containerPort: 80 |
簡単に上の補足をします。
- .metadata.name で Deployment の名前を指定
- .spec.replicas で レプリケートする Pod の数を指定
- .spec.selector.matchLabels で 管理する Pod のラベルを指定
- .spec.template.metadata.labels で Pod のラベルを指定
nginx の Docker イメージは軽量の alpine を使用します。
デプロイ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# Deployment をデプロイします # k8s_nginx_deployment.yaml は先ほど作成したマニフェストファイルです kubectl apply -f k8s_nginx_deployment.yaml # Deployment を取得します kubectl get deployment -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR nginx-deployment 1/3 3 1 13s nginx nginx:1.16.0-alpine app=nginx # [READY] を見ると 1/3 なので、まだデプロイ中です kubectl get deployment -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR nginx-deployment 3/3 3 3 18m nginx nginx:1.16.0-alpine app=nginx # ReplicaSet を見てみます kubectl get rs --show-labels NAME DESIRED CURRENT READY AGE LABELS nginx-deployment-79458bd5c9 3 3 3 36m app=nginx,pod-template-hash=79458bd5c9 # [DESIRED] には マニフェストファイルで指定(.spec.replicas)した 3 と表示しています # Pod を見てみます kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-deployment-79458bd5c9-d82xv 1/1 Running 0 35m app=nginx,pod-template-hash=79458bd5c9 nginx-deployment-79458bd5c9-jv5gd 1/1 Running 0 35m app=nginx,pod-template-hash=79458bd5c9 nginx-deployment-79458bd5c9-vflpp 1/1 Running 0 35m app=nginx,pod-template-hash=79458bd5c9 |
pod-template-hash
ReplicaSet と Pod の取得時に –show-labels オプションを付けてラベルを表示しています。この「pod-template-hash」ラベルは、Development コントローラーによって作成された ReplicaSet に追加されます。また、このラベルにより Deployment が管理する ReplicaSet が重複しないことを保証します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# ReplicaSet の詳細を見ます kubectl describe rs/nginx-deployment-79458bd5c9 Name: nginx-deployment-79458bd5c9 Namespace: default Selector: app=nginx,pod-template-hash=79458bd5c9 Labels: app=nginx pod-template-hash=79458bd5c9 Annotations: deployment.kubernetes.io/desired-replicas: 3 deployment.kubernetes.io/max-replicas: 4 deployment.kubernetes.io/revision: 1 Controlled By: Deployment/nginx-deployment Replicas: 3 current / 3 desired Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed Pod Template: Labels: app=nginx pod-template-hash=79458bd5c9 Containers: nginx: Image: nginx:1.16.0-alpine Port: 80/TCP Host Port: 0/TCP Environment: <none> Mounts: <none> Volumes: <none> Events: <none> |
Selector と Labels に pod-template-hash=79458bd5c9 に追加されています。Controlled By には、この ReplicaSet を管理する Deployment の情報があります。また、時間があれば Pod も見てみてください。
まとめ
Deployment の仕組みでは、Deployment ReplicaSet Pod の関係について、Deployment をデプロイでは、ラベルに注目して紹介しました。次回は、うれいい機能の Updating a Deployment にいきたいところですが、個人的には Service オブジェクトを作成してローカルから nginx にアクセス可能(NodePort を指定)な状態で進めたいので、次回は Service の基本(Service も奥深いので基本だけ)を紹介してから 再度 Deployment に戻りたいと思います。
おすすめ書籍
僕は「入門 Kubernetes」⇒「Kubernetes完全ガイド」(現在進行形)という進み方をしていますが、より本番環境を想定した方法を学べます。特にWeb 系だと、https で使用する Ingress リソースなどもしっかり説明してくれています。「入門 Kubernetes」には、詳しい説明がなかったので個人的にはすごく助かっています。