ROSA(Red Hat OpenShift Service on AWS)を利用したコンテナプラットフォーム構築 ~ ログ転送設定 ~

はじめに

前々回の記事ではROSA HCPの概要やメリットを紹介し、前回の記事ではROSA HCPクラスターを実際に構築してきました。
今回は、本番運用を見据えた、ROSA HCPクラスターにおける「ログ保管の自動化」 についてご紹介します。
KubernetesやOpenShift環境では、Podが再起動したり削除されたりすると、コンテナ内に出力されていたログは消えてしまいます。そのため、システムの安定運用やトラブルシューティングを行うためには、コンテナログを保管する仕組みが必須となります。
そこで、AWSの運用に慣れたエンジニアにとって、最も親和性が高く手軽なログ保管先となるのが「Amazon CloudWatch Logs」です。

本記事では、具体的な設定手順に進む前の前提知識として、まずはROSA環境におけるログ保管の全体像を整理し、その後CloudWatch Logsへ転送する具体的な設定方法を解説していきます。

ROSAで出力されるログの種類

CloudWatch Logsへの転送設定を始める前に、まずはROSAが出力するログの種類についてご紹介します。
ROSAを構成するコンポーネントから出力されるログは以下の3種類に大別されます。
ROSA with HCPでは、ログ種別によってログの転送方法が異なるため注意が必要です。

ログ種別 概要 転送方法

アプリケーションログ

ユーザーがデプロイしたPod(コンテナ)から出力されるログ

OpenShift Logging

インフラストラクチャログ

ワーカーノードやOpenShiftのシステムコンポーネント(※)から出力されるログ

OpenShift Logging

監査ログ

クラスター内での操作履歴のログ

ROSA with HCPの標準機能

※インフラストラクチャログにおけるシステムコンポーネントの定義
OpenShfitの仕様上、以下のnamespaceで実行されているPodはすべて「OpenShiftのシステムコンポーネント」とみなされ、それらが出力するログはインフラストラクチャログとして分類されます。

  • default
  • kube–xxx
  • openshift-xxx

 

OpenShift Loggingとは

ROSA with HCPにおいて、アプリケーションログ・インフラストラクチャログを収集し、外部へ転送するための機能が「OpenShift Logging」です。
Kubernetes標準の機能だけでは、Podが再起動したり削除されたりするとコンテナ内のログも一緒に消えてしまいます。OpenShift Loggingは、クラスター内の各コンテナが出力するログをリアルタイムに収集し、外部(今回はCloudWatch Logs)へと転送するパイプラインを自動管理してくれます。

OpenShift Loggingを構成する主要コンポーネント

現在のOpenShift Loggingは以下のコンポーネントで構成されます。

  • Cluster Logging Operator
    • ログ収集エンジンや転送設定全体のライフサイクルを管理するコンポーネントです。
  • ログ収集エンジン
    • 各ワーカーノードにDaemonSetとして配置され、ノード上で動くコンテナのログを収集するコンポーネントです。以前のOpenShiftではFluentdがログ収集エンジンとして使用されていましたが、現在の最新バージョンではパフォーマンスとリソース効率に優れたVectorがデフォルトのエンジンとして採用されています。

 

ログ転送パイプラインを定義する「ClusterLogForwarder」

OpenShift Loggingは、ログの転送パイプラインの定義を「ClusterLogForwarder」というカスタムリソースで定義します。
これにより、YAMLファイルを1つ定義するだけで、「どのログを」「どこへ転送するか」を自由に設定することができるようになっています。 
ClusterLogForwarderに定義する転送パイプラインは、主に以下の3つの要素を組み合わせて設定します。

  • Inputs(入力元): どのログを対象にするか
  • Outputs(出力先): どこに送るか
  • Pipelines(経路の結合): どのInputsを、どのOutputsへ紐付けるか

ログ転送のデータフロー

OpenShift Loggingを利用したログ転送のデータフローを図に示すと以下のようになります。

ログ収集エンジンであるVectorはClusterLogForwarderの定義に従い、Inputsに設定したアプリケーションログやインフラストラクチャログを収集し、Outputsに設定したCloudWatch Logsにログを転送します。

OpenShift Loggingを利用したCloudWatch Logsへのログ転送設定

ここからは実際にOpenShift Loggingを利用したCloudWatch Logsへのログ転送設定をご紹介します。

前提条件

  • ROSAクラスターが構築済みであること(前回の記事を参照)
  • ROSAクラスターにCLIでログインできていること
  • ROSAクラスターの管理コンソールにWebブラウザからログインできていること

事前準備(ロググループとIAMロール・ポリシーの作成)

ロググループの作成

まずは転送先ロググループを作成します。
以下はCloudFormationでロググループを作成する際のサンプルになります

AWSTemplateFormatVersion: '2010-09-09'
Description: 'Log Group for OpenShift Logging'
Resources:
  # アプリケーションログ用のロググループ
  LogGroupApp:
    Type: AWS::Logs::LogGroup
    DeletionPolicy: "Delete"
    Properties:
      LogGroupName: /rosa/hcp-cluster/application

  # インフラストラクチャログ用のロググループ
  LogGroupInfra:
    Type: AWS::Logs::LogGroup
    DeletionPolicy: "Delete"
    Properties:
      LogGroupName: /rosa/hcp-cluster/infrastructure

上記CloudFormationを適用すると以下のロググループが作成されます。
※OpenShift Loggingはアプリケーションログを「<任意の値>/application」、インフラストラクチャログを「<任意の値>/infrastructure」の名称のロググループにログを転送します。

IAMロール・IAMポリシーの作成

OpenShift Loggingに割り当てるIAMロール・IAMポリシーを作成します。
以下はCloudFormationでIAMロールを作成する際のサンプルになります

AWSTemplateFormatVersion: '2010-09-09'
Description: 'IAM Role and Policy for OpenShift Logging'

Parameters:
  # ROSA構築時に作成したOIDCエンドポイント
  OidcEndpoint:
    Type: String
    Description: 'The OIDC Endpoint'

Resources:
  # CloudWatch Logs へのアクセス許可ポリシー
  OpenShiftLoggingPolicy:
    Type: 'AWS::IAM::ManagedPolicy'
    Properties:
      ManagedPolicyName: 'rosa-openshift-logging-policy'
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Action:
              - 'logs:PutLogEvents'
              - 'logs:PutRetentionPolicy'
              - 'logs:CreateLogStream'
              - 'logs:DescribeLogGroups'
              - 'logs:DescribeLogStreams'
            Resource: 'arn:aws:logs:*:*:*'

  # ログ転送用 IAM ロール
  OpenShiftLoggingRole:
    Type: 'AWS::IAM::Role'
    Properties:
      RoleName: 'rosa-openshift-logging-role'
      AssumeRolePolicyDocument: !Sub |
        {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "Federated": "arn:aws:iam::${AWS::AccountId}:oidc-provider/${OidcEndpoint}"
              },
              "Action": "sts:AssumeRoleWithWebIdentity",
              "Condition": {
                "StringEquals": {
                  "${OidcEndpoint}:sub": "system:serviceaccount:openshift-logging:cloudwatch-log-forwarder-sa"
                }
              }
            }
          ]
        }
      ManagedPolicyArns:
        - !Ref OpenShiftLoggingPolicy

上記CloudFormationの「OidcEndpoint」というパラメーターには、前回の記事で作成したoidc-configの情報を以下のrosaコマンドで確認し、「ISSUER URL」の値の「https://」を除いた値を設定してください。

$ rosa list oidc-config
# 出力例
ID MANAGED ISSUER URL SECRET ARN
XXXXXXXXX true https://xxxx/xxxxx

CloudFormationを適用すると以下のIAMロールが作成されます。

OpenShift Loggingのインストール

Cluster Logging Operatorのデプロイ

まず、OpenShift Loggingのコンポーネントの1つである「Cluster Logging Operator」をデプロイします。
以下はCluster Logging Operatorをyamlファイルでデプロイする際のサンプルになります。
opensfhit-logging-operator.yaml

apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  name: openshift-logging-operaror-group
  namespace: openshift-logging
spec:
  upgradeStrategy: Default
---
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: openshift-logging-operaror-subscription
  namespace: openshift-logging
spec:
  # インストールするOpenShift Loggingのチャンネルを指定
  channel: stable-6.4
  # インストールするOpenShift Loggingのバージョンを指定
  startingCSV: cluster-logging.v6.4.1
  installPlanApproval: Manual
  name: cluster-logging
  source: redhat-operators
  sourceNamespace: openshift-marketplace

作成したopensfhit-logging-operator.yamlをROSAクラスターにログインし、適用します。

$ oc login https://api.your-cluster-name.xxxx.p1.openshiftapps.com:443 --username cluster-admin --password XXXXX-XXXXX-XXXXX-XXXXX

$ oc apply -f opensfhit-logging-operator.yaml

OpenShiftの管理コンソール上の「エコシステム」→「インストール済みのOperator」のページで「cluster-logging」が選択できるようになります。

「cluster-logging」を選択し、「installPlan」のページに遷移すると、OpenShift Logging Operatorのインストールの承認確認画面が表示されるため、「承認」を選択します。


インストールを承認すると、ROSAクラスター上にCluster Logging Operatorが起動します。

$ oc get pod -n openshift-logging
NAME                                       READY   STATUS    RESTARTS   AGE
cluster-logging-operator-dd4646d96-zcw6g   1/1     Running   0          45s

Secretリソースのデプロイ

次に、ログ収集エンジンにIAMロールを割り当てるためのSecretリソースをデプロイします。
以下はSecretのサンプルになります。
secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: cloudwatch-credentials
  namespace: openshift-logging
stringData:
  # 作成したIAMロールのARNを指定
  role_arn: arn:aws:iam::xxx:role/rosa-openshift-logging-role

作成したsecret.yamlをROSAクラスターに適用します。

$ oc apply -f secret.yaml

ServiceAccountのデプロイ

ログ収集エンジンに割り当てるServiceAccoutをデプロイします。
以下はServiceAccountのサンプルになります。
serviceaccount.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: cloudwatch-log-forwarder-sa
  namespace: openshift-logging

作成したserviceaccount.yamlをROSAクラスターに適用します。

$ oc apply -f secret.yaml

ClusterRoleBindingのデプロイ

ログ収集エンジンにログ収集権限を付与するため、ClusterRoleBindingリソースでServiceAccoutに権限の割り当てを行います。
割り当てるClusterRoleはCluster Logging Operatorのデプロイ時に自動で作成されるClusterRoleを割り当てます。
以下はClusterRoleBindingのサンプルになります。
cluster-role-binding.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: logging-collector-logs-writer-crb
subjects:
  - kind: ServiceAccount
    name: cloudwatch-log-forwarder-sa
    namespace: openshift-logging
roleRef:
  kind: ClusterRole
  name: logging-collector-logs-writer
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: collect-application-logs-crb
subjects:
  - kind: ServiceAccount
    name: cloudwatch-log-forwarder-sa
    namespace: openshift-logging
roleRef:
  kind: ClusterRole
  name: collect-application-logs
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: collect-infrastructure-logs-crb
subjects:
  - kind: ServiceAccount
    name: cloudwatch-log-forwarder-sa
    namespace: openshift-logging
roleRef:
  kind: ClusterRole
  name: collect-infrastructure-logs
  apiGroup: rbac.authorization.k8s.io

作成したcluster-role-binding.yamlをROSAクラスターに適用します。

$ oc apply -f cluster-role-binding.yaml

ClusterLogForwarderのデプロイ

ログ収集エンジンをデプロイするためのカスタムリソース(CR)であるClusterLogForwarderをデプロイします。
OpenShift Logging OperatorはClusterLogForwarderに定義した設定内容に基づいてログ収集エンジンをデプロイします。
以下はClusterLogForwarderのサンプルになります。
cluster-log-forwarder.yaml

apiVersion: observability.openshift.io/v1
kind: ClusterLogForwarder
metadata:
  name: cloudwatch-cluster-log-forwarder
  namespace: openshift-logging
spec:
  collector:
    tolerations:
      - operator: "Exists"
  serviceAccount:
    # 3.ServiceAccoutのデプロイで作成したServiceAccout名を指定
    name: cloudwatch-log-forwarder-sa
  outputs:
   - name: cloudwatch-output
     type: cloudwatch
     cloudwatch:
       # 作成したロググループ名を指定
       # {.log_type||"unknown"}の部分はinputRefsで指定している「application」・「infrastructure」の文字列が埋め込まれる
       groupName: '/rosa/hcp-cluster/{.log_type||"unknown"}'
       # ロググループを作成したリージョンを指定
       region: us-east-1
       authentication:
         type: iamRole
         iamRole:
           roleARN:
             key: role_arn
             # 2.Secretリソースのデプロイで作成したSecret名を指定
             secretName: cloudwatch-credentials
           token:
             from: serviceAccount
  pipelines:
    - name: to-cloudwatch
      # アプリケーションログとインフラストラクチャログを収集するように指定
      inputRefs:
        - application
        - infrastructure
      outputRefs:
        - cloudwatch-output

作成したcluster-log-forwarder.yamlをROSAクラスターに適用します。

$ oc apply -f cluster-log-forcluster-log-forwarder.yaml

動作確認

OpenShift Loggingのインストール後、Podが正常に起動しているか確認してください。

$ oc get pod -n openshift-logging
NAME                                        READY   STATUS    RESTARTS   AGE
cloudwatch-cluster-log-forwarder-fngmj      1/1     Running   0          61s
cloudwatch-cluster-log-forwarder-pgx5h      1/1     Running   0          62s
cluster-logging-operator-8646fc6b78-5hh5v   1/1     Running   0          12m

次に、作成したロググループにインフラストラクチャログ・アプリケーションログが転送されていることを確認してください。
※今回はアプリケーションログを出力させるために「test」というnamespace配下にテスト用の「app-log-test」という名前のPodを起動させ、ログ出力させています。

作成したロググループにアプリケーションログ・インフラストラクチャログのログストリームが作成されていることがわかります。以上で、アプリケーションログ・インフラストラクチャログをCloudWatch Logsに転送する設定は完了になります。

【補足】監査ログ(Audit Logs)の転送設定について

ROSA with HCPにおける監査ログはRedHatが管理するコントロールプレーン側で出力されるため、ワーカーノード上に存在するOpenShift Loggingではログの収集が行えません。
そのため、ROSA with HCPでは、監査ログをCloudWatch Logsへ転送する標準機能が用意されています。

監査ログのCloudWatch Logsへの転送を有効化したい場合は、ROSAがCloudWatchにログを書き込むための専用IAMロールを作成し、そのIAMロールのARNを rosa コマンドのオプションに設定します。

以下はCloudFormationでIAMロールを作成する際のサンプルになります。

AWSTemplateFormatVersion: '2010-09-09'
Description: 'IAM Role and Policy for ROSA HCP Audit Log'

Parameters:
  # ROSA構築時に作成したOIDCエンドポイント
  OidcEndpoint:
    Type: String
    Description: 'The OIDC Endpoint'

Resources:
  # 1. CloudWatch Logs へのアクセス許可ポリシー
  RosaAuditLogPolicy:
    Type: 'AWS::IAM::ManagedPolicy'
    Properties:
      ManagedPolicyName: 'rosa-audit-log-policy'
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Action:
              - 'logs:CreateLogGroup'
              - 'logs:CreateLogStream'
              - 'logs:DescribeLogGroups'
              - 'logs:DescribeLogStreams'
              - 'logs:PutLogEvents'
              - 'logs:PutRetentionPolicy'
            Resource: 'arn:aws:logs:*:*:*'

  # 2. Auditログ転送用 IAM ロール
  RosaAuditLogRole:
    Type: 'AWS::IAM::Role'
    Properties:
      RoleName: 'rosa-audit-log-role'
      AssumeRolePolicyDocument: !Sub |
        {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "Federated": "arn:aws:iam::${AWS::AccountId}:oidc-provider/${OidcEndpoint}"
              },
              "Action": "sts:AssumeRoleWithWebIdentity",
              "Condition": {
                "StringEquals": {
                  "${OidcEndpoint}:sub": "system:serviceaccount:openshift-config-managed:cloudwatch-audit-exporter"
                }
              }
            }
          ]
        }
      ManagedPolicyArns:
        - !Ref RosaAuditLogPolicy

上記CloudFormationの「OidcEndpoint」というパラメーターには、OpenShift Logging用のIAMロールを作成した時と同様に、oidc-configの「ISSUER URL」の「https://」を除いた値を設定してください。
CloudFormationを適用すると以下のIAMロールが作成されます。

以下のrosaコマンドで監査ログの転送を有効化します。

$ rosa edit cluster --cluster=<クラスター名> \ 
--audit-log-arn="arn:aws:iam::xxxxxxx:role/rosa-audit-log-role" 

CloudWatch Logsに以下のようなロググループが作成されていれば、監査ログの転送設定は完了です。

※ロググループ名は「ocm-production-<クラスターのID>-<クラスター名>」の形式で自動作成されます。
また、クラスター構築時に–domain-prefixを設定していた場合は、「ocm-production-<クラスターのID>-<domain-prefixの値>」の形式となります。

おわりに

ROSAクラスターにおけるCloudWatch Logsへのログ転送方法について解説しました。
実際にROSAクラスターを運用する際の参考になれば幸いです。
次回はROSAクラスター上のメトリクスをCloudWatchに転送する方法についてご紹介します。

参考文献

https://docs.redhat.com/en/documentation/red_hat_openshift_service_on_aws/4
https://docs.aws.amazon.com/ja_jp/rosa/latest/userguide/what-is-rosa.html
https://docs.redhat.com/en/documentation/red_hat_openshift_logging/6.6/html/install/installing-the-red-hat-openshift-logging-operator

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。
エンジニア募集中!

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です