KubernetesのEventを見たい時にはすでに消えている件
背景 Kubernetesのトラブルシュートをしているときのこと
?「どうやら、アプリケーションの調子がおかしいのだけど、Kubernetesで何か起きてない?」
運用者「よっしゃ Kubernetesのイベントを見て突き止めたるで」
という 風に、一目散にkubernetesクラスタに駆け寄ることと思います。(図1)
駆け寄った際に行うことの例
kubernetesクラスタ内で発生したイベントを取得することで、なんとなく何が起こっていたかを把握することができます。
ただし、1時間分しかEventは保持されないため、通知が遅れたり駆け寄るのが遅いと見逃してしまうことがあります。(図2)
Eventを永続化(通知先にて永続化)する仕組みを検討する(Event Exporter)
Kubecon EU 2019にて発表されている、kubernetes-event-exporterが1つのアプローチとなる。
Github: https://github.com/opsgenie/kubernetes-event-exporter
下記ページにて、Slackへの通知方法について記載があり、大変参考になりました。
kubernetes-event-exporter v0.8(2020/06リリース)にて、MS Teams向け通知もサポートされたため検証してみる。
参考元: https://qiita.com/kob-u/items/125bccf9dba5a7dd9a90
kubernetes-event-exporterの構築
Githubから取得
git clone https://github.com/opsgenie/kubernetes-event-exporter
Teams向けの設定を記載
git clone https://github.com/opsgenie/kubernetes-event-exporter
デフォルトの設定(deploy/01-config.yaml)が下記
apiVersion: v1
kind: ConfigMap
metadata:
name: event-exporter-cfg
namespace: monitoring
data:
config.yaml: |
logLevel: error
logFormat: json
route:
routes:
- match:
- receiver: "dump"
receivers:
- name: "dump"
file:
path: "/dev/stdout"
data.config.yaml内のreceiversにTeamsのレシーバ設定をする
Teams向けの設定例はGithubの通り
下記のendpoint部分をwebhook endpointで置き換える
# ...
receivers:
- name: "ms_teams"
teams:
endpoint: "https://outlook.office.com/webhook/..."
layout: # Optional
設定例
❯ cat 01-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: event-exporter-cfg
namespace: monitoring
data:
config.yaml: |
logLevel: error
logFormat: json
route:
routes:
- match:
- receiver: "ms_teams"
receivers:
- name: "dump"
file:
path: "/dev/stdout"
- name: "ms_teams"
teams:
endpoint: "https://outlook.office.com/webhook/..."
デプロイ
❯ k apply -f 00-roles.yaml
namespace/monitoring created
serviceaccount/event-exporter created
clusterrolebinding.rbac.authorization.k8s.io/event-exporter created
❯ k apply -f 01-config.yaml
configmap/event-exporter-cfg created
❯ k apply -f 02-deployment.yaml
deployment.apps/event-exporter created
❯ k get po
NAME READY STATUS RESTARTS AGE
event-exporter-555d56c958-w9cld 1/1 Running 0 3s
❯ k logs event-exporter-555d56c958-w9cld
❯ k run nginx --image nginx
pod/nginx created
Teamsにイベント群が通知されることを確認できる
実践的な使い方
本来は全てのイベントを通知しても嬉しくないので、OOMKilledやCrashLoopBackOff, ImagePullBackOffイベントが発生した際に通知したい
試しにイベントのTYPEがWARNINGなものについて通知するようにする
config.yaml内のroute.routes[].dropにてtype: Normalを設定することで、Normalなイベントを非通知にする
apiVersion: v1
kind: ConfigMap
metadata:
name: event-exporter-cfg
namespace: monitoring
data:
config.yaml: |
logLevel: error
logFormat: json
route:
routes:
- match:
- receiver: "ms_teams"
drop:
- type: "Normal"
receivers:
- name: "dump"
file:
path: "/dev/stdout"
- name: "ms_teams"
teams:
endpoint: "https://outlook.office.com/webhook/..."
試しに、存在しないosushi imageを指定することで、ImagePullBackOffを引き起こしてみる
osushiがないと怒られてしまう
❯ k run nginx --image osushi
pod/nginx created
❯ k get event | grep Warn
6s Warning Failed pod/nginx Failed to pull image "osushi": rpc error: code = Unknown desc = failed to pull and unpack image "docker.io/library/osushi:latest": failed to resolve reference "docker.io/library/osushi:latest": pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed
6s Warning Failed pod/nginx Error: ErrImagePull
6s Warning Failed pod/nginx Error: ImagePullBackOff
Teamsにて同様のイベントが通知されていることを確認できる
その他のevent exporter
純粋にexporterとしての役割に閉じたタイプ
通知部分は担当しない分、別途prometheus ruleで柔軟にアラート設定できる
opsgenie側は単体で動くが、こちらはメトリクスを収集するprometheusやalertmanagerなどが前提となるので、用途によるといった印象
まとめ
- kubernetesのトラブルシュートのためにEventを別途保持する仕組みとして、kubernetes-event-exporterを調査した。
- 2020/06リリースのv0.8にてMS Teams向けに通知を行えるようになったので、実際に検証しうまく通知されることを確認した。
- Teams内にてEventを保持することで、普段からMS Teamsを使用している場合にシームレスにトラブル対応に移行することが期待できる
Author And Source
この問題について(KubernetesのEventを見たい時にはすでに消えている件), 我々は、より多くの情報をここで見つけました https://qiita.com/iaoiui/items/ee642b8b30670b21ad7c著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .