オンプレのOpenShiftでもログはCloudWatch Logsに転送しよう


OpenShift LoggingのElasticSearchは、正直ちょっと安定的に運用するのが普通は無理だと思うので、それでもログ集約してGUIでログ参照したい場合はAmazon CloudWatch Logsに転送するのが現状はベストじゃないかと思う。オンプレ環境だったとしても。
ClusterLogForwarderでのCloudWatchへのログ転送が、たぶんROSAのGAに関連してだと思うが、OpenShift 4.8から出来るようになっている。

以下はそのやり方。簡単。

1.AWSでIAMユーザーとアクセスキーを作成する

AWSのIAMで、認証タイプがアクセスキーのユーザーを作る。

アクセス許可にCloudWatchFullAccessを付ける。

タグは任意で。ユーザーを作成したらアクセスキーIDとシークレットアクセスキーを手に入れる。

例えば
アクセスキーID: AKIASBHLFJQFVNNFOGOT
シークレットアクセスキー: 4rGScURvVfAgdZppB9+KNzB+y0ZdqMuOJD5U2FxL

OpenShiftでBase64にした文字列が必要なので、base64コマンドか適当なWebのアプリでbase64変換しておく。

アクセスキーID(base64): QUtJQVNCSExGSlFGVk5ORk9HT1QK
シークレットアクセスキー(base64): NHJHU2NVUnZWZkFnZFpwcEI5K0tOekIreTBaZHFNdU9KRDVVMkZ4TAo=

2.OpenShiftでLoggingオペレーターを導入する

OperatorHubからLoggingオペレーターを導入する。
なおClusterLogForwarderを使いたいだけだったら、ElasticSearchを前提オペレーターとして導入する必要はない。

オペレーターがインストールされたら、ClusterLoggingのインスタンスを下記のyamlで作成する。
ElasticSearch、kibanaを導入しないので、logStore、visualizationのスタンザが不要。

apiVersion: "logging.openshift.io/v1"
kind: "ClusterLogging"
metadata:
  name: "instance" 
  namespace: "openshift-logging"
spec:
  managementState: "Managed"  
  collection:
    logs:
      type: "fluentd"  
      fluentd: {}

3.ClusterLogForwarderを設定する

まずは、AWSにアクセスするためのsecretを作る。
画面右上の「+」をクリックして以下を入力、アクセスキーIDとシークレットアクセスキーを先ほど入手したbase64エンコード済みのものに置き換え、作成。

apiVersion: v1
kind: Secret
metadata:
  name: cw-secret
  namespace: openshift-logging
data:
  aws_access_key_id: QUtJQVNCSExGSlFGVk5ORk9HT1QK
  aws_secret_access_key: NHJHU2NVUnZWZkFnZFpwcEI5K0tOekIreTBaZHFNdU9KRDVVMkZ4TAo=

同じく「+」ボタンから作ってもいいのだが、一応OperatorのClusterLogForwardersからClusterLogForwarderの作成から、下記のyamlで作成する。

groupPrefixはオプションだが、指定すればCloudWatch Logsに「my-cluster.audit」みたいな形でロググループが作成される。
region: ap-northeast-1 は、東京に作るの意。

apiVersion: "logging.openshift.io/v1"
kind: ClusterLogForwarder
metadata:
  name: instance 
  namespace: openshift-logging 
spec:
  outputs:
   - name: cw 
     type: cloudwatch 
     cloudwatch:
       groupBy: logType 
       groupPrefix: my-cluster 
       region: ap-northeast-1 
     secret:
        name: cw-secret 
  pipelines:
    - name: infra-logs 
      inputRefs: 
        - infrastructure
        - audit
        - application
      outputRefs:
        - cw 

4.ログが転送されていることを確認する

設定後、割とすぐにCloudWatch Logsに以下の画面のようなロググループが作成される。

作成されない場合は、IAMユーザーのアクセス権が違うか、Secretが間違っているか。
openshift-logging/fluentd-*のログを参照すると原因がわかる事があるかも。

AWS側、Log Insightsを使って転送されたログを解析することができる。
指定するクエリは、infrastructureの場合はfieldsの「@message」から@を外して「message」としたほうが見やすい。