SlideShare a Scribd company logo
はじめてのDapr on Kubernetes
~分散システムでの一過性の障害に備える~
Shiho ASA@Microsoft
Agenda
• 分散システムにおける一過性の障害
• Dapr とは
• Dapr のResiliency
• まとめ
オンプレデータセンターでありがちだった課題
 インフラ(ハードウエア)の管理
 変動するリクエストに応じたシステム拡張が困難
 既存システムに変更を加えるときは事前に関係各所と調整
 業務アプリのバージョンアップは夜間休日
 作業手順書 && チェックリスト による手作業メイン
➡ 直接的なビジネス価値を生まない作業の負荷が増大
➡ クラウドを活用しよう!
クラウド導入の効果
 インフラはクラウドベンダーが管理
 メンテナンスもクラウドベンダーが実施
 従量課金で必要なリソースを必要な時に調達可能
 CI/CD 環境を整備して、リリース作業を自動化
➡ インフラの運用負荷が下がった
➡ アプリの更新頻度が上がり、ビジネスニーズを取り込みやすくなった
が、、、、、ごくまれにある悲劇
御社クラウドで動かしているうちの
基幹システムがエラーが発生して
業務影響が出ていたようです。
クラウドでメンテを
していませんでしたか?
はい。その時間帯に
メンテナンスを実施しています
一過性の障害
ユーザ影響の少ない夜間
に対応してもらわないと
困る!!
弊社側のタイミングで
SLAを下回らないよう
調整しながら自動で
基盤メンテします
いやいや、うちは海外利用
するシステムなので日本
時間の日中にして!!
クラウドで一過性の障害が起こる理由
• クラウドは、複数の計算ユニットやインフラに負荷を動的に配分することでパフォーマンスを実
現し、コンポーネントを自動的にリサイクル (交換) することで信頼性を確保している
• クラウドリソースは多くのユーザ共有されており、それらのリソースを保護するために使用量が
調整されることがある
• クラウド環境では、ハードウェア コンポーネント (ルーター、ロード バランサーなどのネットワーク
インフラストラクチャ) の構成要素が多い
• クライアントとサーバー間のネットワーク (特にインターネットを経由する通信)では断続的な接
続障害が発生しやすい
https://learn.microsoft.com/ja-jp/azure/architecture/best-practices/transient-faults
インフラ構成の違い
Public IP
ILB
Availability
Set
APP1
LB
Availability
Set
WEB1 WEB2
APP2
 物理サーバを意識したアーキテクチャ
 システム管理者が運用保守
計画メンテ
バックアップ
パッチ適用
ストレージ管理
ネットワーク管理
アプリリリース
Availability
Set
node0
Public IP
LB LB LB
Gateway
node1 node2 node3 node4
node5 node6 node7 node8 node9
Master0 Master1 Master2
複数ノードの管理
コンテナアプリの配置
オートスケーリング
死活監視
障害時自己復旧
負荷分散
ストレージ管理
サービスディスカバリー
 インフラレイヤーを抽象化しシステム管理をソフトウエアで自動化
 従来の方式設計に加えて、考慮すべきポイントが発生する
システムメンテナンスの考え方の違い
Public IP
ILB
Availability
Set
APP1
LB
Availability
Set
WEB1 WEB2
APP2
システム管理者が実施
○○基幹システムメンテ
6/5 夜間実施
担当: xx
<作業手順書>
1. サーバーの起動
2. DBの起動
3. 動作確認
4. バックエンドサーバの起動
5. 動作確認
6. フロントサーバの起動
7. 動作確認
8. ロードバランサの起動
9. 外部疎通性確認
・ ・ ・
Availability
Set
node0
Public IP
LB LB LB
Gateway
node1 node2 node3 node4
node5 node6 node7 node8 node9
Master0 Master1 Master2
• メンテナンス対象ノードで動
いているアプリに退避要求
• 複数あるノードプールを順
次バージョンアップ(系全体
系としては無停止)
• メンテナンス終了したノード
に新たにアプリがデプロイさ
れる
• 新しくデプロイされたアプリ
ケーションに対し、LBがリク
エストを転送
ソフトウエアで自動化
大規模基幹システムにおける方式設計の例
非機能要件を満たすハー
ドウエア構成/ソフトウエア
アーキテクチャを設計
機能要件を満たすアプリ
ケーションの処理方式や
画面・業務プロセス・デー
タなどを設計
セキュリティ
性能・信頼性設計
運用方式設計
移行方式設計
他システム連携
etc
・ ・ ・
クラウドのメリットを活かしたシステム構築やアプリケーション開発をするために
検討しておくポイントがある
一過性の障害に備えるためのアプリケーション実装例
アプリケーションでのリトライ処理を検討
• リトライの妥当性を判断
➡ 障害が一過性であり、再試行すれば操作に成功する可能性がある場合に限定する
➡データベースに存在しない項目の更新、致命的なエラーが生じているサービスやリソースへ
の要求などは再試行しても改善しない
• リトライの試行回数と間隔を決める
➡ リトライの回数が不足していると、アプリケーションが操作を完了できず、エラーとなる
➡ リトライ回数が多すぎるか、試行間隔が短すぎると、スレッドや接続、メモリなどのリソー
スをアプリケーションが長時間占有することになる
https://learn.microsoft.com/ja-jp/azure/architecture/best-practices/transient-faults#general-guidelines
Dapr on Kubernetes 101
分散システムが本質的に持つ技術的課題
 サービス間の呼び出し
 サービス間での状態共有
 システムの監視
 シークレットの管理
 障害部分のみ切り離してサービスを継続させる
Dapr (Distributed Application Runtime) とは
 クラウドネイティブなシステムにおいて分散処理を実装するアプリケーションランタイム
 Microsoftが開発を主導するOSSでCNCFに寄贈
✓Dapr自身がコンテナと
して実行
✓サービスから
HTTP/gRPC API経由
で呼び出して利用する
ビルディングブロック
Dapr の提供機能
コンポーネント 説明
Service Invocation リトライ/分散トレースなどのマイクロサービスに必要な機能をサポートするサービス間通信機能
State management キー/バリュー形式の状態管理 状態を保管するコンポーネントとしてRedis/MySQLなどがある
Publish & subscribe
messaging
Publish/Subscribe形式のメッセージング機能
Bindings データベースやキュー、ファイルシステムなどにイベントを送受信する機能
Actors アクターズパターンに関連する機能
Observability 各種メトリックス、ログ、トレース機能
Secrets management 秘匿情報の管理機能 AWS Secrets Manager/GCP Secrets Manager/Azure Key Vaultなどと連携可能
Configuration アプリケーションの構成管理
Dapr の Service Invocation
Dapr がアプリケーション間で通信する機能
✓ HTTP および gRPC でのサービス呼び出し
✓ サービス間のセキュリティ
✓ リクエストのタイムアウト/再試行/サーキットブレーカー
✓ 可観測性とトレースの実装
✓ mDNS によるラウンド ロビン負荷分散
Dapr の Service Invocation
サービスAからサービスBを呼び出す場合
① サービスAからDaprサイドカーにリクエスト
② DaprがサービスBの名前解決
③ DaprがサービスBのDaprサイドカーに転送
④ サービスB の Daprサイドカーは、サービスB
のエンドポイントにリクエストを転送し
サービスBはビジネスロジックを実行
⑤ サービスBからDaprサイドカーにレスポンス
⑥ DaprがサービスAのDaprサイドカーに転送
⑦ サービスAがレスポンスを受信
React
Java
Spring Boot
Dapr
フロントエンド
localhost
サービスB
サービスA
name
resolution
component
❶
❸
Node.js Dapr
localhost
➍
❺
➏
➐
❷
Dapr on Kubernetes ~セットアップ~
$ dapr init --kubernetes --wait
https://github.com/dapr/quickstarts/tree/master/tutorials/hello-kubernetes
$ kubectl get deploy,svc,statefulset -n dapr-system
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/dapr-dashboard 1/1 1 1 7d23h
deployment.apps/dapr-operator 3/3 3 3 7d23h
deployment.apps/dapr-sentry 3/3 3 3 7d23h
deployment.apps/dapr-sidecar-injector 3/3 3 3 7d23h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
AGE
service/dapr-api ClusterIP 10.0.106.48 <none> 80/TCP
service/dapr-dashboard ClusterIP 10.0.246.148 <none> 8080/TCP
service/dapr-placement-server ClusterIP None <none>
50005/TCP,8201/TCP service/dapr-sentry ClusterIP 10.0.54.111 <none>
80/TCP service/dapr-sidecar-injector ClusterIP 10.0.133.83 <none>
443/TCP service/dapr-webhook ClusterIP 10.0.158.32 <none>
443/TCP
NAME READY AGE
statefulset.apps/dapr-placement-server 3/3 7d23h
✓ Dapr CLIでKubernetesにデプロイ
✓ DaprはOperatorとして動作
✓ Dapr-sidecar-injectorはDaprが
Enableなアプリに対してサイドカーを動
かすデプロイメント
✓ Dashboardも用意されている
Dapr on Kubernetes ~アプリケーションのデプロイ~
https://github.com/dapr/quickstarts/tree/master/tutorials/hello-kubernetes
kind: Deployment
apiVersion: apps/v1
metadata:
name: backend
...
spec:
...
template:
metadata:
...
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "backend"
dapr.io/app-port: "8080"
dapr.io/config: "featureconfig"
spec:
containers:
✓ Daprを有効にするには、アノテーションを設定
✓ dapr.io/config アノテーションは、Daprでリトラ
イ処理などを行うために必要な設定
アノテーション 説明
dapr.io/enabled Daprを有効にするかどうか
dapr.io/app-id Dapr ID(クラスタ内で一意になるよう
に設定)
dapr.io/app-port アプリのポート番号
dapr.io/config Configファイルの読み込み
Dapr on Kubernetes ~サービスの呼び出し~
import io.dapr.client.DaprClient;
import io.dapr.client.DaprClientBuilder;
import io.dapr.client.domain.HttpExtension;
...
@SpringBootApplication
public class SampleServiceApplication {
...
DaprClient daprClient = new DaprClientBuilder().build();
var result = daprClient.invokeMethod(
“serviceb",
“todos/" + id,
null,
HttpExtension.GET,
String.class
);
...
}
✓ 提供されているDapr SDKを利用
.NET/Java/Python/Go/Javascript
✓ HTTP/gRPC での呼び出し
dapr-app-id ヘッダにサービス名を指定
✓ Dapr CLI での呼び出し
✓ エンドポイントにGETリクエスト送信
(次のページ)
https://docs.dapr.io/developing-applications/building-blocks/service-invocation/howto-invoke-discover-services/
$ dapr invoke
--app-id serviceb
--method todos/100
Dapr on Kubernetes ~サービスの呼び出し~
http://localhost:3500/v1.0/invoke/serviceb/method/todos
React
Java
Spring
Boot
Dapr
フロントエンド
Pod
サービスB Pod
サービスA Pod
Node.js Dapr
http://localhost:8080/todos
8080
3500
呼び出し先サービス名 呼び出し先パス
Daprポート
アプリのポート
dapr-app-id: serviceb
Dapr の Resiliency
✓ Daprでは次のResiliency機能を提供
⚫ タイムアウト
⚫ リトライ
⚫ サーキットブレーカ
✓Resiliency 機能を有効にするには、Pod 側で
dapr.io/config: “featureconfig” アノテーショ
ンを設定する必要がある
https://docs.dapr.io/operations/resiliency/resiliency-overview/
apiVersion: dapr.io/v1alpha1
kind: Resiliency
metadata:
name: todo-resiliency
...
spec:
policies:
# タイムアウトの設定
timeouts:
general: 5s
important: 60s
largeResponse: 10s
Dapr の Resiliency
リトライのポリシー
✓exponential/constantを指定できる
✓exponential back-off の場合は次の式で評価
✓constantの場合は、リトライ間隔(duration)を指定で
きる
✓maxRetriesで再試行回数を指定
https://docs.dapr.io/operations/resiliency/resiliency-overview/
apiVersion: dapr.io/v1alpha1
kind: Resiliency
...
spec:
policies:
# リトライの設定
retries:
retryForever:
policy: exponential
maxInterval: 15s
maxRetries: -1
important:
policy: constant
duration: 5s
maxRetries: 30
someOperation:
policy: exponential
maxInterval: 15s
BackOffDuration = PreviousBackOffDuration *
(Random value from 0.5 to 1.5) * 1.5
if BackOffDuration > maxInterval {
BackoffDuration = maxInterval
}
Dapr の Resiliency
サーキットブレーカーのポリシー
⚫ maxRequests: ハーフオープン(障害からの回復)時に通
過できるリクエストの最大数を指定
⚫ trip: サーキットブレーカーで評価されるステートメント
⚫ timeout: サーキットブレーカーがハーフオープンに切り替
わるまでの期間。デフォルトは60s
⚫ Interval: サーキットブレーカーがカウントをクリアするた
めの間隔
✓サーキットブレーカーは、Daprサイドカーが動作している限
り、カウンターを維持するが永続化されないので注意
apiVersion: dapr.io/v1alpha1
kind: Resiliency
...
spec:
# サーキットブレーカーの設定
circuitBreakers:
simpleCB:
maxRequests: 1
timeout: 30s
trip: consecutiveFailures >= 5
pubsubCB:
maxRequests: 1
interval: 8s
timeout: 45s
trip: consecutiveFailures > 8
https://docs.dapr.io/operations/resiliency/policies/#circuit-breakers
apiVersion: dapr.io/v1alpha1
kind: Resiliency
...
spec:
policies:
# タイムアウトの設定
timeouts:
general: 5s
important: 60s
largeResponse: 10s
# リトライ/CBの設定
retries:
retryForever:
...
circuitBreakers:
simpleCB:
...
targets:
apps:
serviceb: # Dapr IDを設定
timeout: general
retry: retryForever
circuitBreaker: simpleCB
Dapr の Resiliency
✓定義したポリシーをどのターゲット(アプリ)に適用する
かを指定
✓スコープを設定して適用を限定させることも可能
✓ 組み込みのデフォルトポリシーがあるがユーザ定義ポリシー
のほうが優先度が高い
⚫ DefaultRetryPolicy
⚫ DefaultTimeoutPolicy
⚫ DefaultCircuitBreakerPolicy
どういうふるまいをするかを検証してから本番適用へ!
まとめ
✓クラウドに限らず分散システムでは一過性の障害は起こりえる
✓分散システムの特性を知ったうえでアプリケーションで回避できるかを検討
すると良い
✓分散アプリケーションランタイム「Dapr」にはResiliency の機能がある
✓Dapr サイドカーがタイムアウト/リトライ/サーキットブレーカー
✓リトライの妥当性判断や試行回数・間隔はアプリやシステムに依存する
➡用法用量を守って正しくお使いください
thanks

More Related Content

PDF
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
PDF
Kubernetes 疲れに Azure Container Apps はいかがでしょうか?(江東区合同ライトニングトーク 発表資料)
PPTX
Redisの特徴と活用方法について
PDF
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
PPTX
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
PDF
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
PDF
20190806 AWS Black Belt Online Seminar AWS Glue
PPTX
事例で学ぶApache Cassandra
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetes 疲れに Azure Container Apps はいかがでしょうか?(江東区合同ライトニングトーク 発表資料)
Redisの特徴と活用方法について
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
20190806 AWS Black Belt Online Seminar AWS Glue
事例で学ぶApache Cassandra

What's hot (20)

PDF
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
PDF
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
PPTX
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
PDF
Rancher/Kubernetes入門ハンズオン資料~第2回さくらとコンテナの夕べ #さくらの夕べ 番外編
PDF
20190521 AWS Black Belt Online Seminar Amazon Simple Email Service (Amazon SES)
PPTX
ぱぱっと理解するSpring Cloudの基本
PDF
ドメイン駆動設計 本格入門
PDF
マイクロサービスと Red Hat Integration
PPTX
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
PDF
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
PDF
コンテナにおけるパフォーマンス調査でハマった話
PDF
AWS BlackBelt AWS上でのDDoS対策
PDF
アーキテクチャから理解するPostgreSQLのレプリケーション
PDF
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PDF
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
PDF
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
PPTX
深い親子関係のテーブル設計
PDF
VPC Reachability Analyzer 使って人生が変わった話
PDF
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
PDF
DevOps with Database on AWS
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
Rancher/Kubernetes入門ハンズオン資料~第2回さくらとコンテナの夕べ #さくらの夕べ 番外編
20190521 AWS Black Belt Online Seminar Amazon Simple Email Service (Amazon SES)
ぱぱっと理解するSpring Cloudの基本
ドメイン駆動設計 本格入門
マイクロサービスと Red Hat Integration
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
コンテナにおけるパフォーマンス調査でハマった話
AWS BlackBelt AWS上でのDDoS対策
アーキテクチャから理解するPostgreSQLのレプリケーション
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
深い親子関係のテーブル設計
VPC Reachability Analyzer 使って人生が変わった話
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
DevOps with Database on AWS
Ad

Similar to Dapr on Kubernetes (11)

PDF
Daprでつくるポータブルなバックグラウンドジョブ
PDF
AKS + Azure Event Hubs で試す Dapr の Resorce Binding (Microsoft Open Tech Night ...
PDF
Realizling Dapr Observability Using Elastic Stack
PDF
Kubernetesのワーカーノードを自動修復するために必要だったこと
PDF
Resilience Engineering on Kubernetes
PDF
On-premise コンテナ基盤と Hardware LB を使った "type LoadBalancer"
PDF
Tech Dojo 02/09 IBM Japan CSM
PDF
Architecting on Alibaba Cloud - Fundamentals - 2018
PDF
Kubernetes Cluster Adminやってました #con_rider
PDF
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
PDF
CyberAgent: How We Deployed Production Kubernetes Clusters on OpenStack witho...
Daprでつくるポータブルなバックグラウンドジョブ
AKS + Azure Event Hubs で試す Dapr の Resorce Binding (Microsoft Open Tech Night ...
Realizling Dapr Observability Using Elastic Stack
Kubernetesのワーカーノードを自動修復するために必要だったこと
Resilience Engineering on Kubernetes
On-premise コンテナ基盤と Hardware LB を使った "type LoadBalancer"
Tech Dojo 02/09 IBM Japan CSM
Architecting on Alibaba Cloud - Fundamentals - 2018
Kubernetes Cluster Adminやってました #con_rider
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
CyberAgent: How We Deployed Production Kubernetes Clusters on OpenStack witho...
Ad

Dapr on Kubernetes