kubernetes

kubernetesのeventを過信してはいけない(戒め)

こんにちは、event大好きマンです。

こんなツールを使ったりして快適イベント監視生活を送っています。

しかしこのeventというもの、完全に信頼するには少し足りなかったようです。


eventは省略される

livenessのfailによりコンテナが再起動しているはずなのにeventには見当たらない、ということがたまにありました。

調べてみたところ、eventが大量発生した場合は一部省略されるようになっているようです。


どういうことなの

tl;dr

https://github.com/kubernetes/client-go/blob/kubernetes-1.13.4/tools/record/events_cache.go#L44-L49

kubernetesの各コンポーネントはeventのハンドリングにこの辺りの仕組み

https://github.com/kubernetes/client-go/blob/kubernetes-1.13.4/tools/record

を使っていますが、これには大量に出されたeventを適度にフィルタする仕組みが入っています。

そしてそのフィルタの基準がtl;drで貼ったリンクの部分、定数で決められています。


  • 各コンポーネントはeventハンドリング用のthread(便宜上Recorderと呼ぶ)を作る

  • Recorderは25回eventを送ることができ、それを超えるとコンポーネント側でeventを発生させてもRecorderでフィルタされてしまう

  • 5分毎に1回ぶん回復する

  • 別々のeventでもRecorderを共有していればフィルタの対象になる

といったような感じになってます。


どうすればいいの

そういうものなのでeventを扱う時は頭に入れておきましょう。