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つのデータ機能の長所と短所

推薦する

アマゾン ウェブ サービスがマレーシアに新リージョンを発表

最近、Amazon Web Services は、マレーシアに Amazon Web Service...

無敵のウェブサイトを構築する方法

多くの同僚が、Web サイトのコンバージョン率というトピックについて話しているのを耳にしました。これ...

10億規模のWebシステムの構築: スタンドアロンから分散クラスタまで

Web システムのアクセス数が 1 日あたり 10 万件から 1,000 万件、さらには 1 億件以...

Zhang Qing: SEO 担当者にとっての道はどこにあるのでしょうか?

検索エンジン最適化という言葉は、多くのウェブマスターの心に深く根付いています。ウェブサイトの構築、製...

アリババDAMOアカデミーが中国コミュニティ向けに最大の事前学習済み言語モデルPLUGをリリースし、CLUEカテゴリーリストで新記録を樹立

4月19日、アリババDAMOアカデミーは、中国コミュニティ向け最大規模の事前トレーニング済み言語モデ...

#大容量ハードドライブ VPS# LetBox - 25 ドル/kvm/1g メモリ/200g ハードドライブ/2T トラフィック/ロサンゼルス

LetBox はプロモーション用に特別価格の KVM 仮想 VPS をいくつかリリースしました。これ...

スタートアップが愛用する8つのクラウドサービス

クラウド テクノロジーは、IT インフラストラクチャを構築する際のスタートアップにとって常に第一の選...

VMware と China Mobile が企業のクラウド移行を加速する次世代クラウド デスクトップを発表

[51CTO.com からのオリジナル記事] VMware は 11 月 16 日、China Mo...

すごい!ウェブサイトの最適化が 1 日 2 時間で完了しました。

以前、私は会社で主に病院のウェブサイトの最適化を担当していました。医療ウェブサイトの最適化における競...

SEOトレーニング: 外部リンクを取得するためのいくつかの不健全な方法

では、早速本題に入りましょう。SEO に携わる人なら誰でも外部リンクの重要性を知っていますが、初心者...

2019年の展望: コンテナクラウド戦争が激化、フルスタッククラウドが一般的なトレンドに

[51CTO.com からのオリジナル記事] クラウド コンピューティング テクノロジーに関しては、...

「チャイナパートナーズ」が優れたウェブサイトの運営方法を教えてくれる

数日前、映画館に行って、最近公開された感動的な映画「チャイニーズ・パートナーズ」を見ました。この映画...

分散ストレージの運用と保守の方法についてお話ししましょう

序文最近、分散ストレージに多くの時間を費やしてきましたが、これ以上時間を費やしたくないので、この記事...

デュレックスブランドのマーケティング戦略と核心!

ソーシャル マーケティングは、長い間、独立した産業でした。従来の広告や広報とは異なりますが、それらの...

kvmla: 20% オフ - シンガポール VPS、日本 CN2 + ソフトバンク VPS、15% オフ - シンガポール cn2、日本 cn2 専用サーバー

kvmla (2011~) 年末プロモーションが始まりました: (1) シンガポール VPS、100...