AWS

[AWS] EKS Fargate Logging Setting – Sharing failure experiences

안녕하세요. ManVSCloud 김수현입니다.

09월 12일 AKOS(AWS Kubernetes Online Study)가 마무리되었습니다.
CloudNet@ 가시다님과 2021년도에 ANOS, DKOS, AKOS 총 3회의 스터디를 진행했습니다.

다시 한 번 가시다님에게 감사의 인사 올립니다.
이번 포스팅은 AKOS의 졸업 과제를 포스팅 해보았습니다.


Fargate logging

Fargate logging 설정을 해보았습니다.

우선 결과적으로는 실패했습니다.
아래 방식대로 진행하는데에 있어 로그를 중앙 집중화할 때 CloudWatch와 결합하여 사용할 AWS용 Fluent Bit에 대해 자세히 몰랐기 때문이라 해당 포스팅 이후 Fluent Bit에 대해 추가적인 공부를 한 뒤 성공시킬 것입니다.

우선 Fagate 프로필은 이미 생성된 상태로 진행했습니다.

먼저 로그 라우터를 구성하기 위해 아래 .yaml 파일을 생성하였습니다.

vi fp-demo.yaml

kind: Namespace
apiVersion: v1
metadata:
  name: fp-demo
  labels:
    aws-observability: enabled
(aks-user@myeks:default) [root@myeks-host ~]# kubectl apply -f fp-demo.yaml
namespace/fp-demo created
(aks-user@myeks:default) [root@myeks-host ~]# kubens fp-demo
Context "aks-user@myeks.ap-northeast-2.eksctl.io" modified.
Active namespace is "fp-demo".
(aks-user@myeks:fp-demo) [root@myeks-host ~]# 

cloudwatch_logs 플러그인을 사용하기 위해 아래와 같은 .yaml도 생성해주었습니다.

vi aws-logging-cloudwatch.yaml

kind: ConfigMap
apiVersion: v1
metadata:
  name: aws-logging
  namespace: fp-demo
data:
  output.conf: |
    [OUTPUT]
        Name cloudwatch_logs
        Match   *
        region ap-northeast-2
        log_group_name fluent-bit-cloudwatch
        log_stream_prefix from-fluent-bit-
        auto_create_group true

  parsers.conf: |
    [PARSER]
        Name crio
        Format Regex
        Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>P|F) (?<log>.*)$
        Time_Key    time
        Time_Format %Y-%m-%dT%H:%M:%S.%L%z

  filters.conf: |
     [FILTER]
        Name parser
        Match *
        Key_name log
        Parser crio
        Reserve_Data On
        Preserve_Key On

이 부분을 생성해줄 때 namespace 와 region 부분을 자신에게 맞게 설정하는 것이 중요합니다.

(aks-user@myeks:fp-demo) [root@myeks-host ~]# kubectl apply -f aws-logging-cloudwatch.yaml
configmap/aws-logging created

이후 CloudWatch IAM에 적용할 권한을 curl로 가져왔습니다.

(aks-user@myeks:fp-demo) [root@myeks-host ~]# curl -o permissions.json https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   215  100   215    0     0    637      0 --:--:-- --:--:-- --:--:--   636

위에서 받아온 파일을 이용하여 아래와 같이 정책을 생성하였습니다.

(aks-user@myeks:fp-demo) [root@myeks-host ~]# aws iam create-policy --policy-name eks-fargate-logging-policy --policy-document file://permissions.json

아래 명령어로 attach 해줍시다. 중요하게 넣어야할 부분은
“내 계정”, “위에서 생성한 정책”, “fagate role 이름” 정도인 것같습니다.

(aks-user@myeks:fp-demo) [root@myeks-host ~]# aws iam attach-role-policy \
>   --policy-arn arn:aws:iam::내계정:policy/eks-fargate-logging-policy \
>   --role-name 역할이름
내 계정
역할 이름

권한 부분을 마친 뒤 테스트를 위해 아래와 같이 pod를 하나 생성하였습니다.

nginx-pod.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample-app
  namespace: fp-demo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - name: http
              containerPort: 80
(aks-user@myeks:fp-demo) [root@myeks-host ~]# kubectl apply -f nginx-pod.yaml
deployment.apps/sample-app created

pod 생성 이후 아래 명령어로 logging 부분을 확인해보려 했으나 정상적으로 logging에 관련된 event가 발견되지 않았습니다.

(aks-user@myeks:fp-demo) [root@myeks-host ~]# kubectl get pod
NAME                             READY   STATUS    RESTARTS   AGE
kube-ops-view-5557846b44-ghhx7   1/1     Running   0          7m14s
sample-app-86b8cc866b-8njpn      1/1     Running   0          13m
sample-app-86b8cc866b-gz4x2      1/1     Running   0          13m
sample-app-86b8cc866b-l7gvb      1/1     Running   0          13m
(aks-user@myeks:fp-demo) [root@myeks-host ~]# 
(aks-user@myeks:fp-demo) [root@myeks-host ~]# kubectl describe pod sample-app-86b8cc866b-8njpn
Name:         sample-app-86b8cc866b-8njpn
Namespace:    fp-demo
Priority:     0
Node:         ip-192-168-2-43.ap-northeast-2.compute.internal/192.168.2.43
Start Time:   Sun, 19 Sep 2021 21:53:01 +0900
Labels:       app=nginx
              pod-template-hash=86b8cc866b
Annotations:  kubernetes.io/psp: eks.privileged
Status:       Running
IP:           192.168.2.137
IPs:
  IP:           192.168.2.137
Controlled By:  ReplicaSet/sample-app-86b8cc866b
Containers:
  nginx:
    Container ID:   docker://a5176ad1add9dcf2fd024e577f9c7e8af51c74d63f0c435c387220cce55ebada
    Image:          nginx:latest
    Image ID:       docker-pullable://nginx@sha256:853b221d3341add7aaadf5f81dd088ea943ab9c918766e295321294b035f3f3e
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Sun, 19 Sep 2021 21:53:05 +0900
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-mpdh4 (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  kube-api-access-mpdh4:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  13m   default-scheduler  Successfully assigned fp-demo/sample-app-86b8cc866b-8njpn to ip-192-168-2-43.ap-northeast-2.compute.internal
  Normal  Pulling    13m   kubelet            Pulling image "nginx:latest"
  Normal  Pulled     13m   kubelet            Successfully pulled image "nginx:latest" in 2.853770826s
  Normal  Created    13m   kubelet            Created container nginx
  Normal  Started    13m   kubelet            Started container nginx

이번 테스트는 실패했지만 추가적인 트러블 슈팅 이후 추가 포스팅 해보도록 하겠습니다.


Personal Comments

이번 졸업 과제는 바쁜 와중에 허겁지겁 하느라 고생을 한 것같습니다.
원래 다양한 주제를 고민했었는데 주말마저 당직이라 긴 시간을 투자하지 못해 아쉬움이 있습니다.

최근에 EKS Anywhere가 출시되어 이 부분을 졸업 과제로 해보는건 어떨까 생각했지만 VMware vSphere 사용하기도 애매하고 시간도 부족해 혹시라도 VMware vSphere를 사용하시는 분이 있다면 참고하여 테스트 해보시라고 아래에 링크를 남깁니다.

가시다님 한 해 스터디 준비하시느라 고생 많으셨습니다.
CloudNet@ 운영진분들에게 모두 감사의 인사드립니다.

긴 글 읽어주셔서 감사합니다.


Problems found

포스팅을 누르는 순간 실패한 원인을 찾은듯 합니다.

켜져있던 웹 창을 정리하던 중 helm chart 를 보자마자 뭔가 이상하다는 걸 알아챘습니다.
fagate logging인데 pod가 fagate로 동작하지 않는듯한?…

이후 포스팅은 이 부분을 해결하고 Fluent Bit에 대해 알아본 것을 공유하는 포스팅이 되겠네요.


Previous Post Next Post

You Might Also Like

No Comments

Leave a Reply