はじめに
みなさん、こんにちは。
ROSA(Red Hat OpenShift Service on AWS)では、OpenShift Loggingを利用してApplicationログやInfrastructureログなどをAmazon CloudWatch Logsへ転送できます。
CloudWatch Logsはログの取り込み量や保存量などに応じて料金が発生するため、ログの出力量が多い環境ではコストの増加につながります。
そのため、CloudWatchへ転送する必要のないログをROSA側で減らすこともコスト削減の方法の1つです。
OpenShift LoggingのClusterLogForwarderでは、大きく以下の2つの方法でログを減らせます。
- Inputで収集対象となるログを絞る
- Filterでログレコードやログレコード内のフィールドを削除する
Filterでは、ログレコード自体を除外するdropや、不要なフィールドを削除するpruneが利用できます。
本記事では、Part①としてInputを利用して転送対象のログを絞り込む方法を紹介します。
Part②では、dropとpruneを利用したログ削減方法に加えて、実運用でどのようにログ転送量をチューニングしていくかについても考察しています。
ROSAからCloudWatchへのログ転送コストを抑える② - Filterで不要なログを削減する #AWS - Qiita
※本記事はRed Hat OpenShift Logging 6.6を前提としています。
ClusterLogForwarderのInput
ClusterLogForwarderではInputでCollectorが収集するログを指定します。
OpenShift Logging 6.6で利用できるInput Typeは以下の通りです。
| Input Type | 内容 |
|---|---|
application |
ユーザーがデプロイしたApplication Containerのログ |
infrastructure |
Infrastructure ComponentやNodeのログ |
audit |
Kubernetes API ServerやOpenShift API ServerなどのAuditログ |
receiver |
HTTPまたはSyslogで受信するログ |
このうちapplication、infrastructure、auditはPipelineのinputRefsから直接指定できます。
receiverはHTTPまたはSyslogでログを受信するInputです。今回はROSA上で発生するログをCloudWatchへ転送することが目的なので、以降ではapplication、infrastructure、auditについて説明します。
Input Typeの詳細は公式ドキュメントを確認してください。
Applicationログを絞る
ApplicationログはNamespace、Container、Pod Labelなどを条件に収集対象を絞れます。
Namespaceで絞る
例えば以下のNamespaceがあるとします。
app-prod
app-dev
app-test
app-prodだけを対象とする場合は、includesにNamespaceを指定します。
spec:
inputs:
- name: prod-application
type: application
application:
includes:
- namespace: app-prod
pipelines:
- name: cloudwatch-pipeline
inputRefs:
- prod-application
outputRefs:
- cloudwatch
PipelineのinputRefsには、作成したprod-applicationを指定します。
反対に、特定のNamespaceを除外したい場合はexcludesを利用します。
spec:
inputs:
- name: application-exclude-test
type: application
application:
excludes:
- namespace: app-test
上記ではapp-testのログを収集対象から除外します。
ちなみにincludesとexcludesを両方設定した場合はexcludesが優先されます。
Containerで絞る
Container名でも同じように指定できます。
例えばapp-prod Namespaceのapplication Containerだけを対象にする場合は以下のように設定します。
spec:
inputs:
- name: application-container
type: application
application:
includes:
- namespace: app-prod
container: application
特定のContainerだけ除外する場合は以下のように設定します。
spec:
inputs:
- name: application-without-sidecar
type: application
application:
excludes:
- container: sidecar
NamespaceやContainerの指定ではパターンも利用できます。
Pod Labelで絞る
Pod Labelでも収集対象を絞れます。
例えば以下のLabelが付いたPodを対象にします。
metadata:
labels:
logging: cloudwatch
ClusterLogForwarderは以下のように設定します。
spec:
inputs:
- name: cloudwatch-application
type: application
application:
selector:
matchLabels:
logging: cloudwatch
より細かい条件を指定する場合はmatchExpressionsも利用できます。
spec:
inputs:
- name: cloudwatch-application
type: application
application:
selector:
matchExpressions:
- key: env
operator: In
values:
- prod
- staging
図の例ではenv=prodまたはenv=stagingのLabelをもつPodを指定しています。
matchExpressionsで利用できるOperatorは以下の4種類です。
InNotInExistsDoesNotExist
ExistsまたはDoesNotExistを利用する場合はvaluesを空にします。
Infrastructureログを絞る
Infrastructureログは以下の2つのsourceに分かれています。
containernode
containerはdefault、kube*、openshift* NamespaceのWorkloadから出力されるContainerログ、nodeはCluster NodeのJournalログです。
sourcesを指定しない場合は両方が収集されます。
例えばNodeのJournalログだけを収集する場合は以下のように設定します。
spec:
inputs:
- name: infrastructure-node
type: infrastructure
infrastructure:
sources:
- node
Containerログだけの場合は以下です。
spec:
inputs:
- name: infrastructure-container
type: infrastructure
infrastructure:
sources:
- container
Namespace単位ではInputで絞れない
ここでApplicationログとの違いがあります。
Infrastructureのcontainerには、defaultやopenshift-*などのNamespace上で動作するWorkloadのログが含まれます。
ただし、Infrastructure InputではApplication InputのようにNamespace単位で収集対象を指定することはできません。Inputで指定できるのはcontainerまたはnodeのsource単位です。
そのため、特定のInfrastructure Namespaceだけを除外したい場合はFilterを利用します。
Filterを利用したNamespace単位の除外方法については、次回の記事で紹介します。
Auditログを絞る
Auditログには以下のsourceがあります。
kubeAPIopenshiftAPIauditdovn
sourcesを指定しない場合は、すべてのAudit sourceが収集されます。
例えばKubernetes API ServerとOpenShift API ServerのAuditログだけを対象にする場合は以下のように設定します。
spec:
inputs:
- name: api-audit
type: audit
audit:
sources:
- kubeAPI
- openshiftAPI
Auditログを収集する場合は、CollectorのServiceAccountにcollect-audit-logs権限が必要です。
oc adm policy add-cluster-role-to-user collect-audit-logs \
system:serviceaccount:<namespace>:<service_account_name>
公式ドキュメントでは、権限を付与する前にauditをinputRefsへ追加するとCollectorのDaemonSetが削除され、ログ収集が停止すると記載されています。
Auditログを追加する場合は、先に権限を設定する必要があります。
InputとFilterの違い
ここまで紹介したInputでは、ログの種類やNamespace、Container、sourceなどを条件に収集対象を絞れます。
ただし、Inputで指定できる条件はログ種別によって異なります。
| ログ | Inputで絞れる単位 |
|---|---|
| Application | Namespace / Container / Pod Label |
| Infrastructure |
container / node
|
| Audit |
kubeAPI / openshiftAPI / auditd / ovn
|
InfrastructureログをNamespace単位で絞る場合など、Inputでは指定できない条件についてはFilterを利用します。
また、例えばApacheから以下のログが出力されている場合、
GET /health 200
GET /api/users 200
ERROR database connection failed
/healthだけを除外するといったログ内容によるフィルタリングもFilterを利用します。
OpenShift Logging 6.6では、dropを利用して条件に一致したログレコードを除外できます。
また、pruneを利用するとログレコード自体は残したまま、不要なフィールドを削除できます。
こちらは次回の記事で紹介します。
まとめ
今回はClusterLogForwarderのInputを利用して、CloudWatchへ転送するログの対象を絞る方法を紹介しました。
ApplicationログではNamespace、Container、Pod Labelを条件として対象を限定できます。
Infrastructureログではcontainerとnode、AuditログではkubeAPI、openshiftAPI、auditd、ovnから必要なsourceを指定できます。
一方、InfrastructureログをNamespace単位で絞る場合など、Inputだけでは指定できない条件もあります。
その場合はdropなどのFilterを組み合わせてログを除外します。
次回はdropとpruneを利用して、
- InfrastructureログをNamespace単位で除外する
-
/healthなど特定のログレコードを除外する - 不要なフィールドを削除する
といった方法を紹介します。
それでは、また!
参考文献
Red Hat OpenShift Logging 6.6
https://docs.redhat.com/en/documentation/red_hat_openshift_logging/6.6/
Amazon CloudWatch 料金
https://aws.amazon.com/jp/cloudwatch/pricing/