クラスターのロギング

IBM Cloud® Kubernetes Service でロギングをセットアップすると、問題のトラブルシューティングや、Kubernetes クラスターとアプリの正常性とパフォーマンスの改善に役立ちます。

継続的なモニタリングとロギングは、クラスターへの攻撃を検出し、問題が発生したときに問題をトラブルシューティングするために重要です。 クラスターを継続的にモニターすることによって、クラスターの容量、およびアプリで使用可能なリソースの可用性をよく把握することができます。 この情報があれば、アプリのダウン時間の発生を防ぐために準備できます。

ロギング・ソリューションの選択

デフォルトでは、すべての IBM Cloud Kubernetes Service クラスター・コンポーネント (ワーカー・ノード、コンテナー、アプリケーション、永続ストレージ、Ingress アプリケーション・ロード・バランサー、Kubernetes API、および kube-system 名前空間) について、ログがローカルに生成され、書き込まれます。 これらのログを収集し、転送して表示するために提供されているロギング・ソリューションが複数あります。

IBM Cloud Logs
IBM Cloud Logs のインスタンスをデプロイし、Kubernetes Service のクラスターにそのインスタンスを構成して、ポッド・コンテナーのログを管理します。 ロギング・エージェントが、*.log を含むすべての名前空間から、ポッドの /var/log ディレクトリーに保管されている拡張子なしのファイルと拡張子 kube-system のログを収集します。 その後、エージェントはログをサービスインスタンスに転送します。 また、クラスタ内で行われたユーザー主導の管理アクティビティを追跡することもできます Kubernetes Serviceはクラスタ管理イベントを自動的に生成し、これらのイベントログIBM Cloud Logs に転送します。 詳しくは、IBM Cloud Logs の紹介を参照してください。 クラスターにロギングエージェントをデプロイするには Red Hat OpenShift on IBM Cloudロギングエージェントの管理 」または IBM Cloud Kubernetes Service クラスターのロギングエージェントの管理」 を参照してください。
Fluentd と外部サーバーの組み合わせ
クラスター・コンポーネントのログの収集、転送、表示のために、Fluentd を使用してロギング構成を作成できます。 ロギング設定を作成すると、 Fluentd クラスタコンポーネントは、指定されたソースのパスからログを収集します。 Fluentd その後、これらのログを、 syslog プロトコルに対応した外部サーバーに転送することができます。 まず始めに 、「外部サーバーへのログ転送の理解」 をご覧ください。

ロギングおよびモニタリングエージェントをCloud Logsに移行する

observability CLI プラグイン ibmcloud obv2/observe エンドポイントはサポートされなくなりました。 直接の代替はありませんが、 IBM Cloud Kubernetes Service 拡張機能 または IBM Cloud Kubernetes Service ログデータを IBM Cloud Logs に送信 することで、ロギングとモニタリングの統合を管理できるようになりました。

ob プラグイン、Terraform、または API を使用してクラスタに observability エージェントをインストールしたり、既存の設定を変更したりすることはできなくなりました。 Sysdig エージェントは、指定された IBM Cloud Monitoring インスタンスにメトリックを送信し続けます。 LogDNA IBM Cloud Log Analysis が Logs に置き換わったため、エージェントはログを送信できなくなった。 IBM Cloud

観測可能性プラグインエージェントの削除

  • ob plugin のサポート終了後は、各コンポーネントを個別に削除する必要があります。

    1. デーモンセットとコンフィグマップをクリーンアップする。
        kubectl delete daemonset logdna-agent -n ibm-observe
        kubectl delete daemonset sysdig-agent -n ibm-observe
        kubectl delete configmap <logdna-configmap> -n ibm-observe
        kubectl delete configmap <sysdig-configmap> -n ibm-observe
        ```
    1. オプション:ネームスペースを削除する。 ネームスペースで他のリソースが実行されていない後。
    ```sh {: pre}
        kubectl delete namespace ibm-observe
        ```
    

プラグインを削除した後、クラスターダッシュボード、Terraform、または手動で、クラスター内のロギングおよびモニタリングエージェントを再インストールしてください。

詳しくは、以下のリンクを参照してください。

外部サーバーへのクラスターとアプリのログの転送

IBM Cloud Kubernetes Service の標準クラスターから外部サーバーへのログ転送を構成します。

外部サーバーへのログ転送について

クラスタ内のソースについて、外部サーバーへ転送するためのロギング設定を作成すると、 Fluentd クラスタ内にコンポーネントが作成されます。 Fluentd は、そのソースのパスからログを収集し、そのログを外部サーバーに転送します。 ソースからロギング・サービスの取り込みポートへのトラフィックは暗号化されます。

ログ転送の設定ができるソースにはどのようなものがありますか?
次の画像では、ログ記録の設定が可能であるソースの領域を確認できます。

クラスター内のログソース。
クラスター内のログソース

  1. worker: ユーザーがワーカー・ノードに指定したインフラストラクチャー構成に固有の情報。 syslog には、オペレータログが記録され、そこにはオペレーティングシステムのイベントが含まれています。 auth.log には、OS に対して行われた認証要求に関する情報が含まれます。

    パス

    • /var/log/syslog
    • /var/log/auth.log
  2. container: 実行中のコンテナによって記録される情報。 パス : STDOUT または STDERR`` に書き込まれるすべての内容。

  3. application: アプリケーション・レベルで発生するイベントに関する情報。 これは、ログインの成功、ストレージに関する警告、またはアプリレベルで実行可能なその他の操作など、何らかのイベントが発生したことを通知するものです。 転送先 :ログを転送する先を設定できます。 ただし、ロギング構成で絶対パスを使用しないとログが送信されないため、ログを読み取ることができません。 パスがワーカーノードにマウントされている場合、シンボリックリンクが作成されている可能性があります。 例:指定されたパスが /usr/local/spark/work/app-0546/0/stderr であるにもかかわらず、実際にはログが /usr/local/spark-1.0-hadoop-1.2/work/app-0546/0/stderr に保存されている場合、そのログを読み取ることができません。

  4. storage: クラスター内にセットアップされた永続ストレージに関する情報。 ストレージ・ログは、DevOps パイプラインおよび製品リリースの一部として問題判別ダッシュボードおよびアラートをセットアップするのに役立ちます。 : パス /var/log/kubelet.log および /var/log/syslog にもストレージ・ログが含まれていますが、これらのパスにあるログは kubernetes および worker ログ・ソースによって収集されます。

    パス
    /var/log/ibmc-s3fs.log
    /var/log/ibmc-block.log
    ポッド
    portworx-***
    ibmcloud-block-storage-attacher-***
    ibmcloud-block-storage-driver-***
    ibmcloud-block-storage-plugin-***
    ibmcloud-object-storage-plugin-***
  5. kubernetes: ワーカー・ノードの kube-system 名前空間内で発生する kubelet、kube-proxy、その他の Kubernetes イベントからの情報。

    パス
    /var/log/kubelet.log
    /var/log/kube-proxy.log
    /var/log/event-exporter/1..log
  6. ingress: Ingress ALB を介してクラスターに伝送されるネットワーク・トラフィックに関する情報。

    パス
    /var/log/alb/ids/*.log
    /var/log/alb/ids/*.err
    /var/log/alb/customerlogs/*.log
    /var/log/alb/customerlogs/*.err
  7. kube-audit: Kubernetes API サーバーに送信されるクラスター関連アクションに関する情報。時間、ユーザー、および影響を受けるリソースを含みます。 kube-audit ソースは、Webhook を使用して構成できます。 詳しくは、「外部サーバーへの Kubernetes API 監査ログの転送 (Forwarding Kubernetes API audit logs to an external server)」を参照してください。

Fluentd の更新は私の責任ですか?
ロギングやフィルターの構成を変更するには、Fluentd ロギング・コンポーネントが最新バージョンである必要があります。 デフォルトでは、このアドオンに対する自動更新が有効になっています。 自動更新を使用不可にするには、クラスターのコンポーネントの更新: ロギング用の Fluentdを参照してください。
クラスタ内の1つのソースから、一部のログのみを転送し、他のログは転送しないようにすることはできますか?
はい。 例えば、特にログ量の多いポッドがある場合に、そのポッドのログでログ・ストレージ・スペースが占有されないようにして、他のポッドのログを転送したいことがあります。 特定のポッドのログを転送しないようにする方法については、ログのフィルタリングを参照してください。

クラスターとアプリのログの転送

クラスターとアプリのロギングの構成を作成します。 オプションを使用することで、さまざまなロギングオプションを区別することができます。

ロギングを構成する際に使用できる各種オプションとその説明は、次の表のとおりです。

ロギング構成オプションについて
パラメーター 説明
<cluster_name_or_ID> クラスターの名前または ID。
--logsource ログの転送元になるソース。 指定可能な値は、containerapplicationworkerkubernetesingress、および storage です。 このオプションでは、設定に適用するログソースのリストをカンマ区切りで指定できます。 ログ・ソースを指定しない場合、 container および ingress のログ・ソースのロギング構成が作成されます。
--type syslog syslog という値を指定することで、ログが外部サーバーに転送されます。
--namespace オプション: ログの転送元になる Kubernetes 名前空間。 ログ転送は、Kubernetes 名前空間 ibm-systemkube-system ではサポートされていません。 この値は、container ログ・ソースについてのみ有効です。 名前空間を指定しないと、クラスター内のすべての名前空間でこの構成が使用されます。
--hostname ログ・コレクター・サービスのホスト名または IP アドレスを指定します。
--port 取り込みポート。 ポートを指定しない場合は、標準ポート 9091 が使用されます。 syslog の場合は、ログ・コレクター・サーバーのポートを指定します。 ポートを指定しない場合は、標準ポート 514 が使用されます。
--app-containers オプション: アプリのログを転送するには、アプリが含まれているコンテナーの名前を指定します。 コンマ区切りのリストを使用して複数のコンテナーを指定できます。 コンテナーを指定しない場合は、指定したパスが入っているすべてのコンテナーのログが転送されます。
--app-paths アプリがログを書き込むコンテナー上のパス。 ソース・タイプが application のログを転送するには、パスを指定する必要があります。 複数のパスを指定するには、/var/log/myApp1/*,/var/log/myApp2/* のようにコンマ区切りリストを使用します。
--syslog-protocol ロギング・タイプが syslog< の場合は、トランスポート層プロトコル。 udptls、または tcp の各プロトコルを使用できます。 udp プロトコルを使用して rsyslog サーバーに転送する場合、 1KB を超えるログは切り捨てられます。
--ca-cert 必須: ロギング・タイプが syslog で、プロトコルが tls である場合、認証局証明書を含む Kubernetes シークレット名。
--verify-mode ロギング・タイプが syslog で、プロトコルが tls である場合、検証モード。 サポートされる値は verify-peer で、デフォルトは verify-none
--skip-validation オプション: 組織名とスペース名が指定されている場合にそれらの検証をスキップします。 検証をスキップすると処理時間は短縮されますが、ロギング構成が無効な場合、ログは正しく転送されません。

udp または tcp プロトコルを介してユーザー自身のサーバーにログを転送する

  1. エディターまたは管理者の IBM Cloud IAM プラットフォーム・アクセス役割があることを確認してください。

  2. ログ・ソースがあるクラスターの場合: アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。

  3. syslog プロトコルを受け付けるサーバーを、以下の2つの方法のいずれかで設定します: : 独自のサーバーをセットアップして管理するか、プロバイダーが管理するサーバーを使用します。 プロバイダーがサーバーを管理する場合は、ロギング・プロバイダーからロギング・エンドポイントを取得します。

    : コンテナから syslog を実行します。 たとえば、この デプロイ用.yaml ファイルを使用すると、 Docker のパブリックイメージを取得し、クラスター内でコンテナを実行することができます。 このイメージは、パブリック・クラスター IP アドレスのポート 514 を公開し、このパブリック・クラスター IP アドレスを使用して syslog ホストを構成します。

    syslog というプレフィックスを削除すれば、ログを有効な JSON として確認できます。 そのためには、 rsyslog サーバーが稼働している etc/rsyslog.conf ファイルの先頭に、以下のコードを追加してください: $template customFormat,"%msg%\n"$ActionFileDefaultTemplate customFormat

  4. ログ転送構成を作成します。 パラメーターについて詳しくは、ロギング構成オプションの表についてを参照してください。

    ibmcloud ks logging config create --cluster CLUSTER_NAME_OR_ID --logsource LOG_SOURCE --namespace KUBERNETES_NAMESPACE --hostname LOG_SERVER_HOSTNAME_OR_IP --port LOG_SERVER_PORT --type syslog --app-containers CONTAINER1,2 --app-paths PATHS_TO_LOGS --syslog-protocol PROTOCOL
    

tls プロトコルを介してユーザー自身のサーバーにログを転送する

  1. 以下の IBM Cloud IAM 役割があることを確認します。

    • クラスターに対するエディターまたは管理者のプラットフォーム・アクセス役割
    • ** 名前空間に対するライターまたは**管理者kube-systemのサービス・アクセス役割
  2. ログ・ソースがあるクラスターの場合: アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。

  3. syslog プロトコルを受け付けるサーバーを、以下の2つの方法のいずれかで設定します:

    • 独自のサーバーをセットアップして管理するか、プロバイダーが管理するサーバーを使用します。 プロバイダーがサーバーを管理する場合は、ロギング・プロバイダーからロギング・エンドポイントを取得します。

    • コンテナから syslog を実行します。 たとえば、この デプロイ用.yaml ファイルを使用すると、クラスター内でコンテナを実行する「 Docker 」のパブリックイメージを取得できます。 このイメージは、パブリッククラスタIPアドレスに対してポート 514 を公開し、このパブリッククラスタIPアドレスを使用して syslog ホストを設定します。 関連する認証局証明書およびサーバー・サイド証明書を注入し、syslog.conf を更新して、サーバー上で tls を有効にする必要があります。

  4. 認証局証明書を ca-cert という名前のファイルに保存します。 この名前のとおりでなければなりません。

  5. kube-system ファイル用のシークレットを ca-cert 名前空間に作成します。 ロギング設定を作成する際は、「 --ca-cert 」オプションにシークレット名を使用してください。

    kubectl -n kube-system create secret generic --from-file=ca-cert
    
  6. ログ転送構成を作成します。 パラメーターについて詳しくは、ロギング構成オプションの表についてを参照してください。

    ibmcloud ks logging config create --cluster <cluster name or id> --logsource <log source> --type syslog --syslog-protocol tls --hostname <ip address of syslog server> --port <port for syslog server, 514 is default> --ca-cert <secret name> --verify-mode <defaults to verify-none>
    

転送されるログのフィルタリング

一定期間における特定のログをフィルターで除外することで、外部サーバーに転送するログを選択できます。 オプションを使用することで、さまざまなフィルタリングオプションを区別することができます。

ログ・フィルター操作のオプションについて
パラメーター 説明
<cluster_name_or_ID> 必須: ログをフィルターに掛けるクラスターの名前または ID。
<log_type> フィルターを適用するログのタイプ。 現在、allcontainerhost がサポートされています。
<configs> オプション: ロギング構成 ID のコンマ区切りのリスト。 指定しない場合、フィルターに渡されたすべてのクラスター・ロギング構成にフィルターが適用されます。 フィルターと一致するログ構成を表示するには、--show-matching-configs オプションを使用します。
<kubernetes_namespace> オプション: ログの転送元になる Kubernetes 名前空間。 このオプションは、ログタイプ「 container 」を使用している場合にのみ適用されます。
<container_name> オプション: ログをフィルタリングするコンテナーの名前。
<logging_level> オプション: 指定したレベル以下のログをフィルターで除外します。 指定できる値は、規定の順に fatalerrorwarn/warninginfodebugtrace です。 例えば、info レベルのログをフィルタリングした場合、debugtrace もフィルタリングされます。 :このオプションは、ログメッセージがJSON形式であり、かつ「level」フィールドが含まれている場合にのみ使用できます。 メッセージをJSON形式で表示するには、コマンドの末尾に --output json オプションを追加してください。
<message> オプション: 正規表現で記述された指定メッセージが含まれるログをフィルターで除外します。
<filter_ID> オプション: ログ・フィルターの ID。
--show-matching-configs オプション: 各フィルターが適用されるロギング構成を表示します。
--all オプション: すべてのログ転送フィルターを削除します。
  1. ロギング・フィルターを作成します。

    ibmcloud ks logging filter create --cluster CLUSTER_NAME_OR_ID --type LOG_TYPE --logging-configs CONFIGS --namespace KUBERNETES_NAMESPACE --container CONTAINER_NAME --level LOGGING_LEVEL --regex-message MESSAGE
    
  2. 作成したログ・フィルターを表示します。

    ibmcloud ks logging filter get --cluster CLUSTER_NAME_OR_ID --id FILTER_ID --show-matching-configs
    
  3. 作成したログ・フィルターを更新します。

    ibmcloud ks logging filter update --cluster CLUSTER_NAME_OR_ID --id FILTER_ID --type SERVER_TYPE --logging-configs CONFIGS --namespace KUBERNETES_NAMESPACE --container CONTAINER_NAME --level LOGGING_LEVEL --regex-message MESSAGE
    
  4. 作成したログ・フィルターを削除します。

    ibmcloud ks logging filter rm --cluster CLUSTER_NAME_OR_ID --id FILTER_ID [--all]
    

ログ転送構成の確認、更新、および削除

ログ転送の確認

以下の 2 つのうちいずれかの方法で、構成が正しくセットアップされていることを確認できます。

  • クラスター内のすべてのロギング構成をリスト表示する場合には、以下のようにします。
    ibmcloud ks logging config get --cluster CLUSTER_NAME_OR_ID
    
  • 1 つのタイプのログ・ソースのロギング構成をリストする場合には、以下のようにします。
    ibmcloud ks logging config get --cluster CLUSTER_NAME_OR_ID --logsource SOURCE
    

ログ転送の更新

既に作成したロギング構成を以下のように更新できます。

ibmcloud ks logging config update --cluster CLUSTER_NAME_OR_ID --id LOG_CONFIG_ID --namespace NAMESPACE --type SERVER_TYPE --syslog-protocol PROTOCOL --logsource SOURCE --hostname HOSTNAME_OR_INGESTION_URL --port PORT --app-containers CONTAINER1,2 --app-paths PATHS_TO_LOGS

ログ転送の削除

クラスターの 1 つまたはすべてのロギング構成を削除することにより、以下のようにログの転送を停止できます。

  • 1 つのロギング構成を削除するには、以下のようにします。
    ibmcloud ks logging config rm --cluster CLUSTER_NAME_OR_ID --id LOG_CONFIG_ID
    
  • ネームスペースのログ設定をすべて削除するには:
    ibmcloud ks logging config rm --cluster MY_CLUSTER --namespace KUBERNETES_NAMESPACE