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

約6年間運用したシステムをKubernetesに完全移行するまで/Kubernetes Nov...

約6年間運用したシステムをKubernetesに完全移行するまで/Kubernetes Novice Tokyo

2022.6.28
Kubernetes Novice Tokyo #20

Isao Shimizu

June 28, 2022
Tweet

More Decks by Isao Shimizu

Other Decks in Technology

Transcript

  1. ˜NJYJ *OD"MMSJHIUTSFTFSWFE About Me 清⽔ 勲 @isaoshimizu • 2011年〜 株式会社ミクシィ

    • 2011年〜2014年 SNS「mixi」運⽤エンジニア • 2014年〜2018年 モンスターストライク SRE • 2018年〜現在 家族アルバム みてね SRE • 2022年1⽉〜 SREグループ マネージャー 週末は社会⼈吹奏楽団での活動(楽団⻑、トロンボーン約30年、たまに指揮者)。 キャンプとクラフトビールが好き。 2
  2. ˜NJYJ *OD"MMSJHIUTSFTFSWFE サービスリリース当初(2015年)のシステム • iOS/Android • Ruby on Rails •

    AWS • OpsWorks • S3 • Route 53 • SES • SNS 5 Rails on EC2 Rails on EC2 EC2 AWS OpsWorks Chef Deploy Auto Scale Deploy Scale Out GitHub serverapp repo GitHub cookbook repo AWS OpsWorksによるオーケストレーション
  3. ˜NJYJ *OD"MMSJHIUTSFTFSWFE 当初(2015年)のシステム • AWS OpsWorksによるオーケストレーション • Chef、Cookbookによるインフラの⾃動化 • Railsアプリケーションのデプロイにも対応

    • EC2インスタンスを統合管理 • OpsWorks独⾃のオートスケール(時刻ベース、ロードベースなど) • EC2のモニタリング機能の統合 • ユーザー管理、SSHキーの管理機能 などなど。当時は効率よく開発、デプロイができていた。 6
  4. ˜NJYJ *OD"MMSJHIUTSFTFSWFE Kubernetes移⾏前(2018年頃)の課題 • Cookbookの管理、コードの依存関係が複雑に • Chefによるデプロイ速度の問題 • オートスケールが遅い(ピーク帯に問題が起きやすい) •

    SSHしてホスト内で作業をすることの煩わしさ • Docker使って開発したい(=本番でもDocker使いたい) • オンデマンドインスタンス前提でコスト⾼ • Cron実⾏のSPOF問題 • WebUIでポチポチ作業、ワークロードの種類や台数が増えるとつらい • OpsWorks独⾃仕様(上位Cookbook、エージェントの謎アップデートなど) 8
  5. ˜NJYJ *OD"MMSJHIUTSFTFSWFE Kubernetesを選ぶにあたって検討・準備したこと • 2018年の夏頃にシステムリニューアルの検討を開始 • オーケストレーションとしてAmazon ECS、Amazon EKSどちらを選ぶか •

    EKSの東京リージョンはまだ来てなかった頃、今ほど機能もない • S3に⼤量のデータを持っているため、AWS以外の選択肢はない • Kubernetesの知識がほぼない中、オレゴンリージョンのEKSを触ってみる • Kubernetes完全ガイドを買って勉強したり他社事例を漁りまくる • OSSである点、開発が活発である点、エコシステムの充実ぶりに魅⼒を感じた • 「家族アルバム みてね」のシステムにフィットするかどうか • いくつかのサービス、Rails&Sidekiq、GPUが必要なワークロード、多数のCron設定 • Kubernetesであれば⼀通り対応できるだろうという予測 • AWS Solution Architectの⽅々と何度も相談を繰り返した 10
  6. ˜NJYJ *OD"MMSJHIUTSFTFSWFE Kubernetesを運⽤する前に感じた不安 • Secretsの扱いどうするのが正解なのか • コンテナイメージのCI/CDの実装イメージがなかなかできなかった • db:migrateやassets:precompileをどこでどのタイミングで実⾏するのか(できるのか) •

    KustomizeやHelmを選ぶことは正しいのか • EKSのアップデートはどういう⼿順を取るべきなのか • オートスケールは正しく機能するのか(Cluster AutoscalerやHPAなど) • AWSリソースのクォーターに引っかからないか • CronJobは時刻通りにちゃんと起動するのか • 従来と同レベルのモニタリングができるのか • AWSアカウント、VPC、クラスターの分割単位どうするのが良いのか 12
  7. ˜NJYJ *OD"MMSJHIUTSFTFSWFE Kubernetesを運⽤する前に感じた不安(それぞれの解) • Secretsの扱いどうするのが正解なのか => External Secretsを採⽤。AWS Systems Manager

    Parameter Storeと連携。 • コンテナイメージのCI/CDの実装イメージがなかなかできなかった => GitHub ActionsとArgo CDを採⽤。GitOpsが便利。利⽤事例や開発頻度なども参考に。 • db:migrateやassets:precompileをどこでどのタイミングで実⾏するのか(できるのか) => db:migrateはArgo CDのPreSync hookを利⽤しSync前に実⾏される。 assets:precompileはmasterブランチにマージされたタイミングでGitHub Actionsで実⾏される。 • KustomizeやHelmを選ぶことは正しいのか => Argo CDを使うということで、Helmを採⽤。Kustomizeは使っていない。 • EKSのアップデートはどういう⼿順を取るべきなのか => 既存のクラスターをそのままアップデートするのはリスクが⾼いため、新バージョンのクラスターを 新たに作って移⾏する⼿順に。 13
  8. ˜NJYJ *OD"MMSJHIUTSFTFSWFE Kubernetesを運⽤する前に感じた不安(それぞれの解) • オートスケールは正しく機能するのか(Cluster AutoscalerやHPAなど) => Job Workerで検証する。本番で徐々にチューニングしていく。ある程度知⾒が溜まったらAPIにも。 •

    AWSリソースのクォーターに引っかからないか => ハマりポイントはAWSから事前にヒアリング。 • CronJobは時刻通りにちゃんと起動するのか => 開発環境やステージング環境でテスト。 • 従来と同レベルのモニタリングができるのか => CloudWatch Container Insights、New Relic Infrastructure、Prometheus、Grafanaなどを活⽤して きた(今はPrometheus、Amazon Managed Service for Prometheus、Grafanaを利⽤)。 • AWSアカウント、VPC、クラスターの分割単位どうするのが良いのか => 次ページ以降に紹介 14
  9. ˜NJYJ *OD"MMSJHIUTSFTFSWFE AWS Account AWS Account AWS Account 現在の構成(アカウントとEKSクラスター) 16

    (DEV) EKS Cluster (STG) EKS Cluster (PROD) EKS Cluster Amazon ECR • 本番とそれ以外の環境でAWSアカウントを分ける(元々1アカウントだったが後から分割) • EKSクラスターとVPCは環境ごとに⽤意 • 最初サービス毎に⽤意したが管理コストが⾼く、後で統合した • ECRは独⽴したAWSアカウントに
  10. ˜NJYJ *OD"MMSJHIUTSFTFSWFE 現在の構成(デプロイ) 17 • Kubernetesの構成はHelm Chartで管理され、Argo CDによって同期されている • Helm

    Chart内のコンテナイメージはGitHub ActionsでビルドされECRにプッシュされる • GitHub Actionsの実⾏が成功するとDeploy Toolに通知され、Kubernetesに反映される Amazon EKS Argo CD helm- charts.git ServiceA.git ServiceB.git GitHub Actions Amazon ECR Commit Merge PR Build&Push Sync Deploy Tool Webhook Tag書き換え Pull
  11. ˜NJYJ *OD"MMSJHIUTSFTFSWFE 移⾏の進め⽅① • 新VPC、サブネット構築、EKSの作成、新旧VPC Peering • Argo CD、Cluster Autoscaler、Fluent

    Bit、New Relicなど基盤共通のソフトウェアをセット アップ • デプロイを新旧環境同時におこなう仕組みを作る • ⽚⽅の環境だけデプロイするのを禁⽌する • ジョブワーカーを先に移⾏し、APIリクエストを受け付けるものは後に • APIはALBの加重ルーティングによって新旧の割合を変えて徐々に移⾏する • 新旧で同時に起動して困るものは旧環境側の停⽌→新環境側の開始(停⽌時間がどのくらい許容 できるかについて確認しておく) • 移⾏が終わったものは旧環境から削除 19
  12. ˜NJYJ *OD"MMSJHIUTSFTFSWFE 移⾏の進め⽅② • Terraform Workspacesを利⽤して各環境のコードをできるだけ共通化 • ワークロードごとに開発環境、ステージング、本番と移⾏することで移⾏時のリスクを減らす 20 Service

    A Service B API Job Worker Job Worker Job Worker Dev Stg Prod Dev Stg Prod Service A Service B API Job Worker Job Worker Job Worker Service A Service B API Job Worker Job Worker Job Worker Service A Job Worker Service A Job Worker 移⾏ 旧環境 新環境 ⼩さく移⾏する
  13. ˜NJYJ *OD"MMSJHIUTSFTFSWFE 本番移⾏後に起きたこと(1つだけ紹介) 不定期に502/504エラーが発⽣ • EKS managed node groupsを導⼊した際、Spotインスタンスを利⽤した場合でもAWS Node

    Termination Handlerが不要になると思っていた。 https://aws.amazon.com/jp/blogs/containers/amazon-eks-now-supports-provisioning-and-managing-ec2-spot-instances-in-managed-node-groups/ > To handle Spot interruptions, you do not need to install any extra automation tools on the cluster, for example: AWS Node Termination Handler. と書いてある • エラー発⽣時、CloudTrailにBidEvictedEventというイベントが記録されていた。 • EC2 Auto Scalingにはキャパシティリバランスというのがあり、 EKS managed node groupsで はこれがオプトインされている。 • AWS Node Termination Handler(NTH)を導⼊したところエラーが解消された。 2022.8.17追記修正 本スライド公開時にはNTHが導⼊されていないとキャパシティリバランスのイベントには対応できない と記載しておりましたが、不確定な情報であるため記載を修正いたしました。 22
  14. ˜NJYJ *OD"MMSJHIUTSFTFSWFE まとめ • Kubernetesは実際触ってみないとわからないことが多い • ブログや書籍、他社の事例で学べることも多いが、触ることが何より学べる • AWSサポートやSAとの相談はめちゃくちゃありがたい •

    世の中の情報量は増えてきているので従来よりはハードルが下がっていると思う • サービスの特性やシステムの規模によってKubernetesの向き不向きはある • ⼩さく始めるにはECSの⽅が良いという印象 • Kubernetesの学習、キャッチアップ、運⽤をチーム全体で継続できるかどうか • システムのリプレース作業は⼩さく⾏い、早くフィードバックを得られるよう なサイクルを回すことが⼤事 24