$30 off During Our Annual Pro Sale. View Details »

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

Takuya TAKAHASHI
April 13, 2021
380

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

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

Takuya TAKAHASHI

April 13, 2021
Tweet

Transcript

  1. 1
    カラーミーショップの
    可用性向上のための
    インフラ刷新
    高橋 拓也 @ GMO ペパボ
    2021/04/13
    GMO Developers Night

    View Slide

  2. 2
    2
    アジェンダ
    ● 自己紹介
    ● カラーミショップが抱える課題
    ● 可用性向上への道
    ○ 分離環境の誕生
    ● ShopSet アーキテクチャ
    ○ 概念
    ○ 実装
    ○ 導入と課題
    ● まとめ

    View Slide

  3. 3
    自己紹介
    3

    View Slide

  4. 4
    4
    高橋 拓也 (takutaka)
    自己紹介
    ● インフラエンジニア @ GMO ペパボ
    ● 所属: 技術部 技術基盤チーム
    ● 自宅サーバを飼っています
    ● https://github.com/takutakahashi
    ● https://www.takutakahashi.dev
    ● https://twitter.com/takutaka1220
    写真

    View Slide

  5. 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

    View Slide

  6. 6
    6
    カラーミーショップ

    View Slide

  7. 7
    7

    View Slide

  8. 8
    解決したい課題
    8

    View Slide

  9. 9
    9
    EC の需要が増加🏠

    View Slide

  10. 10
    10
    大量に売り上げる
    ショップが増えた🚀

    View Slide

  11. 11
    11
    システムへの
    負荷がすごいことに🔥

    View Slide

  12. 12
    12
    システムへの負荷
    解決したい課題
    - 需要増加に伴う負荷の集中
    - 人気商品に対する大量アクセス
    - bot を使った DDoS に近いアクセスも...

    View Slide

  13. 13
    13
    システムへの負荷
    解決したい課題
    - カラーミーはマルチテナント型アーキテクチャ
    - すべてのショップアクセスが同じサーバを通る
    - 人気ショップの負荷が他のショップに波及

    View Slide

  14. 14
    14
    システムへの負荷
    解決したい課題
    - カラーミーはマルチテナント型アーキテクチャ
    - すべてのショップアクセスが同じサーバを通る
    - 人気ショップの負荷が他のショップに波及
    サービス全体がダウンしてしまう障害が
    発生してしまった😢

    View Slide

  15. 15
    15
    流通増加による可用性への重要度の増加
    解決したい課題
    - カラーミーを利用した流通額の増加
    - 数分のダウンが無視できない規模感へと成長
    - ショップオーナーから可用性への期待値が上がる

    View Slide

  16. 16
    16
    流通増加による可用性への重要度の増加
    解決したい課題
    - カラーミーを利用した流通額の増加
    - 数分のダウンが無視できない規模感へと成長
    - ショップオーナーから可用性への期待値が上がる
    システムの安定性を
    更に向上させる施策が必要になった

    View Slide

  17. 17
    可用性向上への道
    17

    View Slide

  18. 18
    18
    最初の施策: 分離環境
    可用性向上への道
    - とあるショップの負荷でサービスダウンが発生
    カラーミー

    View Slide

  19. 19
    19
    最初の施策: 分離環境
    可用性向上への道
    - 既存のシステムのクローン(分離環境)を構築
    カラーミー
    カラーミー
    分離環境

    View Slide

  20. 20
    20
    最初の施策: 分離環境
    可用性向上への道
    - 対象ショップのみ向き先を変更
    カラーミー
    カラーミー
    分離環境

    View Slide

  21. 21
    21
    最初の施策: 分離環境
    可用性向上への道
    - 非常に効果的にワークした
    - 特定のショップの負荷による全体のダウンをある程度防げるように
    なった

    View Slide

  22. 22
    22
    最初の施策: 分離環境
    可用性向上への道
    - 非常に効果的にワークした
    - 特定のショップの負荷による全体のダウンをある程度防げるように
    なった
    分離環境を応用して
    多くの課題を解決できるのでは?🤔

    View Slide

  23. 23
    23
    分離環境の応用
    カラーミー
    カラーミー
    分離環境
    カラーミー
    カラーミー
    カラーミー
    カラーミー
    カラーミー
    カラーミー
    カラーミー
    N 環境
    ゼロコストで分離環境を作成し
    高トラフィック対策以外でも利用する

    View Slide

  24. 24
    ShopSet アーキテクチャ
    分離環境改め
    24
    規約を盛り込んだ分離環境

    View Slide

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

    View Slide

  26. 26
    26
    ShopSet
    API
    ショップページ
    カート
    プロキシ LB
    https://hoge.shop-pro.jp
    ShopSet
    API
    ショップページ
    カート
    プロキシ LB
    ひとつ以上の ShopSet で
    冗長構成を取る

    View Slide

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

    View Slide

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

    View Slide

  29. 29
    29
    ShopSet アーキテクチャの要
    ShopSet アーキテクチャ
    - 大量の環境を管理することは非常に大変
    - 以下の指針を設定
    - 人間による管理をしない
    - 規約を厳格に設計し、規約のもと自動化を徹底する

    View Slide

  30. 30
    30
    ShopSet が持つ規約
    ShopSet アーキテクチャ
    新たな概念を導入する
    - Tier
    - Configuration
    - Failure Domain

    View Slide

  31. 31
    31
    ShopSet が持つ規約
    ShopSet アーキテクチャ
    新たな概念を導入する
    - Tier
    - Configuration
    - Failure Domain
    Kubernetes Custom Resource として実装し
    規約をシステムに強制する

    View Slide

  32. 32
    - レベリングされた更新単位のこと
    - ShopSet は必ずひとつの Tier に所属する
    - 同じ Tier に属する ShopSet はすべて同タイミングで更新される
    32
    Tier
    ShopSet アーキテクチャ
    Tier 1
    shopset shopset
    Tier 2
    shopset shopset
    Tier 3
    shopset shopset
    リリースは
    Tier 単位でトリガ

    View Slide

  33. 33
    - すべての更新作業は自身より低い Tier より先に行われてはいけない
    33
    Tier が持つ制約
    ShopSet アーキテクチャ

    View Slide

  34. 34
    - すべての更新作業は自身より低い Tier より先に行われてはいけない
    dev
    34
    Tier
    ShopSet アーキテクチャ
    beta
    prod-beta
    prod
    prod-ha
    dev → beta → prod-beta …
    の順で更新する

    View Slide

  35. 35
    - すべての更新作業は自身より低い Tier より先に行われてはいけない
    dev
    35
    Tier
    ShopSet アーキテクチャ
    beta
    prod-beta
    prod
    prod-ha
    下位 Tier のリリースで
    デグレードした場合でも
    上位 Tier に影響が波及しない

    View Slide

  36. 36
    - すべての更新アセットは低い Tier で動作検証済みのものを使う
    36
    Tier
    ShopSet アーキテクチャ
    beta
    prod
    beta beta
    prod
    beta
    値をコピーせず
    同じものを参照
    manifests, image, etc...

    View Slide

  37. 37
    - 接続する環境を切り替えるためのもの
    - Dev, Staging, Production など
    - Helm でいう values.yaml, Kustomize でいう patches
    37
    Configuration
    ShopSet アーキテクチャ

    View Slide

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

    View Slide

  39. 39
    39
    Configuration
    ShopSet アーキテクチャ
    Tier 1
    shopset 2
    shopset 1
    production
    バージョンの異なる
    prod を
    同時に稼働
    Tier 2

    View Slide

  40. 40
    - 障害ドメイン
    - ShopSet に所属するショップのスケジューリングに利用
    - 複数 ShopSet を利用した冗長構成を組む
    40
    Failure Domain
    ShopSet アーキテクチャ

    View Slide

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

    View Slide

  42. 42
    42
    制約があることで
    よくなること

    View Slide

  43. 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)
    クラウドを跨いだ複数クラスタで
    透過的に同一環境が動作する

    View Slide

  44. 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

    View Slide

  45. 45
    45
    クラスタ障害発生時

    View Slide

  46. 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

    View Slide

  47. 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

    View Slide

  48. 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

    View Slide

  49. 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 を変更して復旧

    View Slide

  50. 50
    50
    アプリケーション更新

    View Slide

  51. 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 順に更新する

    View Slide

  52. 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

    View Slide

  53. 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 で更新実施後
    動作確認を行う

    View Slide

  54. 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 を
    更新する

    View Slide

  55. 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
    アラートがでなければ次へ

    View Slide

  56. 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
    更新完了

    View Slide

  57. 57
    57
    クラスタアップグレード

    View Slide

  58. 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

    View Slide

  59. 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

    View Slide

  60. 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

    View Slide

  61. 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
    別のクラスタから
    ショップを再配置する

    View Slide

  62. 62
    62
    ShopSet の実装

    View Slide

  63. 63
    63
    実装への課題
    ShopSet の実装
    - 制約をどのように実装するか?
    - オペレーションがソフトウェアにロックインされるのでは?

    View Slide

  64. 64
    64
    制約をどのように実装するか?
    ShopSet の実装
    - Custom Resource と Controller を実装する
    - 自律的に動作させられる
    - 人間からわかりやすい単位に抽象化できる
    - フレームワークに乗れば実装も楽

    View Slide

  65. 65
    65
    オペレーションがソフトウェアにロックインされるのでは?
    ShopSet の実装
    - 単体のシステムから抜けられないのはつらい
    - Kubernetes
    - Custom Controller
    - Custom Controller しかオペレーションできないと...
    - Controller を頻繁に更新できない
    - Controller の障害時に対策が何もできない
    - つらい

    View Slide

  66. 66
    66
    Controller から
    ロジックを分離する

    View Slide

  67. 67
    67
    Controller からロジックを分離する
    ShopSet の実装
    - Controller でしかできないオペレーションをなくす
    - 人間が(多少大変でも)容易に再現可能とする

    View Slide

  68. 68
    68
    Controller からロジックを分離する
    ShopSet の実装
    - Controller でしかできないオペレーションをなくす
    - 人間が(多少大変でも)容易に再現可能とする
    GitOps をベースに
    manifests の生成を自動化する

    View Slide

  69. 69
    69
    GitOps?
    ShopSet の実装
    - Git Repository を唯一の成果物とするデプロイ方式
    - リポジトリのマニフェストを Kubernetes Cluster に同期する
    - ArgoCD が有名

    View Slide

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

    View Slide

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

    View Slide

  72. 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

    View Slide

  73. 73
    73
    shopset-controller がやること
    ShopSet の実装
    - Kustomization で使う差分ファイルの生成とプッシュ
    - base manifests の更新
    - ArgoCD Application リソースの作成と apply

    View Slide

  74. 74
    74
    shopset-controller が操作するリポジトリ
    ShopSet の実装
    - system-repository
    - overlays に相当するファイルを保存
    - shopset-controller が生成したファイルをプッシュ
    - ArgoCD が参照して Cluster に Apply する
    - app-repository
    - base に相当するファイルを保存
    - 人間が作成しプッシュ
    - system-repository から git submodule として参照される

    View Slide

  75. 75
    75
    リポジトリを tier.yaml に記述する
    ShopSet の実装

    View Slide

  76. 76
    76
    Kustomization で使う差分ファイルの生成とプッシュ
    ShopSet の実装

    View Slide

  77. 77
    77
    Git Submodule で最新の base を参照し続ける
    ShopSet の実装

    View Slide

  78. 78
    78
    ArgoCD の Custom Resource を生成
    ShopSet の実装

    View Slide

  79. 79
    79
    shopset-controller + GitOps で制約を実装
    ShopSet の実装
    - Tier の実装
    - tier ごとに branch を生やす
    - 最下位 tier で変更を実装する
    - tier branch の変更を上位 branch に push

    View Slide

  80. 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

    View Slide

  81. 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 を分ける

    View Slide

  82. 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 を出す

    View Slide

  83. 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
    自動デプロイされるので
    動作確認する

    View Slide

  84. 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 に
    変更を反映する

    View Slide

  85. 85
    85
    shopset-controller + GitOps で制約を実装
    ShopSet の実装
    - Configuration の実装
    - git repository + Tier branch で管理

    View Slide

  86. 86
    86
    shopset-controller + GitOps で制約を実装
    ShopSet の実装
    - ShopSet は tier と configuration を指定するだけ

    View Slide

  87. 87
    87
    shopset-controller + GitOps で制約を実装
    ShopSet の実装
    - Failure Domain の実装
    - これから

    View Slide

  88. 88
    88
    現状と課題

    View Slide

  89. 89
    89
    ShopSet の開発体制
    現状と課題
    - プロジェクトとしてチーム開発中
    - @takutaka1220 … shopset の設計、実装, etc
    - @MITLicense … App の k8s-convert, ログ転送基盤の構築, etc
    - @ch11aki … Middleware の k8s-convert, クラスタ設計, etc
    - @takapi86 … App の k8s-convert, セキュリティ, etc

    View Slide

  90. 90
    90
    ShopSet の開発体制でうまくいったこと
    現状と課題
    - 一時間ほど集合するわいわいタイムを毎日開催
    - 作業やってもいいし、雑談してもいいし、来なくてもいい
    - MTG や同期的に作業をやる場合はこの時間をあてがう

    View Slide

  91. 91
    91
    ShopSet の開発体制でうまくいかなかったこと
    現状と課題
    - 一時間ほど集合するわいわいタイムを毎日開催
    - 作業やってもいいし、雑談してもいいし、来なくてもいい
    - MTG や同期的に作業をやる場合はこの時間をあてがう

    View Slide

  92. 92
    92
    ShopSet のマイルストーン
    現状と課題
    - 検証環境にて長期安定稼働中
    - 約半年くらいトラブルなし
    - 制約の設計は概ねうまくいった

    View Slide

  93. 93
    93
    ShopSet のマイルストーン
    現状と課題
    - ShopSet で構築した環境をプロダクションに一部導入済み
    - 本日の午前中にリリースしました🎉
    - 単一クラスタ、単一 ShopSet 構成

    View Slide

  94. 94
    94
    ShopSet 開発の課題
    現状と課題
    - k8s-convert がとても大変
    - ドメイン知識豊富な専門家で 1 month/app くらいかかる
    - 構成の共通化や cluster-wide の機能提供で対応
    - ログ収集 (fluentd) や、監視とアラート(prometheus) など

    View Slide

  95. 95
    95
    ShopSet 開発の課題
    現状と課題
    - プロダクト開発体制の構築
    - k8s に慣れた人だけがプロダクト開発するわけじゃない
    - デバッグやリリースを補助するインターフェースが必要
    - `shopctl` コマンドを現在設計中

    View Slide

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

    View Slide

  97. 97
    97
    ShopSet 開発の課題
    現状と課題
    - ShopSet で動作させるカラーミー環境の最適化
    - Microservice のベストプラクティスの吸収
    - rate limit & circuit breaker とか
    - observability とか

    View Slide

  98. 98
    98
    ShopSet 開発の課題
    現状と課題
    - ShopSet で動作させるカラーミー環境の最適化
    - 次のボトルネックへの対処
    - 無限に ShopSet を作るには?
    - おそらく DB Connection が枯渇しそう

    View Slide

  99. 99
    99
    ShopSet 開発の課題
    現状と課題
    - プロダクト運用の簡素化
    - ショップの追加、 ShopSet の変更など
    - どの ShopSet を使えばいいの?などの迷いを無くす
    - 規約を用いて自動化する方針

    View Slide

  100. 100
    100
    ShopSet 開発の今後
    現状と課題
    - ShopSet に内包する Service の拡充
    - k8s-convert との戦い
    - AWS EKS を用いたマルチクラウドの本番適用
    - ほぼできるはず
    - マルチ k8s クラスタのハンドリングの実装
    - クラスタライフサイクル管理、Failure Domain 実装、etc...

    View Slide

  101. 101
    101
    アジェンダ
    ● 可用性向上への道
    ○ 分離環境の誕生
    ● ShopSet アーキテクチャ
    ○ 概念
    ■ Tier
    ■ Configuration
    ■ Failure Domain
    ○ 実装
    ■ GitOps + ArgoCD
    ○ 導入と課題

    View Slide

  102. 102
    102
    おしまい

    View Slide