[デモ] ロギング設定

デモの概要

このモジュールでは、インストラクターがROSAクラスターのロギング設定方法をご紹介します。


本演習を自習している時以外、ROSAクラスターのロギング設定を実行しないで下さい。

ROSAのロギングについては、OpenShift LoggingのLokiを利用したロギングか、 Amazon CloudWatchをベースとするログ転送ソリューションの利用を推奨しています。 ROSAでのOpenShift Loggingによるロギング設定の概要は次のとおりです。

  1. Lokiのログ保存に利用するAmazon S3を、AWS STSで利用するためのIAMロールを作成します。

  2. Amazon S3の汎用バケットを作成します。

  3. ROSAのOpenShiftコンソールから、OpenShift Logging OperatorやLoki Operatorなどを インストールして、ロギングとログ転送用のインスタンスを作成します。 このとき、上記手順で作成したIAMロールとAmazon S3のバケットを利用するように設定します。

これらを順番に見ていきましょう。

Amazon S3をAWS STSで利用するためのIAMロール作成

AWSのコンソールまたはAWS CLIで、Amazon S3をAWS STSで利用するためのIAMロールを作成します。 IAMロール作成手順は 「カスタム信頼ポリシーを使用してロールを作成する」をご参照下さい。

例として、下記画像のような「AmazonS3FullAccess」ポリシーを割り当てたIAMロールを作成します。

iam role 01
iam role 02
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::<AWS_ACCOUNT_ID>:oidc-provider/<AWS_IAM_ID_PROVIDER_ID>"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "<AWS_IAM_ID_PROVIDER_ID>:sub": "system:serviceaccount:openshift-logging:logging-loki"
                }
            }
        }
    ]
}

上記のカスタム信頼ポリシーは、特定の AWS IAM IDプロバイダーに 紐づけられたOpenShiftやROSAクラスター上の openshift-logging プロジェクトにある logging-loki サービスアカウントに対して、IAMポリシーで指定されたAWSリソースへの特定の操作を許可するためのものとなります。

後述するLoki OperatorでLokiStackインスタンスを作成する際に、LokiStackインスタンスの名前と同じ名前のサービスアカウントがOpenShiftクラスターで自動作成されるようになっており、Amazon S3の利用権限をこのサービスアカウントに付与する必要があります。

ROSAの場合は rosa list oidc-provider コマンドで、ROSAクラスターに紐づいているAWS IAM IDプロバイダーが確認できるようになっています。下記のコマンドの出力結果で表示されている oidc.op1.openshiftapps.com/289dfjXXXXXX がAWS IAM IDプロバイダーのIDとなります。

$ rosa list oidc-provider
I: Fetching OIDC providers
OIDC PROVIDER ARN                                                                    Cluster ID       In Use
arn:aws:iam::<AWS_ACCOUNT_ID>:oidc-provider/oidc.op1.openshiftapps.com/289dfjXXXXXX  2el3cammYYYYYYY  Yes

ここで作成したIAMロールのARNをメモしておきます。

Amazon S3のバケット作成

AWSのコンソールまたはAWS CLIで、 Amazon S3の汎用バケットを作成します。

AWSのコンソールから汎用バケットを作成する場合、バケット名を任意の名前で指定する以外は、全てデフォルトのパラメーターのままでバケットを作成します。なお、バケットのリージョンはどこでも構いません。ROSA HCPクラスターがあるリージョンとは別のリージョンにバケットを作成することもできます。

ここで作成した汎用バケットの名前とリージョンをメモしておきます。

OpenShift Loggingに必要となるOperatorのインストール

OpenShift Loggingを利用するためのOperatorを、管理者アカウント( cluster-admin ユーザーなど)で順次インストールしていきます。

OperatorHubから「Red Hat OpenShift Logging Operator」をインストールします。 インストールには、全てデフォルトのパラメータを利用します。 このOperatorは、vectorでのLokiやCloudWatchへのログ転送設定に利用します。

logging operator install1
logging operator install3

OperatorHubから「Cluster Observability Operator」をインストールします。 インストールには、全てデフォルトのパラメータを利用します。 このOperatorは、OpenShiftコンソールでのログ集約の表示設定に利用します。

co operator install1
co operator install2

OperatorHubから「Loki Operator」をインストールします。 「Community Loki Operator」ではなく、Red Hat提供の「Loki Operator」を選択してください。 インストール時に「ロール ARN」で、前述の手順で作成したカスタム信頼ポリシー付きのIAMロールのARNを指定します。「更新の承認」はデフォルトは「手動」となっていますが、Operatorの自動更新を有効化したい場合は「自動」を選択してください。 その他のパラメータは、全てデフォルト値を利用します。 このOperatorは、Lokiのインスタンス作成に利用します。

loki operator install1
loki operator install2

ロギングの設定

Lokiを利用したクラスターロギングを設定します。

最初にLokiが利用するためのS3バケットの情報(バケット名とリージョンID)を保存したシークレットリソースを作成します。OpenShiftコンソール右上にある「+」アイコンをクリックして「YAMLのインポート」を選択し、以下を入力して「作成」をクリックします。以下の例だと、バケット名が rosa-hcp-test-bucket-000001 で、リージョンIDが us-east-1 を指定しています。

apiVersion: v1
kind: Secret
metadata:
  name: logging-loki-s3
  namespace: openshift-logging
stringData:
  bucketnames: rosa-hcp-test-bucket-000001
  region: us-east-1
s3 secret create

openshift-logging プロジェクトに LokiStack カスタムリソースを作成して、Loki実行に必要となるアプリケーション群を作成します。先ほどと同様に、OpenShiftコンソール右上にある「+」アイコンをクリックしてYAMLをインポートします。ここで指定するシークレット名は、先ほど作成した logging-loki-s3 となります。また、1x.demo サイズを指定することで、 LokiStackインスタンスのサイズを指定しています。

1x.demo はデモ用途なので、本番環境には利用しないでください。
apiVersion: loki.grafana.com/v1
kind: LokiStack
metadata:
  name: logging-loki
  namespace: openshift-logging
spec:
  managementState: Managed
  size: 1x.demo
  storage:
    schemas:
    - effectiveDate: '2024-10-01'
      version: v13
    secret:
      name: logging-loki-s3
      type: s3
  storageClassName: gp3-csi
  tenants:
    mode: openshift-logging
lokistack create

UIPlugin カスタムリソースを作成して、OpenShiftコンソールでのログ集約の表示を有効化します。 ここで指定している logging-loki は、前述の手順で作成したLokiStackインスタンスの名前です。

apiVersion: observability.openshift.io/v1alpha1
kind: UIPlugin
metadata:
  name: logging
spec:
  type: Logging
  logging:
    lokiStack:
      name: logging-loki
uiplugin create

数分待ってOpenShiftコンソールを更新すると、左サイドメニューに「Logs」が表示されます。 今の状態だと、vectorでのログ転送が有効化されていないため、まだ何も表示されません。

uiplugin logs

ログ転送の設定

次のコマンドでログ収集用のサービスアカウント collector を作成し、LokiStackカスタムリソースへのデータ書き込み許可と、アプリケーション/インフラストラクチャー/監査ログ収集を許可する権限を付与します。

oc create sa collector -n openshift-logging
oc adm policy add-cluster-role-to-user logging-collector-logs-writer -z collector -n openshift-logging
oc adm policy add-cluster-role-to-user collect-application-logs -z collector -n openshift-logging
oc adm policy add-cluster-role-to-user collect-audit-logs -z collector -n openshift-logging
oc adm policy add-cluster-role-to-user collect-infrastructure-logs -z collector -n openshift-logging

この5つのコマンドは、管理者アカウント( cluster-admin ユーザーなど)で実行します。前の演習で紹介したOpenShiftのWeb Terminalを利用することができます。

sa collector create

最後にvectorによるLokiStackインスタンスへのログ転送を設定します。以下のYAMLをOpenShiftコンソールからインポートします。inputRefs の箇所で、アプリケーション/インフラストラクチャー/監査の3種類のログを転送するように指定しています。また、前述の手順で作成した下記を指定しています。

  • サービスアカウント: collector

  • LokiStackインスタンス: logging-loki

apiVersion: observability.openshift.io/v1
kind: ClusterLogForwarder
metadata:
  name: collector
  namespace: openshift-logging
spec:
  serviceAccount:
    name: collector
  outputs:
  - name: default-lokistack
    type: lokiStack
    lokiStack:
      authentication:
        token:
          from: serviceAccount
      target:
        name: logging-loki
        namespace: openshift-logging
    tls:
      ca:
        key: service-ca.crt
        configMapName: openshift-service-ca.crt
  pipelines:
  - name: default-logstore
    inputRefs:
    - application
    - infrastructure
    - audit
    outputRefs:
    - default-lokistack
clf create

どの種類のログを転送するかについては、前述したYAMLの inputRefs: の項目で指定できます。

  • application : アプリケーションログの収集。利用者が作成したプロジェクトにデプロイされるアプリケーションのログ(stdoutとstderrに出力されるログ)を収集します。後述のインフラストラクチャー関連のログは除きます。

  • infrastructure : インフラストラクチャーログの収集。ROSAクラスター作成時にデフォルトで作成される openshift-* , kube-* などのプロジェクトにある、インフラストラクチャー関連のログを収集します。

  • audit : セキュリティ監査に関連するログの収集。ワーカーノードのノード監査システム(auditd)で 生成される監査ログ(/var/log/audit/audit.log)を収集します。コントロールプレーンの監査ログは、OpenShift Logging Operatorとは別の仕組みで外部転送されており、 Red HatのSREチームによって1年間保存されます。 そのため、ROSAの利用者は監査ログを保存しなくても、 Red Hatのサポートケース経由で監査ログを取得することもできます。

このログ転送設定によって、自動的に collector-* という名前のPod(内部ではvectorが実行)が、「openshift-logging」プロジェクトに作成されます。 この collector-* Podは、全てのワーカーノードで自動的に実行されて、 ワーカーノード上のログをLokiStackインスタンスに転送します。

loki logging pods

しばらく時間が経つと、LokiStackインスタンスが指定しているAmazon S3のバケットにログが保存されていることを、AWSマネジメントコンソールから確認できます。Lokiでのログは自動圧縮されて、S3のバケットに保存されます。

s3 loki logs