Azure KubernetesとAzure Database for MySQLを使ってWordPress Containerを動かす

首先

Azure Kubernetes Service(AKS)が2018年6月26日付けで日本リージョンで利用可能になりました。
まずはお試しとして、WordPressのDocker ContainerをAKS上で動かしました。
データベースであるMySQLはAzureのDatabase as a Service(DaaS)であるAzure Database for MySQLを利用します。

或许有人会说「用App Services和Azure Database for MySQL不挺好吗」,但如果你有这种想法,请参考这篇文章。

利用App Service和Azure Database for MySQL来简单构建一个WordPress网站。

构成的说明

请给出以下中文的本地语言翻译,只需提供一种选项:

AKS

    Docker Hubで提供されている「wordpress」コンテナをそのまま利用。
    wordpressコンテナを動かすPodは1つ。
    外部ロードバランサを作成して(今回はとりあえず) http(TCP/80)によるアクセスを可能にする
    永続化領域(/var/www/html)はAKSが提供しているストレージクラスを利用
    Azure Database for MySQLに繋げられるようにExternalNameも作成する

Azure数据库用于MySQL

    AKSからの接続にはサービスエンドポイント(Preview)を使って内部経路でアクセスする
    内部経路でアクセスするため、とりあえず今回はSSL接続は強制せずにTCP/3306でWordPressから繋げる

AzureでKubernetesを利用する際のポイント

对于特别利用AKS的情况来说,以下是一些与Azure专门构建相关的要点。

存储空间

在AKS中,默认定义了以下存储类,并且可以轻松地使用Azure Managed Disk。

ストレージクラス名 Managed Diskの種類 default Standard Storage managed-premium Premium Storage

请参考:包含Azure磁盘的持久化卷。

公共IP地址

只需在 Azure 上部署 AKS 的资源组(MC_<资源组名称><地区>)下创建公共 IP 地址资源,即可从 AKS 的负载均衡器上使用该 IP 地址。

参考 : Azure Kubernetes Service (AKS) ロード バランサーで静的 IP アドレスを使用する

Azure 数据库 for MySQL 可以进行私有连接。

虽然仍处于预览阶段,但通过使用服务终端点功能,我们将限制连接,使其仅能从AKS的虚拟网络访问。

使用Azure门户创建和管理Azure Database for MySQL VNet的服务终点和VNet规则。

MySQLでサービスエンドポイントを利用する時は、汎用サーバーとメモリ最適化サーバーでのみサポートされるため、Azure利用料としては泣けてきますw

AKS的部署

image.png

image.png

ノード数はデフォルトの「3」のままだとAzureの課金が心配なので、今回は検証目的であるため「1」に変更しました。
他の必須項目はご自身の環境に併せて適宜入力します。
(ここではAzureポータルの詳細な操作説明は除きます)

部署Azure Database for MySQL

登录Azure门户后,从“Azure Marketplace”中查找并创建“Azure Database for MySQL”。

image.png

image.png

image.png

image.png

image.png

image.png

image.png

创建公共IP地址

image.png

image.png

image.png

AKS部署的准备工作

在控制Kubernetes时,基本上会使用”kubectl”命令。由于在客户端个人电脑上安装此命令通常需要额外步骤,所以本次我们将使用可以从Azure门户启动的Cloud Shell。

image.png

一旦打开Cloud Shell(bash)控制台后,您只需输入以下命令即可执行kubectl。

$ az aks get-credentials --resource-group <Resource Group Name> --name <AKS Name>
Merged "<AKS Name>" as current context in /home/yoshimasa_katakura/.kube/config

AKS 上部署各种服务

创建秘密

在MySQL部署时,可以使用Kubernetes的密钥来创建指定的管理员密码。这样可以避免将密码直接写在yaml文件中。

$ kubectl apply secret generic wp-secrets --from-literal=WORDPRESS_DB_PASSWORD=<PASSWORD>

创建MySQL的ExternalName

MySQLのエンドポイント名も環境依存になるため、WordPress本体のyamlファイルに記載はせずに、ExternalNameとして最初に作成します。

准备以下的yaml文件。
将externalName设置为先前创建的MySQL服务器的名称。

apiVersion: v1
kind: Service
metadata:
  name: azure-mysql
spec:
  type: ExternalName
  externalName: XXX.mysql.database.azure.com (ここは適宜変更)

使用以下命令进行创建。

$ kubectl apply -f mysql-service.yaml

创建用于传递给WordPress的环境变量的配置地图(ConfigMap)。

除了上述密碼之外,還需要準備環境變數來傳遞給WordPress的容器。將這樣的環境相依值放在另一個yaml文件中,可以提高後續的維護性。將WORDPRESS_DB_USER設定為先前創建的MySQL服務器的管理員登錄名。

apiVersion: v1
kind: ConfigMap
metadata:
  name: wp-configmap
data:
  WORDPRESS_DB_NAME: wordpress
  WORDPRESS_DB_USER: dbadmin@aks-mysql (ここは適宜変更)
  WORDPRESS_DB_HOST: azure-mysql:3306

用下面的指令创建。

$ kubectl apply -f wp-configmap.yaml

创建永久化存储

由于我们将使用Azure的Standard Disk作为持久性存储,因此在storage-class中指定为“default”。
我们暂时保留了5Gi的大小,但请根据需要进行适当调整。
由于它将被挂载在/var/www/html目录下,在使用WordPress进行大量媒体文件上传时,可能需要将其调整得更大。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wp-azure-disk
  annotations:
    volume.beta.kubernetes.io/storage-class: default
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

使用以下命令创建。

$ kubectl apply -f wp-storage.yaml

创建外部负载均衡器

为了使WordPress能够从互联网访问,我们将创建一个外部负载均衡器。
在yaml文件中,将先前创建的Azure公共IP地址的值设置为相同的IP地址。

apiVersion: v1
kind: Service
metadata:
  name: wp-external-lb
spec:
  loadBalancerIP: XX.XX.XX.XX (ここは適宜変更)
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: wordpress

用以下命令进行创建。

$ kubectl apply -f wp-lb.yaml

顺便一提,当执行此命令时,将会更改Azure上的负载均衡器资源“kubernetes”的配置,并添加从指定的公共IP地址负载均衡到Kubernetes节点的设置。

建立WordPress网站

完成以下的任务后,接下来将创建WordPress的部署。

    シークレット(Secrets)「wp-secrets」
    環境変数(ConfigMap)「wp-configmap」
    永続化ストレージ(PersistentVolumeClaim)「wp-azure-disk」
    MySqlのExternalName「mysql-service」
    ロードバランサー(LoadBalancer)「wp-external-lb」

このyamlファイル内には環境に依存した記述が一切ありませんね。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wordpress
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      containers:
      - name: wordpress
        image: wordpress
        envFrom:
        - configMapRef:
            name: wp-configmap
        - secretRef:
            name: wp-secrets
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wp-azure-disk
          mountPath: /var/www/html
      volumes:
        - name: wp-azure-disk
          persistentVolumeClaim:
            claimName: wp-azure-disk

以下のコマンドで作成します。

$ kubectl apply -f wp-service.yaml

确认行动

在AKS上确认部署状态。

もっと前のタイミングでも良いのですが、AKS上に作成した各種ワークロードの確認をします。

# シークレットの状態確認
$ kubectl get secrets
NAME                                       TYPE                                  DATA      AGE
azure-storage-account-ktkraksst01-secret   Opaque                                2         4d
default-token-bjsjg                        kubernetes.io/service-account-token   3         8d
wp-secrets                                 Opaque                                1         2h

# 環境変数の状態確認
$ kubectl get configmap
NAME           DATA      AGE
wp-configmap   3         11h

# 永続化ストレージの状態確認
$ kubectl get persistentVolumeClaim
NAME            STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
wp-azure-disk   Bound     pvc-e4f26c86-8c02-11e8-b0bf-da69366a1397   5Gi        RWO            default        1d

# ExternalNameとLoadbalancer(両方共service)の状態確認
$ kubectl get service
NAME             TYPE           CLUSTER-IP    EXTERNAL-IP                          PORT(S)        AGE
azure-mysql      ExternalName   <none>        aks-mysql.mysql.database.azure.com   <none>         1d
kubernetes       ClusterIP      10.0.0.1      <none>                               443/TCP        8d
wp-external-lb   LoadBalancer   10.0.145.26   XX.XX.XX.XX                          80:31367/TCP   25m

# WordPressのPodの状態確認
$ kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
wordpress-5fbc6d9cc8-mhd8h   1/1       Running   0          2h

要查看 WordPress 中 Pod 的详细信息,请输入以下命令。

$ kubectl describe pod wordpress-5fbc6d9cc8-mhd8h
Name:           wordpress-5fbc6d9cc8-mhd8h
Namespace:      default
Node:           aks-agentpool-10122857-1/10.240.0.4
Start Time:     Sun, 22 Jul 2018 10:15:26 +0900
Labels:         app=wordpress
                pod-template-hash=1967285774
Annotations:    <none>
Status:         Running
IP:             XX.XX.XX.XX
Controlled By:  ReplicaSet/wordpress-5fbc6d9cc8
Containers:
  wordpress:
    Container ID:   docker://2e39cffc356eba2b9e634d143dd2887df7d2da4255b10835876732b0bd45d30a
    Image:          wordpress
    Image ID:       docker-pullable://wordpress@sha256:1958b7258b1e1b09bbec1c6269e2e150bcc85c18383aa2420d95cb95a30d107f
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Sun, 22 Jul 2018 10:16:10 +0900
    Ready:          True
    Restart Count:  0
    Environment Variables from:
      wp-configmap  ConfigMap  Optional: false
      wp-secrets    Secret     Optional: false
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-bjsjg (ro)
      /var/www/html from wp-azure-disk (rw)
Conditions:
  Type           Status
  Initialized    True
  Ready          True
  PodScheduled   True
Volumes:
  wp-azure-disk:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  wp-azure-disk
    ReadOnly:   false
  default-token-bjsjg:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-bjsjg
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:          <none>

ConditionsのReadyが「True」になっているので準備完了です。

实际上连接到WordPress网站

可以通过直接在浏览器中输入之前创建的公共IP地址,或者通过输入指定的FQDN(全限定域名)”XXX.japanease.cloudapp.azure.com”来连接WordPress网站。

image.png

image.png

image.png

image.png

最后

今回の記事ではKubernetesそのもののベストプラクティスについての話ではなく、Azure Kubernetes Service(AKS)の概要を中心に記載しました。

Azure Kubernetes Serviceを利用していく上でAzureの関連サービスをうまく連携して活用していく上で参考になればと思います。

最后,我已经将这次使用的所有yaml文件上传到GitHub,请随意使用。

https://github.com/katakura/aks-wordpress 这个链接是一个用于AKS的WordPress项目的GitHub仓库。

bannerAds