Pocket

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

半年前に個人のDigitalOceanで運用しているKubernetes(wiki.adachin.me)をWordPress公式コンテナイメージから独自イメージに移行しました。そこでようやく、CircleCIで自動デプロイとローリングアップデートを実装してみたのでブログします。


デプロイ構成

CircleCIにはOrbsがありますが、DigitalOceanには対応していません。そのため職人のようにシェルを自前で実装する必要があります。ですが、Kubernetesが提供しているkubectlがうまいことやってくれますので、そこまでハマることはないと思います。(自分は5時間かかりましたが…)簡単にデプロイの流れとしては以下となります。

  • CircleCIのpath-filteringで特定ディレクトリに差分があれば実行
    • docker/prd/wiki/.*
    • k8s/wiki/manifests/wordpress.yaml
  • kubectl、doctlパッケージをインストール
  • docker build、tag、Containter Registryにpush
  • kubectl applyでローリングアップデート

準備

[DigitalOcean]kubectlを利用できるように設定

まずはローカルで利用するDigitalOceanが提供しているコマンドライン・ツール doctl(awscli的な)kubectl が利用できるように初期設定をしましょう。これらをCircleCIで駆使します。


Fix CircleCI

  • リポジトリ構成

  • CircleCI側で設定するEnvironment Variables(環境変数)
    • KUBERNETES_CLUSTER_CERTIFICATE(/.kube/configのcertificate-authority-dataを指定)
    • DO_API_TOKEN(doctlで利用するAPIを指定)
  • .circleci/config.yml

path-filtering を利用しているので、docker/prd/wiki、k8s/wiki/manifests/wordpress.yamlに差分があった場合にデプロイするように追加しました。

  • .circleci/workflows.yml

docker buildで利用するbaseイメージは cimg/base:edge を選択しました。また、事前にインストールする kubectl  と doctlreferences で管理しました。(ここはシェル化しちゃっても良さそう)

docker buildとtagの14行目は $CIRCLECI_SHA1  で最終コミットを識別するハッシュ値を指定しました(Orbsの裏側も同じなはず)。ちなみにdocker imageのtagをlatestで管理してしまうと何かあったときに元に戻せなくなってしまうため、コミットハッシュがベストです。この変数を利用して後ほど出てくるデプロイシェルや、manifestsファイルでも利用します。

  • deploy-wiki.sh

このデプロイスクリプトで工夫しなければならないことは上記で指定した CIRCLE_SHA1 コミットハッシュをmanifestsファイル内でimage URLとして環境変数に渡さなければなりません。そこでsedを使う方法もありますが、可読性は低くなってしまうので、enbsubstコマンドを利用しました。変数展開などテンプレートエンジンのような仕組みを作れるので非常に便利です。最後の段落ではContainer Registry(garbage-collection)の容量が貯まるため、毎回最適化しています。最後にmanifestsファイルを見てみましょう。


Fix Manifest

manifestsファイルでは8行目でreplicasを2台に変更と、updateStrategyではRollingUpdateを追加しました。22行目では先程のtagをコミットハッシュとして指定しています。

ところで、replicasを1台から2台に変更した理由としてはデプロイ時のローリングアップデートで1台だと何故かLBから外れて503になってしまいました。ヘルスチェックの調整が必要そうなので、後ほど調査します。一旦デプロイ時のダウンタイムは防ぐことができました。また、クラスターは1core メモリー2GBなので、php-fpmのチューニングをしました。

ちなみにkindで StatefulSet/ステートフル/状態を持つPod を指定している理由は volumeClaimTemplates でWordPressのソースコードをマウントしているためです。今後はリポジトリでソースコードも管理しようと思いますので、 Deployment/ステートレス/状態を持たないPod に変更したほうが良さそうです。以下参考にさせていただきました。

https://sorarinu.dev/2021/08/kubernetes_01/

※Deploymentに移行してローリングアップデートのダウンタイムを改善しました

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


Test Deploy

  • Rolling Update

  • Podsのimage確認


    まとめ

    今回Kubernetesでの自動デプロイは初めて実装しました。Kubernetesは独自の知識が必要なので、デバッグには少々時間がかかりましたが、ようやくやりたかったことができたので満足です。プライベート充実!次はソースコードをリポジトリで管理しようと思いますので、また改善できたらブログしたいと思います。それでは!

    参考

    Pocket


    adachin

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

    0件のコメント

    コメントを残す

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