Slide 1

Slide 1 text

prob_code: k8s @proelbtn

Slide 2

Slide 2 text

自己紹介 ● 名前:えると(@proelbtn) ● 所属:電気通信大学 セキュリティ情報学プログラム 3年 ● 今年の役割:インフラリーダー

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

問題の様子を見に行こう!

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

🤔

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

🤔🤔🤔

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

問題 : Prometheusが壊れちゃった。。。 概要 あなたはトラブルシューティングコンテストの運営です。本戦当日、目が覚めて問題展開 状況を確認するダッシュボードを見に行ったところ、メトリクスが取れていませんでした。 前提条件 現在保存されているメトリクスを消してはいけない。 初期条件 ダッシュボードを確認すると、2021/03/06 02:16以降のメトリクスが見れない。 終了条件 ダッシュボードからメトリクスを見れるようにする。

Slide 15

Slide 15 text

とりあえずログを見ろ

Slide 16

Slide 16 text

$ kubectl get logs -n monitoring … ... level=warn ts=2021-03-05T18:06:31.492Z caller=scrape.go:972 component="scrape manager" scrape_pool=blackbox-exporter target="http://blackbox-exporter.monitoring.svc.cluster.local:9115/pro be?module=icmp&target=10.5.15.194" msg="append failed" err="write to WAL: log samples: write /etc/prometheus-data/wal/00001007: disk quota exceeded" level=warn ts=2021-03-05T18:06:31.492Z caller=scrape.go:987 component="scrape manager" scrape_pool=blackbox-exporter target="http://blackbox-exporter.monitoring.svc.cluster.local:9115/pro be?module=icmp&target=10.5.15.194" msg="appending scrape report failed" err="write to WAL: log samples: write /etc/prometheus-data/wal/00001007: disk quota exceeded"

Slide 17

Slide 17 text

😇

Slide 18

Slide 18 text

さてどう解決するか? ● 少なくなったら足すだけや! ○ PVCを編集してスケールアップしたい ○ そもそもできるの?

Slide 19

Slide 19 text

$ kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE csi-cephfs rook-ceph.cephfs.csi.ceph.com Retain Immediate true 11d

Slide 20

Slide 20 text

ALLOWVOLUMEEXPANSION=true

Slide 21

Slide 21 text

😃

Slide 22

Slide 22 text

さてどう解決するか? ● 少なくなったら足すだけや! ○ PVCを編集してスケールアップしたい ○ そもそもできるの? ○ おっしゃ!後はやるだけや!

Slide 23

Slide 23 text

$ nvim prometheus-pvc.yaml $ kubectl apply -f .

Slide 24

Slide 24 text

Ignoring the PVC: didn't find a plugin capable of expanding the volume; waiting for an external controller to process this PVC.

Slide 25

Slide 25 text

🤔🤔🤔🤔🤔

Slide 26

Slide 26 text

さてどう解決するか? ● 少なくなったら足すだけや! ○ 足せなかった。。。

Slide 27

Slide 27 text

$ kubectl delete -f .

Slide 28

Slide 28 text

😇😇😇

Slide 29

Slide 29 text

問題 : Prometheusが壊れちゃった。。。 概要 あなたはトラブルシューティングコンテストの運営です。本戦当日、目が覚めて問題展開 状況を確認するダッシュボードを見に行ったところ、メトリクスが取れていませんでした。 そしてPVCを削除しました。 前提条件 現在保存されているメトリクスを消してはいけない。 初期条件 ダッシュボードを確認すると、2021/03/06 02:16以降のメトリクスが見れない。 終了条件 ダッシュボードからメトリクスを見れるようにする。

Slide 30

Slide 30 text

さてどう解決するか? ● 少なくなったら足すだけや! ○ 足せなかった。。。 ● どうにかしてデータを復旧させなければならない

Slide 31

Slide 31 text

$ kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE csi-cephfs rook-ceph.cephfs.csi.ceph.com Retain Immediate true 11d

Slide 32

Slide 32 text

RECLAIMPOLICY=Retain

Slide 33

Slide 33 text

さてどう解決するか? ● 少なくなったら足すだけや! ○ 足せなかった。。。 ● 実は、PVは残っているのでは。。。?

Slide 34

Slide 34 text

$ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-dfb6cde7-e3d0-4e6a-b46d-4ac5dd3d97fb 20Gi RWX Retain Released monitoring/prometheus-pvc csi-cephfs 8d

Slide 35

Slide 35 text

PV自体は消えていなさそう!

Slide 36

Slide 36 text

でも、どうやって解決するか?

Slide 37

Slide 37 text

正しく作られている時の状況 Persistent Volume Claim Storage Class Persistent Volume storageClassName claimRef volumeName

Slide 38

Slide 38 text

今の状況 Persistent Volume Claim Storage Class Persistent Volume claimRef

Slide 39

Slide 39 text

$ kubectl edit pv pvc-dfb6cde7-e3d0-4e6a-b46d-4ac5dd3d97fb

Slide 40

Slide 40 text

$ cat pvc.yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: namespace: monitoring name: prometheus-pvc-old spec: accessModes: - ReadWriteMany resources: requests: storage: 20Gi volumeName: "pvc-dfb6cde7-e3d0-4e6a-b46d-4ac5dd3d97fb" storageClassName: csi-cephfs

Slide 41

Slide 41 text

$ cat ds.yaml apiVersion: apps/v1 kind: Deployment ... containers: - name: data-access image: ubuntu:18.04 command: ["/bin/sh"] args: ["-c", "while true; do echo hello; sleep 10; done"] volumeMounts: - name: prometheus-data-old mountPath: /old - name: prometheus-data mountPath: /new volumes: - name: prometheus-data-old persistentVolumeClaim: claimName: prometheus-pvc-old - name: prometheus-data persistentVolumeClaim: claimName: prometheus-pvc

Slide 42

Slide 42 text

$ cp -r /old/* /new $ chown -R 65534:65534 /new

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

🎉🎉🎉🎉🎉

Slide 45

Slide 45 text

教訓 ● ちゃんとストレージのサイジングをしないとだめ ○ ログやメトリクスは無くなると困る ○ 1日の収集量とretentionの設定から計算する ○ 多少の余力を持ってサイジングする

Slide 46

Slide 46 text

教訓 ● ちゃんとストレージのサイジングをしないとだめ ○ ログやメトリクスは無くなると困る ○ 1日の収集量とretentionの設定から計算する ○ 多少の余力を持ってサイジングする ● 書かれているからといって使えるとは限らない ○ 必要な要件をちゃんと確認する必要があった

Slide 47

Slide 47 text

教訓 ● ちゃんとストレージのサイジングをしないとだめ ○ ログやメトリクスは無くなると困る ○ 1日の収集量とretentionの設定から計算する ○ 多少の余力を持ってサイジングする ● 書かれているからといって使えるとは限らない ○ 必要な要件をちゃんと確認する必要があった ● 監視基盤が死んだ時の手段を用意しておく ○ Prometheusが死んだアラートが上がらなかった

Slide 48

Slide 48 text

教訓