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コマンドを発行することができます。