Azure Pipelines を使用したビルドと Azure Kubernetes Service へのデプロイ

Azure DevOps Services

Azure Pipelinesを使用して、Azure Kubernetes サービス (AKS) に自動的にデプロイします。 Azure Pipelines を使用すると、 Azure DevOps を使用して継続的インテグレーション (CI) と継続的デリバリー (CD) でビルド、テスト、およびデプロイを行うことができます。

この記事では、アプリを継続的にビルドしてデプロイするパイプラインを作成する方法について説明します。 Dockerfile を含むリポジトリ内のコードを変更すると、そのたびにイメージが Azure Container Registry にプッシュされ、その後、マニフェストが AKS クラスターにデプロイされます。

前提条件

コードを取得する

サンプル アプリケーションと 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 ダッシュボーが表示されます。

選択した組織内で、"プロジェクト" を作成します。 組織にプロジェクトがない場合、 [プロジェクトを作成して開始します] 画面が表示されます。 それ以外の場合は、ダッシュボードの右上隅にある [プロジェクトの作成] ボタンを選択します。

パイプラインを作成する

リポジトリを接続して選択する

  1. Azure DevOps 組織にサインインし、プロジェクトに移動します。

  2. パイプラインに移動し、[新しいパイプライン] を選択します。

  3. 最初に、ソース コードの場所として GitHub を選択し、ウィザードの手順を実行します。

  4. サインインするために GitHub にリダイレクトされる場合があります。 その場合は、GitHub の資格情報を入力します。

  5. リポジトリの一覧が表示されたら、目的のリポジトリを選択します。

  6. Azure Pipelines アプリをインストールするために、GitHub にリダイレクトされる場合があります。 その場合は、[承認してインストール] を選択します。

  7. [Deploy to Azure Kubernetes Service] (Azure Kubernetes Service へのデプロイ) を選択します。

  8. メッセージが表示されたら、レジストリとクラスターを作成したサブスクリプションを選択します。

  9. myapp クラスターを選択します。

  10. [名前空間] で、[存在している] を選択し、次に [既定] を選択します。

  11. コンテナー レジストリの名前を選択します。

  12. イメージ名は既定値に設定されたままにしておくことができます。

  13. サービス ポートを 8080 に設定します。

  14. 後の手順で自動生成されるパイプラインの YAML に、アプリの確認に関連した構成が組み込まれるように、[pull request に対してアプリの確認を有効にする] チェック ボックスを設定します。

  15. [Validate and configure] を選択します。

    Azure Pipelines によってパイプラインが作成され、次の処理が行われます。

    • "Docker レジストリ サービス接続" を作成して、パイプラインからコンテナー レジストリにイメージをプッシュできるようにします。

    • "環境" を作成し、その環境内に Kubernetes リソースを作成します。 RBAC が有効なクラスターの場合、Kubernetes リソースを作成すると、クラスター内に ServiceAccount および RoleBinding オブジェクトが暗黙的に作成されます。作成された ServiceAccount は、選択された名前空間の外部で操作を実行できません。

    • パイプラインを定義する azure-pipelines.yml ファイルを生成します。

    • Kubernetes マニフェスト ファイルを生成します。 これらのファイルは、選択した内容に基づいて deployment.ymlservice.yml テンプレートをハイドレートすることによって生成されます。 準備ができたら、[保存および実行] を選択します。

  16. [保存および実行] を選択します。

  17. [コミット メッセージ] を "リポジトリにパイプラインを追加する" などに変更できます。 準備ができたら、[保存および実行] を選択して新しいパイプラインをリポジトリにコミットし、その後、新しいパイプラインの初回実行を開始します。

アプリのデプロイを確認する

パイプラインが実行されると、ビルド ステージが、次にデプロイ ステージが、青色 (実行中) から緑色 (完了) に移行するので、その様子を監視します。 ステージとジョブを選択して、パイプラインの動作を監視できます。

Note

Microsoft ホステッド エージェントを使用している場合は、Microsoft ホステッド エージェントの IP 範囲をファイアウォールに追加する必要があります。 毎週水曜日に公開される週単位の JSON ファイルから、IP 範囲の週単位の一覧を取得できます。 新しい IP 範囲は、次の月曜日に有効になります。 詳細については、Microsoft ホステッド エージェントに関するページを参照してください。 ご自身の Azure DevOps 組織に必要な IP 範囲を見つけるには、Microsoft ホステッド エージェントの想定される IP 範囲を特定する方法を確認してください。

パイプラインの実行が完了したら、何が行われたかを調べ、アプリがデプロイされていることを確認します。 パイプラインの概要から:

  1. [環境] タブを選択します。

  2. [環境を表示する] を選択します。

  3. デプロイ先の名前空間のアプリの場合は、インスタンスを選択します。 既定値を使用した場合は、既定の名前空間の myapp アプリです。

  4. [サービス] タブを選択します。

  5. 外部 IP アドレスを選択し、クリップボードにコピーします。

  6. 新しいブラウザー タブまたはウィンドウを開き、「<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.ymldeployment.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@0
            displayName: Create imagePullSecret
            inputs:
              action: createSecret
              secretName: $(imagePullSecret)
              namespace: $(k8sNamespace)
              dockerRegistryEndpoint: $(dockerRegistryServiceConnection)

          - task: KubernetesManifest@0
            displayName: Deploy to Kubernetes cluster
            inputs:
              action: deploy
              namespace: $(k8sNamespace)
              manifests: |
                $(System.ArtifactsDirectory)/manifests/deployment.yml
                $(System.ArtifactsDirectory)/manifests/service.yml
              imagePullSecrets: |
                $(imagePullSecret)
              containers: |
                $(containerRegistry)/$(imageRepository):$(tag)

リソースをクリーンアップする

作成したリソースを使い終わったら、次のコマンドを使用してリソースを削除できます。

az group delete --name myapp-rg

プロンプトが表示されたら、「y」を入力します。

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019

Azure Pipelinesを使用して、Azure Kubernetes サービス (AKS) に自動的にデプロイします。 Azure Pipelines を使用すると、 Azure DevOps を使用して継続的インテグレーション (CI) と継続的デリバリー (CD) でビルド、テスト、およびデプロイを行うことができます。

この記事では、アプリを継続的にビルドしてデプロイするパイプラインを作成する方法について説明します。 Dockerfile を含むリポジトリ内のコードを変更すると、そのたびにイメージが Azure Container Registry にプッシュされ、その後、マニフェストが AKS クラスターにデプロイされます。

前提条件

コードを取得する

サンプル アプリケーションと 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 Kubernetes Service (AKS) で Azure Container Registry (ACR) を使用する場合は、認証メカニズムを確立する必要があります。 これは次の 2 つの方法で実現できます。

  1. ACR へのアクセス許可を AKS に付与します。 「Azure Kubernetes Service から Azure Container Registry の認証を受ける」を参照してください。

  2. Kubernetes イメージのプル シークレットを使用します。 イメージのプルシークレットは、Kubernetes デプロイ タスクを使用して作成できます。

リリース パイプラインを作成する

CI の設定に使用したビルド パイプラインによって、既に Docker イメージがビルドされ、Azure Container Registry にプッシュされています。 また、Helm Chart がパッケージ化されて成果物として公開されています。 リリース パイプラインでは、コンテナー イメージを Helm アプリケーションとして AKS クラスターにデプロイします。

  1. Azure Pipelines でビルドの概要を開きます。

  2. ビルドの概要で、[リリース] アイコンを選択して、新しいリリース パイプラインを開始します。

    これらのビルド成果物を使用するリリース パイプラインを以前に作成している場合は、代わりに新しいリリースを作成するように求められます。 その場合は、[リリース] ページに移動し、そこから + アイコンを選択して新しいリリース パイプラインを開始します。

  3. [空のジョブ] テンプレートを選択します。

  4. [タスク] ページを開き、[エージェント ジョブ] を選択します。

  5. 新しいタスクを追加するために [+] を選択し、Helm ツール インストーラー タスクを追加します。 これにより、後続のタスクを実行するエージェントには、Helm と Kubectl が確実にインストールされます。

  6. もう一度 [+] を選択し、Helm Charts のパッケージ化と配置タスクを実行します。 このタスクの設定を次のように構成します。

    • 接続の種類: Azure サービス接続を使用して AKS クラスターに接続するには、[Azure Resource Manager] を選択します。 または、kubeconfig またはサービス アカウントを使用して任意の Kubernetes クラスターに接続する場合は、[Kubernetes サービス接続] を選択できます。 この場合は、次の設定について、Azure サブスクリプションではなく Kubernetes サービス接続を作成して選択する必要があります。

    • Azure サブスクリプション: [利用可能な Azure サービス接続] の一覧から接続を選択するか、さらに制限されたアクセス許可を持つ Azure サブスクリプションへの接続を作成します。 入力の横に [承認] ボタンが表示された場合は、それを使用して Azure サブスクリプションへの接続を承認します。 サブスクリプションの一覧に必要な Azure サブスクリプションが表示されない場合は、Azure サービス接続の作成に関するページを参照して、接続を手動で設定します。

    • リソース グループ: AKS クラスターを含むリソース グループを入力または選択します。

    • Kubernetes クラスター: 作成した AKS クラスターを入力または選択します。

    • コマンド: Helm コマンドとして [init] を選択します。 これにより、実行中の Kubernetes クラスターに Tiller がインストールされます。 また、必要なローカル構成も設定されます。 [カナリア イメージのバージョンを使用します] をオンにして、最新のプレリリース バージョンの Tiller をインストールします。 また、事前にインストールされている場合は、[Tiller をアップグレードする] をオンにして Tiller をアップグレードすることもできます。 これらのオプションを有効にすると、タスクでhelm init --canary-image --upgrade が実行されます

  7. [エージェント ジョブ] で [+] を選択し、Helm Charts のパッケージ化と配置タスクをもう 1 つ追加します。 このタスクの設定を次のように構成します。

    • Kubernetes クラスター: 作成した AKS クラスターを入力または選択します。

    • 名前空間: アプリケーションをデプロイする Kubernetes クラスターの名前空間を入力します。 Kubernetes は、同じ物理クラスターに基づく複数の仮想クラスターをサポートしています。 これらの仮想クラスターは "名前空間" と呼ばれます。 名前空間を使用すると、同じクラスター内に開発、テスト、ステージングなどのさまざまな環境を作成できます。

    • コマンド: Helm コマンドとして [upgrade] を選択します。 このタスクを使用して任意の Helm コマンドを実行し、コマンド オプションを引数として渡すことができます。 [upgrade] を選択すると、さらにいくつかのフィールドがタスクに表示されます。

      • グラフの種類: [ファイル パス] を選択します。 または、URL または chart 名を指定する場合は、[Chart 名] を指定できます。 たとえば、chart 名が stable/mysql の場合、タスクで helm upgrade stable/mysql が実行されます

      • Chart パス: パッケージ化された chart またはアンパックされた chart のディレクトリへのパスとすることができます。 この例では、CI ビルドを使用して chart を公開しているので、ファイル ピッカーを使用してファイル パッケージを選択するか、「$(System.DefaultWorkingDirectory)/**/*.tgz」と入力します

      • リリース名: リリースの名前を入力します (例: azuredevops)

      • ポッドを再作成します: リリース中に構成が変更され、実行中のポッドを新しい構成で置き換える場合は、このチェック ボックスをオンにします。

      • 値をリセットします: タスクによって提供されるすべての値を、chart に組み込まれている値でオーバーライドする場合は、このチェック ボックスをオンにします。

      • 強制: 競合の発生時にアップグレードしてロールバックし、リソースを削除して再作成したうえで、完全なリリースを再インストールする場合は、このチェック ボックスをオンにします。 これは、修正プログラムの適用が失敗する可能性がある場合に便利です (たとえば、サービスのクラスター IP アドレスが変更不可である場合)。

      • 引数: Helm コマンドの引数とその値を入力します。この例の場合: --set image.repository=$(imageRepoName) --set image.tag=$(Build.BuildId) これらの引数を使用している理由の説明については、こちらのセクションを参照してください。

      • TLS を有効にする: Helm と Tiller の間で TLS ベースの強力な接続を有効にする場合は、このチェック ボックスをオンにします。

      • CA 証明書: Tiller および Helm クライアントの証明書を発行するためにアップロードして使用する CA 証明書を指定します。

      • 証明書: Tiller 証明書または Helm クライアント証明書を選択します

      • キー: Tiller キーまたは Helm クライアント キーを指定します

  8. パイプラインの [変数] ページで、imageRepoName という名前の変数を追加し、値を Helm イメージ リポジトリの名前に設定します。 通常、これは example.azurecr.io/coderepository という形式です

  9. リリース パイプラインを保存します。

Helm アップグレード タスクで使用される引数

ビルド パイプラインでは、コンテナー イメージにタグ $(Build.BuildId) が付いており、これが Azure Container Registry にプッシュされます。 同じ chart を使用して異なる複数の環境にデプロイできるため、Helm chart では、名前やタグなどのコンテナー イメージの詳細をパラメーター化できます。 これらの値は、values.yaml ファイルで指定することも、ユーザーが指定した値のファイルでオーバーライドすることもできます。さらにそれを、Helm のインストールまたはアップグレード時に --set パラメーターでオーバーライドすることができます。

この例では、次の引数を渡します。

--set image.repository=$(imageRepoName) --set image.tag=$(Build.BuildId)

$(imageRepoName) の値は、[変数] ページ (または YAML ファイルの variables セクション) で設定されています。 または、--set の引数の値または values.yaml ファイルで、イメージ リポジトリ名を使用して直接置き換えることもできます。 次に例を示します。

  image:
    repository: VALUE_TO_BE_OVERRIDDEN
    tag: latest

別の方法として、タスクの [値の設定] オプションを設定して、引数の値をコンマ区切りのキーと値のペアとして指定する方法もあります。

アプリをデプロイするためのリリースを作成する

これで、リリースを作成する準備ができました。これは、特定のビルドで生成された成果物を使用してリリース パイプラインを実行するプロセスを開始することを意味します。 これにより、ビルドがデプロイされます。

  1. [+ リリース] を選択し、[リリースの作成] を選択します。

  2. [新しいリリースの作成] パネルで、使用する成果物のバージョンが選択されていることを確認し、[作成] を選択します。

  3. 情報バーのメッセージにあるリリースのリンクを選択します。 たとえば、"リリース Release-1 が作成されました" と表示されます。

  4. パイプライン ビューで、パイプラインのステージの状態リンクを選択して、ログとエージェントの出力を表示します。