Azure Pipelines を使用したビルドと Azure Kubernetes Service へのデプロイ
Azure DevOps Services
Azure Pipelinesを使用して、Azure Kubernetes サービス (AKS) に自動的にデプロイします。 Azure Pipelines を使用すると、 Azure DevOps を使用して継続的インテグレーション (CI) と継続的デリバリー (CD) でビルド、テスト、およびデプロイを行うことができます。
この記事では、アプリを継続的にビルドしてデプロイするパイプラインを作成する方法について説明します。 Dockerfile を含むリポジトリ内のコードを変更すると、そのたびにイメージが Azure Container Registry にプッシュされ、その後、マニフェストが AKS クラスターにデプロイされます。
前提条件
- アクティブなサブスクリプションが含まれる Azure アカウント。 無料でアカウントを作成できます。
- Azure Resource Manager サービス接続。 Azure Resource Manager サービス接続を作成できます。
- GitHub アカウント。 GitHub アカウントをまだお持ちでない場合は、無料の GitHub アカウントを作成できます。
コードを取得する
サンプル アプリケーションと Dockerfile を含む次のリポジトリをフォークします。
https://github.com/MicrosoftDocs/pipelines-javascript-docker
Azure リソースの作成
Azure portal にサインインし、右上隅にある [Cloud Shell] ボタンを選択します。 Azure CLI または PowerShell を使用して AKS クラスターを作成します。
コンテナー レジストリの作成
# Create a resource group
az group create --name myapp-rg --location eastus
# Create a container registry
az acr create --resource-group myapp-rg --name mycontainerregistry --sku Basic
# Create a Kubernetes cluster
az aks create \
--resource-group myapp-rg \
--name myapp \
--node-count 1 \
--enable-addons monitoring \
--generate-ssh-keys
Azure Pipelines にサインインする
Azure Pipelines にサインインします。 サインインすると、ブラウザーが https://dev.azure.com/my-organization-name
に移動し、Azure DevOps ダッシュボーが表示されます。
選択した組織内で、"プロジェクト" を作成します。 組織にプロジェクトがない場合、 [プロジェクトを作成して開始します] 画面が表示されます。 それ以外の場合は、ダッシュボードの右上隅にある [プロジェクトの作成] ボタンを選択します。
パイプラインを作成する
リポジトリを接続して選択する
Azure DevOps 組織にサインインし、プロジェクトに移動します。
パイプラインに移動し、[新しいパイプライン] を選択します。
最初に、ソース コードの場所として GitHub を選択し、ウィザードの手順を実行します。
サインインするために GitHub にリダイレクトされる場合があります。 その場合は、GitHub の資格情報を入力します。
リポジトリの一覧が表示されたら、目的のリポジトリを選択します。
Azure Pipelines アプリをインストールするために、GitHub にリダイレクトされる場合があります。 その場合は、[承認してインストール] を選択します。
[Deploy to Azure Kubernetes Service] (Azure Kubernetes Service へのデプロイ) を選択します。
メッセージが表示されたら、レジストリとクラスターを作成したサブスクリプションを選択します。
myapp
クラスターを選択します。[名前空間] で、[存在している] を選択し、次に [既定] を選択します。
コンテナー レジストリの名前を選択します。
イメージ名は既定値に設定されたままにしておくことができます。
サービス ポートを 8080 に設定します。
後の手順で自動生成されるパイプラインの YAML に、アプリの確認に関連した構成が組み込まれるように、[pull request に対してアプリの確認を有効にする] チェック ボックスを設定します。
[Validate and configure] を選択します。
Azure Pipelines によってパイプラインが作成され、次の処理が行われます。
"Docker レジストリ サービス接続" を作成して、パイプラインからコンテナー レジストリにイメージをプッシュできるようにします。
"環境" を作成し、その環境内に Kubernetes リソースを作成します。 RBAC が有効なクラスターの場合、Kubernetes リソースを作成すると、クラスター内に ServiceAccount および RoleBinding オブジェクトが暗黙的に作成されます。作成された ServiceAccount は、選択された名前空間の外部で操作を実行できません。
パイプラインを定義する azure-pipelines.yml ファイルを生成します。
Kubernetes マニフェスト ファイルを生成します。 これらのファイルは、選択した内容に基づいて deployment.yml と service.yml テンプレートをハイドレートすることによって生成されます。 準備ができたら、[保存および実行] を選択します。
[保存および実行] を選択します。
[コミット メッセージ] を "リポジトリにパイプラインを追加する" などに変更できます。 準備ができたら、[保存および実行] を選択して新しいパイプラインをリポジトリにコミットし、その後、新しいパイプラインの初回実行を開始します。
アプリのデプロイを確認する
パイプラインが実行されると、ビルド ステージが、次にデプロイ ステージが、青色 (実行中) から緑色 (完了) に移行するので、その様子を監視します。 ステージとジョブを選択して、パイプラインの動作を監視できます。
Note
Microsoft ホステッド エージェントを使用している場合は、Microsoft ホステッド エージェントの IP 範囲をファイアウォールに追加する必要があります。 毎週水曜日に公開される週単位の JSON ファイルから、IP 範囲の週単位の一覧を取得できます。 新しい IP 範囲は、次の月曜日に有効になります。 詳細については、Microsoft ホステッド エージェントに関するページを参照してください。 ご自身の Azure DevOps 組織に必要な IP 範囲を見つけるには、Microsoft ホステッド エージェントの想定される IP 範囲を特定する方法を確認してください。
パイプラインの実行が完了したら、何が行われたかを調べ、アプリがデプロイされていることを確認します。 パイプラインの概要から:
[環境] タブを選択します。
[環境を表示する] を選択します。
デプロイ先の名前空間のアプリの場合は、インスタンスを選択します。 既定値を使用した場合は、既定の名前空間の myapp アプリです。
[サービス] タブを選択します。
外部 IP アドレスを選択し、クリップボードにコピーします。
新しいブラウザー タブまたはウィンドウを開き、「<IP アドレス>:8080」を入力します。
サンプル アプリをビルドしている場合は、Hello world がブラウザーに表示されます。
パイプラインのビルド方法
オプションの選択を完了し、パイプラインの検証と構成に進むと、[Deploy to Azure Kubernetes Service] (Azure Kubernetes Service へのデプロイ) テンプレートを使用して、Azure Pipelines によってパイプラインが作成されています。
ビルド ステージでは、Docker タスクを使用してイメージをビルドし、Azure Container Registry にプッシュします。
- stage: Build
displayName: Build stage
jobs:
- job: Build
displayName: Build job
pool:
vmImage: $(vmImageName)
steps:
- task: Docker@2
displayName: Build and push an image to container registry
inputs:
command: buildAndPush
repository: $(imageRepository)
dockerfile: $(dockerfilePath)
containerRegistry: $(dockerRegistryServiceConnection)
tags: |
$(tag)
- task: PublishPipelineArtifact@1
inputs:
artifactName: 'manifests'
path: 'manifests'
デプロイ ジョブでは、"Kubernetes マニフェスト タスク" を使用して、Kubernetes クラスター ノードで Azure Container Registry リソースからプルするために必要な imagePullSecret
を作成します。 その後、マニフェスト ファイルは、Kubernetes クラスターにデプロイするために Kubernetes マニフェスト タスクによって使用されます。 マニフェスト ファイル service.yml
と deployment.yml
は、Azure Kubernetes Service へのデプロイ テンプレートを使用したときに生成されました。
- stage: Deploy
displayName: Deploy stage
dependsOn: Build
jobs:
- deployment: Deploy
displayName: Deploy job
pool:
vmImage: $(vmImageName)
environment: 'myenv.aksnamespace' #customize with your environment
strategy:
runOnce:
deploy:
steps:
- task: DownloadPipelineArtifact@2
inputs:
artifactName: 'manifests'
downloadPath: '$(System.ArtifactsDirectory)/manifests'
- task: KubernetesManifest@1
displayName: Create imagePullSecret
inputs:
action: 'createSecret'
connectionType: 'kubernetesServiceConnection'
kubernetesServiceConnection: 'myapp-default' #customize for your Kubernetes service connection
secretType: 'dockerRegistry'
secretName: '$(imagePullSecret)'
dockerRegistryEndpoint: '$(dockerRegistryServiceConnection)'
- task: KubernetesManifest@1
displayName: Deploy to Kubernetes cluster
inputs:
action: 'deploy'
connectionType: 'kubernetesServiceConnection'
kubernetesServiceConnection: 'myapp-default' #customize for your Kubernetes service connection
manifests: |
$(Pipeline.Workspace)/manifests/deployment.yml
$(Pipeline.Workspace)/manifests/service.yml
containers: '$(containerRegistry)/$(imageRepository):$(tag)'
imagePullSecrets: '$(imagePullSecret)'
リソースをクリーンアップする
作成したリソースを使い終わったら、次のコマンドを使用してリソースを削除できます。
az group delete --name myapp-rg
プロンプトが表示されたら、「y
」を入力します。
Azure Kubernetes Service