Kubernetesでのデプロイ
Part 2ではアプリのコンテナ化を行った.
Part 3ではKubernetesにアプリをデプロイしてみる.
Get Started, Part 3: Deploying to Kubernetes
https://docs.docker.com/get-started/part3/
もくじ
- Prerequisites
- Introduction
- Describing Apps Using Kubernetes YAML
- Deploying and Checking Your Application
- Conclusion
Prerequisites
https://docs.docker.com/get-started/part3/#prerequisites
Introduction
https://docs.docker.com/get-started/part3/#introduction
前のパートではアプリのコンポーネントを単独のコンテナとして動作させていたが, ここからはそれらをコンテナオーケストレーター(Kubernetes)で管理する.Kubernetesはコンテナアプリのスケーリング, ネットワーク, セキュリティ, メンテナンスのための, コンテナ自体に最初から入っている機能よりも強力な様々なツールを提供する.
前のパートで作成したコンテナアプリがKubernetes上で動作することを検証するために, 今回は本番環境のKubernetesクラスタではなくDocker Desktopでセットアップした開発マシンのKubernetesを使用する.Docker Desktopで構築したKubernetes環境は本番環境のクラスタで動作するものと同じ機能を持ち, 開発マシンから容易にアクセスできるという利点がある.
Describing Apps Using Kubernetes YAML
https://docs.docker.com/get-started/part3/#describing-apps-using-kubernetes-yamlKubernetesでは全てのコンテナはリソースを共有する複数のコンテナによって構成されるPodという単位で運用される.
また, 実際のアプリで開発者がPodを1つずつ運用することは稀で, Kubernetesが自動でスケーリングなどの管理を行う複数のPodで構成されるDeploymentという単位で運用されることが多い.
全てのKubernetesオブジェクトはKubernetesYAMLファイルと呼ばれるマニフェストファイルで定義される.
このファイルにはKubernetesアプリを構成するコンポーネントと設定の情報が記述されていて, Kubernetes環境でのアプリの作成/削除に使用される.
1: Part 1では簡単な内容のKubernetesYAMLファイルを作成したが, 今回は掲示板アプリを動かすためにもう少し詳細なものをつくってみる.
任意の場所にbb.yamlというファイルを以下の内容で作成する.
apiVersion: apps/v1
kind: Deployment
metadata:
name: bb-demo
namespace: default
spec:
replicas: 1
selector:
matchLabels:
bb: web
template:
metadata:
labels:
bb: web
spec:
containers:
- name: bb-site
image: bulletinboard:1.0
---
apiVersion: v1
kind: Service
metadata:
name: bb-entrypoint
namespace: default
spec:
type: NodePort
selector:
bb: web
ports:
- port: 8080
targetPort: 8080
nodePort: 30001
このKuberetesYAMLファイルには---で区切られた2つのオブジェクトが記述されている:
Deploymentは中身が同じでスケーリングが可能な複数のPodを定義する.
このファイルではreplica(同じPodの数)が1つであり,
そのPodがPart 2で作成したimage(bulletinboard:1.0)から起動するコンテナを1つ持つことが定義されている.ServiceはPodに関する通信設定を定義する.
このファイルではホスト(ここでは開発マシン)の30001番ポートをPodの8080番ポートと通信させるNodePort Serviceを定義し, 掲示板アプリに接続できるようにしている.
はじめはこのKubernetesYAMLファイルが長く, 複雑なものに見えるかもしれないが, 実際はどれも同じパターンで記述されている:
apiVersionでこのオブジェクトをパースするKubernetesAPIのバージョンを指定kindでこのオブジェクトの種類を定義metadataでオブジェクトの名前などの情報(メタデータ)を定義specでオブジェクトのパラメータと設定を記述
Deploying and Checking Your Application
https://docs.docker.com/get-started/part3/#deploying-and-checking-your-application
1: bb.yamlがあるディレクトリに移動して, Kubernetesにアプリをデプロイする.
# bb.yamlがあることを確認
$ ls
bb.yaml
# bb.yamlに記述された内容のリソースを作成
$ kubectl apply -f bb.yaml
deployment.apps/bb-demo created
service/bb-entrypoint created
2: 起動しているDeploymentの一覧を表示して動作を確認する.
# Deploymentsの一覧を表示
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
bb-demo 1/1 1 1 93s
bb.yamlで定義したDeployment(bb-demo)で1つのPodが正常に動作していることがわかる.
同様にServiceについても動作確認を行う.
# Serviceの一覧を表示
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
bb-entrypoint NodePort 10.102.111.61 <none> 8080:30001/TCP 6m11s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 34d
Kubernetesのデフォルトで使用されるServiceの他に, bb.yamlで定義したService(bb-entrypoint)が動作し, 30001/TCPへのリクエストを受ける設定になっていることがわかる.
3: 開発マシンのブラウザで http://localhost:30001/ を開く.
Part 2でコンテナを単体で実行したときと同じ画面が確認できる.
4: 動作確認が完了したら, アプリを削除する.
# bb.yamlに記述された内容のリソースを削除
$ kubectl delete -f bb.yaml
deployment.apps "bb-demo" deleted
service "bb-entrypoint" deleted
Conclusion
https://docs.docker.com/get-started/part3/#conclusion
このパートでは, Docker Desktopを用いて開発マシン上のKubernetesに掲示板アプリをデプロイした.
この程度ではまだKubernetesを使いこなしているとは言えないが, 最初のステップは既にクリアしている.
環境はすでに開発マシンに構築できているので, 同じ手順でKubernetesの機能をさらに活用すればアプリに他のコンポーネントを追加することもできる.
また, このパートではアプリのデプロイに加えてKubernetesYAMLファイルでのアプリ定義も行った.
アプリを動作させるために必要なすべての情報がシンプルなファイルに記述されているため, バージョンコントロール(Gitなど)で管理したり, 他の開発者と簡単に共有することができる.
また, KubernetesYAMLファイルがあればアプリを異なるクラスタに配置することも簡単に行うことができる(例: テスト環境と本番環境を分ける場合など).
[追加]俗に言うInfrastructure as Codeというもの. Kubernetesではアプリの実行に必要なインフラをコードとして管理することで動作環境への依存をなくしている.