Kubernetesのイベントを徹底的に理解する

Kubernetesのイベントを徹底的に理解する

[[442818]]

以前、私は「よりエレガントな Kubernetes クラスター イベント メトリック ソリューション」というタイトルの記事を書きました。この記事では、Jaeger とトレースを使用して Kubernetes クラスター内のイベントを収集して表示します。最終的な効果は次のようになります。

その記事を書いたとき、私は原則を詳しく紹介するためのフラグを立てました。長い間延期してきました。いよいよ年末となり、公開する時期になりました。

イベント概要

Kubernetes クラスターでどのようなイベントが発生するかを確認するために、簡単な例を見てみましょう。

moelove という新しい名前空間を作成し、その中に redis というデプロイメントを作成します。次に、この名前空間内のすべてのイベントを表示します。

  1. (萌えラブ) ➜ kubectl create ns moelove
  2. namespace/moelove を作成しました
  3. (MoeLove) ➜ kubectl -n moeloveデプロイメント redisを作成--image=ghcr.io/moelove/redis:alpine  
  4. デプロイメント.apps/redis が作成されました
  5. (MoeLove) ➜ kubectl -n moelove get デプロイ
  6. 名前準備完了最新利用可能年齢
  7. レディス 1/1 1 1 11秒
  8. (MoeLove) ➜ kubectl -n moelove イベントを取得
  9. 最終閲覧タイプ理由オブジェクトメッセージ
  10. 21 秒 通常スケジュール pod/redis-687967dbc5-27vmr moelove/redis-687967dbc5-27vmr をkind-worker3正常に割り当てました
  11. 21 秒 通常 pod/redis-687967dbc5-27vmr をプルしています イメージ「ghcr.io/moelove/redis:alpine」をプルしています 
  12. 15 秒 正常 pod/redis-687967dbc5-27vmr をプルしました イメージ「ghcr.io/moelove/redis:alpine」を正常にプルしました  6.814310968秒
  13. 14 秒 正常 pod/redis-687967dbc5-27vmr を作成しました コンテナ redis を作成しました
  14. 14秒 正常 pod/redis-687967dbc5-27vmr を起動しました コンテナ redis を起動しました
  15. 22 秒 正常 成功 replicaset/redis-687967dbc5 を作成しました ポッド redis-687967dbc5-27vmr を作成しました
  16. 22秒 通常のスケーリングレプリカセットのデプロイメント/redis レプリカセットredis-687967dbc51スケールアップしました

ただし、デフォルトでは kubectl get events はイベントを発生順に並べ替えないので、出力を時間順に並べ替えるには、--sort-by='{.metadata.creationTimestamp}' パラメータを追加する必要があることがよくあります。

このため、Kubernetes v1.23 では kubectl alpha events コマンドが追加されました。

時間で並べ替えると、次の結果が表示されます。

  1. (MoeLove) ➜ kubectl -n moelove イベントを取得--sort-by='{.metadata.creationTimestamp}'  
  2. 最終閲覧タイプ理由オブジェクトメッセージ
  3. 2分12秒 通常スケジュール pod/redis-687967dbc5-27vmr moelove/redis-687967dbc5-27vmr をkind-worker3正常に割り当てました
  4. 2 分 13 秒 正常 成功 replicaset/redis-687967dbc5 を作成しました ポッド redis-687967dbc5-27vmr を作成しました
  5. 2分13秒 通常のスケーリングレプリカセットのデプロイメント/redis レプリカセットredis-687967dbc51スケールアップしました
  6. 2 分 12 秒 通常 pod/redis-687967dbc5-27vmr をプルしています イメージ"ghcr.io/moelove/redis:alpine"をプルしています 
  7. 2 分 6 秒 正常 pod/redis-687967dbc5-27vmr をプルしました イメージ「ghcr.io/moelove/redis:alpine」を正常にプルしました  6.814310968秒
  8. 2分5秒 正常 pod/redis-687967dbc5-27vmr を作成しました コンテナ redis を作成しました
  9. 2分5秒 正常 pod/redis-687967dbc5-27vmr を起動しました コンテナ redis を起動しました

上記の操作により、イベントが実際には Kubernetes クラスター内のリソースであることがわかります。 Kubernetes クラスター内のリソースのステータスが変化すると、新しいイベントが生成されることがあります。

イベントに飛び込む

単一イベントオブジェクト

イベントは Kubernetes クラスター内のリソースであるため、通常、metadata.name には個々の操作の名前が含まれている必要があります。したがって、次のコマンドを使用してその名前を出力できます。

  1. (MoeLove) ➜ kubectl -n moelove get events --sort-by='{.metadata.creationTimestamp}' -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}'  
  2. レディス-687967dbc5-27vmr.16c4fb7bde8c69d2
  3. レディス-687967dbc5.16c4fb7bde6b54c4
  4. レディス.16c4fb7bde1bf769
  5. レディス-687967dbc5-27vmr.16c4fb7bf8a0ab35
  6. レディス-687967dbc5-27vmr.16c4fb7d8ecaeff8
  7. redis-687967dbc5-27vmr.16c4fb7d99709da9
  8. レディス-687967dbc5-27vmr.16c4fb7d9be30c06

任意のイベント レコードを選択し、YAML 形式でエクスポートして表示します。

  1. (MoeLove) ➜ kubectl -n moelove イベントを取得 redis-687967dbc5-27vmr.16c4fb7bde8c69d2 -o yaml
  2. アクション: バインディング
  3. APIバージョン: v1
  4. イベント時間: "2021-12-28T19:31:13.702987Z"  
  5. 最初のタイムスタンプ: null  
  6. 関与オブジェクト:
  7. APIバージョン: v1
  8. 種類: ポッド
  9. 名前: redis-687967dbc5-27vmr
  10. 名前空間: moelove
  11. リソースバージョン: "330230"  
  12. uid: 71b97182-5593-47b2-88cc-b3f59618c7aa
  13. 種類: イベント
  14. 最終タイムスタンプ: null  
  15. メッセージ: moelove/redis-687967dbc5-27vmr をkind-worker3正常に割り当てました
  16. メタデータ:
  17. 作成タイムスタンプ: "2021-12-28T19:31:13Z"  
  18. 名前: redis-687967dbc5-27vmr.16c4fb7bde8c69d2
  19. 名前空間: moelove
  20. リソースバージョン: "330235"  
  21. ユーザID: e5c03126-33b9-4559-9585-5e82adcd96b0
  22. 理由: 予定
  23. reportingComponent:デフォルト-scheduler
  24. reportingInstance:デフォルト-scheduler-kind-control-plane
  25. ソース: {}
  26. タイプ: 通常

たくさんの情報が含まれていることがわかりますが、ここでは詳しく説明しません。別の例を見てみましょう。

kubectlのイベント記述

Deployment オブジェクトと Pod オブジェクトに対してそれぞれ記述操作を実行すると、次の結果が得られます (中間出力は省略されています)。

  • 展開時の操作
  1. (MoeLove) ➜ kubectl -n moelove deploy/redis を記述します
  2. 名前: redis
  3. 名前空間: moelove
  4. ...
  5. イベント:
  6. タイプ 理由 年齢送信元 メッセージ
  7. ---- ------ ---- ---- -------  
  8. 通常のScalingReplicaSet 15m デプロイメント コントローラ レプリカセットredis-687967dbc51スケールアップしました
  • ポッドの操作
  1. (MoeLove) ➜ kubectl -n moelove ポッドを記述します redis-687967dbc5-27vmr
  2. 名前: redis-687967dbc5-27vmr
  3. 名前空間: moelove
  4. 優先度: 0
  5. イベント:
  6. タイプ 理由 年齢送信元 メッセージ
  7. ---- ------ ---- ---- -------  
  8. 通常スケジュール 18 分デフォルト-scheduler moelove/redis-687967dbc5-27vmrkind-worker3正常に割り当てました
  9. 通常の引き込み 18m kubelet 引き込みイメージ"ghcr.io/moelove/redis:alpine"  
  10. 正常にプルされました 17m kubelet イメージ「ghcr.io/moelove/redis:alpine」を正常にプルしました  6.814310968
  11. 通常 17m kubelet を作成しました コンテナ redis を作成しました
  12. 正常 17分 kubelet コンテナ redis を開始

さまざまなリソース オブジェクトを説明するときに、表示されるイベントはすべて自分自身に直接関連していることがわかります。デプロイメントを記述する場合、ポッド関連のイベントは表示されません。

これは、イベント オブジェクトに、それが記述するリソース オブジェクトに関する情報が含まれており、それらが直接関連していることを示しています。

先ほど見た単一の Event オブジェクトと組み合わせると、involvedObject フィールドの内容は、イベントに関連付けられたリソース オブジェクトの情報であることがわかります。

イベントの詳細

存在しないイメージを使用してデプロイメントを作成する次の例を見てみましょう。

  1. (MoeLove) ➜ kubectl -n moeloveデプロイメントを作成non-exist --image=ghcr.io/moelove/non-exist  
  2. デプロイメント.apps/non-exist が作成されました
  3. (MoeLove) ➜ kubectl -n moelove ポッドを取得する
  4. 名前準備完了 ステータス 再起動 年齢
  5. 存在しない-d9ddbdd84-tnrhd 0/1 ErrImagePull 0 11s
  6. redis-687967dbc5-27vmr 1/1 実行中 0 26分

現在の Pod が ErrImagePull 状態にあることがわかります。現在の名前空間のイベントを表示します(以前の deploy/redis レコードは省略しました)

  1. (MoeLove) ➜ kubectl -n moelove イベントを取得--sort-by='{.metadata.creationTimestamp}'  
  2. 最終閲覧タイプ理由オブジェクトメッセージ
  3. 35 秒 正常 成功 レプリカセット/non-exist-d9ddbdd84 を作成しました ポッドを作成しました: non-exist-d9ddbdd84-tnrhd
  4. 35 秒 通常の ScalingReplicaSet の展開/非存在 レプリカセットnon-exist-d9ddbdd841スケールアップしました
  5. 35 秒 通常スケジュール pod/non-exist-d9ddbdd84-tnrhd moelove/non-exist-d9ddbdd84-tnrhd をkind-worker3正常に割り当てました
  6. 17 秒の警告失敗 pod/non-exist-d9ddbdd84-tnrhd エラー: ErrImagePull
  7. 17秒警告失敗pod/non-exist-d9ddbdd84-tnrhdイメージ「ghcr.io/moelove/non-exist」のプル失敗しました: rpcエラー: code = Unknown desc =イメージ「ghcr.io/moelove/non-exist:latest」プル解凍失敗しました: 参照「ghcr.io/moelove/non-exist:latest」の解決失敗しました:承認失敗しました:  匿名トークンを取得: 予期しないステータス: 403 禁止
  8. 18 秒 通常 pod/non-exist-d9ddbdd84-tnrhd をプルしています イメージ「ghcr.io/moelove/non-exist」をプルしています 
  9. 4 秒の警告失敗 pod/non-exist-d9ddbdd84-tnrhd エラー: ImagePullBackOff
  10. 4 秒 通常のバックオフ pod/non-exist-d9ddbdd84-tnrhdイメージ「ghcr.io/moelove/non-exist」のバックオフ 

この Pod に対して記述操作を実行します。

  1. (MoeLove) ➜ kubectl -n moelove ポッドを記述します non-exist-d9ddbdd84-tnrhd
  2. ...
  3. イベント:
  4. タイプ 理由 年齢送信元 メッセージ
  5. ---- ------ ---- ---- -------  
  6. 通常スケジュール 4mデフォルト-scheduler moelove/non-exist-d9ddbdd84-tnrhd をkind-worker3正常に割り当てました
  7. 通常のプル 2 分 22 秒 (3 分 59 秒かけて x4) kubelet イメージ「ghcr.io/moelove/non-exist」のプル 
  8. 警告失敗 2分21秒 (3分59秒で4倍) kubeletイメージ「ghcr.io/moelove/non-exist」のプル失敗しました: rpcエラー: code = 不明desc =イメージ「ghcr.io/moelove/non-exist:latest」のプル解凍失敗しました: 参照「ghcr.io/moelove/non-exist:latest」の解決失敗しました:承認失敗しました:  匿名トークンを取得: 予期しないステータス: 403 禁止
  9. 警告失敗 2分21秒 (3分59秒で4倍) kubelet エラー: ErrImagePull
  10. 警告失敗 2 分 9 秒 (3 分 58 秒で x6) kubelet エラー: ImagePullBackOff
  11. 通常のバックオフ 115 秒 (3 分 58 秒にわたって x7) kubelet バックオフイメージ「ghcr.io/moelove/non-exist」をプル 

ここでの出力は、Pod の以前の正しい実行とは異なることがわかります。主な違いは年齢の列にあります。ここでは、115 秒 (3 分 58 秒にわたって x7) のような出力が表示されます。

つまり、このタイプのイベントは 3 分 58 秒以内に 7 回発生しており、最新のイベントは 115 秒前に発生しています。

しかし、kubectl get events を直接実行すると、7 つの重複イベントは表示されません。これは、Kubernetes が重複するイベントを自動的にマージすることを意味します。

最後のイベントを選択し(方法は上記で説明しました)、その内容を YAML 形式で出力します。

  1. (MoeLove) ➜ kubectl -n moelove イベントを取得 non-exist-d9ddbdd84-tnrhd.16c4fce570cfba46 -o yaml
  2. APIバージョン: v1
  3. : 43
  4. イベント時間: null  
  5. 最初のタイムスタンプ: "2021-12-28T19:57:06Z"  
  6. 関与オブジェクト:
  7. APIバージョン: v1
  8. フィールドパス: spec.containers{存在しない}
  9. 種類: ポッド
  10. 名前: 存在しない-d9ddbdd84-tnrhd
  11. 名前空間: moelove
  12. リソースバージョン: "333366"  
  13. ユーザID: 33045163-146e-4282-b559-fec19a189a10
  14. 種類: イベント
  15. 最終タイムスタンプ: "2021-12-28T18:07:14Z"  
  16. メッセージ: イメージ「ghcr.io/moelove/non-exist」のプルを中止してください 
  17. メタデータ:
  18. 作成タイムスタンプ: "2021-12-28T19:57:06Z"  
  19. 名前: 存在しない-d9ddbdd84-tnrhd.16c4fce570cfba46
  20. 名前空間: moelove
  21. リソースバージョン: "334638"  
  22. ユーザID: 60708be0-23b9-481b-a290-dd208fed6d47
  23. 理由: バックオフ
  24. レポートコンポーネント: ""  
  25. レポートインスタンス: ""  
  26. ソース:
  27. コンポーネント: kubelet
  28. ホスト: kind-worker3
  29. タイプ: 通常

ここで、フィールドに同じイベントが何回発生したかを示す count フィールドが含まれていることがわかります。 firstTimestamp と lastTimestamp はそれぞれ、このイベントが最初に出現した時刻と最後に出現した時刻を示します。これは、前の出力におけるイベントの連続サイクルを説明しています。

イベントを徹底的に理解する

以下はイベントからのランダムな選択です。含まれるフィールド情報の一部を確認できます。

  1. APIバージョン: v1
  2. カウント: 1
  3. イベント時間: null  
  4. 最初のタイムスタンプ: "2021-12-28T19:31:13Z"  
  5. 関与オブジェクト:
  6. APIバージョン: アプリ/v1
  7. 種類: レプリカセット
  8. 名前: redis-687967dbc5
  9. 名前空間: moelove
  10. リソースバージョン: "330227"  
  11. ユーザID: 11e98a9d-9062-4ccb-92cb-f51cc74d4c1d
  12. 種類: イベント
  13. 最終タイムスタンプ: "2021-12-28T19:31:13Z"  
  14. メッセージ: 'ポッドを作成しました: redis-687967dbc5-27vmr'  
  15. メタデータ:
  16. 作成タイムスタンプ: "2021-12-28T19:31:13Z"  
  17. 名前: redis-687967dbc5.16c4fb7bde6b54c4
  18. 名前空間: moelove
  19. リソースバージョン: "330231"  
  20. ユーザID: 8e37ec1e-b3a1-420c-96d4-3b3b2995c300
  21. 理由: 成功しました作成
  22. レポートコンポーネント: ""  
  23. レポートインスタンス: ""  
  24. ソース:
  25. コンポーネント: レプリカセット コントローラ
  26. タイプ: 通常

主なフィールドの意味は次のとおりです。

  • カウント: 同じ種類のイベントが何回発生したかを示します (前述)
  • volvedObject: このイベントに直接関連付けられたリソース オブジェクト (前述)。構造は次のとおりです。
  1. ObjectReference構造体型{
  2. 種類の文字列
  3. 名前空間文字列
  4. 名前文字列
  5. UIDタイプ。UID
  6. APIバージョン文字列
  7. リソースバージョン文字列
  8. フィールドパス文字列
  9. }
  • ソース: 直接関連するコンポーネント、構造は次のようになります。
  1. EventSource構造体型{
  2. コンポーネント文字列
  3. ホスト文字列
  4. }
  • 理由: 単純な要約 (または固定コード)。主に機械で読み取り可能にするために、フィルター条件として使用するのに適しています。現在、このようなコードは 50 個以上あります。
  • メッセージ: 人々が理解しやすいように詳細な説明をしてください
  • タイプ: 現在は「通常」と「警告」の 2 つのタイプのみがあります。それらの意味はソースコードにも書かれています:
  1. // ステージング/src/k8s.io/api/core/v1/types.go
  2. 定数(
  3. // 情報のみ そして何の問題起こさない
  4. EventTypeNormal 文字列 = "Normal"  
  5. // これらのイベントは、何か問題が発生する可能性があることを警告するためのものです
  6. EventTypeWarning 文字列 = "警告"  

したがって、これらすべてのイベントをトレース範囲として収集すると、ソースに従って分類し、関連するオブジェクトに従って関連付け、時間で並べ替えることができます。

要約する

この記事では、正しくデプロイされた Deploy と存在しないイメージを使用してデプロイされた Deploy の 2 つの例を通じて、主に Events オブジェクトの実際の役割とさまざまなフィールドの意味を紹介します。

Kubernetes の場合、イベントには多くの有用な情報が含まれていますが、この情報は Kubernetes に影響を与えず、実際の Kubernetes ログではありません。デフォルトでは、Kubernetes のログは etcd リソースを解放するために 1 時間後にクリーンアップされます。

したがって、クラスター管理者に何が起こったかをより適切に知らせるために、実稼働環境では通常、Kubernetes クラスターからイベントも収集します。私が個人的にお勧めするツールは、https://github.com/opsgenie/kubernetes-event-exporter です。

この記事はWeChatの公式アカウント「MoeLove」から転載したもので、以下のQRコードからフォローできます。この記事を転載する場合はMoeLove公式アカウントまでご連絡ください。

<<:  より洗練されたKubernetesクラスタイベント測定ソリューション

>>:  Microsoft Ignite China の詳細な読み物 |クラウド上の6つのデータ機能の長所と短所

推薦する

インターネット マーケティング: 初心者がインターネット マーケティングを学ぶためのヒント

私は2か月以上毎日仕事が終わった後にインターネットマーケティングの知識のトレーニングをしてきました。...

市場調査:AWSとMicrosoft Azureは、企業のクラウド支出の増加から大きな恩恵を受けている

新たな調査によると、現在、ほとんどの企業はクラウド コンピューティング サービスに年間 100 万ド...

キーワードランキングに影響を与える致命的な要因: メタタグとキーワード密度

SEO 業界では、キーワード ランキングは昔から不朽の神話です。企業が自社の Web サイトを Go...

不安定な空間はウェブサイトにとって幸運の裏返し

スペースの安定性は、ウェブサイト開発の基盤です。どんな種類のウェブサイトであっても、何らかの操作を実...

事例: ハウスキーピング会社 Homejoy は、わずか 6 か月でどのようにして 30 都市に拡大したのでしょうか?

Homejoy は、ユーザーに効率的で高品質なハウスクリーニング サービスを提供するために設立されま...

SaaSマルチテナントシステムにおけるデータ分離の実装について話す

SaaS システム プラットフォームを開発したことがある人は、マルチテナントの概念に精通しているはず...

マーケティングツールを過度に宣伝すると、自分自身を傷つけることもある

マーケティングは今や一般的な言葉になりました。経験豊富な人でも、業界に入ったばかりの初心者でも、誰も...

Google Urchin の設定: イベント トラッキングの設定方法

イベント トラッキング (TrackEvent) を使用すると、Flash Web サイトの要素、埋...

IDC: パブリック クラウドは 2017 年上半期に 28.6% 成長しました。パブリック クラウドがなければ、イノベーションは起こりません。

IDC の世界半期パブリック クラウド サービス追跡レポートの最新結果によると、世界のパブリック ク...

業界のウェブサイトは会員制に重点を置くべきでしょうか、それとも広告に重点を置くべきでしょうか?

業界のウェブサイトは、ここ数年で非常に優れたウェブサイト プロジェクトであると言えます。今日まで、こ...

エッジコンピューティング: 流行語か未来か?

市場調査・コンサルティング会社グランドビューリサーチは、「コロナウイルスが世界的に蔓延する中でも、エ...

誰でも使えるアジャイルメトリクスツール! Kyligence ZenがGAバージョンを正式にリリース

4月11日、Kyligence Indicator Platform製品発表会が盛況のうちに開催され...

Ceph分散ストレージシステムの最適化分析

[[409074]]前回の記事「Ceph 分散ストレージ システム アーキテクチャ研究のレビュー」で...

B2B2C ビジネスモデル研究: 制御と制御不能の間

C2C は間違いなく最も自由なモデルです。しかし、自由には代償が伴います。それは、コントロールを失う...

速度が99%向上、Steinbeis Papierがインダストリー4.0プラットフォームをどのように導入しているかをご覧ください

「Rancher により、インテリジェント データ プラットフォームを極めて安定して実行し、新しいサ...