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

王文暁

Azure Kubernetes Service (AKS) は、コンテナ化されたアプリケーションをデプロイして管理するために使用できるマネージド Kubernetes サービスです。コンテナ化されたアプリケーションとKubernetes 利用すると、気軽にKubernetesの自動スケーリング機能と高可用性と無停止のプログラムアップグレードを実現できます。

今回AKSにWordPressをデプロイすることによると、AKSの使用方法など勉強しましょう。

最終的に、希望のWordPressの運用プロセスは以下の通りです。WordPressの実行環境を含むイメージと、MySQLデータベースを含むイメージの2つを準備します。Kubernetesを使用して複数のWordPress Podをデプロイし、より多くのトラフィックを処理できるようにします。

WordPressのDocker化の準備

Dockerfile

この Dockerfile の役割は、PHP 8.3-FPM、Nginx、および Supervisor を含むイメージを作成し、WordPress 環境を設定することです。

FROM php:8.3-fpm

RUN apt-get update && apt-get install -y \
    nginx \
    supervisor \
    && docker-php-ext-install mysqli

COPY nginx.conf /etc/nginx/nginx.conf

COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

RUN curl -o wordpress.tar.gz https://wordpress.org/latest.tar.gz \
    && tar -xzf wordpress.tar.gz \
    && rm wordpress.tar.gz \
    && mv wordpress/* /var/www/html/ \
    && chown -R www-data:www-data /var/www/html

# COPY wp-config.php /var/www/html/wp-config.php

EXPOSE 80

CMD ["supervisord", "-n"]

nginx.conf

このNginx構成ファイルは、WordPressのNginx環境のコンフィグです、基本的なWebサーバーを設定し、静的ファイルとPHPファイルを処理することができます。ルートパスへのすべてのリクエストを実際のファイルまたはディレクトリにマッピングし、見つからない場合はindex.phpにリダイレクトします。

worker_processes 1;

events {
    worker_connections 1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen 80;
        server_name localhost;

        root /var/www/html;
        index index.php index.html index.htm;

        location / {
            try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }

        location ~ /\.ht {
            deny all;
        }
    }
}

supervisord.conf

このSupervisord構成ファイルは、PHP-FPMとNginxの2つのサービスを同時に起動および管理するためのものです。これらの2つのサービスは同じ環境で実行され、Supervisordを通じて監視および管理することができます。

[supervisord]
nodaemon=true

[program:php-fpm]
command=/usr/local/sbin/php-fpm

[program:nginx]
command=/usr/sbin/nginx -g "daemon off;"

wordpress-mysql-deployment.yaml

この構成ファイルは、MySQL8.4データベースとWordPressアプリケーションのKubernetesデプロイメントとサービスを定義しています。MySQLデプロイメントには1つのインスタンスが含まれ、WordPressデプロイメントには2つのインスタンスが含まれています。また、LoadBalancerサービスを通じて外部に公開されています。MySQLとWordPressは環境変数を通じて接続設定が行われています。

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.4
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: example
        - name: MYSQL_DATABASE
          value: wordpress
        - name: MYSQL_USER
          value: wordpress
        - name: MYSQL_PASSWORD
          value: wordpress
        resources:
          requests:
            cpu: 1000m
            memory: 512Mi
          limits:
            cpu: 2000m
            memory: 1024Mi
        ports:
        - containerPort: 3306

---
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysql

---
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:0.7
        resources:
          requests:
            memory: 512Mi
          limits:
            memory: 1024Mi
        ports:
        - containerPort: 80

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

wordpress/wordpress-php-nginxというフォルダを作って、上記のコンフィグをwordpress-php-nginxフォルダに保存します。

コンテナ レジストリの作成

1、Azure CLI のインストール

Azure CLIは、Azure に接続して Azure リソースに対して管理コマンドを実行するためのコマンド ライン ツールです。

https://learn.microsoft.com/ja-jp/cli/azure/install-azure-cli

上記のURLによると、Azure CLIをインストールできます。

2、リソース グループの作成

az group create コマンドを使用して、リソース グループを作成します。

az group create --name myResourceGroupTestaks --location japaneast

3、コンテナ レジストリ作成

Azure Container Registry(ACR) は、Docker Hub に似たコンテナイメージレジストリで、Docker コンテナイメージの保存と管理に使用されます。

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

4、イメージをビルドして ACR にプッシュ

az acr build --registry arcnametestaks --image wordpress/wordpress-php-nginx:0.7 ./wordpress/wordpress-php-nginx

5、成功かどうか検査

Kubernetes クラスターの作成とデプロイ

1、Kubernetes クラスター作成

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

resource-group は前に設定されたリソースの名前を設定します。

node-count はKubernetes クラスターのノードプールのノード数です。

attach-acr arcnametestaks は前に設定されたレジストリの名前を設定します、指定されたレジストリからイメージをプールできます。

成功ならば、Azureの管理画面で下記のKubernetes クラスター管理画面を見れます。

2、kubectlインストール

Kubernetes クラスターに接続するには Kubernetes CLI kubectl を使用します。kubectlがない場合は、下記のコマンドを実行して kubectl をインストールできます。

az aks install-cli

3、Azure Kubernetes クラスターに接続するようにkubectl構成。

az aks get-credentials --resource-group myResourceGroupTestaks --name myAKSClustertestWordpress

4、AKSにプロジェクトデプロイ

1、このアドレスをコピーして、wordpress-mysql-deployment.yamlのimageの設定を置き換えます。

2、kubectl applyコマンドを使用してアプリケーションをデプロイします。Kubernetesのコンフィグが解析され、定義された Kubernetes オブジェクトが作成されます。

kubectl apply -f wordpress-mysql-deployment.yaml

5、成功かどうか検査

[kusanagi@KUSANAGI WordPress]$ kubectl get nodes
NAME                                STATUS   ROLES   AGE   VERSION
aks-nodepool1-30232977-vmss000000   Ready    agent   4h   v1.28.9
aks-nodepool1-30232977-vmss000001   Ready    agent   4h   v1.28.9
[kusanagi@KUSANAGI WordPress]$ kubectl get pods
NAME                         READY   STATUS    RESTARTS   AGE
mysql-67cf8f469d-rd746       1/1     Running   0          4h
wordpress-7dc656bfbf-7zkz8   1/1     Running   0          4h
wordpress-7dc656bfbf-j6zvc   1/1     Running   0          4h

NodeとPodの状況は正常に稼働することわかりました。

6、WordPressインストール

MySQLのServiceの名前はmysqlですので、Hostにmysqlを入力します。

Azure Kubernetes ClusterでWordPressサイトは正常に稼働になりました。

Kubernetes 関連の情報

kubectl describe nodesを実行して、Nodeの全体の情報を見れます。

[kusanagi@KUSANAGI WordPress]$ kubectl describe nodes
Nodeの名前
Name:               aks-nodepool1-30232977-vmss000000
Conditions: //Memor、Disk、PID圧力なし、ReadyはTrueですので、このNodeは正常的に稼働中です
  Type                          Status  LastHeartbeatTime                 LastTransitionTime                Reason                          Message
  ----                          ------  -----------------                 ------------------                ------                          -------
 .......
  MemoryPressure                False   Wed, 12 Jun 2024 13:37:55 +0900   Mon, 10 Jun 2024 17:10:06 +0900   KubeletHasSufficientMemory      kubelet has sufficient memory available
  DiskPressure                  False   Wed, 12 Jun 2024 13:37:55 +0900   Mon, 10 Jun 2024 17:10:06 +0900   KubeletHasNoDiskPressure        kubelet has no disk pressure
  PIDPressure                   False   Wed, 12 Jun 2024 13:37:55 +0900   Mon, 10 Jun 2024 17:10:06 +0900   KubeletHasSufficientPID         kubelet has sufficient PID available
  Ready                         True    Wed, 12 Jun 2024 13:37:55 +0900   Mon, 10 Jun 2024 17:10:07 +0900   KubeletReady                    kubelet is posting ready status. AppArmor enabled
Addresses: プライベートIP情報
  InternalIP:  10.224.0.5
  Hostname:    aks-nodepool1-30232977-vmss000000
Capacity: Nodeの仕様
  cpu:                2
  ephemeral-storage:  129886128Ki
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             7097620Ki
  pods:               110
Allocatable:分配可能資源
  cpu:                1900m
  ephemeral-storage:  119703055367
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             4652308Ki
  pods:               110
System Info://Nodeを運行している物理マシン情報
  Machine ID:                 b3dbdafb1591480cbc005ad0dedb879c
  System UUID:                dfe3832c-b038-4038-a627-a3955a2b9556
  Boot ID:                    b677206a-bbd1-4d1b-82a8-d31c149f6285
  Kernel Version:             5.15.0-1064-azure
  OS Image:                   Ubuntu 22.04.4 LTS
  Operating System:           linux
  Architecture:               amd64
  Container Runtime Version:  containerd://1.7.15-1
  Kubelet Version:            v1.28.9
  Kube-Proxy Version:         v1.28.9
......
物理マシンID
ProviderID:                   azure:///subscriptions/1038841e-9546-4725-baaa-ec2b5a0fc60b/resourceGroups/mc_myresourcegrouptestaks_myaksclustertestwordpress_japaneast/providers/Microsoft.Compute/virtualMachineScaleSets/aks-nodepool1-30232977-vmss/virtualMachines/0
稼働中Pod
Non-terminated Pods:          (10 in total)
  Namespace                   Name                                   CPU Requests  CPU Limits  Memory Requests  Memory Limits  Age
  ---------                   ----                                   ------------  ----------  ---------------  -------------  ---
  default                     wordpress-7dc656bfbf-j6zvc             0 (0%)        0 (0%)      512Mi (11%)      1Gi (22%)      43h
  kube-system                 azure-ip-masq-agent-77xlb              100m (5%)     500m (26%)  50Mi (1%)        250Mi (5%)     44h
  kube-system                 cloud-node-manager-gjdpc               50m (2%)      0 (0%)      50Mi (1%)        512Mi (11%)    44h
  kube-system                 coredns-767bfbd4fb-k5bsz               100m (5%)     3 (157%)    70Mi (1%)        500Mi (11%)    44h
  kube-system                 csi-azuredisk-node-f2tbm               30m (1%)      0 (0%)      60Mi (1%)        400Mi (8%)     44h
  kube-system                 csi-azurefile-node-hxc4x               30m (1%)      0 (0%)      60Mi (1%)        600Mi (13%)    44h
  kube-system                 konnectivity-agent-66476544fb-jpwgf    20m (1%)      1 (52%)     20Mi (0%)        1Gi (22%)      44h
  kube-system                 kube-proxy-xbgpb                       100m (5%)     0 (0%)      0 (0%)           0 (0%)         44h
  kube-system                 metrics-server-64f4bf9984-76wm5        50m (2%)      145m (7%)   89Mi (1%)        359Mi (7%)     44h
  kube-system                 metrics-server-64f4bf9984-jmnnp        50m (2%)      145m (7%)   89Mi (1%)        359Mi (7%)     44h
Allocated resources:資源利用状況
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource           Requests      Limits
  --------           --------      ------
  cpu                530m (27%)    4790m (252%)
  memory             1000Mi (22%)  5028Mi (110%)
  ephemeral-storage  0 (0%)        0 (0%)
  hugepages-1Gi      0 (0%)        0 (0%)
  hugepages-2Mi      0 (0%)        0 (0%)
Events://最近のWarning情報
  Type     Reason                  Age    From                                     Message
  ----     ------                  ----   ----                                     -------
  Warning  ContainerRuntimeIsDown  6m19s  container-runtime-custom-plugin-monitor  Timeout when running plugin "/etc/node-problem-detector.d/plugin/check_runtime.s
  Warning  KubeletIsDown           6m19s  kubelet-custom-plugin-monitor            Timeout when running plugin "/etc/node-problem-detector.d/plugin/check_kubelet.s
  Normal   KubeletIsUp             6m19s  kubelet-custom-plugin-monitor            Node condition KubeletProblem is now: Unknown, reason: KubeletIsUp, message: "Timeout when running plugin \"/etc/node-problem-detector.d/plugin/check_kubelet.s"
  Normal   ContainerRuntimeIsUp    6m18s  container-runtime-custom-plugin-monitor  Node condition ContainerRuntimeProblem is now: Unknown, reason: ContainerRuntimeIsUp, message: "Timeout when running plugin \"/etc/node-problem-detector.d/plugin/check_runtime.s"
  Normal   ContainerRuntimeIsUp    5m52s  container-runtime-custom-plugin-monitor  Node condition ContainerRuntimeProblem is now: False, reason: ContainerRuntimeIsUp, message: "container runtime service is up"
  Normal   KubeletIsUp             5m52s  kubelet-custom-plugin-monitor            Node condition KubeletProblem is now: False, reason: KubeletIsUp, message: "kubelet service is up"


Name:               aks-nodepool1-30232977-vmss000001
......
ProviderID:                   azure:///subscriptions/1038841e-9546-4725-baaa-ec2b5a0fc60b/resourceGroups/mc_myresourcegrouptestaks_myaksclustertestwordpress_japaneast/providers/Microsoft.Compute/virtualMachineScaleSets/aks-nodepool1-30232977-vmss/virtualMachines/1
Non-terminated Pods:          (10 in total)
  Namespace                   Name                                   CPU Requests  CPU Limits  Memory Requests  Memory Limits  Age
  ---------                   ----                                   ------------  ----------  ---------------  -------------  ---
  default                     mysql-67cf8f469d-rd746                 1 (52%)       2 (105%)    512Mi (11%)      1Gi (22%)      43h
  default                     wordpress-7dc656bfbf-7zkz8             0 (0%)        0 (0%)      512Mi (11%)      1Gi (22%)      43h
  kube-system                 azure-ip-masq-agent-2q4ww              100m (5%)     500m (26%)  50Mi (1%)        250Mi (5%)     44h
  kube-system                 cloud-node-manager-hmmcm               50m (2%)      0 (0%)      50Mi (1%)        512Mi (11%)    44h
  kube-system                 coredns-767bfbd4fb-mmzl7               100m (5%)     3 (157%)    70Mi (1%)        500Mi (11%)    44h
  kube-system                 coredns-autoscaler-c6649b67c-vrb7z     20m (1%)      200m (10%)  10Mi (0%)        500Mi (11%)    44h
  kube-system                 csi-azuredisk-node-d84kx               30m (1%)      0 (0%)      60Mi (1%)        400Mi (8%)     44h
  kube-system                 csi-azurefile-node-tnfq8               30m (1%)      0 (0%)      60Mi (1%)        600Mi (13%)    44h
  kube-system                 konnectivity-agent-66476544fb-xfdl9    20m (1%)      1 (52%)     20Mi (0%)        1Gi (22%)      44h
  kube-system                 kube-proxy-sst8r                       100m (5%)     0 (0%)      0 (0%)           0 (0%)         44h

上記の情報によると、二つNodeのステータスは健康です、aks-nodepool1-30232977-vmss/virtualMachines/0とaks-nodepool1-30232977-vmss/virtualMachines/1VM使用しています、二つのVMのスペックは同じです、2CPU、7Gです、今WordPressコンテナとMySQLコンテナ合わせて三つPodは稼働中です。

残っている問題

上記のソースコードは試験性ソースコードなので、本番環境でこの WordPress を実行するには、まだいくつかの問題があります。以下の点を考慮し、解決する必要があります:

  1. WordPress コンテナの画像などリソースが共有されていない
    • 問題の説明:現在、WordPress コンテナ内の画像リソースが共有されていないため、あるコンテナで保存された画像が別のコンテナからアクセスできません。
  2. MySQL データベースが永続化されていない
    • 問題の説明:現在、MySQL データベースが永続化されていないため、コンテナの更新時にデータが失われる可能性があります。

参考資料

https://learn.microsoft.com/ja-jp/azure/aks/learn/quick-kubernetes-deploy-cli

https://learn.microsoft.com/ja-jp/azure/aks/tutorial-kubernetes-deploy-cluster?tabs=azure-cli

<< WordPress 6.5で翻訳処理が高速化。裏側に迫る。Microsoft Entra IDを使用したZabbix SAMLのセットアップ >>

関連記事

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

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

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

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

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