Azure DevOpsでAzure Kubernetesへの自動リリースとデプロイ

王文暁

導入

DevOpsで毎回手動でAzure Kubernetesにテストとデプロイはややこしいです。プロジェクトをビルド、テスト、デプロイなどプロセスは自動化したほうがいいと思います。
今回は、Azure DevOps を導入して CI(インテグレーション)/CD(デリバリー)を自動化し、簡単な継続的CIと継続的CDプロセスを実現することで、より高い品質と信頼性を持つことを目指します。リポジトリはGitHubを使用します。新しいソースコードをコミットしたら、自動的にビルド、Kubernetesにデプロイします。

基礎知識紹介

DevOps

DevOps(DevelopmentとOperationsの組み合わせ)は、ソフトウェア開発の方法論です。
「ソフトウェアのデリバリー」と「ソフトウェアの継続開発」のプロセスを自動化することで、ソフトウェアの構築、テスト、リリースをより迅速,信頼性を持って行うことができます。

https://learn.microsoft.com/ja-jp/azure/devops/pipelines/architectures/devops-pipelines-baseline-architecture

前提条件

リソース グループの作成

az group create --name myResourceGroupTestaks --location japaneast

コンテナ レジストリ作成

az acr create --resource-group myResourceGroupTestaks --name arcnametestaks --sku Basic

Kubernetes クラスター作成

az aks create \
     --resource-group myResourceGroupTestaks \
     --name myAKSClustertestWordpress \
     --node-count 2 \
     --generate-ssh-keys \
     --attach-acr arcnametestaks

テスト用GitHubのリポジトリの作成

まずDockerfile、nginx.conf、supervisord.conf、wordpress-mysql-deloyment.yamlだけを準備します。

ファイルの内容とコマンドの紹介と環境作成など知識、下の文章ご覧ください。

Azure Kubernetes ClusterでWordPressをデプロイしてみる

Azure DevOps

https://dev.azure.com

ソース管理、作業の追跡、継続的インテグレーションとデリバリーなど機能があります。

Azure DevOpsのパイプライン機能導入

Azure DevOps 組織にサインインし、プロジェクトに移動します。パイプラインに移動し、[New pipeline] を選択します。

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

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

リポジトリの一覧が表示されたら、目的のリポジトリを選択します。[Deploy to Azure Kubernetes Service]を選択します。

メッセージが表示されたら、先作成したレジストリとクラスターを選択します。

[Validate and configure] を選択します。Azure Pipelines によってパイプラインが作成され、次の処理が行われます。

  • パイプラインを定義する azure-pipelines.yml ファイルを生成します。
  • Kubernetes manifest ファイルを生成します。 これらのファイルは、選択した内容に基づいで deployment.yml と service.yml テンプレートを生成されます。

[Save and run] を選択して新しいパイプラインをリポジトリにコミットし、その後、新しいパイプラインの初回実行を開始します。

azure-pipelines設定ファイル紹介

デフォルトのコンフィグを調整して、最終の設定ファイルは下記です。

trigger:
- main

resources:
- repo: self

variables:

  # Container registry service connection established during pipeline creation
  dockerRegistryServiceConnection: 'xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx'
  imageRepository: 'wordpress/wordpress-php-nginx'
  containerRegistry: 'arcnametestaks.azurecr.io'
  dockerfilePath: '**/Dockerfile'
  tag: '$(Build.BuildId)'
  imagePullSecret: 'arcnametestaks23ef-auth'

  # Agent VM image name
  vmImageName: 'ubuntu-latest'


stages:
- stage: Build
  displayName: Build stage
  jobs:
  - job: Build
    displayName: Build
    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)

    - upload: manifests
      artifact: manifests

- stage: Deploy
  displayName: Deploy stage
  dependsOn: Build

  jobs:
  - deployment: Deploy
    displayName: Deploy
    pool:
      vmImage: $(vmImageName)
    environment: 'wapaiakstest.default'
    strategy:
      runOnce:
        deploy:
          steps:
          - task: KubernetesManifest@0
            displayName: Create imagePullSecret
            inputs:
              action: createSecret
              secretName: $(imagePullSecret)
              dockerRegistryEndpoint: $(dockerRegistryServiceConnection)

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

重要な設定を紹介します。

trigger:main ブランチへの変更がプッシュされると、パイプラインが自動的に開始されます。
variables:いろんな変数定義しています。
二つステージ定義してます。
stage: Build
vmImage: ubuntu-latest 仮想マシン上で実行されます。
Docker@2 タスクが Dockerfile を使用してイメージをビルドし、ACR(コンテナー レジストリ)にプッシュします。
stage: Deploy
デプロイ ジョブが ubuntu-latest 仮想マシン上で実行されます。
タスク1が、ACR(コンテナー レジストリ) と通信するための認証情報を Kubernetes Secret として作成します。
タスク2が、manifest ファイルを使用してアプリケーションを AKS(Azure Kubernetes Service)クラスターにデプロイします。デプロイには、ビルドされた最新の Docker イメージが使用されます。

他の設定の詳細紹介は下のURLご覧ください。

https://learn.microsoft.com/ja-jp/azure/devops/pipelines/yaml-schema/?view=azure-pipelines

他のファイル紹介

manifestsフィルター

manifestsの中にKubernetesの設定を保存しています,【Azure Kubernetes ClusterでWordPressをデプロイしてみる 】文章のプロジェクトのwordpress-mysql-deployment.yamlファイルを分割して、manifestsに保存します。

manifests/deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
  replicas: 2
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      containers:
      - name: wordpress
        image: arcnametestaks.azurecr.io/wordpress/wordpress-php-nginx
        env:
        - name: WORDPRESS_DB_HOST
          value: mysql:3306
        - name: WORDPRESS_DB_USER
          value: wordpress
        - name: WORDPRESS_DB_PASSWORD
          value: wordpress
        - name: WORDPRESS_DB_NAME
          value: wordpress
        resources:
          requests:
            memory: 512Mi
          limits:
            memory: 1024Mi
        ports:
        - containerPort: 80

manifests/service.yml

apiVersion: v1
kind: Service
metadata:
  name: wordpress
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: wordpress

結果

調整

Dockerfile内の [“supervisord”, “-n”] の直前に、以下のコマンドを追加してください。

このコマンドは、setup-config.php ファイルの2行目に「bugを修正のところ」というコメント行を挿入します。このコメントは、WordPressのセットアップ中に表示されます。

RUN sed -i '2i echo "bugを修正のところ";' /var/www/html/wp-admin/setup-config.php

結果

mainブランチでコミットすると、パイプラインが稼働します。まずビルドステージの設定を実行して、そしてデプロイステージの設定を実行して、自動的にKubernetesにデプロイします。

Pod最新のステータスを取得して、2分間前に作成されたPodが確認できました。

[kusanagi@KUSANAGI-CloudDevVm k8s_test]$ kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
mysql-855d465f7b-vw78n      1/1     Running   0          30h
wordpress-dc9877764-c5gwm   1/1     Running   0          2min
wordpress-dc9877764-nkbbk   1/1     Running   0          2min

コミットする前のプロジェクト画面

コミットしたプロジェクト画面

自動的にKubernetesにデプロイしました。

参考資料

1,https://learn.microsoft.com/ja-jp/azure/devops/pipelines/?view=azure-devops

<< WordPress 6.5 の翻訳処理の改善をコードレベルで理解しようMicrosoft Entra IDを使用して、AzureのLinux仮想マシンにサインインする >>

関連記事

Webサイト運用の課題解決事例100選 プレゼント

Webサイト運用の課題を弊社プロダクトで解決したお客様にインタビュー取材を行い、100の事例を108ページに及ぶ事例集としてまとめました。

・100事例のWebサイト運用の課題と解決手法、解決後の直接、間接的効果がわかる

・情報通信、 IT、金融、メディア、官公庁、学校などの業種ごとに事例を確認できる

・特集では1社の事例を3ページに渡り背景からシステム構成まで詳解