クラスターの正常性のモニタリング
IBM Cloud® Kubernetes Service でモニタリングをセットアップすると、問題のトラブルシューティングや、Kubernetes クラスターとアプリの正常性とパフォーマンスの改善に役立ちます。
継続的なモニタリングとロギングは、クラスターへの攻撃を検出し、問題が発生したときに問題をトラブルシューティングするために重要です。 クラスターを継続的にモニターすることによって、クラスターの容量、およびアプリで使用可能なリソースの可用性をよく把握することができます。 この情報があれば、アプリのダウン時間の発生を防ぐために準備できます。
モニタリング・ソリューションの選択
メトリックは、クラスターの正常性とパフォーマンスをモニターするのに役立ちます。 Kubernetes とコンテナー・ランタイムの標準機能を使用して、クラスターとアプリの正常性をモニターできます。
すべての Kubernetes マスターは、IBM によって継続的にモニターされます。IBM Cloud Kubernetes Service は自動的に、Kubernetes マスターがデプロイされているすべてのノードで、Kubernetes および OS 固有のセキュリティー・フィックスで見つかった脆弱性をスキャンします。 脆弱性が見つかった場合、IBM Cloud Kubernetes Service はユーザーに代わって自動的に修正を適用し、脆弱性を解決して、マスター・ノードが確実に保護されるようにします。 残りのクラスター・コンポーネントのログのモニターと分析は、お客様が行う必要があります。
メトリック・サービスの使用時に競合を回避するには、リソース・グループとリージョンの間でクラスターの名前が固有であることを確認してください。
- IBM Cloud® Monitoring
- Monitoring エージェントをワーカー・ノードにデプロイすることで、アプリおよびクラスターのパフォーマンスと正常性を運用面で可視化します。 このエージェントはポッドおよびクラスターのメトリックを収集し、それらのメトリックを IBM Cloud Monitoring に送信します。 IBM Cloud Monitoring について詳しくは、このサービスの資料を参照してください。 Monitoring エージェントをクラスターにセットアップするには、IBM Cloud Monitoring によるクラスターおよびアプリのメトリックの表示を参照してください。
- Kubernetes ダッシュボード
- Kubernetes ダッシュボードは、ワーカー・ノードの正常性の確認、Kubernetes リソースの検索、コンテナー化アプリのデプロイ、ロギングとモニタリング情報を使用したアプリのトラブルシューティングを行える管理 Web インターフェースです。 Kubernetes ダッシュボードにアクセスする方法について詳しくは、IBM Cloud Kubernetes Service での Kubernetes ダッシュボードの起動を参照してください。
IBM Cloud® Monitoring アラートのセットアップ
アラートをセットアップする際には、クラスターに自己修復のための十分な時間を与えてください。 Kubernetes には自己修復機能があるため、時間の経過とともに発生する問題に対してのみアラートを構成してください。 時間の経過とともにクラスターを監視することで、Kubernetes がそれ自体っで解決できる問題と、ダウン時間を回避するためにアラートを必要とする問題を把握できます。
クラスターのサイズに応じて、以下のレベルでアラートをセットアップすることを検討してください。
ワーカー・ノードに自動リカバリーをセットアップして、クラスターが自動的に問題を解決できるようにします。
アプリ・アラート
クラスターでのアプリ・モニタリングのセットアップに役立つ、以下のアプリ・レベルのメトリックおよびアラートしきい値を確認します。
モニター対象の般的なアプリ・レベル条件には、次のようなものがあります。
- 複数のアプリ・ポッドまたはコンテナーが 10 分以内に再始動します。
- アプリの複数のレプリカが実行されていません。
- 10 分のうちに 10 個を超える 5XX
HTTP
応答コードを受信しました。 - 名前空間内の複数のポッドが不明な状態です。
- ワーカー・ノードで 5 つを超えるポッドをスケジュールすることはできません (保留状態)。
これらの症状の根本的な問題には、次のようなものがあります。
- 1 つ以上のワーカー・ノードが正常でない状態です。
- ワーカー・ノードで CPU、メモリー、またはディスク・スペースが不足しています。
- クラスターごとのポッドが最大限度に達しました。
- アプリそれ自体に問題があります。
これらの条件のモニターをセットアップするには、以下の IBM Cloud Monitoring メトリックに基づいてアラートを構成します。 アラートしきい値は、クラスター構成によって異なる可能性があることに注意してください。
メトリック | IBM Cloud Monitoring メトリック | アラートしきい値 |
---|---|---|
短時間でのポッドの複数の再始動。 | kubernetes_pod_restart_count |
過去 10 分間において 4 回より多い |
ReplicaSet 内に実行中のレプリカがありません。 | kube_replicaset_status_replicas (kubernetes_deployment_name ) |
1 より少ない。 |
クラスター内で保留中のポッドが 5 つを超えています。 | kube_pod_container_status_waiting |
状況は 5 より大きい pending です。 |
使用可能なデプロイメント内にレプリカがありません。 | kubernetes_deployment_replicas_available |
1 より少ない。 |
ノードあたりのポッド数がしきい値 110 に達しています。 | (kube_cluster_name,kube_node_name)(kube_pod_container_info) 別カウント |
100 より大きいか等しい。 この照会は promQL 照会であることに注意してください。 |
不明状態にあるワークロード。 | (kube_workload_status_unavailable) |
1 より大きいか等しい。 この照会は promQL 照会であることに注意してください。 |
ワーカー・ノード・アラート
ワーカー・ノードの以下のしきい値およびアラートを確認します。
メトリック | IBM Cloud Monitoring メトリック | アラートしきい値 |
---|---|---|
ワーカー・ノードの CPU 使用率がしきい値を超えています。 | cpu_used_percent |
1 時間で 80% を超えています。 |
ワーカー・ノードの CPU 使用率がしきい値を超えています。 | cpu_used_percent |
24 時間で 65% を超えています。 |
ワーカー・ノードのメモリー使用量がしきい値を超えています。 | memory_used_percent |
1 時間で 80% を超えています。 |
ワーカー・ノードのメモリー使用量がしきい値を超えています。 | memory_used_percent |
24 時間で 65% を超えています。 |
使用されたメモリーの量がしきい値を超えています。 | memory_bytes_used |
NUMBER_OF_BYBTES を超えています。 |
ディスク不足のノードが存在します。 | kube_node_status_condition |
10 分間で 1 以上です。 |
準備ができていない Kubernetes ノードが存在します。 | kube_node_status_ready >= 1 |
ワーカー・ノード・アラートの解決
ワーカーを再ロードまたはリブートすると、問題が解決する可能性があります。 ただし、ワーカーを追加してキャパシティーを増やさなければならない場合があります。
-
ワーカー・ノードを取得し、状態を確認します。
kubectl get nodes
-
すべてのワーカーノードが
Ready
の状態でない場合は、ワーカーノードをクラスタに追加します。 -
すべてのワーカー・ノードが
Ready
状態の場合は、ワーカー・ノードを再ロードまたはリブートします。-
ワーカー・ノードを記述し、**「イベント」**セクションで一般的なエラー・メッセージを確認します。
kubectl describe node <node>
-
Ready
ではないノードを遮断して、調査を開始できるようにします。 -
ワーカー・ノードをドレーンします。 ワーカー・ノードからポッドを安全にドレーンするためのKubernetes の資料を参照してください。
kubectl drain <node>
-
ゾーン・アラート
ゾーン・レベルのアラートをセットアップするには、 sysdig-agent
configmap を編集して、必要なラベル・フィルターを組み込みます。
- 次のコマンドを実行して configmap を編集します。
kubectl edit configmap sysdig-agent -n ibm-observe
k8s_cluster_name: <cluster_name>
の後に次の YAML ブロックを追加します。<cluster_name>
をモニター対象のクラスターの名前で置き換えます。k8s_labels_filter: - include: "kubernetes.node.label.kubernetes.io/hostname" - include: "kubernetes.node.label.kubernetes.io/role" - include: "kubernetes.node.label.ibm-cloud.kubernetes.io/zone" - exclude: "*.kubernetes.io/*" - exclude: "*.pod-template-hash" - exclude: "*.pod-template-generation" - exclude: "*.controller-revision-hash" - include: "*"
- IBM Cloud Monitoring ポッドを再始動します。 すべてのポッドを削除し、それらが再始動するまで待ちます。 ポッドのリストを取得します。
kubectl get pods -n ibm-observe
- ポッドを削除して再始動します。
kubectl delete pods sysdig-agent-1111 sysdig-agent-2222 sysdig-agent-3333 -n ibm-observe
- ポッドが再始動するまで 5 分間待ちます。 ポッドが再始動すると、以前に追加したラベルが IBM Cloud Monitoring で使用可能になります。
- IBM Cloud Monitoring ダッシュボード > 「探索」 > **「PromQL 照会 (PromQL query)」**を開いて、ラベルが現在表示されていることを確認します。
- 照会フィールドに
kube_node_labels
と入力し、Run Query
をクリックします。
メトリック | PromQL 照会 |
---|---|
しきい値を超えたゾーンあたりの CPU 使用率 | sum(sysdig_container_cpu_used_percent{agent_tag_cluster="<cluster_name>"}) by (kube_node_label_ibm_cloud_kubernetes_io_zone) / sum (kube_node_info) by (kube_node_label_ibm_cloud_kubernetes_io_zone) > 80 |
しきい値を超えたゾーンあたりのメモリー使用量 | sum(sysdig_container_cpu_used_percent{agent_tag_cluster="<cluster_name>"}) by (kube_node_label_ibm_cloud_kubernetes_io_zone)/ sum (kube_node_info) by (kube_node_label_ibm_cloud_kubernetes_io_zone) > 80 |
クラスター・アラート
クラスター・レベルでアラートを作成するためのしきい値の例を以下で確認してください。
- リージョンに含まれるすべてのワーカー・ノードが 80% のキャパシティーしきい値に達しようとしています。
- すべてのワーカー・ノードの 50% より多くが異常な状態になっています。
- アカウントあたりのファイル・ボリュームとブロック・ストレージ・ボリュームの最大数 (250) に達しようとしています。
- クラスターあたりのワーカー・ノードの最大数 (500) に達しようとしています。
アカウント・アラート
アカウントあたりのクラスターの最大数が制限に達しようとしている場合のアラートをセットアップできます。 例えば、リージョン/インフラストラクチャー・プロバイダーあたりで 100 にします。
Block Storage for VPC のアラート
Block Storage for VPC アラートでは、以下のメトリクスを使用できます:
kubelet_volume_stats_available_bytes
kubelet_volume_stats_capacity_bytes
kubelet_volume_stats_inodes
kubelet_volume_stats_inodes_free
kubelet_volume_stats_inodes_used
-
Block Storage for VPC アラートのモニター・インスタンスを作成します。 Forwarding cluster and app metrics to IBM Cloud Monitoring の説明を参照してください。
-
syslog
エージェントをインストールする。- IBM Cloud コンソールで、メニューから 「プログラム識別情報」 を選択します。
- **「モニタリング」**を選択します。
- Block Storage for VPC アラートのインスタンスの行で、 「ダッシュボードを開く」 を選択します。
- メニューから、 「開始」 を選択します。
- 「エージェントのインストール」 セクションで、 「ソースの追加」 を選択します。
- 指示に従ってエージェントをインストールしてください。
kubectl get pods -n CLUSTER_NAME | grep syslog
コマンドを使用して、エージェントが実行されていることを確認します。
-
通知チャネルを構成します。
- IBM Cloud モニター・ダッシュボードで、 「モニター操作」>「設定」 を選択します。
- 「通知チャネル (Notification Channels)」 > 「通知チャネルの追加 (Add Notification Channel)」 を選択し、使用可能な通知方法の 1 つを選択します。
- 新規チャネルの設定を完了し、 「保存」 をクリックします。
- オプション:チャンネルを追加するには、前の手順を繰り返します。
-
アラートを作成します。
- IBM Cloud モニター・ダッシュボードで、 「アラート」 > 「ライブラリー」 を選択します。
- いずれかのテンプレートを選択し、 「アラートの有効化」 を選択します。 例えば、
PVC storage
を検索して、PVC Storage Usage Is Reaching The Limit
アラートを有効にすることができます。 - テンプレートのアラート設定をカスタマイズし、 「アラートの有効化」 を選択して設定を適用します。
Block Storage for VPC ボリュームが容量に達している場合は、 ボリューム拡張をセットアップ できます。
自動回復によるワーカーノードの健全性の監視
Autorecovery システムは、さまざまな検査機能を使用してワーカー・ノードの正常性状況を照会します。 Autorecovery は、構成された検査に基づいて正常でないワーカー・ノードを検出すると、VPC ワーカー・ノードのリブートやクラシック・ワーカー・ノード内のオペレーティング・システムの再ロードのような修正アクションをトリガーします。 修正アクションは、一度に 1 つのワーカー・ノードに対してのみ実行されます。 ワーカーノードは、他のワーカーノードが是正処置を受ける前に、是正処置を完了しなければならない。
Autorecovery が正常に機能するためには、1 つ以上の正常なワーカー・ノードが必要です。 Autorecovery でのアクティブな検査は、複数のワーカー・ノードが存在するクラスターでのみ構成します。
始める前に
- 以下の IBM Cloud IAM 役割があることを確認します。
- クラスターに対する管理者のプラットフォーム・アクセス役割
- ** 名前空間に対するライターまたは**管理者
kube-system
のサービス・アクセス役割
- アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。
自動リカバリーを構成するには、以下のようにします。
-
こちらの手順に従って、Helm バージョン 3 クライアントをローカル・マシンにインストールします。
-
検査を JSON 形式で定義する構成マップ・ファイルを作成します。 例えば、次の YAML ファイルでは、3 つの検査 (1 つの HTTP 検査と 2 つの Kubernetes API サーバー検査) を定義しています。 この 3 種類の検査と各検査の個々の構成要素については、構成要素の説明とヘルス・チェックの構成要素の表を参照してください。
構成マップの
data
セクションに、各検査を固有キーとして定義します。kind: ConfigMap apiVersion: v1 metadata: name: ibm-worker-recovery-checks namespace: kube-system # The `kube-system` namespace is a constant and can't be changed. data: checknode.json: | { "Check":"KUBEAPI", "Resource":"NODE", "FailureThreshold":3, "CorrectiveAction":"RELOAD", "CooloffSeconds":1800, "IntervalSeconds":180, "TimeoutSeconds":10, "Enabled":true } checkpod.json: | { "Check":"KUBEAPI", "Resource":"POD", "PodFailureThresholdPercent":50, "FailureThreshold":3, "CorrectiveAction":"RELOAD", "CooloffSeconds":1800, "IntervalSeconds":180, "TimeoutSeconds":10, "Enabled":true } checkhttp.json: | { "Check":"HTTP", "FailureThreshold":3, "CorrectiveAction":"REBOOT", "CooloffSeconds":1800, "IntervalSeconds":180, "TimeoutSeconds":10, "Port":80, "ExpectedStatus":200, "Route":"/myhealth", "Enabled":false }
-
クラスター内に構成マップを作成します。
kubectl apply -f ibm-worker-recovery-checks.yaml
-
適切な検査を実行して、
ibm-worker-recovery-checks
名前空間内にkube-system
という名前の構成マップが作成されていることを確認します。kubectl -n kube-system get cm ibm-worker-recovery-checks -o yaml
-
ibm-worker-recovery
Helm チャートをインストールして、クラスターに Autorecovery をデプロイします。helm install ibm-worker-recovery iks-charts/ibm-worker-recovery --namespace kube-system
-
数分後に、次のコマンドの出力にある
Events
セクションを確認して、Autorecovery のデプロイメントのアクティビティーを確認できます。kubectl -n kube-system describe deployment ibm-worker-recovery
-
Autorecovery デプロイメントでアクティビティーが表示されない場合は、Autorecovery チャート定義内にあるテストを実行して Helm デプロイメントを確認します。
helm test ibm-worker-recovery -n kube-system
構成マップの構成要素について
ヘルス・チェックの個々の構成要素に関する以下の情報を参照してください。
name
: 構成名ibm-worker-recovery-checks
は定数であり、変更できません。namespace
:kube-system
名前空間は定数であり、変更できません。checknode.json
: 各ワーカー・ノードがReady
状態であるかどうかを検査する Kubernetes API ノード検査を定義します。 特定のワーカー・ノードがReady
状態でない場合、そのワーカー・ノードの検査結果は失敗となります。 サンプル YAML では、検査が 3 分ごとに実行されます。 連続して 3 回失敗すると、ワーカー・ノードは再ロードされます。 この操作は、ibmcloud ks worker reload
を実行することと同等です。 **「有効」**フィールドをfalse
に設定するか、または検査を除去するまで、ノード検査は有効になります。 再ロードは、クラシック・インフラストラクチャーのワーカー・ノードでしかサポートされないことに注意してください。checkpod.json
: ワーカー・ノード上のNotReady
ポッドの合計パーセンテージを、そのワーカー・ノードに割り当てられた合計ポッド数に基づいて検査する、Kubernetes API ポッド検査を定義します。NotReady
ポッドの合計パーセンテージが、定義済みのPodFailureThresholdPercent
より大きい場合、そのワーカー・ノードの検査結果は失敗となります。 サンプル YAML では、検査が 3 分ごとに実行されます。 連続して 3 回失敗すると、ワーカー・ノードは再ロードされます。 この操作は、ibmcloud ks worker reload
を実行することと同等です。 例えば、デフォルトPodFailureThresholdPercent
は 50% です。NotReady
ポッドのパーセンテージが 50% を 3 回連続して超えると、ワーカー・ノードが再ロードされます。 デフォルトでは、すべての名前空間で検査が実行されます。 指定した名前空間内のポッドのみに検査を限定するには、Namespace
フィールドを検査に追加します。 **「有効」**フィールドをfalse
に設定するか、または検査を除去するまで、ポッド検査は有効になります。 再ロードは、クラシック・インフラストラクチャーのワーカー・ノードでしかサポートされないことに注意してください。checkhttp.json
: ワーカー・ノードで稼働している HTTP サーバーが正常かどうかを検査する HTTP 検査を定義します。 このチェックを使用するには、 デーモン・セットを使用してクラスタ内のすべてのワーカー・ノードに HTTP サーバをデプロイする必要があります。 HTTP サーバーが正常かどうかを検証できるヘルス・チェックを、/myhealth
パスで利用できるように実装する必要があります。 他のパスを定義するには、Route
パラメーターを変更します。 HTTP サーバーが正常である場合は、ExpectedStatus
で定義されている HTTP 応答コードを返す必要があります。 HTTP サーバーは、ワーカー・ノードのプライベート IP アドレスで listen するように構成する必要があります。 プライベート IP アドレスを調べるには、kubectl get nodes
ノードを実行します。 例えば、プライベート IP アドレスが 10.10.10.1 および 10.10.10.2 の 2 つのノードがクラスターにあるとします。 この例では、http://10.10.10.1:80/myhealth
およびhttp://10.10.10.2:80/myhealth
の 2 つのルートの 200 HTTP 応答を検査します。 サンプル YAML では、検査が 3 分ごとに実行されます。 連続して 3 回失敗すると、ワーカー・ノードはリブートされます。 この操作は、ibmcloud ks worker reboot
を実行することと同等です。 **「有効」**フィールドをtrue
に設定するまで、HTTP 検査は無効になります。
ヘルス・チェックの個々の構成要素について
ヘルス・チェックの個々の構成要素に関する以下の表を参照してください。
コンポーネント | 説明 |
---|---|
Check |
Auorecovery で使用する検査のタイプを入力します。HTTP : Autorecovery は、各ノード上で稼働する HTTP サーバーを呼び出して、そのノードが正常に稼働しているかどうかを判別します。KUBEAPI : Autorecovery は、Kubernetes API サーバーを呼び出し、ワーカー・ノードで報告された正常性状況データを読み取ります。 |
Resource |
検査タイプが KUBEAPI である場合は、Autorecovery で検査するリソースのタイプを入力します。 受け入れられる値は NODE または POD です。 |
FailureThreshold |
検査の連続失敗数のしきい値を入力します。 このしきい値に達すると、Autorecovery が、指定された修正アクションをトリガーします。 例えば、値が 3 である場合に、Autorecovery で構成された検査が 3 回連続して失敗すると、Autorecovery は検査に関連付けられている修正アクションをトリガーします。 |
PodFailureThresholdPercent |
リソース・タイプが POD の場合、ワーカー・ノード上のポッドの割合のしきい値を入力します。 NotReady 状態にすることができます。 このパーセンテージは、ワーカー・ノードにスケジュールされているポッドの合計数に基づきます。 検査の結果、正常でないポッドのパーセンテージがしきい値を超えていることが判別されると、1 回の失敗としてカウントされます。 |
CorrectiveAction |
失敗しきい値に達したときに実行するアクションを入力します。 修正アクションが実行されるのは、他のワーカーの修復中ではないとき、および当該ワーカー・ノードが前のアクションからの冷却期間内ではないときに限られます。REBOOT : ワーカー・ノードがリブートされます。RELOAD : ワーカー・ノードに必要となるすべての構成がクリーンな OS から再ロードされます。 |
CooloffSeconds |
既に修正アクションが実行されたノードに対して別の修正アクションを実行するために Autorecovery が待機する必要がある秒数を入力します。 クールオフ期間は、修正アクションが実行された時点から始まります。 |
IntervalSeconds |
連続する検査と検査の間隔 (秒) を入力します。 例えば、値が 180 である場合、Autorecovery は 3 分ごとに各ノードで検査を実行します。 |
TimeoutSeconds |
データベースに対する検査の呼び出しの最大秒数を入力します。この秒数が経過すると、Autorecovery は呼び出し動作を終了します。 TimeoutSeconds の値は、IntervalSeconds の値より小さくする必要があります。 |
Port |
検査タイプが HTTP である場合は、HTTP サーバーがワーカー・ノードにバインドする必要があるポートを入力します。 このポートは、クラスター内のすべてのワーカー・ノードの IP で公開されている必要があります。 Autorecovery がサーバーを検査するためには、すべてのノードで一定のポート番号を使用する必要があります。 カスタム・サーバーをクラスタにデプロイする場合は、 デーモン・セットを使用します。 |
ExpectedStatus |
検査タイプが HTTP である場合は、検査で返されることが予期される HTTP サーバー状況を入力します。 例えば、値 200 は、サーバーからの応答として OK を予期していることを示します。 |
Route |
検査タイプが HTTP である場合は、HTTP サーバーから要求されたパスを入力します。 通常、この値は、すべてのワーカー・ノードで稼働するサーバーのメトリック・パスです。 |
Enabled |
検査を有効にするには true 、検査を無効にするには false を入力します。 |
Namespace |
オプション: ある名前空間内のポッドのみを検査するように checkpod.json を制限するには、Namespace フィールドを追加してその名前空間を入力します。 |