Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Azure Kubernetes Serviceで実現する超低予算&(ほぼ)フルマネージド&本格的なWordPress環境

Azure Kubernetes Serviceで実現する超低予算&(ほぼ)フルマネージド&本格的なWordPress環境

Noriyuki TAKEI

January 29, 2020
Tweet

More Decks by Noriyuki TAKEI

Other Decks in Technology

Transcript

  1. © SIOS Technology, Inc. All rights Reserved. Azure Kubernetes Serviceで実現する

    超低予算 & (ほぼ)フルマネージド & 本格的なWordPress環境 2020年1⽉29⽇ Kubernetes Meetup Tokyo #27
  2. © SIOS Technology, Inc. All rights Reserved. About me 2

    Internal Only BCPVUNF Noriyuki TAKEI ෢Ҫ ٓߦ Information • サイオステクノロジー株式会社 • 千葉県在住 Favorites • Azure • Squash • Sweets blog https://tech-lab.sios.jp/ core skill Azure Kubernetes Service Cloud Native, Serverless全般 Twitter @noriyukitakei
  3. © SIOS Technology, Inc. All rights Reserved. WordPress on k8s

    3 Internal Only 弊社技術ブログの WordPressを Kubernetesに 移⾏したお話です。
  4. © SIOS Technology, Inc. All rights Reserved. WordPress on k8s

    4 Internal Only 正直Kubernetesで ある必要はなかったですが、 ⾊々チャレンジ してみたかったのです。
  5. © SIOS Technology, Inc. All rights Reserved. WordPress on k8s

    5 Internal Only ハッシュタグ #k8sjp もしくは @noriyukitakei に忌憚ないご意⾒ お願いいたします
  6. © SIOS Technology, Inc. All rights Reserved. WordPress on k8s

    6 Internal Only Internal Only https://tech-lab.sios.jp/archives/18794 今回のセッションのお話は、弊社技術ブログでも ご覧頂けます。
  7. © SIOS Technology, Inc. All rights Reserved. 概要 8 Internal

    Only WordPressの基本的な構成は以下のとおりです。 /var/www/html wp-content index.php ・・・ wp-admin uploads plugins WordPressのコアモジュー ルでユーザーデータは含ま ず、基本的に変更はない。 画像やプラグインなど運⽤ 後に変更のあるファイルが ある。 MySQL Cookie Salt付きCookieです。 セッションは使っていない ので、サーバー側はステー トです。
  8. © SIOS Technology, Inc. All rights Reserved. 概要 9 Internal

    Only Kubernetes移⾏前の構成です。 /var/www/html wp-content index.php ・・・ wp-admin uploads plugins Virtual Machine MySQL https://tech-lab.sios.jp/ /var/www/html wp-content index.php ・・・ wp-admin uploads plugins Virtual Machine MySQL https://azure.sios.jp/
  9. © SIOS Technology, Inc. All rights Reserved. 概要 10 Internal

    Only tech-lab.sios.jp ブログページ azure.sios.jp ブログページ NGINX Ingress Pod Pod tech-lab.sios.jp ブログページ azure.sios.jp ブログページ NGINX Ingress バックエンド⽤Node バックエンド⽤Node Azure Load Balancer Azure Container Registry Azure Database for MySQL SendGrid NFS Server on VM tech-lab.sios.jp⽤ コンテンツ azure.sios.jp⽤ コンテンツ Azure Kubernetes Service L4でNGINX IngressのPodにロードバランシング Dockerイメージをpull メールを送信 画像などの コンテンツを マウント tech-lab.sios.jp⽤ データベース azure.sios.jp⽤ データベース フロントエンド⽤Node フロントエンド⽤Node Pod tech-lab.sios.jp 管理画⾯ azure.sios.jp 管理画⾯ Pod tech-lab.sios.jp 管理画⾯ azure.sios.jp 管理画⾯ Pod ユーザーのアクセス L7でWordPressのPodにロードバランシング 投稿情報などの データを参照 Kubernetes移⾏後の構成です。
  10. © SIOS Technology, Inc. All rights Reserved. 概要 11 Internal

    Only 基本構成は以下のとおりです。 2つのブログを4ノードのクラスターで運⽤している。 低性能で安価のVMにて静的なHTMLを処理、⾼性能で⾼価なVMでPHP やDBアクセスなど負荷の⾼い処理を実現している。 低性能で安価なVM、⾼性能で⾼価なVMへのリクエストの振り分けは NGINX Ingressにて実現している。 データベース、メール送信サービス、リポジトリサービスなど可能な限 りマネージドを利⽤している。 残念ながら共有ストレージのみVMにて運⽤している。 (理由は後述)
  11. © SIOS Technology, Inc. All rights Reserved. フロントエンド⽤Nodeと バックエンド⽤Nodeの振り分け 13

    Internal Only tech-lab.sios.jp ブログページ azure.sios.jp ブログページ NGINX Ingress Pod Pod tech-lab.sios.jp ブログページ azure.sios.jp ブログページ NGINX Ingress バックエンド⽤Node バックエンド⽤Node Azure Load Balancer Azure Container Registry Azure Database for MySQL SendGrid NFS Server on VM tech-lab.sios.jp⽤ コンテンツ azure.sios.jp⽤ コンテンツ Azure Kubernetes Service L4でNGINX IngressのPodにロードバランシング tech-lab.sios.jp⽤ データベース azure.sios.jp⽤ データベース フロントエンド⽤Node フロントエンド⽤Node Pod tech-lab.sios.jp 管理画⾯ azure.sios.jp 管理画⾯ Pod tech-lab.sios.jp 管理画⾯ azure.sios.jp 管理画⾯ Pod ユーザーがtech-lab.sios.jp の管理画⾯にアクセス L7でホスト名tech-lab.sios.jpで、ロケーション が/wp-adminだったものは、tech-lab.sios.jp 管理画⾯Podにリクエストを振る。
  12. © SIOS Technology, Inc. All rights Reserved. フロントエンド⽤Nodeと バックエンド⽤Nodeの振り分け 14

    Internal Only tech-lab.sios.jp ブログページ azure.sios.jp ブログページ NGINX Ingress Pod Pod tech-lab.sios.jp ブログページ azure.sios.jp ブログページ NGINX Ingress バックエンド⽤Node バックエンド⽤Node Azure Kubernetes Service PHPの実⾏やDBへのアクセスなど、管理画⾯系の 負荷の⾼い処理はCPU優先VMであるFシリーズの VMにリクエストを振る。 フロントエンド⽤Node フロントエンド⽤Node Pod tech-lab.sios.jp 管理画⾯ azure.sios.jp 管理画⾯ Pod tech-lab.sios.jp 管理画⾯ azure.sios.jp 管理画⾯ Pod バックエンド⽤ノードプール (インスタンスサイズ:F2s_v2) フロントエンド⽤ノードプール (インスタンスサイズ:B2s) 静的なHTML参照という負荷の低い処理は、性能は 控えめだけど安いVMであるBシリーズのVMにリク エストを振る。
  13. © SIOS Technology, Inc. All rights Reserved. フロントエンド⽤Nodeと バックエンド⽤Nodeの振り分け 15

    Internal Only WordPressの「WP Super Cache」というプラグインを⽤いて、 ⼀度アクセスしたページを静的なHTMLとしてキャッシュしていま す。
  14. © SIOS Technology, Inc. All rights Reserved. フロントエンド⽤Nodeと バックエンド⽤Nodeの振り分け 16

    Internal Only フロントエンド⽤Node × 2 Pod app: techlab-user Label env=user Label Pod app: ossonaz-user Label バックエンド⽤Node × 2 Pod app: techlab-admin Label env=admin Label Pod app: ossonaz-admin Label tech-lab.sios.jp ブログページ⽤ deployment tech-lab.sios.jp ブログページ⽤ ReplicaSets azure.sios.jp ブログページ⽤ deployment azure.sios.jp ブログページ⽤ ReplicaSets tech-lab.sios.jp 管理画⾯⽤ deployment tech-lab.sios.jp 管理画⾯⽤ ReplicaSets azure.sios.jp 管理画⾯⽤ deployment azure.sios.jp 管理画⾯⽤ ReplicaSets ・・・リソース ・・・ラベル azure.sios.jpブログページ⽤Podをenv=userの ラベルが付いたNodeに配置 tech-lab.sios.jp管理画⾯⽤Podをenv=admin のラベルが付いたNodeに配置 azure.sios.jp管理画⾯⽤Podをenv=adminのラ ベルが付いたNodeに配置 tech-lab.sios.jpブログページ⽤Podを env=userのラベルが付いたNodeに配置 システム管理者
  15. © SIOS Technology, Inc. All rights Reserved. フロントエンド⽤Nodeと バックエンド⽤Nodeの振り分け 17

    Internal Only nginx フロントエンド⽤Node × 2 Pod app: techlab-user Label env=user Label Pod app: ossonaz-user Label バックエンド⽤Node × 2 Pod app: techlab-admin Label env=admin Label Pod app: ossonaz-admin Label azure.sios.jp ブログページ⽤ NodePort tech-lab.sios.jp ブログページ⽤ NodePort tech-lab.sios.jp 管理画⾯⽤ NodePort azure.sios.jp 管理画⾯⽤ NodePort ・・・リソース ・・・ラベル アクセス先がhttps://azure.sios.jp/wp-adminの場合 アクセス先がhttps://tech-lab.sios.jp/wp-adminの場合 アクセス先がhttps://azure.sios.jp/wp-admin以外の場合 アクセス先がhttps://tech-lab.sios.jp/wp-admin以外の場合 ユーザー
  16. © SIOS Technology, Inc. All rights Reserved. WordPress on k8s

    18 Internal Only これより 詳細を ご説明します。
  17. © SIOS Technology, Inc. All rights Reserved. Load Balancer周り 20

    Internal Only Azure Kubernetes Serviceとは︖ Masterサーバー、Nodeサーバーを構築する必要なし。管理 も全ておまかせ。 Kubernetes⾃⾝のバージョンアップもGUIで⼀発 あとからNodeの追加も可能 Azureが提供するKubernetesのフルマネージドサービス
  18. © SIOS Technology, Inc. All rights Reserved. 21 Internal Only

    tech-lab.sios.jp ブログページ azure.sios.jp ブログページ NGINX Ingress Pod Pod tech-lab.sios.jp ブログページ azure.sios.jp ブログページ NGINX Ingress バックエンド⽤Node バックエンド⽤Node Azure Load Balancer Azure Container Registry Azure Database for MySQL SendGrid NFS Server on VM tech-lab.sios.jp⽤ コンテンツ azure.sios.jp⽤ コンテンツ Azure Kubernetes Service L4でNGINX IngressのPodにロードバランシング Dockerイメージをpull メールを送信 画像などの コンテンツを マウント tech-lab.sios.jp⽤ データベース azure.sios.jp⽤ データベース フロントエンド⽤Node フロントエンド⽤Node Pod tech-lab.sios.jp 管理画⾯ azure.sios.jp 管理画⾯ Pod tech-lab.sios.jp 管理画⾯ azure.sios.jp 管理画⾯ Pod ユーザーのアクセス L7でWordPressのPodにロードバランシング 投稿情報などの データを参照
  19. © SIOS Technology, Inc. All rights Reserved. Load Balancer周り 22

    Internal Only ロードバランサー周りの詳細は以下のとおりです。 NGINX IngressでServiceにリクエストを振っている。 NGINX IngressへのリクエストはパブリックIPアドレスを 割り当てたAzure Load Balancerで⾏っている。 NGINX Ingressで、ホスト名及びロケーションによって リクエストを割り振るPodを定義している。
  20. © SIOS Technology, Inc. All rights Reserved. Load Balancer周り 23

    Internal Only Azure Load Balancer及びNGINX Ingress両⽅とも構築はHelmで ⼀発︕︕ $ helm install stable/nginx-ingress \ --namespace techblog-nginx \ --set controller.replicaCount=2 \ --set controller.nodeSelector."beta\.kubernetes\.io/os"=linux \ --set defaultBackend.nodeSelector."beta\.kubernetes\.io/os"=linux \ --set controller.service.externalTrafficPolicy=Local \ --set controller.service.loadBalancerIP=“[ロードバランサーのPublicIP]" \ --generate-name
  21. © SIOS Technology, Inc. All rights Reserved. Load Balancer周り 24

    Internal Only NGINX Ingressのリソースを作成するマニフェストは以下の通り。 apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx name: techblog-ingress-nginx spec: rules: - host: tech-lab.sios.jp http: paths: # SIOS Tech.lab (https://tech-lab.sios.jp/)のブログページ向けのリクエストを # それ⽤に作成したNodePortに振ります。 - path: / backend: serviceName: techlab-user-np servicePort: 80 # SIOS Tech.lab (https://tech-lab.sios.jp/)の管理画⾯向けのリクエストを # それ⽤に作成したNodePortに振ります。 - path: /wp-admin backend: serviceName: techlab-admin-np servicePort: 80 ingress.yml
  22. © SIOS Technology, Inc. All rights Reserved. Load Balancer周り 25

    Internal Only - host: azure.sios.jp http: paths: # OSS on Azure (https://azure.sios.jp/)のブログページ向けのリクエストを # それ⽤に作成したNodePortに振ります。 - path: / backend: serviceName: ossonaz-user-np servicePort: 80 # OSS on Azure (https://azure.sios.jp/)の管理画⾯向けのリクエストを # それ⽤に作成したNodePortに振ります。 - path: /wp-admin backend: serviceName: ossonaz-admin-np servicePort: 80 # SSL終端するための証明書が格納されたSecertを定義します。 # この構成では、ワイルドカード証明書で2つのサイトを同じ証明書で終端しています。 tls: - secretName: siosjp-tls hosts: - tech-lab.sios.jp - azure.sios.jp 〜 前ページからの続き 〜 ingress.yml
  23. © SIOS Technology, Inc. All rights Reserved. Pod⽣成周り 27 Internal

    Only tech-lab.sios.jp ブログページ azure.sios.jp ブログページ NGINX Ingress Pod Pod tech-lab.sios.jp ブログページ azure.sios.jp ブログページ NGINX Ingress バックエンド⽤Node バックエンド⽤Node Azure Load Balancer Azure Container Registry Azure Database for MySQL SendGrid NFS Server on VM tech-lab.sios.jp⽤ コンテンツ azure.sios.jp⽤ コンテンツ Azure Kubernetes Service L4でNGINX IngressのPodにロードバランシング Dockerイメージをpull メールを送信 画像などの コンテンツを マウント tech-lab.sios.jp⽤ データベース azure.sios.jp⽤ データベース フロントエンド⽤Node フロントエンド⽤Node Pod tech-lab.sios.jp 管理画⾯ azure.sios.jp 管理画⾯ Pod tech-lab.sios.jp 管理画⾯ azure.sios.jp 管理画⾯ Pod ユーザーのアクセス L7でWordPressのPodにロードバランシング 投稿情報などの データを参照
  24. © SIOS Technology, Inc. All rights Reserved. Pod⽣成周り 28 Internal

    Only WordPressのDocker Imageは、起動時のdocker-entrypoint.sh で、毎回起動時にwp-content配下のプラグインを上書きしてしま うので、そうしないように修正してDockerイメージを作り直して、 Azure Container Registryにpushする。 sourceTarArgs=( --create --file - --directory /usr/src/wordpress --owner "$user" --group "$group" ) targetTarArgs=( --extract --file - ) if [ "$user" != '0' ]; then # avoid "tar: .: Cannot utime: Operation not permitted" and "tar: .: Cannot change mode to rwxr-xr-x: Operation not permitted" targetTarArgs+=( --no-overwrite-dir ) fi # これを追加してwp-contentを削除して上書きされるのを防ぐ rm -rf /usr/src/wordpress/wp-content tar "${sourceTarArgs[@]}" . | tar "${targetTarArgs[@]}" docker-entrypoint.sh
  25. © SIOS Technology, Inc. All rights Reserved. Pod⽣成周り 29 Internal

    Only tech-lab.sios.jp ブログページ azure.sios.jp ブログページ NGINX Ingress Pod Pod tech-lab.sios.jp ブログページ azure.sios.jp ブログページ NGINX Ingress バックエンド⽤Node バックエンド⽤Node Azure Load Balancer Azure Container Registry Azure Database for MySQL SendGrid NFS Server on VM tech-lab.sios.jp⽤ コンテンツ azure.sios.jp⽤ コンテンツ Azure Kubernetes Service L4でNGINX IngressのPodにロードバランシング Dockerイメージをpull メールを送信 画像などの コンテンツを マウント tech-lab.sios.jp⽤ データベース azure.sios.jp⽤ データベース フロントエンド⽤Node フロントエンド⽤Node Pod tech-lab.sios.jp 管理画⾯ azure.sios.jp 管理画⾯ Pod tech-lab.sios.jp 管理画⾯ azure.sios.jp 管理画⾯ Pod ユーザーのアクセス L7でWordPressのPodにロードバランシング 投稿情報などの データを参照
  26. © SIOS Technology, Inc. All rights Reserved. Pod⽣成周り 30 Internal

    Only ここからは各Podを⽣成するためのdeployment.yamlを説明しま すが、その前にWordPressでRollingUpdateを⾏うための⼿法につ いて説明します。 terminationGracePeriodSeconds (40秒) preStop sleep 3 apachectl –k graceful-stop sleep 30 SIGTERM SIGKILL サービス 除外 ユーザーの接続 ユーザーの接続 サービスからPodを切り離す処理と preStopは⾮同期で⾏われるため、サー ビス除外が終わってからpreStopが始ま るようにする。 SIGTERMだとApacheはユーザーのリ クエストをブッツリ切ってしまうので、 SIGTERMが送られる前にpreStopで Graceful Shutdownする。
  27. © SIOS Technology, Inc. All rights Reserved. Pod⽣成周り 31 Internal

    Only ここからは各Podを⽣成するためのdeployment.yamlを説明しま す。 apiVersion: apps/v1beta1 kind: Deployment metadata: name: techlab-user spec: replicas: 2 selector: matchLabels: app: techlab-user # ローリングアップデートする際、次のPodの更新に移るまでの間隔を指定する。 minReadySeconds: 60 # デプロイのタイムアウトで、この時間過ぎてもデプロイが成功しなければ中⽌する。 progressDeadlineSeconds: 600 strategy: # RollingUpdateするための設定。最⼤1個のPodの増加まで許容する形でRollingUpdateを⾏う。 type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 0 deployment.yml
  28. © SIOS Technology, Inc. All rights Reserved. Pod⽣成周り 32 Internal

    Only template: metadata: labels: app: techlab-user spec: # preStop + SIGTERM送信が終わるまでの時間を指定する。 terminationGracePeriodSeconds: 40 containers: - name: wordpress # 先程Azure Container RegistryにプッシュしたWordPressのイメージを指定する。 image: XXXXXX.azurecr.io/techblog/wordpress:php7.4 ports: - containerPort: 80 〜 前ページからの続き 〜 deployment.yml
  29. © SIOS Technology, Inc. All rights Reserved. Pod⽣成周り 33 Internal

    Only env: - name: WORDPRESS_DB_HOST value: "XXXXXX.mysql.database.azure.com" - name: WORDPRESS_DB_USER value: "siosadmin@techblog-db" # Secretリソースに登録したデータベースのパスワードを環境変数に格納する。 - name: WORDPRESS_DB_PASSWORD valueFrom: secretKeyRef: name: techblog-secret key: WORDPRESS_DB_PASSWORD - name: WORDPRESS_DB_NAME value: "techlab" # Secretリソースに登録したSALT値等をを環境変数に格納する。以下すべて同じ。 - name: WORDPRESS_AUTH_KEY valueFrom: secretKeyRef: name: techblog-secret key: WORDPRESS_AUTH_KEY ・・・以降かなりの数の環境変数の格納が続くので割愛・・・ 〜 前ページからの続き 〜 deployment.yml
  30. © SIOS Technology, Inc. All rights Reserved. Pod⽣成周り 34 Internal

    Only lifecycle: preStop: exec: # https://tech-lab.sios.jp/archives/18730を参照 # 確実にRollingUpdateを⾏うためにApacheをGracefulにShutdownする。 command: ["sh", "-c", "sleep 3; apachectl -k graceful-stop; sleep 30"] 〜 前ページからの続き 〜 deployment.yml
  31. © SIOS Technology, Inc. All rights Reserved. Pod⽣成周り 35 Internal

    Only # ヘルスチェック⽤の定義をする。 livenessProbe: httpGet: # ⾃前で作成したヘルスチェック⽤のPHPを指定する。 # ※MySQLに簡単なクエリを投げるスクリプトですが、後ほど詳細をご説明します。 path: /wp-content/healthcheck.php port: 80 scheme: HTTP # 何故かMySQLへのSSL接続が安定するまで時間かかるので、 # ヘルスチェック開始を4分ほど遅らせる。 initialDelaySeconds: 240 timeoutSeconds: 5 periodSeconds: 10 failureThreshold: 5 〜 前ページからの続き 〜 deployment.yml
  32. © SIOS Technology, Inc. All rights Reserved. Pod⽣成周り 36 Internal

    Only # Podがサービスインする準備ができているかどうかをチェックする。 readinessProbe: httpGet: # ⾃前で作成したヘルスチェック⽤のPHPを指定する。 # ※MySQLに簡単なクエリを投げるスクリプトですが、後ほど詳細をご説明します。 path: /wp-content/healthcheck.php port: 80 scheme: HTTP # 何故かMySQLへのSSL接続が安定するまで時間かかるので、 # ヘルスチェック開始を4分ほど遅らせる。 initialDelaySeconds: 240 timeoutSeconds: 5 periodSeconds: 10 failureThreshold: 5 〜 前ページからの続き 〜 deployment.yml
  33. © SIOS Technology, Inc. All rights Reserved. Pod⽣成周り 37 Internal

    Only resources: limits: memory: "500Mi" requests: memory: "500Mi" # NFS Serverで作成したボリュームをマウントする。 volumeMounts: - name: techblog-vlm mountPath: /var/www/html/wp-content # subPathを切って、NFS Serverのボリューム上に作成された # techlabディレクトリをマウントする。(NFS Serverの詳細は後ほど、、、) subPath: techlab 〜 前ページからの続き 〜 deployment.yml
  34. © SIOS Technology, Inc. All rights Reserved. Pod⽣成周り 38 Internal

    Only # env=userというラベルが付与されたNode(フロントエンド⽤Node)に # Podをスケジューリングする。 affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: env operator: In values: - user 〜 前ページからの続き 〜 deployment.yml
  35. © SIOS Technology, Inc. All rights Reserved. Pod⽣成周り 39 Internal

    Only Podのヘルスチェックスクリプトです。MySQLへの接続も含めて 確認をします。 <?php require_once('/var/www/html/wp-load.phpʼ); # DB接続⽤インスタンスを格納しているグローバル変数 global $wpdb; # 超簡単なSQLを発⾏します。 $result = $wpdb->get_col('select 1 as val'); # SQLの結果が無事返ってきたらHTTPステータスコード200、 # そうでない場合は、500を返します。 if ($result[0] == 1) { http_response_code(200); } else { http_response_code(500); } ?> healthcheck.php
  36. © SIOS Technology, Inc. All rights Reserved. データベース周り 41 Internal

    Only tech-lab.sios.jp ブログページ azure.sios.jp ブログページ NGINX Ingress Pod Pod tech-lab.sios.jp ブログページ azure.sios.jp ブログページ NGINX Ingress バックエンド⽤Node バックエンド⽤Node Azure Load Balancer Azure Container Registry Azure Database for MySQL SendGrid NFS Server on VM tech-lab.sios.jp⽤ コンテンツ azure.sios.jp⽤ コンテンツ Azure Kubernetes Service L4でNGINX IngressのPodにロードバランシング Dockerイメージをpull メールを送信 画像などの コンテンツを マウント tech-lab.sios.jp⽤ データベース azure.sios.jp⽤ データベース フロントエンド⽤Node フロントエンド⽤Node Pod tech-lab.sios.jp 管理画⾯ azure.sios.jp 管理画⾯ Pod tech-lab.sios.jp 管理画⾯ azure.sios.jp 管理画⾯ Pod ユーザーのアクセス L7でWordPressのPodにロードバランシング 投稿情報などの データを参照
  37. © SIOS Technology, Inc. All rights Reserved. データベース周り 42 Internal

    Only AzureのMySQLマネージドサービス「Azure Database for MySQL」を利⽤します。 tech-lab.sios.jp ブログページ Pod tech-lab.sios.jp 管理画⾯ Pod azure.sios.jp ブログページ Pod azure.sios.jp 管理画⾯ Pod アクセス Azure Database for MySQL techlab ossonaz アクセス アクセス アクセス
  38. © SIOS Technology, Inc. All rights Reserved. ストレージ周り 44 Internal

    Only tech-lab.sios.jp ブログページ azure.sios.jp ブログページ NGINX Ingress Pod Pod tech-lab.sios.jp ブログページ azure.sios.jp ブログページ NGINX Ingress バックエンド⽤Node バックエンド⽤Node Azure Load Balancer Azure Container Registry Azure Database for MySQL SendGrid NFS Server on VM tech-lab.sios.jp⽤ コンテンツ azure.sios.jp⽤ コンテンツ Azure Kubernetes Service L4でNGINX IngressのPodにロードバランシング Dockerイメージをpull メールを送信 画像などの コンテンツを マウント tech-lab.sios.jp⽤ データベース azure.sios.jp⽤ データベース フロントエンド⽤Node フロントエンド⽤Node Pod tech-lab.sios.jp 管理画⾯ azure.sios.jp 管理画⾯ Pod tech-lab.sios.jp 管理画⾯ azure.sios.jp 管理画⾯ Pod ユーザーのアクセス L7でWordPressのPodにロードバランシング 投稿情報などの データを参照
  39. © SIOS Technology, Inc. All rights Reserved. ストレージ周り 46 Internal

    Only 今回のストレージ周りの構成は以下のとおりです。 techlab plugins theme ・・・ ossonaz plugins theme ・・・ tech-lab.sios.jp ブログページ /var/www/html/wp-content Pod tech-lab.sios.jp 管理画⾯ /var/www/html/wp-content Pod azure.sios.jp ブログページ /var/www/html/wp-content Pod azure.sios.jp 管理画⾯ /var/www/html/wp-content Pod マウント マウント マウント マウント 共有ストレージ
  40. © SIOS Technology, Inc. All rights Reserved. ストレージ周り 47 Internal

    Only AzureにはKubernetesから利⽤できる3つの共有ストレージがあり ます。 Azure FilesというSMBベースの マネージドサービス Azure NetApp FilesというNFSベースの マネージドサービス VM上にNFS Serverを インストールしたもの
  41. © SIOS Technology, Inc. All rights Reserved. ストレージ周り 48 Internal

    Only Azure FilesというSMBベースの マネージドサービス Azure NetApp FilesというNFSベースの マネージドサービス VM上にNFS Serverを インストールしたもの Azure Filesを選択しました。
  42. © SIOS Technology, Inc. All rights Reserved. ストレージ周り 49 Internal

    Only 激オソ。 1ページあたり8秒程度の レスポンス
  43. © SIOS Technology, Inc. All rights Reserved. ストレージ周り 51 Internal

    Only <?php require_once('/var/www/html/wp-load.phpʼ); # DB接続⽤インスタンスを格納しているグローバル変数 global $wpdb; # 超簡単なSQLを発⾏します。 $result = $wpdb->get_col('select 1 as val'); # SQLの結果が無事返ってきたらHTTPステータスコード200、 # そうでない場合は、500を返します。 if ($result[0] == 1) { http_response_code(200); } else { http_response_code(500); } ?> healthcheck.php 単純なDBアクセススクリプト動かしたけど問題なし。
  44. © SIOS Technology, Inc. All rights Reserved. ストレージ周り 52 Internal

    Only プロファイラ(Blackfire) 使おう︕︕
  45. © SIOS Technology, Inc. All rights Reserved. ストレージ周り 55 Internal

    Only error_log(“hoge1”); // Turn register_globals off. wp_unregister_GLOBALS(); error_log(“hoge2”); // Standardize $_SERVER variables across setups. wp_fix_server_vars(); error_log(“hoge3”); // Check if we have received a request due to missing favicon.ico wp_favicon_request(); error_log(“hoge4”); // Check if we're in maintenance mode. wp_maintenance(); error_log(“hoge5”); // Start loading timer. timer_start(); error_log(“hoge6”); // Check if we're in WP_DEBUG mode. wp_debug_mode(); error_log(“hoge7”); if ( WP_CACHE && apply_filters( 'enable_loading_advanced_cache_dropin', true ) && file_exists( WP_CONTENT_DIR . '/advanced-cache.php' ) ) { error_log(“hoge8”); include( WP_CONTENT_DIR . '/advanced-cache.php' ); error_log(“hoge9”); if ( $wp_filter ) { $wp_filter = WP_Hook::build_preinitialized_hooks( $wp_filter ); }
  46. © SIOS Technology, Inc. All rights Reserved. ストレージ周り 56 Internal

    Only error_log(“hoge10”); foreach ( wp_get_mu_plugins() as $mu_plugin ) { error_log(“hoge11”); include_once( $mu_plugin ); error_log(“hoge12”); do_action( 'mu_plugin_loaded', $mu_plugin ); error_log(“hoge13”); } error_log(“hoge14”); unset( $mu_plugin ); error_log(“hoge14”); if ( is_multisite() ) { error_log(“hoge15”); foreach ( wp_get_active_network_plugins() as $network_plugin ) { error_log(“hoge16”); wp_register_plugin_realpath( $network_plugin ); error_log(“hoge17”); include_once( $network_plugin ); error_log(“hoge18”); do_action( 'network_plugin_loaded', $network_plugin ); error_log(“hoge19”); } error_log(“hoge20”); unset( $network_plugin ); }
  47. © SIOS Technology, Inc. All rights Reserved. ストレージ周り 57 Internal

    Only do_action( 'muplugins_loaded' ); error_log(“hoge21”); if ( is_multisite() ) { error_log(“hoge22”); ms_cookie_constants(); error_log(“hoge23”); } error_log(“hoge24”); wp_cookie_constants(); error_log(“hoge25”); wp_ssl_constants(); error_log(“hoge26”); require( ABSPATH . WPINC . '/vars.php' ); error_log(“hoge27”); create_initial_taxonomies(); error_log(“hoge28”); create_initial_post_types(); error_log(“hoge29”); wp_start_scraping_edited_file_errors(); error_log(“hoge30”); register_theme_directory( get_theme_root() ); error_log(“hoge31”); if ( ! is_multisite() ) { error_log(“hoge32”); wp_recovery_mode()->initialize(); error_log(“hoge33”); }
  48. © SIOS Technology, Inc. All rights Reserved. ストレージ周り 59 Internal

    Only error_log(“hoge10”); foreach ( wp_get_mu_plugins() as $mu_plugin ) { error_log(“hoge11”); include_once( $mu_plugin ); error_log(“hoge12”); do_action( 'mu_plugin_loaded', $mu_plugin ); error_log(“hoge13”); } error_log(“hoge14”); unset( $mu_plugin ); error_log(“hoge14”); if ( is_multisite() ) { error_log(“hoge15”); foreach ( wp_get_active_network_plugins() as $network_plugin ) { error_log(“hoge16”); wp_register_plugin_realpath( $network_plugin ); error_log(“hoge17”); include_once( $network_plugin ); error_log(“hoge18”); do_action( 'network_plugin_loaded', $network_plugin ); error_log(“hoge19”); } error_log(“hoge20”); unset( $network_plugin ); } ここで処理に異様に時間がか かっていることが発覚。 WordPressのプラグインを読み 取っているだけのところ。⼤量 のPHPファイルをincludeしてい る。
  49. © SIOS Technology, Inc. All rights Reserved. ストレージ周り 60 Internal

    Only SMBがボトルネックに なっているのでは︖
  50. © SIOS Technology, Inc. All rights Reserved. ストレージ周り 61 Internal

    Only Azure FilesというSMBベースの マネージドサービス Azure NetApp FilesというNFSベースの マネージドサービス VM上にNFS Serverを インストールしたもの Azure NetApp Filesに置き換えました。
  51. © SIOS Technology, Inc. All rights Reserved. ストレージ周り 62 Internal

    Only 解決︕︕ レスポンスが激ハヤに︕︕
  52. © SIOS Technology, Inc. All rights Reserved. ストレージ周り 65 Azureサブスクリプション

    NetAppアカウント NetAppアカウント NetAppアカウント 容量プール (最⼩4TiB) ボリューム (最⼩100GiB) 容量プール (最⼩4TiB) 容量プール (最⼩4TiB) ボリューム (最⼩100GiB) ボリューム (最⼩100GiB) Pod Pod Pod Azure Kubernetes Cluster ここに対して課⾦ がされるものかと 思ったら、、、
  53. © SIOS Technology, Inc. All rights Reserved. ストレージ周り 66 Azureサブスクリプション

    NetAppアカウント NetAppアカウント NetAppアカウント 容量プール (最⼩4TiB) ボリューム (最⼩100GiB) 容量プール (最⼩4TiB) 容量プール (最⼩4TiB) ボリューム (最⼩100GiB) ボリューム (最⼩100GiB) Pod Pod Pod Azure Kubernetes Cluster 実はここでした。
  54. © SIOS Technology, Inc. All rights Reserved. ストレージ周り 67 Internal

    Only Azure FilesというSMBベースの マネージドサービス Azure NetApp FilesというNFSベースの マネージドサービス VM上にNFS Serverを インストールしたもの VM上のNFSサーバーに置き換えました。
  55. © SIOS Technology, Inc. All rights Reserved. ストレージ周り 68 Internal

    Only 今度こそ本当に解決︕︕ (価格的な意味でも)
  56. © SIOS Technology, Inc. All rights Reserved. ストレージ周り 69 Internal

    Only ストレージでVM使っ ているので(ほぼ)に なります。。。
  57. © SIOS Technology, Inc. All rights Reserved. 気になるお値段は・・・ 71 Internal

    Only フロントエンド⽤Node 9,076円/⽉ (4,538円/⽉ × 2) バックエンド⽤Node 17,856円/⽉ (8,928円/⽉ × 2) Azure Database for MySQL 4,337円/⽉ NFS Server on VM 4,129円/⽉ 合計 35,398円/⽉
  58. © SIOS Technology, Inc. All rights Reserved. さいごに 74 Internal

    Only Internal Only https://tech-lab.sios.jp/ そんな苦労して移⾏した弊社技術ブログは、下記URL でお届けしております。⾒てね︕︕