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

[EC2からKubernetes] 楽天ラクマのコンテナ化の歩み

Morix
August 22, 2023

[EC2からKubernetes] 楽天ラクマのコンテナ化の歩み

楽天グループ株式会社が運営するフリマアプリ「ラクマ」のインフラ基盤をAWS EC2 + AutoScalingGroupからKubernetes(EKS)に移行しました。このプロジェクトは約3年におよび、様々な調査や検証を行いました。

初めてKubernetesへの移行を考える企業にとって、大規模トラフィックを処理するための適切な構成を模索することは一筋縄ではいきませんでした。この発表では、どのような観点を持って調査を行い、どう構築していったか具体的な事例とともにお伝えします。

Morix

August 22, 2023
Tweet

More Decks by Morix

Other Decks in Technology

Transcript

  1. 2 ⾃⼰紹介 • 名前 • ⻄野 翔太(Morix) • 所属 •

    楽天グループ株式会社 • ラクマ開発課 SREチーム • X(Twitter) • @morix1500
  2. 8 移⾏のための⽅針作成 • Network • Namespace • RBAC • DNS

    • Pod • Ingress/LoadBalancer • Secrets • AutoScale • Logging • Monitoring • マニフェストの管理 • Dockerfileの管理 • ContainerRepository • CI/CD • Batch • ServiceMesh • Security • ClusterUpgrade 期間: 約4ヶ⽉
  3. 19 リソース要求・制限 楽天ラクマのKubernetesクラスタには⾃分たちのアプリケーションしか載らないことを前提に以下 の⽅針でリソース要求・制限をつけるようにした。 • requests • cpu: 必須。コンテナを動かすために必要なCPU量を指定する。低すぎてはダメ。 •

    memory: 必須。コンテナを動かすために必要なメモリ量を指定する。余裕を持った数値にする。 • limits • cpu: 不要。 • memory: requests.memoryと同じ値にする。 詳しくは記事にしてるので読んでほしい。 KubernetesのPodのResource設定の考え⽅ https://qiita.com/Morix1500/items/8e9e6f6a86ece5a1c98e
  4. 21 Probe 外部からトラフィックがあるようなPodはProbeの導⼊を必須にした。 • readinessProbe • Podがトラフィックを受けることが可能かどうか監視するもの • NginxとRailsコンテナがある場合、どちらも通るパスをこのProbeに設定する •

    そのためPod内のいずれか1つのコンテナにこのProbeがあればいい • livenessProbe • コンテナの死活監視を⾏うもの • すべてのコンテナに設定する • startupProbe • 起動が遅いコンテナで使⽤する
  5. 23 配置戦略 Podをどこにどのように配置するのかをそのPodの性質によって決めている。 たとえば通常のWebアプリケーションであれば • ZoneごとにPodを分散配置する • HPAで⾃動スケールさせる • PDBで最低台数を保証させる

    簡単に終了してほしくないコントローラーPodであれば • オンデマンドインスタンスに配置する • 2PodをZone/Nodeごとに分散配置する • PDBで最低台数を保証させる
  6. 24 Ingress/LoadBalancer Ingressを扱うコントローラーはどうするのか、またNodeの前段に配置するLoadBalancerをどう⽤ 意するのか検討した。 Podのデプロイ戦略上、ArgoRolloutsを使うことになっていたのでそれと組み合わせて使えたり、今 後のServiceMesh導⼊も考え、Istio IngressGatewayを使うことにした。 またIngressリソースからAWS ALBを⽣成することも可能だったが次の利⽤でしなかった。 •

    ALBの機能でドメイン・パスごとに重み付けルーティングが可能なので、それを使いKubernetes バージョンアップの際に古いクラスターから新しいクラスターに移⾏する⽅針のため、クラス ターでロードバランサーリソースを作っては困る • 基本的にインフラリソースはTerraformで構築していたので統⼀したかった
  7. 39 負荷試験の観点 • 観点 • レイテンシが劣化しないか • スケールアウト速度が劣化しないか • その他⾒たところ

    • 1PodにどのくらいのUnicornWorkerを載せるか、また必要なリソースはどのくらいか • ClusterAutoscalerは意図通りスケールイン・アウトするか • IstioIngressGatewayおよびIstiodの負荷は問題ないか • ログ収集系コンポーネントの負荷は問題ないか • IPの消費量は問題ないか
  8. 41 当初の課題を解決できたのか︖ • 検証環境が⾜りない • 増やしやすい環境が整った🎉 • 開発環境はGitHub Issueを作ると環境ができる仕組みを作れた︕ •

    ⾔語やパッケージなどのバージョンアップがSREしかできない • Dockerfileを編集することで可能になった🎉
  9. 45 課題1: Kubernetes運⽤むずかしすぎる問題の対策 • 定期的にSREチーム向けに楽天ラクマKubernetesの勉強会を開催 • 不定期でエンジニア向けに楽天ラクマKubernetesの勉強会を開催 • Kubernetesトラブルシューティングガイドを作成 •

    エラーが起きたらこの順番でこのログを⾒ていけ など • Datadogメトリクスの⾒⽅や傾向をまとめた • この値がスパイクしてるときは◯◯が原因の可能性が⾼い など