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 を実行するには、まだいくつかの問題があります。以下の点を考慮し、解決する必要があります:
- WordPress コンテナの画像などリソースが共有されていない
- 問題の説明:現在、WordPress コンテナ内の画像リソースが共有されていないため、あるコンテナで保存された画像が別のコンテナからアクセスできません。
- 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