💬

Draft を使って自動的に Dockerfile とマニフェストを生成する

2023/06/21に公開

あまり知られてい (ないと思っている) ませんが、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

以下の画面が表示されれば成功です。
stopwatch-timer

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 に自動デプロイしてみたいと思います...!!!!

参考

https://github.com/Azure/draft

https://learn.microsoft.com/ja-jp/azure/aks/draft

GitHubで編集を提案
Microsoft (有志)

Discussion