More Related Content Similar to SaaS運用での大障害の思い出と対策の共有(中噴火編)【WESEEK Tech Conf #4】
Similar to SaaS運用での大障害の思い出と対策の共有(中噴火編)【WESEEK Tech Conf #4】 (20) More from WESEEKWESEEK (11) SaaS運用での大障害の思い出と対策の共有(中噴火編)【WESEEK Tech Conf #4】10. 10
● 株式会社WESEEK
システムエンジニア
佐藤 龍
● 前職(7.5年)ではサポートセンターのテクニカルエンジニアをしてました
● 現職(3年目)では大手IXの業務自動化システムの機能開発やGROWI.cloudの
インフラ構築・運用に携わってます
● Qiitaでは@tatsurou313としてアウトプットしてます
自己紹介
18. どんな構成?
18
*1-1 Brigade | Event-driven scripting for Kubernetes.
*1-1
を使って、マニフェストをデプロイする
利用者
GROWI ノード
【フロントエンド】
GROWI 作成 (/構成変更/削除)
オーダー
オーダー
helm
upgrade
helm
upgrade
【バックエンド】
【オーダー処理】
【クラスタ】
...
GROWI App
GROWI App
22. 運用の目標は?
● GROWI appの稼働率SLO 99.9% *
● まだまだ至らないところですが、一日
換算で許容できる停止時間は
86.44秒
22
* SLO 99.9% は、旧スタンダードプラン以上、5/13リリースの新法人
プランではベーシックプラン以上での提供です
GROWI appが停止した
Keycloakが停止した
HackMDが停止した
Elasticsearchが停止した
= GROWI appでの全文検索不可
GROWI.cloudサイトが停止した
GROWI.cloudにログインできない
GROWI.cloudでGROWI appの更新ができない
GROWI.cloud上でバグなどにより利用できな
い機能がある
バックアップできない
機能は提供できるが縮退状態
高
↑
障
害
緊
急
度
↓
低
24. 大障害1.監視システムの全停止
● 何が起きたのか?
○ Prometheus serverが停止した
● 何が出来なくなるか?何が困るのか?
○ GROWI.cloudを使っているユーザーには何も影響ない
■ 障害緊急度の表にあてはめても一番低
○ しかし、システムの稼働状況の把握や、サービスの稼働率の
計測、アラート通知が一切できない
■ GROWI.cloudは稼働している?→ 不明
■ ユーザーはGROWI appを使える?→ 不明
■ ミドルウェアは稼働している?→ 不明
○ つまり、SLOを達成できているか分からなくなってしまい、
サービス運営存続に支障が出てしまう
24
GROWI appが停止した
Keycloakが停止した
HackMDが停止した
Elasticsearchが停止した
= GROWI appでの全文検索不可
GROWI.cloudサイトが停止した
GROWI.cloudにログインできない
GROWI.cloudでGROWI appの更新ができない
GROWI.cloud上でバグなどにより利用できない機能がある
バックアップできない
機能は提供できるが縮退状態
26. ● Podを見るとPrometheus serverがCrashLoopBackOffとなっていた*1-3
○ 通常は停止してもk8s clusterのkubeletにより自動再起動される*1-4
● ログを見るとPrometheus起動時に実行されるhead chunkチェックで不整
合を検知していた*1-5
→ 不整合を起こしたhead chunkファイルを削除すればよいと判明
*1-3 トラブルシューティング | Kubernetes Engine ドキュメント
*1-4 Liveness Probe、Readiness ProbeおよびStartup Probeを使用する
*1-5 opening storage failed: found unsequential head chunk files 23 and 25 · Issue #7412 · prometheus/prometheus
26
まずは状況確認(2/2)
27. どうやって不要なhead chunkを消そう?(1/2)
● PrometheusのPodは数秒で停止するためkubectl execではshellを起動でき
ない
1. マニフェストのcommandを`sleep infinity`等へ書き換える?
○ Podのcommandは書き換え不可*1-6
2. マニフェストのrestart policyをNeverへ書き換える?
○ StatefulSetのrestart policyはAlways以外不可*1-7
3. 同じPVをmountするPodを立ち上げる?
○ PVがRWOであったため、別Nodeで立ち上がったPodからはアクセス不可*1-8
*1-6 Kubernetes API Reference Docs
*1-7 restartPolicy: Unsupported value: "Never": supported values: "Always"
*1-8 永続ボリューム
27
29. Prometheusが稼働していたノードへsshログインす
る
1. GKEのノードへsshする*1-10
2. PVのmount先を特定する
3. ファイルを消す
29
$ kubectl get pvc
storage-volume-admin-prometheus-server-0 Bound pvc-bf8d8e4c-7561-11e9-bef2-42010a920054 XXXGi RWO XXXXX XXXd
$ mount | grep bf8d
/dev/sdb on /var/lib/kubelet/plugins/kubernetes.io/gce-pd/mounts/gke-growi-cloud-prod-c-pvc-bf8d8e4c-7561-11e9-bef2-42010a920054 type ext4
(rw,relatime,data=ordered)
:
# cd /var/lib/kubelet/plugins/kubernetes.io/gce-pd/mounts/gke-growi-cloud-prod-c-pvc-bf8d8e4c-7561-11e9-bef2-42010a920054/chunks_head
# ls
000618 000619 000621 000622
# rm -f 000621 000622
# ls
000618 000619
*1-10 Using SSH to connect to a cluster node | Anthos clusters on VMware
30. 大障害1のまとめと恒久対策
● 事象
○ Prometheus serverが停止した
● 原因
○ Prometheusのhead chunkに不整合が起こり起動しなくなった
● 影響
○ システムの稼働状況の把握や、サービスの稼働率の計測、アラート通知が一切できず、サービス運営存続に支障
が出てしまう
● 暫定復旧方法
○ ノードへsshして不整合を起こしたhead chunkを削除した
● 恒久対策
○ 監視システムが停止したことを監視する
○ Prometheusはv2.19.1以降を使用する
■ head chunkの不整合が起こらないようになった
30
34. ノード数を自動で増やす仕組み
34
● ノードやクラスタのオートスケーラーはCluster Autoscalerと呼ばれる*2-1
○ GKEはCluster Autoscalerに対応している
● ノードプール(ノードの集まりを指す概念)にてオートスケールを指定でき
る*2-1
○ 増減量はmin/max(per zone)が指定可能
○ Podをscheduleする際に、request resource分の空きがあるノードが枯渇した場合、
新しいノードが追加される
*2-1 Cluster Autoscaler
*2-2 クラスタ オートスケーラー | Kubernetes Engine ドキュメント | Google Cloud
ノードプール
(ex. min:2, max:5)
node node new
node
p
o
d
p
o
d
オートスケール
schedule
36. 大障害2.長時間GROWI appが停止し影響数も増加
● 何が起こったのか?
○ 同じノードに載っているGROWI appが一斉に停止し、
起動せず長時間に及んだ
○ 他のノードでも徐々に同じ状況になった
○ いずれのノードもプリエンプティブルノードであった
● 何が出来なくなるか?何が困るのか?
○ 複数のユーザーのGROWI appが一切使えない
■ ユーザーの怒る顔が浮かびます...
○ プリエンプティブルノードは24h以内に再起動するため、
放置するとSLOを維持できなくなることが明白である
36
GROWI appが停止した
Keycloakが停止した
HackMDが停止した
Elasticsearchが停止した
= GROWI appでの全文検索不可
GROWI.cloudサイトが停止した
GROWI.cloudにログインできない
GROWI.cloudでGROWI appの更新ができない
GROWI.cloud上でバグなどにより利用できない機能がある
バックアップできない
機能は提供できるが縮退状態
40. 大障害2まとめと恒久対策
● 事象
○ 長時間GROWI appが停止し影響数も増加
● 原因
○ プリエンプティブルノードの在庫が枯渇した
● 影響
○ 多くのGROWI appにて、稼働するノードがなくなり長時間停止した
● 暫定復旧方法
○ ノンプリエンプティブルノードを購入してGROWI appを稼働させた
● 恒久対策
○ 緊急時にノードを退避するためのnodeAffinityを設定した
(在庫の枯渇は避けようがないため、再発時の対応を迅速にする対策)
40
46. 大障害3.GROWI appの新規作成及び更新操作の失敗が多発
● 何が起こったのか?
○ GROWI appの新規作成及び更新操作の失敗が多発
● 何が出来なくなるか?何が困るのか?
○ ユーザーは作成済みのGROWI appは利用できる
○ GROWI.cloudの操作画面からGROWI appの新規作成
及び更新ができない
○ つまり、SLOは維持ができるが、新規ユーザーを獲得
する機会損失につながり、既存ユーザーは不便な思い
をしてしまう
46
GROWI appが停止した
Keycloakが停止した
HackMDが停止した
Elasticsearchが停止した
= GROWI appでの全文検索不可
GROWI.cloudサイトが停止した
GROWI.cloudにログインできない
GROWI.cloudでGROWI appの更新ができない
GROWI.cloud上でバグなどにより利用できない機能がある
バックアップできない
機能は提供できるが縮退状態
52. 大障害3まとめと恒久対策
● 事象
○ GROWI appの新規作成及び更新操作の失敗が多発
● 原因
○ npmjsサイトの障害により一切のnpmのパッケージダウンロードができなくなった
● 影響
○ GROWI Appの新規作成及び更新ができない
● 暫定復旧方法
○ なし (障害アナウンスのみ)
● 恒久対策
○ 必要なnpmパッケージをSCM repositoryに含め、都度ダウンロードを不要にした
(また、repositoryに含めるにあたり依存するnpmパッケージ数を減らしもしました)
52