OpenShiftでプロジェクト単位でEventログをPodログとして出力するPodを作成する

Red HatでOpenShiftのサポートをしているid:nekopです。

Kubernetes/OpenShiftではEventログはデフォルト1時間から3時間といったTTL設定となっています。Podログをログ基盤へ集約する設定を行っていても、Eventログはetcd内に格納されているリソースであり、Podログではないので、別途対応しないとログ基盤への集約ができません。

良く利用されるものにEventrouterがありますが、これは一つのnamespaceのPodログとして全てのnamespaceのEventログを出力する、という簡易的なものであり、クラスタ管理権限がなかったりマルチテナント環境などの権限管理がしっかりしているクラスタでは利用できず、複数namespaceのEventログがひとまとめになってしまっているのでログの参照権限も問題となります。

そこで、namespace内でEventログをPodログとして出力するPodをデプロイすることで、namespace内の権限に閉じたEventrouter相当の機能を実装してみましょう。

ocコマンドを利用できるose-cliというイメージが用意されているので、それを利用します。PodのocコマンドがAPIアクセスできるようにServiceAcccountを用意してプロジェクト内リソース参照権限viewを与え、Podではoc get event -wを無限ループで実行すればできそうですね。名前はeventlogdumperという名前にしています。

oc new-project ...
oc create deployment eventlogdumper --image registry.redhat.io/openshift4/ose-cli
oc scale deployment eventlogdumper --replicas=0
oc create sa eventlogdumper
oc policy add-role-to-user view -z eventlogdumper
oc patch deployment eventlogdumper -p 'spec:
  template:
    spec:
      serviceAccountName: eventlogdumper
      containers:
      - name: ose-cli
        command:
        - /bin/bash
        - -c
        - |
          #!/bin/bash

          while true; do
            oc get event -w -o custom-columns="LAST SEEN:{lastTimestamp},FIRST SEEN:{firstTimestamp},COUNT:{count},NAME:{metadata.name},KIND:{involvedObject.kind},SUBOBJECT:{involvedObject.fieldPath},TYPE:{type},REASON:{reason},SOURCE:{source.component},MESSAGE:{message}"
          done'
oc scale deployment eventlogdumper --replicas=1

oc logs deployment/eventlogdumper を実行すると、oc get event出力がPodログとして出力されていることがわかります。このPodをデプロイすることで、namespace内のPodログとしてEventログをOpenShift EFKなどのログ基盤から参照することができるようになります。この実装も簡易的なものであり、エラーハンドリングなども行っていません。それほど問題になるシナリオは無いと思いますが、たとえばPod再作成時にTTL範囲内のEventログが再読み込みされるため、ログ出力の重複などは発生します。

ocコマンドはPodに割り当てられたServiceAccountを自動で利用するようになっているので、APIアクセスのために別途設定ファイルやtokenを明示的に指定する必要はなく、ストレートにocコマンドを発行することができます。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。