7.11. Amazon CloudView로 로그 전달
AWS(Amazon Web Services)에서 호스팅하는 모니터링 및 로그 스토리지 서비스인 Amazon CloudMonitor에 로그를 전달할 수 있습니다. 기본 OpenShift Logging 관리 Elasticsearch 로그 저장소에 추가하거나 대신 CloudMonitor에 로그를 전달할 수 있습니다.
CloudMonitor에 대한 로그 전달을 구성하려면 CloudMonitor의 출력이 있는 ClusterLogForwarder
사용자 정의 리소스(CR)와 출력을 사용하는 파이프라인을 생성해야 합니다.
절차
aws_access_key_id
및aws_secret_access_key
필드를 사용하여 base64로 인코딩된 AWS 인증 정보를 지정하는Secret
YAML 파일을 만듭니다. 예를 들면 다음과 같습니다.apiVersion: v1 kind: Secret metadata: name: cw-secret namespace: openshift-logging data: aws_access_key_id: QUtJQUlPU0ZPRE5ON0VYQU1QTEUK aws_secret_access_key: d0phbHJYVXRuRkVNSS9LN01ERU5HL2JQeFJmaUNZRVhBTVBMRUtFWQo=
시크릿을 생성합니다. 예를 들면 다음과 같습니다.
$ oc apply -f cw-secret.yaml
ClusterLogForwarder
CR 오브젝트를 정의하는 YAML 파일을 생성하거나 편집합니다. 파일에서 시크릿 이름을 지정합니다. 예를 들면 다음과 같습니다.apiVersion: "logging.openshift.io/v1" kind: ClusterLogForwarder metadata: name: instance 1 namespace: openshift-logging 2 spec: outputs: - name: cw 3 type: cloudwatch 4 cloudwatch: groupBy: logType 5 groupPrefix: <group prefix> 6 region: us-east-2 7 secret: name: cw-secret 8 pipelines: - name: infra-logs 9 inputRefs: 10 - infrastructure - audit - application outputRefs: - cw 11
- 1
ClusterLogForwarder
CR의 이름은instance
여야 합니다.- 2
ClusterLogForwarder
CR의 네임스페이스는openshift-logging
이어야 합니다.- 3
- 출력 이름을 지정합니다.
- 4
cloudwatch
유형을 지정합니다.- 5
- 선택 사항: 로그를 그룹화하는 방법을 지정합니다.
-
logType
은 각 로그 유형에 대한 로그 그룹을 생성합니다. -
namespaceName
은 각 애플리케이션 네임 스페이스에 대한 로그 그룹을 생성합니다. 인프라 및 감사 로그를 위해 별도의 로그 그룹도 생성합니다. -
namespaceUUID
는 각 애플리케이션 네임스페이스 UUID에 대한 새 로그 그룹을 생성합니다. 인프라 및 감사 로그를 위해 별도의 로그 그룹도 생성합니다.
-
- 6
- 선택 사항: 로그 그룹 이름에 기본
infrastructureName
접두사를 대체할 문자열을 지정합니다. - 7
- AWS 리전을 지정합니다.
- 8
- AWS 인증 정보가 포함된 시크릿의 이름을 지정합니다.
- 9
- 선택 사항: 파이프라인의 이름을 지정합니다.
- 10
- 파이프라인을 사용하여 전달할 로그 유형 (
application,
infrastructure
, 또는audit
)을 지정합니다. - 11
- 이 파이프라인으로 로그를 전달할 때 사용할 출력 이름을 지정합니다.
CR 오브젝트를 생성합니다.
$ oc create -f <file-name>.yaml
예제: Amazon CloudMonitor와 함께 ClusterLogForwarder 사용
여기에 ClusterLogForwarder
사용자 정의 리소스(CR)의 예와 Amazon CloudMonitor로 출력되는 로그 데이터가 표시됩니다.
mycluster
라는 OpenShift Container Platform 클러스터를 실행하고 있다고 가정합니다. 다음 명령은 나중에 aws
명령을 구성하는 데 사용할 클러스터의 infrastructureName
을 반환합니다.
$ oc get Infrastructure/cluster -ojson | jq .status.infrastructureName "mycluster-7977k"
이 예제에 대한 로그 데이터를 생성하려면 app
이라는 네임스페이스에서 busybox
Pod를 실행합니다. busybox
포드는 3초마다 stdout에 메시지를 씁니다.
$ oc run busybox --image=busybox -- sh -c 'while true; do echo "My life is my message"; sleep 3; done' $ oc logs -f busybox My life is my message My life is my message My life is my message ...
busybox
Pod가 실행되는 앱
네임스페이스의 UUID를 조회할 수 있습니다.
$ oc get ns/app -ojson | jq .metadata.uid "794e1e1a-b9f5-4958-a190-e76a9b53d7bf"
ClusterLogForwarder
사용자 정의 리소스(CR)에서 infrastructure
, audit
, application
로그 유형을 all-logs
파이프라인에 대한 입력으로 구성합니다. 또한 이 파이프라인을 cw
출력에 연결하여 us-east-2
리전의 CloudMonitor 인스턴스로 로그를 전달합니다.
apiVersion: "logging.openshift.io/v1" kind: ClusterLogForwarder metadata: name: instance namespace: openshift-logging spec: outputs: - name: cw type: cloudwatch cloudwatch: groupBy: logType region: us-east-2 secret: name: cw-secret pipelines: - name: all-logs inputRefs: - infrastructure - audit - application outputRefs: - cw
CloudMonitor의 각 리전에는 세 가지 수준의 오브젝트가 포함되어 있습니다.
로그 그룹
로그 스트림
- 로그 이벤트
ClusterLogForwarding
CR의 groupBy: logType
을 사용하는 경우 inputRefs
의 세 가지 로그 유형은 Amazon Cloudwatch에 3개의 로그 그룹을 생성합니다.
$ aws --output json logs describe-log-groups | jq .logGroups[].logGroupName "mycluster-7977k.application" "mycluster-7977k.audit" "mycluster-7977k.infrastructure"
각 로그 그룹에는 로그 스트림이 포함되어 있습니다.
$ aws --output json logs describe-log-streams --log-group-name mycluster-7977k.application | jq .logStreams[].logStreamName "kubernetes.var.log.containers.busybox_app_busybox-da085893053e20beddd6747acdbaf98e77c37718f85a7f6a4facf09ca195ad76.log"
$ aws --output json logs describe-log-streams --log-group-name mycluster-7977k.audit | jq .logStreams[].logStreamName "ip-10-0-131-228.us-east-2.compute.internal.k8s-audit.log" "ip-10-0-131-228.us-east-2.compute.internal.linux-audit.log" "ip-10-0-131-228.us-east-2.compute.internal.openshift-audit.log" ...
$ aws --output json logs describe-log-streams --log-group-name mycluster-7977k.infrastructure | jq .logStreams[].logStreamName "ip-10-0-131-228.us-east-2.compute.internal.kubernetes.var.log.containers.apiserver-69f9fd9b58-zqzw5_openshift-oauth-apiserver_oauth-apiserver-453c5c4ee026fe20a6139ba6b1cdd1bed25989c905bf5ac5ca211b7cbb5c3d7b.log" "ip-10-0-131-228.us-east-2.compute.internal.kubernetes.var.log.containers.apiserver-797774f7c5-lftrx_openshift-apiserver_openshift-apiserver-ce51532df7d4e4d5f21c4f4be05f6575b93196336be0027067fd7d93d70f66a4.log" "ip-10-0-131-228.us-east-2.compute.internal.kubernetes.var.log.containers.apiserver-797774f7c5-lftrx_openshift-apiserver_openshift-apiserver-check-endpoints-82a9096b5931b5c3b1d6dc4b66113252da4a6472c9fff48623baee761911a9ef.log" ...
각 로그 스트림에는 로그 이벤트가 포함되어 있습니다. busybox
Pod에서 로그 이벤트를 보려면 application
로그 그룹에서 로그 스트림을 지정합니다.
$ aws logs get-log-events --log-group-name mycluster-7977k.application --log-stream-name kubernetes.var.log.containers.busybox_app_busybox-da085893053e20beddd6747acdbaf98e77c37718f85a7f6a4facf09ca195ad76.log { "events": [ { "timestamp": 1629422704178, "message": "{\"docker\":{\"container_id\":\"da085893053e20beddd6747acdbaf98e77c37718f85a7f6a4facf09ca195ad76\"},\"kubernetes\":{\"container_name\":\"busybox\",\"namespace_name\":\"app\",\"pod_name\":\"busybox\",\"container_image\":\"docker.io/library/busybox:latest\",\"container_image_id\":\"docker.io/library/busybox@sha256:0f354ec1728d9ff32edcd7d1b8bbdfc798277ad36120dc3dc683be44524c8b60\",\"pod_id\":\"870be234-90a3-4258-b73f-4f4d6e2777c7\",\"host\":\"ip-10-0-216-3.us-east-2.compute.internal\",\"labels\":{\"run\":\"busybox\"},\"master_url\":\"https://kubernetes.default.svc\",\"namespace_id\":\"794e1e1a-b9f5-4958-a190-e76a9b53d7bf\",\"namespace_labels\":{\"kubernetes_io/metadata_name\":\"app\"}},\"message\":\"My life is my message\",\"level\":\"unknown\",\"hostname\":\"ip-10-0-216-3.us-east-2.compute.internal\",\"pipeline_metadata\":{\"collector\":{\"ipaddr4\":\"10.0.216.3\",\"inputname\":\"fluent-plugin-systemd\",\"name\":\"fluentd\",\"received_at\":\"2021-08-20T01:25:08.085760+00:00\",\"version\":\"1.7.4 1.6.0\"}},\"@timestamp\":\"2021-08-20T01:25:04.178986+00:00\",\"viaq_index_name\":\"app-write\",\"viaq_msg_id\":\"NWRjZmUyMWQtZjgzNC00MjI4LTk3MjMtNTk3NmY3ZjU4NDk1\",\"log_type\":\"application\",\"time\":\"2021-08-20T01:25:04+00:00\"}", "ingestionTime": 1629422744016 }, ...
예제: 로그 그룹 이름에 접두사 사용자 정의
로그 그룹 이름에서는 기본 infrastructureName
접두사인 mycluster-7977k
를 demo-group-prefix
와 같은 임의의 문자열로 바꿀 수 있습니다. 이 변경을 수행하려면 ClusterLogForwarding
CR에서 groupPrefix
필드를 업데이트합니다.
cloudwatch: groupBy: logType groupPrefix: demo-group-prefix region: us-east-2
groupPrefix
값은 기본 infrastructureName
접두사를 대체합니다.
$ aws --output json logs describe-log-groups | jq .logGroups[].logGroupName "demo-group-prefix.application" "demo-group-prefix.audit" "demo-group-prefix.infrastructure"
예제: 애플리케이션 네임스페이스 이름 뒤에 로그 그룹 이름 이름 지정
클러스터의 각 애플리케이션 네임스페이스에 대해 애플리케이션 네임스페이스 이름을 기반으로 하는 로그 그룹을 CloudWatch에서 생성할 수 있습니다.
애플리케이션 네임스페이스 오브젝트를 삭제하고 이름이 같은 새 항목을 생성하면 CloudMonitor는 이전과 동일한 로그 그룹을 계속 사용합니다.
서로 동일한 이름이 있는 연속적인 애플리케이션 네임스페이스 오브젝트를 고려하는 경우 이 예제에 설명된 접근 방식을 사용합니다. 또는 결과 로그 그룹을 서로 구분해야 하는 경우 대신 다음 "애플리케이션 네임스페이스 UUID에 대한 로그 그룹 설정" 섹션을 참조하십시오.
애플리케이션 네임스페이스의 이름을 기반으로 이름이 인 애플리케이션 로그 그룹을 생성하려면 ClusterLogForwarder
CR에서 groupBy
필드의 값을 namespaceName
으로 설정합니다.
cloudwatch: groupBy: namespaceName region: us-east-2
groupBy
를 namespaceName
으로 설정하면 애플리케이션 로그 그룹에만 영향을 미칩니다. audit
및 infrastructure
로그 그룹에는 영향을 미치지 않습니다.
Amazon Cloudwatch에서 각 로그 그룹 이름 끝에 네임스페이스 이름이 표시됩니다. 단일 애플리케이션 네임스페이스인 "app"이 있으므로 다음 출력에서는mycluster-7977k.application
대신 새 mycluster-7977k.app
로그 그룹이 표시됩니다.
$ aws --output json logs describe-log-groups | jq .logGroups[].logGroupName "mycluster-7977k.app" "mycluster-7977k.audit" "mycluster-7977k.infrastructure"
이 예제의 클러스터에 여러 애플리케이션 네임스페이스가 포함된 경우 출력에 각 네임스페이스에 하나씩 여러 개의 로그 그룹이 표시됩니다.
groupBy
필드는 애플리케이션 로그 그룹에만 영향을 미칩니다. audit
및 infrastructure
로그 그룹에는 영향을 미치지 않습니다.
예제: 애플리케이션 네임스페이스 UUID 후 로그 그룹 이름 지정
클러스터의 각 애플리케이션 네임스페이스에 대해 애플리케이션 네임스페이스 UUID를 기반으로 하는 로그 그룹을 CloudWatch에서 생성할 수 있습니다.
애플리케이션 네임스페이스 오브젝트를 삭제하고 새 오브젝트를 생성하면 CloudMonitor에서 새 로그 그룹을 생성합니다.
동일한 이름을 가진 연속적인 애플리케이션 네임스페이스 개체를 서로 다른 것으로 간주하는 경우 이 예에서 설명하는 접근 방식을 사용하십시오. 그렇지 않으면 앞의 "예: 대신 애플리케이션 네임스페이스 이름에 대한 로그 그룹 이름 지정" 섹션.
애플리케이션 네임스페이스 UUID 후에 로그 그룹의 이름을 지정하려면 ClusterLogForwarder
CR에서 groupBy
필드의 값을 namespaceUUID
로 설정합니다.
cloudwatch: groupBy: namespaceUUID region: us-east-2
Amazon Cloudwatch에서 각 로그 그룹 이름 끝에 네임스페이스 UUID가 표시됩니다. 단일 애플리케이션 네임스페이스인 "app"이 있으므로 다음 출력에서는 mycluster-7977k.application
대신 새로운 mycluster-7977k.794e1e1a-b9f5-4958-a190-e76a9b53d7bf
로그 그룹이 표시됩니다.
$ aws --output json logs describe-log-groups | jq .logGroups[].logGroupName "mycluster-7977k.794e1e1a-b9f5-4958-a190-e76a9b53d7bf" // uid of the "app" namespace "mycluster-7977k.audit" "mycluster-7977k.infrastructure"
groupBy
필드는 애플리케이션 로그 그룹에만 영향을 미칩니다. audit
및 infrastructure
로그 그룹에는 영향을 미치지 않습니다.