본문 바로가기

Louis

시리즈 2/5AWS EKS 애플리케이션 로그 수집

AWS. EKS 애플리케이션 로그 수집하기 (2)

2022-09-11 (수정 2022-10-15) · 읽는 시간 3

AWS. EKS 애플리케이션 로그 수집하기 (2)

AWS EKS의 애플리케이션 로그를 AWS OpenSearch로 수집하고 관리하기 위한 내용을 정리한다. 로그 전송은 Fluent Bit을 사용했다.

내용은 간단하지만 한 개의 포스팅에 포함하려니 내용이 길어지고 가독성을 해쳐서 몇 개의 파트로 나눴다.

본 포스팅은 K8S의 로그 수집 권한 및 인가 설정을 다룬다.

파트 목차


AWS IRSA (IAM Role for Service Accounts) & RBAC 설정


Fluent Bit DaemonSet이 파드의 로그에 접근할 수 있도록 RBAC 방식의 인가 설정을 한다.

IAM Identity Provider 생성

  • EKS의 OIDC identity provider 생성
  • 콘솔 메뉴 : IAM > Access Management > Identity Providers > Add Provider

IAM Policy 생성

  • 콘솔 메뉴 : IAM > Access Management > Policies > Create policy
  • JSON Editor로 내용을 작성
    • ${OPENSEARCH_ARN} : 생성한 OpenSearch의 ARN 정보로 교체
      • 예: arn:aws:es:ap-southeast-1:111122223333:domain/logging-test
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": [
                    "es:ESHttp*"
                ],
                "Resource": "${OPENSEARCH_ARN}",
                "Effect": "Allow"
            }
        ]
    }

IAM Role 생성

  • 콘솔 메뉴 : IAM > Access Management > Roles > Create role
  • AWS Service : EC2
  • Permissions : 위에 생성한 IAM Policy를 선택
  • Trust Relationship 내용 작성
    • ${IDENTITY_PROVIDER_ARN} : 위에서 생성한 EKS OIDC Provider ARN 값을 사용
      • 예 : arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE
    • ${IDENTITY_PROVIDER} : 위에서 생성한 EKS OIDC Provider 값을 사용
      • 예 : oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE
    • ${SERVICE_ACCOUNT_NAME} : 생성할 Service Account 정보를 기입
      • 예 : system:serviceaccount:logging:fluent-bit
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Federated": "${IDENTITY_PROVIDER_ARN}"
                },
                "Action": "sts:AssumeRoleWithWebIdentity",
                "Condition": {
                    "StringEquals": {
                        "${IDENTITY_PROVIDER}:aud": "sts.amazonaws.com",
                        "${IDENTITY_PROVIDER}:sub": "${SERVICE_ACCOUNT_NAME}",
                    }
                }
            }
        ]
    }

Service Account 생성

  • ${IAM_ROLE_ARN} : 위에서 생성한 Role ARN (예 : arn:aws:iam::111122223333:role/logging-role)
  • Service Account 이름은 데몬셋 파드에서 이를 할당할 때 사용한다.
apiVersion: v1
kind: ServiceAccount
metadata:
  name: fluent-bit
  annotations:
    eks.amazonaws.com/role-arn: ${IAM_ROLE_ARN}
  namespace: logging

Cluster Role 생성

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: fluent-bit-read
rules:
- apiGroups:
  - ""
  resources:
  - namespaces
  - pods
  verbs:
  - get
  - list
  - watch

Cluster Role Binding 생성

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: fluent-bit-read
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: fluent-bit-read
subjects:
- kind: ServiceAccount
  name: fluent-bit
  namespace: logging

참고