Pocket

センシンロボティクス Advent Calendar 2023 4日目の記事です。

ついに!長年(4年)動いていた個人Kubernetes環境であるwiki.adachin.me(WordPress)ですが、1台のAppコンテナからNginxを切り離すことができました。説明するのが長くなりますが、諸々改善したことをまとめていこうと思います。

ちなみに以下は初めてKubernetes運用した時のブログ!懐かしすぎる…

[DigitalOcean]KubernetesでWordPressを動かしてwikiブログを始めました!


改善したこと

  • 新たにadachin-wikiリポジトリの作成
  • WordPressのソースコードをGit管理
  • Dockerで開発環境の構築
    • Appコンテナ(php-fpm,Nginx)のNginxを分離して独立したコンテナに
  • 本番環境のDockerfileの修正
  • Manifestの修正
    • PersistentVolumeの廃止
    • Container Registryにwiki-app、wiki-nginxリポジトリを作成
  • CircleCIでのデプロイ修正
  • 最後にVolumes Block Storageの削除

[DigitalOcean][Kubernetes]ローリングアップデート時のダウンタイムを改善してStatefulSetからDeploymentに移行した

そもそもですが、WordPressのソースコードはAppコンテナでPersistentVolumeを使って永続的にボリュームマウントをしていました。よくボリュームマウントしてWordPressを運用するのが一般的ですが、間違ったときに削除してしまったり、復元するにも工数が取れられてしまうので、個人的にはその運用は好きではありません。なので、GitHubでソースコードを管理した方がいつでも元に戻せますし、PHPのバージョンアップをする時にもDockerで開発環境を作ればデバッグ等しやすくなります。まずはWordPressをGit管理して、開発環境からNginxを分離するところから説明していきましょう。


WordPressのソースコードをGit管理

  • .gitignore

  • wp-config.php

WordPressのソースコードはプラグイン含めると壮大です。必ずcache、upgrade、uploadsディレクトリは.gitignoreに入れましょう。画像はWp Offload Media LiteでDigitalOceanのSpaces Object Storageに置く前提となります。wp-config.phpのパスワード等は今回KubernetesのSecretsで管理するため、環境変数化しました。


Dockerでの開発環境構築

  • 構成

  • docker/dev/app/Dockerfile

  • docker/dev/nginx/Dockerfile

  • docker-compose.yml

Nginxコンテナを分離するためには、まずphp-fpmに対してどのようにリバースプロキシしなければならないのか考慮する必要があります。方法としてはContainer LinkでのPort接続かUNIXドメインソケットの二択になります。サーバー1台の場合ではUNIXドメインソケットの方がパフォーマンスが上がりますが、コンテナの場合だと、どちらもあまり変わらないそうです。ですが、8%早いとなれば、今回はUNIXドメインソケットを採用しました。以下のようにボリュームマウント先としてAppコンテナとNginxコンテナに対して /var/run/php-fpm 配下にphp-fpm.sockが作成されます。今までSupervisorを利用していましたが、単体でphp-fpmやNginxを起動するようにしました。最後に起動してアクセスできれば開発環境は完了になります。


    本番環境のDockerfileを作成

    • docker/prd/wiki/app/Dockerfile

    • docker/prd/wiki/nginx/Dockerfile

    Appコンテナではソースコードをコピーして、ディレクトリの権限を変更しないと以下のように書き込みができなくなるので注意しましょう。あとはDigitalOceanのContainer Registryにpushしてみます。ちなみに以下で以前に独自コンテナをContainer Registryにpushしたブログを書いていたので参考に。

    Appコンテナは約300MBで、Nginxコンテナは約30MBですね。もうちょい絞れそう。

    NOTICE: PHP message: PHP Warning: mkdir(): Permission denied in /var/www/wiki.adachin.me/wp-content/plugins/wp-optimize/vendor/rosell-dk/webp-convert/src/Convert/Converters/BaseTraits/DestinationPreparationTrait.php on line 41

    [DigitalOcean][Kubernetes][Container Registry]独自のWordPressコンテナイメージに移行してみた


    ManifestとCircleCIのデプロイ修正

    • secret.yaml

    Secretsではbase64にしていますが、decodeしてしまえば中身が丸見えなので、Git管理してはNGです。なので、gitignoreしてSpaces Object Storageのprivateで管理することにしました。

    • wiki-app.yaml

    大本のManifestではソースコードがコピーされているwiki-appコンテナをマウントしてまうと起動時に消えてしまいます。方法としてはinitContainersを利用して、別ディレクトリ(/wiki)にコピー後にその/wikiをさらに/var/www/wiki.adachin.meとしてボリュームマウントさせました。ECSのボリュームマウントは共有マウントなので少し挙動が違いますね。php-fpm-socketもボリュームマウントしているので、NginxコンテナがAppコンテナに対してUNIXドメインソケットの接続ができます。wiki-appではSecretsで管理している環境変数をenvとして読み込むようにしました。

    また、コンテナが2台になったことでCPUやメモリーのlimitsを適切な数値にしないと、デプロイ時にOOM Killerが発生してコンテナが再起動することが多かったので、スペックを2coreに変更しました。実際にapplyして見るとPodの中にコンテナが2台動いていることが分かります。Nginxコンテナからもソースコードとphp-fpm.sockがマウントされていることも確認できました。

    • CircleCIの修正

    • .circleci/workflows.yml

    • .circleci/workflows.yml

      CircleCIのデプロイは新規のリポジトリに移行したので、大幅に変更はないですが、build、tag、pushはコンテナ2台を実行してsecret.yamlをダウンロードしてるくらいです。デプロイ方法は前回のブログでも書いているので参考に。

      • プラグインのバージョンアップの運用方法は?

      このままブラウザからWordPressのプラグイン等バージョンアップしてしまうとデプロイ時に元に戻ってしまうため、開発環境でバージョンアップしたローカルの差分をgit pushして本番リリースする流れとなります

      [DigitalOcean][Kubernetes]WordPressコンテナをCircleCIで自動デプロイとローリングアップデートを実装してみた


      レスポンスはどうなったのか?

      709ms!少し早くなったかも!?2000msになっているところはちょうど切り替えて色々と失敗した形跡が見られますね。


      まとめ

      Kubernetesでコンテナ分離したのは初めてだったのでなかなか大変だった。。特にボリュームマウントでソースコードが上書きされて消える件はハマった。だいぶモダン化してイミュータブルになったので、少し個人の環境は落ち着いたかな!と思いきや、New Relicで監視するの忘れてたので後で設定してみます。それとPHP8にもようやくバージョンアップできそうなのでやらねば…

      そういえばおーしゃんで外形監視ができるようになっている!?

      https://www.digitalocean.com/products/uptime-monitoring

      Pocket


      adachin

      1989年生まれのSRE。ホスティングから大規模なアドテクなどのインフラエンジニアとして携わる。現在はサービスの信頼性向上、DevOps、可用性、レイテンシ、パフォーマンス、モニタリング、オブザーバビリティ、緊急対応、AWS/Azureでのインフラ構築、Docker開発環境の提供、Kubernetes保守、インフラコード化、新技術の検証、リファクタリング、セキュリティ強化などを担当している。個人事業主では数社サーバー保守とベンチャー企業のSREインフラコンサルティングやMENTAで未経験者にインフラのコーチング/コミュニティの運用を実施している。また、「脆弱性スキャナVuls」のOSS活動もしており、自称エバンジェリスト/技術広報/テクニカルサポート/コントリビュータでもある。

      0件のコメント

      コメントを残す

      このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください