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

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

Avatar for Takuya TAKAHASHI Takuya TAKAHASHI
April 13, 2021
460

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

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

Avatar for Takuya TAKAHASHI

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 ◦ 導入と課題