Draft を使って自動的に Dockerfile とマニフェストを生成する
あまり知られてい (ないと思っている) ませんが、Azure のリポジトリの中に Draft という Dockerfile とマニフェストを生成してくれるツールがあります。
ちょっと前のアップデートで、この Draft が AKS のワークロードに使えるようになったという 内容 が書かれていました。私、歓喜!!
最終的には上記の動きを目指しますが、まずは Draft がどのような動作を行うのかを単体で知っておいた方が良さそうです。そのため、今回は Draft を使って、自動的に Dockerfile とマニフェストを生成するところまでを試してみます。
Draft とは
コンテナ化されていないアプリケーションを作成し、Dockerfiles、Kubernetes マニフェスト、Helm チャート、Kustomize 構成、コンテナ化されたアプリケーションに関連付けられているその他の成果物を生成するツールです。
ちなみにリポジトリの README には以下のように書かれています。
Draft is a tool made for users who are just getting started with Kubernetes, or users who want to simplify their experience with Kubernetes. This readme will give you a quick run down on Draft’s commands and what they do.
Dockerfile もマニフェストも1から作成するのは大変...!できるなら勝手に生成されて欲しいし、それをデプロイまでできたら最高!
インストール
では、インストールします。今回試していく環境は、Mac です。そのため、Homebrew を使ってインストールします。
% brew tap azure/draft
% brew install draft
インストールが完了したら、コマンドが使えるか確認します。
% draft
Draft is a Command Line Tool (CLI) that creates the miminum required files for your Kubernetes deployments.
To start a k8s deployment with draft, run the 'draft create' command 🤩
$ draft create
(略)
アプリケーションの作成
今回は、React で作成したアプリケーションを使って試してみます。まずは、アプリケーションを作成します。
% npx create-react-app draft-sample
% cd draft-sample
% npm start
または、私が作成したストップウォッチ(途中)アプリを clone して使ってください。
% git clone https://github.com/mihohoi0322/stopwatch-timer.git
まずはアプリの動作を確認するために実際に動かしてみます。
cd stopwatch-timer
npm install
npm start
以下の画面が表示されれば成功です。
Draft の実行
では、プロジェクトのディレクトリから、Draft を実行します。
% draft create
対話形式でいくつか質問があるため、答えていきます。
ほとんどがデフォルトですが、アプリケーションの名前や Kubernetes のマニフェストの種類を選択する箇所があります。以下を参考に適宜変更してください。
Please enter the port exposed in the application (default: 80): 80
Please enter the version of node used in the application (default: 14): 18
? Select k8s Deployment Type:
helm
kustomize
▸ manifests
Please enter the port exposed in the application (default: 80): 80
Please enter the name of the application: stopwatch-timer
Please enter the namespace to place new resources in (default: default):
Please enter the name of the image to use in the deployment (default: stopwatch-timer):
Please enter the tag of the image to use in the deployment (default: latest):
質問が全て完了すると、Dockerfile とマニフェストが作成されます。
% ls -lrt
total 1368
-rw-r--r-- 1 miho staff 2117 6 21 15:29 README.md
-rw-r--r-- 1 miho staff 1071 6 21 15:29 package.json
-rw-r--r-- 1 miho staff 82 6 21 15:29 postcss.config.js
drwxr-xr-x 8 miho staff 256 6 21 15:29 public
drwxr-xr-x 11 miho staff 352 6 21 15:29 src
-rw-r--r-- 1 miho staff 211 6 21 15:29 tailwind.config.js
-rw-r--r-- 1 miho staff 535 6 21 15:29 tsconfig.json
-rw-r--r-- 1 miho staff 675164 6 21 15:31 package-lock.json
drwxr-xr-x 832 miho staff 26624 6 21 15:31 node_modules
-rw-r--r-- 1 miho staff 150 6 21 15:34 Dockerfile
drwxr-xr-x 4 miho staff 128 6 21 15:37 manifests
実際に作成された Dockerfile とマニフェストを見ても良いですね。
Dockerfile のビルド
せっかくなので、Dockerfile をビルドしてみます。Dockerfile があるディレクトリ (プロジェクト ルート) に移動して、以下のコマンドを実行します。
% docker build --platform linux/amd64 -t stopwatch-timer:v1 .
% docker run -p 8080:80 stopwatch-time
localhost:8080
にアクセスをし、稼働していれば成功です。
Kubernetes (AKS) へのデプロイ
作成されたイメージをコンテナーレジストリにアップロードし、Kubernetes にデプロイします。
今回は、コンテナーレジストリに Azure Container Registry を使い、Kubernetes には Azure Kubernetes Service を使います。
- Azure Container Registry (ACR) の作成方法は こちら を参考にしてください。
- Azure Kubernetes Service (AKS) の作成方法は こちら を参考にしてください。
ACR は AKS に統合されていることが前提です。
ACR へのイメージのアップロード
ACR へのイメージのアップロードは、以下のコマンドを実行します。
% az acr login --name <ACR名>
% docker tag stopwatch-timer:v1 <ACR名>.azurecr.io/stopwatch-timer:v1
% docker push <ACR名>.azurecr.io/stopwatch-timer:v1
AKS へデプロイ準備
まずは AKS に接続します。
% az aks get-credentials --resource-group <リソースグループ名> --name <AKS名>
Draft により自動生成されたマニフェストには、イメージの格納先は記載されていません。そのため image
部分を修正します。
% cd manifests
% ls
deployment.yaml service.yaml
変更部分だけ抜き出します。修正するファイルは deployment.yaml
です。
spec.template.spec.containers.image
の部分を修正します。格納したイメージの名前に合わせてファイルを更新してください。
image: <ACR名>/stopwatch-timer:v1
AKS へのデプロイ
では、実際にデプロイしてみましょう。
% kubectl apply -f ./
deployment.apps/stopwatch-timer created
service/stopwatch-timer created
状況を確認します。
% kubectl get pods
NAME READY STATUS RESTARTS AGE
stopwatch-timer-dd8758b76-r2vqm 1/1 Running 0 2m17s
% kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 16m
stopwatch-timer LoadBalancer 10.0.42.57 XXX.XX.XX.XXX 80:30414/TCP 6m45s
EXTERNAL-IP
が割り当てられていることが確認できます。EXTERNAL-IP
にアクセスすると、アプリケーションが表示されます。
おめでとうございます!これで自動作成された Dockerfile とマニフェストを使って、Kubernetes にデプロイすることができました。
まとめ
今回は、ACR と AKS に、Draft により自動生成された Dockerfile とマニフェストをデプロイしました。
デプロイ先は ACR と AKS に限らず、他のコンテナーレジストリや Kubernetes でも同様にデプロイすることができます。
簡単にコンテナー化とマニフェスト化ができるので、「まずは Dockerfile の書き方から...」という方には非常に強力なサポートになると思います。また、ゴリゴリ書いている方の手助けにもなるのではないかと思います。
ただ、必ずしも Draft により自動生成された Dockerfile とマニフェストが正しく動作するとは限りません。そのため、自動生成されたものをベースに、必要に応じて修正そして手元で検証することをおすすめします。
次はいよいよ AKS に自動デプロイしてみたいと思います...!!!!
参考
Discussion