導入
DevOpsで毎回手動でAzure Kubernetesにテストとデプロイはややこしいです。プロジェクトをビルド、テスト、デプロイなどプロセスは自動化したほうがいいと思います。
今回は、Azure DevOps を導入して CI(インテグレーション)/CD(デリバリー)を自動化し、簡単な継続的CIと継続的CDプロセスを実現することで、より高い品質と信頼性を持つことを目指します。リポジトリはGitHubを使用します。新しいソースコードをコミットしたら、自動的にビルド、Kubernetesにデプロイします。
基礎知識紹介
DevOps
DevOps(DevelopmentとOperationsの組み合わせ)は、ソフトウェア開発の方法論です。
「ソフトウェアのデリバリー」と「ソフトウェアの継続開発」のプロセスを自動化することで、ソフトウェアの構築、テスト、リリースをより迅速,信頼性を持って行うことができます。
前提条件
リソース グループの作成
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
ソース管理、作業の追跡、継続的インテグレーションとデリバリーなど機能があります。
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