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

カラーミーショップの 可用性向上のための インフラ刷新

Takuya TAKAHASHI
April 13, 2021
390

カラーミーショップの 可用性向上のための インフラ刷新

GMO Developers Night で発表した内容です

Takuya TAKAHASHI

April 13, 2021
Tweet

Transcript

  1. 2 2 アジェンダ • 自己紹介 • カラーミショップが抱える課題 • 可用性向上への道 ◦

    分離環境の誕生 • ShopSet アーキテクチャ ◦ 概念 ◦ 実装 ◦ 導入と課題 • まとめ
  2. 4 4 高橋 拓也 (takutaka) 自己紹介 • インフラエンジニア @ GMO

    ペパボ • 所属: 技術部 技術基盤チーム • 自宅サーバを飼っています • https://github.com/takutakahashi • https://www.takutakahashi.dev • https://twitter.com/takutaka1220 写真
  3. 5 5 高橋 拓也 (takutaka) 自己紹介 • 所属: 技術部 技術基盤チーム

    ◦ 事業部のお手伝いをしたり、 ◦ 全社的なインフラ基盤を開発したりするチーム • 自宅サーバを飼っています • https://github.com/takutakahashi • https://www.takutakahashi.dev • https://twitter.com/takutaka1220 写真 WS 兼 k8s node k8s node k8s master Backup HDD ルーター (VyOS) おもちゃ箱 10G Switch
  4. 7 7

  5. 23 23 分離環境の応用 カラーミー カラーミー 分離環境 カラーミー カラーミー カラーミー カラーミー

    カラーミー カラーミー カラーミー N 環境 ゼロコストで分離環境を作成し 高トラフィック対策以外でも利用する
  6. 25 25 ShopSet API ショップ ページ カート プロキシ LB https://hoge.shop-pro.jp

    ShopSet … ユーザーが決済完了までで通るコンポーネントをまとめたもの 複数のショップの 集合体だから ShopSet https://foo.shop-pro.jp
  7. 26 26 ShopSet API ショップページ カート プロキシ LB https://hoge.shop-pro.jp ShopSet

    API ショップページ カート プロキシ LB ひとつ以上の ShopSet で 冗長構成を取る
  8. 27 AWS On-Prem 27 ShopSet API ショップページ カート プロキシ LB

    https://hoge.shop-pro.jp ShopSet API ショップページ カート プロキシ LB ShopSet のポータビリティを高め マルチクラウド構成を取ることで プラットフォーム冗長を実現する
  9. 28 AWS On-Prem 28 ShopSet API ショップページ カート プロキシ LB

    https://hoge.shop-pro.jp ShopSet API ショップページ カート プロキシ LB ShopSet のポータビリティを高め マルチクラウド構成を取ることで プラットフォーム冗長を実現する 自律的構築運用と ポータビリティを実現するために Kubernetes 上に ShopSet を構築する
  10. 29 29 ShopSet アーキテクチャの要 ShopSet アーキテクチャ - 大量の環境を管理することは非常に大変 - 以下の指針を設定

    - 人間による管理をしない - 規約を厳格に設計し、規約のもと自動化を徹底する
  11. 31 31 ShopSet が持つ規約 ShopSet アーキテクチャ 新たな概念を導入する - Tier -

    Configuration - Failure Domain Kubernetes Custom Resource として実装し 規約をシステムに強制する
  12. 32 - レベリングされた更新単位のこと - ShopSet は必ずひとつの Tier に所属する - 同じ

    Tier に属する ShopSet はすべて同タイミングで更新される 32 Tier ShopSet アーキテクチャ Tier 1 shopset shopset Tier 2 shopset shopset Tier 3 shopset shopset リリースは Tier 単位でトリガ
  13. 35 - すべての更新作業は自身より低い Tier より先に行われてはいけない dev 35 Tier ShopSet アーキテクチャ

    beta prod-beta prod prod-ha 下位 Tier のリリースで デグレードした場合でも 上位 Tier に影響が波及しない
  14. 36 - すべての更新アセットは低い Tier で動作検証済みのものを使う 36 Tier ShopSet アーキテクチャ beta

    prod beta beta prod beta 値をコピーせず 同じものを参照 manifests, image, etc...
  15. 37 - 接続する環境を切り替えるためのもの - Dev, Staging, Production など - Helm

    でいう values.yaml, Kustomize でいう patches 37 Configuration ShopSet アーキテクチャ
  16. 38 38 Configuration ShopSet アーキテクチャ Tier 1 shopset 2 shopset

    1 production staging 同じバージョンの stg, prod を設定
  17. 39 39 Configuration ShopSet アーキテクチャ Tier 1 shopset 2 shopset

    1 production バージョンの異なる prod を 同時に稼働 Tier 2
  18. 41 AWS On-Prem 41 ShopSet API ショップページ カート プロキシ LB

    https://hoge.shop-pro.jp ShopSet API ショップページ カート プロキシ LB クラウドやクラスタのレイヤで 障害が発生しても 冗長構成で動作を担保できるように ショップのスケジューリングをする
  19. 43 43 k8s Cluster A (On-Prem) k8s Cluster B (EKS)

    ShopSet A-1 A-2 B-1 B-2 C-1 C-2 k8s Cluster C (On-Prem) クラウドを跨いだ複数クラスタで 透過的に同一環境が動作する
  20. 44 44 k8s Cluster A k8s Cluster B Prod A-1

    Prod A-2 Prod B-1 Prod B-2 k8s Cluster A (On-Prem) k8s Cluster B (EKS) 2ドメイン冗長 冗長なし k8s Cluster B Prod C-1 Prod C-2 k8s Cluster C (On-Prem) ShopSet 間冗長を行うように ショップを配置する ShopSet A-1 A-2 B-1 B-2 C-1 C-2
  21. 46 46 k8s Cluster A k8s Cluster B Prod A-1

    Prod A-2 Prod B-1 Prod B-2 k8s Cluster A (On-Prem) k8s Cluster B (EKS) 2ドメイン冗長 冗長なし k8s Cluster B Prod C-1 Prod C-2 k8s Cluster C (On-Prem) とあるクラスタが動作不能になる ShopSet A-1 A-2 B-1 B-2 C-1 C-2
  22. 47 47 k8s Cluster A k8s Cluster B Prod A-1

    Prod A-2 Prod B-1 Prod B-2 k8s Cluster A (On-Prem) k8s Cluster B (EKS) 2ドメイン冗長 冗長なし k8s Cluster B Prod C-1 Prod C-2 k8s Cluster C (On-Prem) このユーザーが サービス利用不可能になる ShopSet A-1 A-2 B-1 B-2 C-1 C-2
  23. 48 48 k8s Cluster A k8s Cluster B Prod A-1

    Prod A-2 Prod B-1 Prod B-2 k8s Cluster A (On-Prem) k8s Cluster B (EKS) 2ドメイン冗長 冗長なし k8s Cluster B Prod C-1 Prod C-2 k8s Cluster C (On-Prem) これらのユーザーのアクセスは 守られる ShopSet A-1 A-2 B-1 B-2 C-1 C-2
  24. 49 49 k8s Cluster A k8s Cluster B Prod A-1

    Prod A-2 Prod B-1 Prod B-2 k8s Cluster A (On-Prem) k8s Cluster B (EKS) 2ドメイン冗長 冗長なし k8s Cluster B Prod C-1 Prod C-2 k8s Cluster C (On-Prem) ShopSet A-1 A-2 B-1 B-2 C-1 C-2 利用する ShopSet を変更して復旧
  25. 51 51 k8s Cluster A k8s Cluster B A-1 A-2

    B-1 B-2 k8s Cluster A (On-Prem) k8s Cluster B (EKS) 2ドメイン冗長 冗長なし k8s Cluster B C-1 C-2 k8s Cluster C (On-Prem) Tier 順に更新する
  26. 52 52 k8s Cluster A k8s Cluster B A-1 beta-prod

    A-2 prod B-1 prod B-2 beta-prod k8s Cluster A (On-Prem) k8s Cluster B (EKS) 2ドメイン冗長 冗長なし k8s Cluster B C-1 beta C-2 dev k8s Cluster C (On-Prem) 更新順: 1. dev 2. beta 3. beta-prod 4. prod
  27. 53 53 k8s Cluster A k8s Cluster B Prod A-1

    Prod A-2 Prod B-1 Prod B-2 k8s Cluster A (On-Prem) k8s Cluster B (EKS) 2ドメイン冗長 冗長なし k8s Cluster B Prod C-1 Prod C-2 k8s Cluster C (On-Prem) 更新順決定: 1. C-2 2. C-1 3. A-2, B-1 4. A-1, B-2 Prod A-1 beta-prod Prod A-2 prod Prod B-1 prod Prod B-2 beta-prod Prod C-1 beta Prod C-2 dev 更新順: 1. dev 2. beta 3. beta-prod 4. prod A-1 beta-prod A-2 prod B-1 prod B-2 beta-prod C-1 beta C-2 dev 低レベルの Tier で更新実施後 動作確認を行う
  28. 54 54 k8s Cluster A k8s Cluster B Prod A-1

    Prod A-2 Prod B-1 Prod B-2 k8s Cluster A (On-Prem) k8s Cluster B (EKS) 2ドメイン冗長 冗長なし k8s Cluster B Prod C-1 Prod C-2 k8s Cluster C (On-Prem) 更新順決定: 1. C-2 2. C-1 3. A-2, B-1 4. A-1, B-2 Prod A-1 beta-prod Prod A-2 prod Prod B-1 prod Prod B-2 beta-prod Prod C-1 beta Prod C-2 dev 更新順: 1. dev 2. beta 3. beta-prod 4. prod A-1 beta-prod A-2 prod B-1 prod B-2 beta-prod C-1 beta C-2 dev 問題なければ次のレベルの Tier を 更新する
  29. 55 55 k8s Cluster A k8s Cluster B Prod A-1

    Prod A-2 Prod B-1 Prod B-2 k8s Cluster A (On-Prem) k8s Cluster B (EKS) 2ドメイン冗長 冗長なし k8s Cluster B Prod C-1 Prod C-2 k8s Cluster C (On-Prem) 更新順決定: 1. C-2 2. C-1 3. A-2, B-1 4. A-1, B-2 Prod A-1 beta-prod Prod A-2 prod Prod B-1 prod Prod B-2 beta-prod Prod C-1 beta Prod C-2 dev 更新順: 1. dev 2. beta 3. beta-prod 4. prod A-1 beta-prod A-2 prod B-1 prod B-2 beta-prod C-1 beta C-2 dev アラートがでなければ次へ
  30. 56 56 k8s Cluster A k8s Cluster B Prod A-1

    Prod A-2 Prod B-1 Prod B-2 k8s Cluster A (On-Prem) k8s Cluster B (EKS) 2ドメイン冗長 冗長なし k8s Cluster B Prod C-1 Prod C-2 k8s Cluster C (On-Prem) 更新順決定: 1. C-2 2. C-1 3. A-2, B-1 4. A-1, B-2 Prod A-1 beta-prod Prod A-2 prod Prod B-1 prod Prod B-2 beta-prod Prod C-1 beta Prod C-2 dev 更新順: 1. dev 2. beta 3. beta-prod 4. prod A-1 beta-prod A-2 prod B-1 prod B-2 beta-prod C-1 beta C-2 dev 更新完了
  31. 58 58 k8s Cluster A k8s Cluster B Prod A-1

    Prod A-2 Prod B-1 Prod B-2 k8s Cluster A (On-Prem) k8s Cluster B (EKS) k8s Cluster B Prod C-1 Prod C-2 k8s Cluster C (On-Prem) Cluster A をアップグレードする Prod A-1 beta-prod Prod A-2 prod Prod B-1 prod Prod B-2 beta-prod Prod C-1 beta Prod C-2 dev A-1 beta-prod A-2 prod B-1 prod B-2 beta-prod C-1 beta C-2 dev
  32. 59 59 k8s Cluster A k8s Cluster B Prod A-1

    Prod A-2 Prod B-1 Prod B-2 k8s Cluster A (On-Prem) k8s Cluster B (EKS) k8s Cluster B Prod C-1 Prod C-2 k8s Cluster C (On-Prem) 同一 Tier の ShopSet へ ショップを割り振る Prod A-1 beta-prod Prod A-2 prod Prod B-1 prod Prod B-2 beta-prod Prod C-1 beta Prod C-2 dev B じゃない どこか Cluster B は Failure Domain の条件を満たせないため 別のクラスタに移る A-1 beta-prod A-2 prod B-1 prod B-2 beta-prod C-1 beta C-2 dev
  33. 60 60 k8s Cluster A k8s Cluster B Prod A-1

    Prod A-2 Prod B-1 Prod B-2 k8s Cluster A (On-Prem) k8s Cluster B (EKS) k8s Cluster B Prod C-1 Prod C-2 k8s Cluster C (On-Prem) クラスタをアップグレードする Prod A-1 beta-prod Prod A-2 prod Prod B-1 prod Prod B-2 beta-prod Prod C-1 beta Prod C-2 dev B じゃない どこか A-1 beta-prod A-2 prod B-1 prod B-2 beta-prod C-1 beta C-2 dev
  34. 61 61 k8s Cluster A k8s Cluster B Prod A-1

    Prod A-2 Prod B-1 Prod B-2 k8s Cluster A (On-Prem) k8s Cluster B (EKS) k8s Cluster B Prod C-1 Prod C-2 k8s Cluster C (On-Prem) Prod A-1 beta-prod Prod A-2 prod Prod B-1 prod Prod B-2 beta-prod Prod C-1 beta Prod C-2 dev B じゃない どこか A-1 beta-prod A-2 prod B-1 prod B-2 beta-prod C-1 beta C-2 dev 別のクラスタから ショップを再配置する
  35. 64 64 制約をどのように実装するか? ShopSet の実装 - Custom Resource と Controller

    を実装する - 自律的に動作させられる - 人間からわかりやすい単位に抽象化できる - フレームワークに乗れば実装も楽
  36. 65 65 オペレーションがソフトウェアにロックインされるのでは? ShopSet の実装 - 単体のシステムから抜けられないのはつらい - Kubernetes -

    Custom Controller - Custom Controller しかオペレーションできないと... - Controller を頻繁に更新できない - Controller の障害時に対策が何もできない - つらい
  37. 68 68 Controller からロジックを分離する ShopSet の実装 - Controller でしかできないオペレーションをなくす -

    人間が(多少大変でも)容易に再現可能とする GitOps をベースに manifests の生成を自動化する
  38. 69 69 GitOps? ShopSet の実装 - Git Repository を唯一の成果物とするデプロイ方式 -

    リポジトリのマニフェストを Kubernetes Cluster に同期する - ArgoCD が有名
  39. 70 70 GitOps? ShopSet の実装 - ArgoCD は `git pull`

    して `kubectl apply -f ` するだけ - ArgoCD が apply できる = 人間が apply できる - ArgoCD を中間レイヤにすれば複雑性を吸収できる
  40. 71 71 GitOps? ShopSet の実装 - ArgoCD は `git pull`

    して `kubectl apply -f ` するだけ - ArgoCD が apply できる = 人間が apply できる - ArgoCD を中間レイヤにすれば複雑性を吸収できる ArgoCD が apply できるリポジトリを Controller で自動生成する
  41. 72 72 ShopSet の実装 Kubernetes Cluster GitHub (Enterprise) shopset-controller Kubernetes

    API apply -f tier.yaml apply -f shopset.yaml push assets fetch apply fetch shopset deploy API Cart Proxy
  42. 74 74 shopset-controller が操作するリポジトリ ShopSet の実装 - system-repository - overlays

    に相当するファイルを保存 - shopset-controller が生成したファイルをプッシュ - ArgoCD が参照して Cluster に Apply する - app-repository - base に相当するファイルを保存 - 人間が作成しプッシュ - system-repository から git submodule として参照される
  43. 79 79 shopset-controller + GitOps で制約を実装 ShopSet の実装 - Tier

    の実装 - tier ごとに branch を生やす - 最下位 tier で変更を実装する - tier branch の変更を上位 branch に push
  44. 80 80 ShopSet の実装 リポジトリの関係性 開発者 shopset-system (branch:tier-0) overlays/shopset1 base

    shopset-system (branch:tier-1) overlays/shopset2 base shopset-apps (branch:tier-0) api cart proxy shopset-system (branch:tier-4) overlays/shopset3 base shopset-apps (branch:tier-1) api cart proxy shopset-apps (branch:tier-4) api cart proxy PR/Merge submodule argocd
  45. 81 81 ShopSet の実装 リポジトリの関係性 開発者 shopset-system (branch:tier-0) overlays/shopset1 base

    shopset-system (branch:tier-1) overlays/shopset2 base shopset-apps (branch:tier-0) api cart proxy shopset-system (branch:tier-4) overlays/shopset3 base shopset-apps (branch:tier-1) shopset-apps (branch:tier-1) shopset-apps (branch:tier-4) api cart proxy shopset-apps (branch:tier-4) api cart proxy PR/Merge submodule argocd ブランチで Tier を分ける
  46. 82 82 ShopSet の実装 リポジトリの関係性 開発者 shopset-system (branch:tier-0) overlays/shopset1 base

    shopset-system (branch:tier-1) overlays/shopset2 base shopset-apps (branch:tier-0) api cart proxy shopset-system (branch:tier-4) overlays/shopset3 base shopset-apps (branch:tier-1) api cart proxy shopset-apps (branch:tier-4) api cart proxy submodule argocd PR/Merge 一番下の Tier branch に PR を出す
  47. 83 83 ShopSet の実装 リポジトリの関係性 開発者 shopset-system (branch:tier-0) overlays/shopset1 base

    shopset-system (branch:tier-1) overlays/shopset2 base shopset-apps (branch:tier-0) api cart proxy shopset-system (branch:tier-4) overlays/shopset3 base shopset-apps (branch:tier-1) api cart proxy shopset-apps (branch:tier-4) api cart proxy submodule argocd PR/Merge 自動デプロイされるので 動作確認する
  48. 84 84 ShopSet の実装 リポジトリの関係性 開発者 shopset-system (branch:tier-0) overlays/shopset1 base

    shopset-system (branch:tier-1) overlays/shopset2 base shopset-apps (branch:tier-0) api cart proxy shopset-system (branch:tier-4) overlays/shopset3 base shopset-apps (branch:tier-1) api cart proxy shopset-apps (branch:tier-4) api cart proxy submodule argocd PR/Merge 動作確認できたら 次の tier branch に 変更を反映する
  49. 89 89 ShopSet の開発体制 現状と課題 - プロジェクトとしてチーム開発中 - @takutaka1220 …

    shopset の設計、実装, etc - @MITLicense … App の k8s-convert, ログ転送基盤の構築, etc - @ch11aki … Middleware の k8s-convert, クラスタ設計, etc - @takapi86 … App の k8s-convert, セキュリティ, etc
  50. 94 94 ShopSet 開発の課題 現状と課題 - k8s-convert がとても大変 - ドメイン知識豊富な専門家で

    1 month/app くらいかかる - 構成の共通化や cluster-wide の機能提供で対応 - ログ収集 (fluentd) や、監視とアラート(prometheus) など
  51. 95 95 ShopSet 開発の課題 現状と課題 - プロダクト開発体制の構築 - k8s に慣れた人だけがプロダクト開発するわけじゃない

    - デバッグやリリースを補助するインターフェースが必要 - `shopctl` コマンドを現在設計中
  52. 96 96 ShopSet 開発の課題 現状と課題 - ShopSet で動作させるカラーミー環境の最適化 - キャパシティの把握

    - どのくらいリクエストを食えるのかわからない - 1クラスタ上でどのくらい ShopSet をスケールさせるべきか?
  53. 97 97 ShopSet 開発の課題 現状と課題 - ShopSet で動作させるカラーミー環境の最適化 - Microservice

    のベストプラクティスの吸収 - rate limit & circuit breaker とか - observability とか
  54. 99 99 ShopSet 開発の課題 現状と課題 - プロダクト運用の簡素化 - ショップの追加、 ShopSet

    の変更など - どの ShopSet を使えばいいの?などの迷いを無くす - 規約を用いて自動化する方針
  55. 100 100 ShopSet 開発の今後 現状と課題 - ShopSet に内包する Service の拡充

    - k8s-convert との戦い - AWS EKS を用いたマルチクラウドの本番適用 - ほぼできるはず - マルチ k8s クラスタのハンドリングの実装 - クラスタライフサイクル管理、Failure Domain 実装、etc...
  56. 101 101 アジェンダ • 可用性向上への道 ◦ 分離環境の誕生 • ShopSet アーキテクチャ

    ◦ 概念 ▪ Tier ▪ Configuration ▪ Failure Domain ◦ 実装 ▪ GitOps + ArgoCD ◦ 導入と課題