平成31年度 環境物品等の調達方針...3 環境物品等の調達の推進に関するその他の事項 特定調達物品等の調達に当たっては、判断の基準を満たすにとどまらず、環境物品等の
AWSのマネージドサービスを活かした Kubernetes 運用と … · 2020. 8. 3. · ※...
Transcript of AWSのマネージドサービスを活かした Kubernetes 運用と … · 2020. 8. 3. · ※...
freee 株式会社 �1
AWSのマネージドサービスを活かした Kubernetes 運用と Amazon EKS によるクラスタのシングルテナント戦略について
AWS Summit Tokyo 2019
�2
• 2015年12月 ~ freeeに入社 • 2018年11月 ~ SRE
• 3年ぐらいフロントエンドとサーバサイドの開発 • SREに移ってからEKS移行やマルチクラスタデプロイツールの開発など • 趣味 • 自動化 • キーボード制作/設計
Kosuke Adachi@foostan
freee株式会社 SRE
質問
�3
K8s本番で使っているよ
�4
EKS本番で使っているよ
�5
�6
インフラリソースのコード化とKubernetesのシングルテナント化でサービスの運用コストを分散させる
本日お話すること
本日お話すること
�7
サービス規模が拡大、サービス数が増加、開発者が増加
• 強い権限を持っているので何でも屋になりがち • SREに問い合わせが集中 • 目先のタスクに追われる日々 • SREの人数はなかなか増えない
SREがボトルネックに
開発者チームにサービスの運用をおまかせする
サービスの運用コストを分散させる?
�8
• インフラ構築 • Kubernetesクラスタ構築 • アプリケーションデプロイ • サービス監視 • アラート対応 など、基本的にサービス運用に必要なことすべて
開発チームだけでサービス運用の殆どをまかなえるような基盤づくりをSREが行う
本日お話すること
おまかせする内容
�9
Overview
03 シングルテナントで権限を分離してクラスタの運用をおまかせする
02 インフラリソースのコード化
01 freee について
04 EKSをマネージドサービスと組み合わせてクラスタの運用コストを抑える
05 マルチテナントからシングルテナントなEKSに移行した実例
�10
01 freee について
Section
�11
スモールビジネスを、 世界の主役に。
MISSION
生産年齢人口が劇的に減少し、慢性的な人手不足となる日本
で労働生産性向上は緊急の課題となっています
freeeは「人工知能」と「統合基幹業務システム」をクラウド
技術を活用し、業務効率化のサポートを続けることで、中堅中
小企業のバックオフィス業務効率化を目指しています
freeeについて
�12
PRODUCTS
その他インターナルなマイクロサービス多数
freeeについて
�13
• 100人以上、1チーム: 2 ~ 10人程度 • 1チームで複数のサービスを兼任することが多い • サービスの規模によっては複数のチームで開発することもある
Dev A Dev B Dev C
サービスAサービスB
Dev D Dev E
サービスCサービスD
Dev F
サービスE
Dev G Dev H
サービスG
サービスH
サービスF
SRE
freee の 開発チーム
freeeについて
�14
Dev A Dev B Dev C
サービスAサービスB
Dev D Dev E
サービスCサービスD
Dev F
サービスE
Dev G Dev H
サービスG
サービスH
サービスF
SRE
• 8人 • すべてのプロダクト/サービスのインフラを支える横断的なチーム • サービスの価値をユーザーに届けるために、安定したインフラを提供し続けるのがミッション
freee の SREチーム
freeeについて
�15
IPO準備・成長企業への導入が加速
41%
資金調達Top100社の freee 導入率
※ 出典:entrepedia ベンチャーリスト
※ 資金調達額TOP100社:直近1年で1億円以上の資金調達をした企業を対象に調査
freeeについて
�16
SOC保証: 上場企業が自社の財務報告がきちんとしていることを保証するものfreee(会計ソフト) を利用する場合、freeeも監査の対象になる
SOC1を取得していればfreeeがSOC保証が満たされていると認められる
相応のセキュリティ対策が必要
freeeについて
受託業務に係る内部統制の保証報告書(SOC1 Type2報告書)を受領
例えばDBに直接アクセスする場合認証、認可、履歴管理が必要
EC2インスタンス等からのアクセスも SecurityGroup などで明確に権限管
理できていることが望ましい
�17
02 インフラリソースのコード化
Section
SREと開発チームの役割
�18
とある新規プロダクトをリリースするとして
Product A
SRE
インフラリソースのコード化
• ネットワーク整備
SREと開発チームの役割
�19
とある新規プロダクトをリリースするとして
Product A
SRE
インフラリソースのコード化
• ネットワーク整備 • LB追加
SG ALB
SREと開発チームの役割
�20
とある新規プロダクトをリリースするとして
Product A
SRE
インフラリソースのコード化
• ネットワーク整備 • LB追加 • AutoScalingGroup追加
SG ALB
SG
Kubernetes AutoScalingGroup
デプロイジョブ
SREと開発チームの役割
�21
とある新規プロダクトをリリースするとして
Product A
SRE
インフラリソースのコード化
• ネットワーク整備 • LB追加 • AutoScalingGroup追加 • デプロイ環境整備
SG ALB
SG
Kubernetes AutoScalingGroup
デプロイジョブ
SREと開発チームの役割
�22
とある新規プロダクトをリリースするとして
Product A
SRE
インフラリソースのコード化
• ネットワーク整備 • LB追加 • AutoScalingGroup追加 • デプロイ環境整備 • DB追加
SG ALB
SG
Kubernetes
SG RDS
AutoScalingGroup
デプロイジョブ
SREと開発チームの役割
�23
とある新規プロダクトをリリースするとして
Product A
SRE
インフラリソースのコード化
• ネットワーク整備 • LB追加 • AutoScalingGroup追加 • デプロイ環境整備 • DB追加 • Route53登録
SG ALB
SG
Kubernetes
SG RDS
AutoScalingGroup
デプロイジョブ
SREと開発チームの役割
�24
とある新規プロダクトをリリースするとして
Product A
SRE
インフラリソースのコード化
• ネットワーク整備 • LB追加 • AutoScalingGroup追加 • デプロイ環境整備 • DB追加 • Route53登録 • セキュリティ確保
SG ALB
SG
Kubernetes
SG RDS
AutoScalingGroup
デプロイジョブ
SREと開発チームの役割
�25
とある新規プロダクトをリリースするとして
Product A
SRE
インフラリソースのコード化
• ネットワーク整備 • LB追加 • AutoScalingGroup追加 • デプロイ環境整備 • DB追加 • Route53登録 • セキュリティ確保 • IAMロール追加
SG ALB
SG
Kubernetes
SG RDS
AutoScalingGroup
デプロイジョブ
SREと開発チームの役割
�26
とある新規プロダクトをリリースするとして
Product A
SRE
インフラリソースのコード化
• ネットワーク整備 • LB追加 • AutoScalingGroup追加 • デプロイ環境整備 • DB追加 • Route53登録 • セキュリティ確保 • IAMロール追加
SG ALB
SG
Kubernetes
SG RDS
AutoScalingGroup
Developers
• アプリケーション開発
デプロイジョブ
SREと開発チームの役割
�27
とある新規プロダクトをリリースするとして
Product A
SRE
インフラリソースのコード化
• ネットワーク整備 • LB追加 • AutoScalingGroup追加 • デプロイ環境整備 • DB追加 • Route53登録 • セキュリティ確保 • IAMロール追加
SG ALB
SG
Kubernetes
SG RDS
AutoScalingGroup
Developers
• アプリケーション開発 • アプリケーションデプロイ
プロダクト(サービス)はリリースして終わりではない
�28
本番はここから
デプロイジョブ
SREと開発チームの役割
�29
運用フェーズでは問い合わせはSREに集まりがち
Product A
インフラリソースのコード化
SG ALB
SG
Kubernetes
SG RDS
AutoScalingGroup
SRE
Developers
デプロイ失敗しました ☓
デプロイジョブ
SREと開発チームの役割
�30
運用フェーズでは問い合わせはSREに集まりがち
Product A
インフラリソースのコード化
SG ALB
SG
Kubernetes
SG RDS
AutoScalingGroup
SRE
Developers
サービスが落ちました ☓
デプロイ失敗しました
デプロイジョブ
SREと開発チームの役割
�31
運用フェーズでは問い合わせはSREに集まりがち
Product A
インフラリソースのコード化
SG ALB
SG
Kubernetes
SG RDS
AutoScalingGroup
SRE
Developers
アクセス数増加して さばききれません
☓デプロイ失敗しましたサービスが落ちました
デプロイジョブ
SREと開発チームの役割
�32
運用フェーズでは問い合わせはSREに集まりがち
Product A
インフラリソースのコード化
SG ALB
SG
Kubernetes
SG RDS
AutoScalingGroup
SRE
Developers
DBのIOPS高いです、耐えられません
☓
デプロイ失敗しましたサービスが落ちました
アクセス数増加してさばききれません
デプロイジョブ
SREと開発チームの役割
�33
運用フェーズでは問い合わせはSREに集まりがち
インフラリソースのコード化
SRE
Developers
サービスが増えました
デプロイ失敗しましたサービスが落ちました
アクセス数増加してさばききれません
Product A
SG ALB
SG
Kubernetes
SG RDS
AutoScalingGroup
ProductB
SG ALB
SG
Kubernetes
SG RDS
AutoScalingGroup
デプロイジョブ
SREと開発チームの役割
�34
運用フェーズでは問い合わせはSREに集まりがち
Product A
インフラリソースのコード化
SG ALB
SG
SG RDS
SRE
Developers
サービスが増えました
デプロイ失敗しましたサービスが落ちました
アクセス数増加してさばききれませんサービスが増えました
Product B
SG ALB
SG
SG RDSProduct C
SG ALB
SG
SG RDS
デプロイジョブ
SREと開発チームの役割
�35
運用フェーズでは問い合わせはSREに集まりがち
A
インフラリソースのコード化
SG
ALB
SG
SGRDS
SRE
Developers
サービスが増えました
デプロイ失敗しましたサービスが落ちました
アクセス数増加してさばききれませんサービスが増えましたサービスが増えました
B
SG
ALB
SG
SGRDS
C
SG
ALB
SG
SGRDS
D
SG
ALB
SG
SGRDS
E
SG
ALB
SG
SGRDS
�36
• サービスが増えるに従って SRE への依頼件数も増加
• 開発者の方が圧倒的に多いので、SRE がボトルネックに
• 何でも屋になりがちで、目先のタスクに追われる日々
SREがボトルネックに
設定変更依頼
稼働率の担保
障害対応
監視
負荷対策
CI/CD整備
EOL
SRE構成相談
インフラリソースのコード化
マイクロサービス化の流れ
�37
開発組織の拡大に伴い、これまでのEC2 + Auto Scaling だと辛くなってきた
• 言語やフレームワークの多様化
• 複雑化するデプロイフロー
• 依存するサービスの増加
• SREに問い合わせがさらに集中
インフラリソースのコード化
�38
すべてのアプリケーションをコンテナ化
本番環境のコンテナのランタイムとして採用
インフラリソースのコード化
freeeを支えるインフラ系ツール
インフラリソースのコード化
�39
すべてのアプリケーションをコンテナ化多様化する言語やフレームワークを吸収
インフラリソースのコード化
デプロイジョブ
�40A
インフラリソースのコード化
SG
ALB
SG
SGRDS
B
SG
ALB
SG
SGRDS
C
SG
ALB
SG
SGRDS
D
SG
ALB
SG
SGRDS
E
SG
ALB
SG
SGRDS
すべてのアプリケーションをコンテナ化
デプロイジョブ
�41A
インフラリソースのコード化
SG
ALB
SG
SGRDS
B
SG
ALB
SG
SGRDS
C
SG
ALB
SG
SGRDS
D
SG
ALB
SG
SGRDS
E
SG
ALB
SG
SGRDS
ECR
すべてのアプリケーションをコンテナ化コンテナに吸収されて考え方がシンプルに
�42
アプリケーションの動作環境をマニフェストとしてコード化
宣言的にデプロイ、オートスケーリング、セルフヒーリングを実現
本番環境のコンテナのランタイムとして採用
インフラリソースのコード化
デプロイジョブ
�43A
インフラリソースのコード化
SG
ALB
SG
SGRDS
B
SG
ALB
SG
SGRDS
C
SG
ALB
SG
SGRDS
D
SG
ALB
SG
SGRDS
E
SG
ALB
SG
SGRDS
ECR
コンテナをKubernetesで動かすアプリケーションの構成がコード化される
�44A
インフラリソースのコード化
SG
ALB
SG
SGRDS
B
SG
ALB
SG
SGRDS
C
SG
ALB
SG
SGRDS
D
SG
ALB
SG
SGRDS
E
SG
ALB
SG
SGRDS
ECR
コンテナをKubernetesで動かす
namespace namespace namespace namespace namespace
podpodpodpodpod ManifestsManifests
アプリケーションの構成がコード化される
�45
宣言的にAWSのリソースを確保
AWSリソースのコード化
インフラリソースのコード化
�46A
インフラリソースのコード化
SG
ALB
SG
SGRDS
B
SG
ALB
SG
SGRDS
C
SG
ALB
SG
SGRDS
D
SG
ALB
SG
SGRDS
E
SG
ALB
SG
SGRDS
宣言的にAWSリソースを確保
namespace namespace namespace namespace namespace
podpodpodpodpod
SRE
• ネットワーク整備 • LB追加 • AutoScalingGroup追加 • デプロイ環境整備 • DB追加 • Route53登録 • セキュリティ確保 • IAMロール追加
�47A
インフラリソースのコード化
SG
ALB
SG
SGRDS
B
SG
ALB
SG
SGRDS
C
SG
ALB
SG
SGRDS
D
SG
ALB
SG
SGRDS
E
SG
ALB
SG
SGRDS
宣言的にAWSリソースを確保
namespace namespace namespace namespace namespace
podpodpodpodpod
ManifestsTF Files
AWSリソースがコード化される
インフラリソースがコード化されると開発チームと SREとのコミュニケーション方法が変わる
�48
インフラリソースのコード化
�49
インフラリソースのコード化
SREDevelopers サービスが増えました
インフラリソースがコード化されていない世界
インフラの構築には強い権限が必要 現状のインフラ構成を理解していない インフラを触るのはなんとなく怖い SREにお願いするしかない
この言葉には以下の内容が含まれているのではないか
�50
インフラリソースのコード化
SREDevelopers コード書きました!レビューお願いします!
インフラリソースがコード化された世界
インフラ構築の権限が与えられている 現状のインフラ構成は既存のコードから読み取れる
インフラを触るのはまだ怖いけどSREにレビューしてもらえる
開発チームがインフラのコードを書いてSREがレビューする
Manifests
TF File
インフラリソースがコード化されると開発チームと SREとのコミュニケーション方法が変わる
�51
インフラリソースのコード化
開発者チームにサービスの運用をおまかせできるかもしれない
�52
03シングルテナントで権限を分離してクラスタの運用をおまかせする
Section
マルチテナント か シングルテナント か
�53
K8s cluster
Product AService A-1
Service A-2Service A-3
Product BService B-1
ServiceB-2Service B-3
Product CService C-1
Service C-2Service C-3
K8s cluster
Product AService A-1
Service A-2
Service A-3
K8s cluster
Product BService B-1
Service B-2Service B-3
K8s cluster
Product CService C-1
Service C-2
Service C-3
プロダクト(分離したい権限)単位で分割したシングルテナントクラスタ
シングルテナントで権限を分離してクラスタの運用をおまかせする
すべてのプロダクトが動いているマルチテナントクラスタ
シングルテナントのメリット
• Blast radius(障害の影響範囲)が小さい
• セキュリティの境界線の明確化
• クラスタ全体に関係するアップデート作業がしやすい
シングルテナントのデメリット• 利用料金が増える • 運用コストが増える
�54
権限移譲により運用コストの分散は可能
シングルテナントで権限を分離してクラスタの運用をおまかせする
マルチテナント か シングルテナント か
Blast radius(障害の影響範囲)が小さい
�55
リスクを分散し、心理的安全性を高める
シングルテナントで権限を分離してクラスタの運用をおまかせする
K8s cluster
Product AService A-1
Service A-2
Service A-3
Product BService B-1
ServiceB-2
Service B-3
Product CService C-1
Service C-2
Service C-3
K8sのバグ
オペミス
全サービスダウンの危険• Blast radius(障害の影響範囲)が大きい • 運用の難易度が高い • チャレンジしづらい空気
マルチテナントのリスク
�56
シングルテナントで権限を分離してクラスタの運用をおまかせする
シングルテナントによるリスクの軽減
�57
K8s cluster
Product AService A-1
Service A-2
Service A-3
K8s cluster
Product BService B-1
Service B-2
Service B-3
K8s cluster
Product CService C-1
Service C-2
Service C-3
K8sのバグ
オペミス
一部のみサービスダウン• Blast radius(障害の影響範囲)が小さい • 運用の難易度は下がる • チャレンジしやすい空気 • 心理的安全性が高い
シングルテナントで権限を分離してクラスタの運用をおまかせする
セキュリティの境界線の明確化
�58
プロダクト間の不正なアクセスをどう防ぐか
シングルテナントで権限を分離してクラスタの運用をおまかせする
�59
SOC保証: 上場企業が自社の財務報告がきちんとしていることを保証するものfreee(会計ソフト) を利用する場合、freeeも監査の対象になる
SOC1を取得していればfreeeがSOC保証が満たされていると認められる
相応のセキュリティ対策が必要
例えばDBに直接アクセスする場合認証、認可、履歴管理が必要
EC2インスタンス等からのアクセスも SecurityGroup などで明確に権限管
理できていることが望ましい
[再掲] freeeについて
受託業務に係る内部統制の保証報告書(SOC1 Type2報告書)を受領
Product B
マルチテナントで境界線の明確化は難しい
�60
Product A
SG
Kubernetes nodeKubernetes nodeService A-1
Service B-2
Service B-3
Kubernetes nodeKubernetes nodeService B-1
Service A-2
Service A-3
SG SG
Security Group による分割は不可 IAMとKiamでAWSリソースへの制御は可能 RBACでNamespace間のアクセス制御は可能
ただしプロダクト間でVMは共通
↓
プロダクト単位でNodeGroupを分割すれば対応可能だが、そのための仕組みづくりが必要
シングルテナントで権限を分離してクラスタの運用をおまかせする
Product B
SG
Product A
SG
Kubernetes nodeKubernetes nodeService A-1
Service B-2
Service B-3
Kubernetes nodeKubernetes nodeService B-1
Service A-2
Service A-3
SG SG
テナントは分離したい権限単位になっている Security Group が利用可能
RBACを併用 VMレベルで分割されている
↓
今まで運用してきた(枯れた)構成と 一緒なので扱いが簡単
シングルテナントなら境界の明確化は容易
�61
シングルテナントで権限を分離してクラスタの運用をおまかせする
クラスタ全体に関係するアップデート作業がしやすい
�62
• Kubernetesクラスタは頻繁にアップグレードが必要 • 共通部分で利用しているツールのアップデートも必要
シングルテナントで権限を分離してクラスタの運用をおまかせする
�63
シングルテナントで権限を分離してクラスタの運用をおまかせする
K8s cluster
Product AService A-1
Service A-2
Service A-3
Product BService B-1
ServiceB-2
Service B-3
Product CService C-1
Service C-2
Service C-3
Team A Team B Team C
運用
運用運用
マルチクラスタはクラスタ全体に関係する アップデート作業がしづらい
共通部分Product A
SRE
クラスタのアップグレードなど
• サービスをすべて停止させる必要がある • アップグレードに失敗する可能性がある • 失敗したときのロールバックのコストが高い
�64
シングルテナントで権限を分離してクラスタの運用をおまかせする
Team A Team B Team C
運用
運用運用
シングルクラスタはクラスタ全体に関係する アップデート作業がしやすい
SRE
クラスタのアップグレードなど
• サービスの停止は最小限 • アップグレードに失敗しても最小限 • 失敗したときのロールバックのコストも最小限
K8s cluster
Product AService A-1
Service A-2Service A-3
K8s cluster
Product BService B-1Service B-2
Service B-3
K8s cluster
Product CService C-1Service C-2
Service C-3
シングルテナントのメリット• Blast radius(障害の影響範囲)が小さい
• セキュリティの境界線の明確化
• クラスタ全体に関係するアップデート作業がしやすい
�65
シングルテナントで権限を分離してクラスタの運用をおまかせする
クラスタの運用をおまかせするならシングルテナントがマッチする
�66
開発チームがクラスタを 運用するのは簡単ではない
各クラスタ/サービスを横断的に 面倒を見るチームを設置
• SRE • 各種アップデート補助、インシデント対応補助、クラスタ作成補助、ツールの検証/作成、OSSへのコミット
• サービス基盤 • 共通で使うライブラリを整備 • マイクロサービス委員会(SREとサービス基盤を含む各サービス担当者で構成) • 共通の方針や仕様の決定、情報共有、横展開
シングルテナントで権限を分離してクラスタの運用をおまかせする
�67
04EKSをマネージドサービスと組み合わせてクラスタの運用コストを抑える
Section
�68
Product A
SG
SG
SG
Kubernetes node
applications
Product B
SG
SG
SG
Kubernetes node
applications
Kubernetesにどこまで任せる?
• Application
• Database
• LoadBalancer
• Security
• Auth
EKSをマネージドサービスと組み合わせてクラスタの運用コストを抑える
Kubernetesでなんでもやろうとしない
�69
マネージドサービスは積極的に利用し、 システムに Kubernetes(EKS) を組み込む
枯れた運用ノウハウは最大限に活かす
EKSをマネージドサービスと組み合わせてクラスタの運用コストを抑える
�70Product A
SG
SG
SG
Kubernetes node
applications
Product B
SG
SG
SG
Kubernetes node
applications
Product A
SG
Product B
SG
SG
SG
Kubernetes node
SG
SG
Kubernetes node
EKSをマネージドサービスと組み合わせてクラスタの運用コストを抑える
Kubernetes はアプリケーションを動かすことだけに利用する
�71Product A
SG
Product B
SG
SG
SG
Kubernetes node
SG
SG
Kubernetes node
マネージドサービスと Kubernetes の得意分野が活きる
宣言的デプロイ 自動配置 セルフヒーリング オートスケーリング Databases
MySQL/Redis/ElasticSearch
Load Balancer Application/Classic Load Balancer
Security GuardDuty/IAM/WAF
EKSをマネージドサービスと組み合わせてクラスタの運用コストを抑える
�72Product A
SG
Product B
SG
SG
SG
Kubernetes node
SG
SG
Kubernetes node
部品の交換をやりやすい状態に保つ
より良いものが出てきたときにそれを取り込みやすい状態にしておく
AWS App Mesh Istio
EKS on Fargate ECS on Fargate
Knative
Next generation LB Next generation DB
EKSをマネージドサービスと組み合わせてクラスタの運用コストを抑える
�73
05マルチテナントからシングルテナントなEKSに移行した実例
Section
freee で Kubernetes が本番導入されたのは約1年前
�74
• 新しいマイクロサービスが出てきたことがきっかけ • TerraformによるAWSリソースのコード化は一部で導入済み • Kube-aws を採用 • マルチテナント
マルチテナントからシングルテナントなEKSに移行した実例
�75
マルチテナントからシングルテナントなEKSに移行した実例
ap-northeast-1a
Kubernetes master
Kubernetes master
Kubernetes node
Kubernetes master
kube-controller-manager
kube-scheduler
kube-apiserver
Kubernetes master
etcd
Kubernetes node
container runtime
kube-proxy
kubelet
ap-northeast-1c
Kubernetes master
Kubernetes master
Kubernetes node
Kubernetes master
kube-controller-manager
kube-scheduler
kube-apiserver
Kubernetes master
etcd
Kubernetes node
container runtime
kube-proxy
kubelet
ap-northeast-1d
Kubernetes master
Kubernetes master
Kubernetes node
Kubernetes master
kube-controller-manager
kube-scheduler
kube-apiserver
Kubernetes master
etcd
Kubernetes node
container runtime
kube-proxy
kubelet
kube-aws
EKS 2018/12/20 Tokyo Region
�76
• kube-aws のクラスタの証明書が3月13日に切れる • 証明書の入れ替えはちょっと面倒でサービスメンテが必要 • もうEKSに移行してしまおう!
マルチテナントからシングルテナントなEKSに移行した実例
EKS 移行プロジェクト
�77
• 1月下旬頃からスタート • 3月13日までに全プロダクトを移行する • シングルテナントに変更する • 必要なAWSリソースは開発チーム主導で用意してもらう • Kubernetesクラスタも開発チーム主導で構築してもらう
SREから開発チームへ権限委譲を果たし、開発チームにサービスの運用をおまかせすることが最大のミッション
マルチテナントからシングルテナントなEKSに移行した実例
プロジェクトの規模感
�78
• kube-awsでもともと動いていたプロダクト数: 7 • EKSに移行したプロダクト数(移行中に4つ増えた): 11 • クラスタ総数: 26 (staging環境を含む) • 関わった人数: 約33人
マルチテナントからシングルテナントなEKSに移行した実例
EKS 移行プロジェクトで活躍したツール
�79
• Terraform • kubectl • eksctl • helm/helmfile • eksclst
マルチテナントからシングルテナントなEKSに移行した実例
�80
Terraform必要なAWSリソースはすべてTerraformで用意/SREのレビューを経てApply
Product A
SG
SG
SG
Kubernetes node
Kubernetes node
Service A-1
Service A-2
Service A-3
Team APR
appl
y
SRE
Review/Approve
resource "aws_lb" "product-a-internal" { name = "product-a-internal" internal = true load_balancer_type = "application" security_groups = ["${var.lb_security_groups}"] subnets = ${var.subnets} ip_address_type = "ipv4" enable_deletion_protection = true}
resource "aws_route53_record" "product-a-internal" { zone_id = "${var.route53_hosted_zone_id}" name = "${var.route53_dns_name}" type = "A" alias { name = "${aws_lb.product-a-internal.dns_name}" zone_id = "${aws_lb.product-a-internal.zone_id}" evaluate_target_health = true }}
マルチテナントからシングルテナントなEKSに移行した実例
�81
Product A
SG
SG
SG
Kubernetes node
Kubernetes node
Service A-1
Service A-2
Service A-3
Team A (Admin)
IAM Role
ops
via
kube
ctl
assume role
kubectl
RBAC with aws-auth
aws-auth を利用して IAM Role と紐付けて権限を絞って利用apiVersion: v1kind: ConfigMapmetadata: name: aws-auth namespace: kube-systemdata: mapRoles: | - rolearn: {{ .Values.rolearn }} username: system:node:{{`{{EC2PrivateDNSName}}`}} groups: - system:bootstrappers - system:nodes - rolearn: arn:aws:iam::<ID>:role/team-a-admin username: team-a-admin:{{`{{SessionName}}`}} groups: - system:masters - rolearn: arn:aws:iam::<ID>:role/team-a-readonly username: team-a-readonly:{{`{{SessionName}}`}} groups: - system:authenticated
Team A (ReadOnly)
read
onl
y ac
cess
マルチテナントからシングルテナントなEKSに移行した実例
�82
eksctlマルチテナントからシングルテナントなEKSに移行した実例
Product B
SG
SG
SG
Kubernetes node
Kubernetes node
Team B
eksc
tl cr
eate
clu
ster
PR Commands
SRE
Review/Approve
apiVersion: eksctl.io/v1alpha5kind: ClusterConfig
metadata: name: cluster-name region: ap-northeast-1 version: "1.13"
vpc: id: “*****” cidr: "10.0.0.0/16" subnets: private: ap-northeast-1a: id: “*****” ap-northeast-1c: id: “*****”
cluster.yaml でクラスタを定義、eksctl create cluster で作成nodeGroups: - name: nodegroup1 instanceType: r5.large desiredCapacity: 2 availabilityZones: - ap-northeast-1a - ap-northeast-1c privateNetworking: true securityGroups: attachIDs: - ****** iam: withAddonPolicies: imageBuilder: true autoScaler: true attachPolicyARNs: - arn:aws:iam::aws:policy/*****
�83
Helm/Helmfile によるアプリケーションデプロイGitOps で Kubernetesのマニフェストを安全にデプロイ
Product B
SG
SG
SG
Kubernetes node
Kubernetes node
Service B-1
Service B-2
Service B-3
Team B
helm
file
sync
PR Commands
SRE
Review/Approve
environments: production: values: - production.yaml
releases: - name: kube-state-metrics namespace: kube-system chart: stable/kube-state-metrics version: 0.13.0 - name: metricbeat namespace: kube-system chart: stable/metricbeat version: 1.2.1 values: - values.yaml.gotmpl
• Helm(Helm Chart) • The Kubernetes Package Manger • マニフェストをパッケージ化 • よくあるツールのテンプレ • Helmfile • Helm Chartの依存関係をファイルでファイルで定義 • helmfile sync • helmfile diff • helmfile delete
マルチテナントからシングルテナントなEKSに移行した実例
�84Templates
Manifests
eksclstによるクラスタのテンプレ化よくある構成のクラスタテンプレ化し、クラスタの作成/複製を容易にする
New Product
SG
Kubernetes node
Kubernetes node
cluster-autoscaler
Metricbeat
Filebeat
New Team
eksc
tlcr
eate
clu
ster
PR Commands
Manifestseksclst init
Templates
cluster.yaml helmfile.yaml aws-auth.yaml など
helm
file
sync
• クラスタを量産する内製ツール • cluster.yaml • aws-auth.yaml • metricbeat/filebeat • など、一から書くコストを削減するためにテンプレを容易
マルチテナントからシングルテナントなEKSに移行した実例
New Product A
移行作業
�85
マルチテナントからシングルテナントなEKSに移行した実例
Product AProduct A
SG
SG
SG
Kubernetes node
Kubernetes node
Service B-1
Service B-2
Service B-3 SG
Kubernetes node
Kubernetes node
Service B-1
Service B-2
Service B-3
Kube-aws上のプロダクト (実際はマルチテナント) EKS上のプロダクト
Weighted Routing
80% 20%
• 同じ構成のクラスタを用意 • AWSリソースは共有できるものは共有する(DBは必須) • Route53のWeighted Routingを利用して徐々にリクエストを流し込む • サービスによってはRoute53ではなくLBを共通化して、Kubernetes node を差し替える方法を使用 • ノーメンテで切り替え
プロジェクトの成功の要因
�86
• 関わった開発チームのKubernetesへの意欲が強い • ドキュメントを皆で編集しながら(情報交換を密にしながら)進めた • 完璧ではないドキュメントもメンバーが意図を汲み取って理解してくれた • 最後までモチベーションが下がらなかった
マルチテナントからシングルテナントなEKSに移行した実例
まとめ
インフラリソースのコード化とKubernetesのシングルテナント化でサービスの運用コストを分散させる •インフラリソースのコード化は必須、これを足がかりに権限委
譲が進む
•クラスタ運用を開発チームにお願いするにはシングルテナント
がおすすめ
•クラスタ自体の運用コストを抑えるにはマネージドサービスを
うまく使う
•開発チームにKubernetesに対する意欲があることが重要、理
解されない場合は辛みが増えるだけ�87
�88
アイデアやパッションやスキルがあればだれでも、 ビジネスを強くスマートに育てられるプラットフォーム
スモールビジネスを、世界の主役に。