Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
© SIOS Technology, Inc. All rights Reserved. Azure Kubernetes Serviceで実現する 超低予算 & (ほぼ)フルマネージド & 本格的なWordPress環境 2020年1⽉29⽇ Kubernetes Meetup Tokyo #27
Slide 2
Slide 2 text
© 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
Slide 3
Slide 3 text
© SIOS Technology, Inc. All rights Reserved. WordPress on k8s 3 Internal Only 弊社技術ブログの WordPressを Kubernetesに 移⾏したお話です。
Slide 4
Slide 4 text
© SIOS Technology, Inc. All rights Reserved. WordPress on k8s 4 Internal Only 正直Kubernetesで ある必要はなかったですが、 ⾊々チャレンジ してみたかったのです。
Slide 5
Slide 5 text
© SIOS Technology, Inc. All rights Reserved. WordPress on k8s 5 Internal Only ハッシュタグ #k8sjp もしくは @noriyukitakei に忌憚ないご意⾒ お願いいたします
Slide 6
Slide 6 text
© SIOS Technology, Inc. All rights Reserved. WordPress on k8s 6 Internal Only Internal Only https://tech-lab.sios.jp/archives/18794 今回のセッションのお話は、弊社技術ブログでも ご覧頂けます。
Slide 7
Slide 7 text
© SIOS Technology, Inc. All rights Reserved. 概要 7
Slide 8
Slide 8 text
© 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です。 セッションは使っていない ので、サーバー側はステー トです。
Slide 9
Slide 9 text
© 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/
Slide 10
Slide 10 text
© 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移⾏後の構成です。
Slide 11
Slide 11 text
© SIOS Technology, Inc. All rights Reserved. 概要 11 Internal Only 基本構成は以下のとおりです。 2つのブログを4ノードのクラスターで運⽤している。 低性能で安価のVMにて静的なHTMLを処理、⾼性能で⾼価なVMでPHP やDBアクセスなど負荷の⾼い処理を実現している。 低性能で安価なVM、⾼性能で⾼価なVMへのリクエストの振り分けは NGINX Ingressにて実現している。 データベース、メール送信サービス、リポジトリサービスなど可能な限 りマネージドを利⽤している。 残念ながら共有ストレージのみVMにて運⽤している。 (理由は後述)
Slide 12
Slide 12 text
© SIOS Technology, Inc. All rights Reserved. フロントエンド⽤Nodeと バックエンド⽤Nodeの振り分け 12
Slide 13
Slide 13 text
© 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にリクエストを振る。
Slide 14
Slide 14 text
© 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にリク エストを振る。
Slide 15
Slide 15 text
© SIOS Technology, Inc. All rights Reserved. フロントエンド⽤Nodeと バックエンド⽤Nodeの振り分け 15 Internal Only WordPressの「WP Super Cache」というプラグインを⽤いて、 ⼀度アクセスしたページを静的なHTMLとしてキャッシュしていま す。
Slide 16
Slide 16 text
© 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に配置 システム管理者
Slide 17
Slide 17 text
© 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以外の場合 ユーザー
Slide 18
Slide 18 text
© SIOS Technology, Inc. All rights Reserved. WordPress on k8s 18 Internal Only これより 詳細を ご説明します。
Slide 19
Slide 19 text
© SIOS Technology, Inc. All rights Reserved. Load Balancer周り 19
Slide 20
Slide 20 text
© SIOS Technology, Inc. All rights Reserved. Load Balancer周り 20 Internal Only Azure Kubernetes Serviceとは︖ Masterサーバー、Nodeサーバーを構築する必要なし。管理 も全ておまかせ。 Kubernetes⾃⾝のバージョンアップもGUIで⼀発 あとからNodeの追加も可能 Azureが提供するKubernetesのフルマネージドサービス
Slide 21
Slide 21 text
© 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にロードバランシング 投稿情報などの データを参照
Slide 22
Slide 22 text
© SIOS Technology, Inc. All rights Reserved. Load Balancer周り 22 Internal Only ロードバランサー周りの詳細は以下のとおりです。 NGINX IngressでServiceにリクエストを振っている。 NGINX IngressへのリクエストはパブリックIPアドレスを 割り当てたAzure Load Balancerで⾏っている。 NGINX Ingressで、ホスト名及びロケーションによって リクエストを割り振るPodを定義している。
Slide 23
Slide 23 text
© 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
Slide 24
Slide 24 text
© 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
Slide 25
Slide 25 text
© 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
Slide 26
Slide 26 text
© SIOS Technology, Inc. All rights Reserved. Pod⽣成周り 26
Slide 27
Slide 27 text
© 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にロードバランシング 投稿情報などの データを参照
Slide 28
Slide 28 text
© 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
Slide 29
Slide 29 text
© 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にロードバランシング 投稿情報などの データを参照
Slide 30
Slide 30 text
© 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する。
Slide 31
Slide 31 text
© 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
Slide 32
Slide 32 text
© 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
Slide 33
Slide 33 text
© 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
Slide 34
Slide 34 text
© 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
Slide 35
Slide 35 text
© 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
Slide 36
Slide 36 text
© 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
Slide 37
Slide 37 text
© 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
Slide 38
Slide 38 text
© 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
Slide 39
Slide 39 text
© SIOS Technology, Inc. All rights Reserved. Pod⽣成周り 39 Internal Only Podのヘルスチェックスクリプトです。MySQLへの接続も含めて 確認をします。 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
Slide 40
Slide 40 text
© SIOS Technology, Inc. All rights Reserved. データベース周り 40
Slide 41
Slide 41 text
© 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にロードバランシング 投稿情報などの データを参照
Slide 42
Slide 42 text
© 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 アクセス アクセス アクセス
Slide 43
Slide 43 text
© SIOS Technology, Inc. All rights Reserved. ストレージ周り 43
Slide 44
Slide 44 text
© 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にロードバランシング 投稿情報などの データを参照
Slide 45
Slide 45 text
© SIOS Technology, Inc. All rights Reserved. ストレージ周り 45 Internal Only ⼀番苦労しました。
Slide 46
Slide 46 text
© 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 マウント マウント マウント マウント 共有ストレージ
Slide 47
Slide 47 text
© SIOS Technology, Inc. All rights Reserved. ストレージ周り 47 Internal Only AzureにはKubernetesから利⽤できる3つの共有ストレージがあり ます。 Azure FilesというSMBベースの マネージドサービス Azure NetApp FilesというNFSベースの マネージドサービス VM上にNFS Serverを インストールしたもの
Slide 48
Slide 48 text
© SIOS Technology, Inc. All rights Reserved. ストレージ周り 48 Internal Only Azure FilesというSMBベースの マネージドサービス Azure NetApp FilesというNFSベースの マネージドサービス VM上にNFS Serverを インストールしたもの Azure Filesを選択しました。
Slide 49
Slide 49 text
© SIOS Technology, Inc. All rights Reserved. ストレージ周り 49 Internal Only 激オソ。 1ページあたり8秒程度の レスポンス
Slide 50
Slide 50 text
© SIOS Technology, Inc. All rights Reserved. ストレージ周り 50 Internal Only DB︖
Slide 51
Slide 51 text
© SIOS Technology, Inc. All rights Reserved. ストレージ周り 51 Internal Only 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アクセススクリプト動かしたけど問題なし。
Slide 52
Slide 52 text
© SIOS Technology, Inc. All rights Reserved. ストレージ周り 52 Internal Only プロファイラ(Blackfire) 使おう︕︕
Slide 53
Slide 53 text
© SIOS Technology, Inc. All rights Reserved. ストレージ周り 53 Internal Only エラーで 動かない
Slide 54
Slide 54 text
© SIOS Technology, Inc. All rights Reserved. ストレージ周り 54 Internal Only Print debug しよう
Slide 55
Slide 55 text
© 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 ); }
Slide 56
Slide 56 text
© 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 ); }
Slide 57
Slide 57 text
© 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”); }
Slide 58
Slide 58 text
© SIOS Technology, Inc. All rights Reserved. ストレージ周り 58 Internal Only
Slide 59
Slide 59 text
© 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してい る。
Slide 60
Slide 60 text
© SIOS Technology, Inc. All rights Reserved. ストレージ周り 60 Internal Only SMBがボトルネックに なっているのでは︖
Slide 61
Slide 61 text
© SIOS Technology, Inc. All rights Reserved. ストレージ周り 61 Internal Only Azure FilesというSMBベースの マネージドサービス Azure NetApp FilesというNFSベースの マネージドサービス VM上にNFS Serverを インストールしたもの Azure NetApp Filesに置き換えました。
Slide 62
Slide 62 text
© SIOS Technology, Inc. All rights Reserved. ストレージ周り 62 Internal Only 解決︕︕ レスポンスが激ハヤに︕︕
Slide 63
Slide 63 text
© SIOS Technology, Inc. All rights Reserved. ストレージ周り 63 Internal Only リリース前⽇に 問題発覚
Slide 64
Slide 64 text
© SIOS Technology, Inc. All rights Reserved. ストレージ周り 64 Internal Only たった2⽇で4万円
Slide 65
Slide 65 text
© SIOS Technology, Inc. All rights Reserved. ストレージ周り 65 Azureサブスクリプション NetAppアカウント NetAppアカウント NetAppアカウント 容量プール (最⼩4TiB) ボリューム (最⼩100GiB) 容量プール (最⼩4TiB) 容量プール (最⼩4TiB) ボリューム (最⼩100GiB) ボリューム (最⼩100GiB) Pod Pod Pod Azure Kubernetes Cluster ここに対して課⾦ がされるものかと 思ったら、、、
Slide 66
Slide 66 text
© SIOS Technology, Inc. All rights Reserved. ストレージ周り 66 Azureサブスクリプション NetAppアカウント NetAppアカウント NetAppアカウント 容量プール (最⼩4TiB) ボリューム (最⼩100GiB) 容量プール (最⼩4TiB) 容量プール (最⼩4TiB) ボリューム (最⼩100GiB) ボリューム (最⼩100GiB) Pod Pod Pod Azure Kubernetes Cluster 実はここでした。
Slide 67
Slide 67 text
© SIOS Technology, Inc. All rights Reserved. ストレージ周り 67 Internal Only Azure FilesというSMBベースの マネージドサービス Azure NetApp FilesというNFSベースの マネージドサービス VM上にNFS Serverを インストールしたもの VM上のNFSサーバーに置き換えました。
Slide 68
Slide 68 text
© SIOS Technology, Inc. All rights Reserved. ストレージ周り 68 Internal Only 今度こそ本当に解決︕︕ (価格的な意味でも)
Slide 69
Slide 69 text
© SIOS Technology, Inc. All rights Reserved. ストレージ周り 69 Internal Only ストレージでVM使っ ているので(ほぼ)に なります。。。
Slide 70
Slide 70 text
© SIOS Technology, Inc. All rights Reserved. 気になるお値段は・・・ 70
Slide 71
Slide 71 text
© 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円/⽉
Slide 72
Slide 72 text
© SIOS Technology, Inc. All rights Reserved. さいごに 72
Slide 73
Slide 73 text
© SIOS Technology, Inc. All rights Reserved. さいごに 73 ⾊々ありましたが 無事稼働できて何よりです
Slide 74
Slide 74 text
© SIOS Technology, Inc. All rights Reserved. さいごに 74 Internal Only Internal Only https://tech-lab.sios.jp/ そんな苦労して移⾏した弊社技術ブログは、下記URL でお届けしております。⾒てね︕︕
Slide 75
Slide 75 text
ご清聴ありがとうございました