안녕하세요. 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에 대해 알아본 것을 공유하는 포스팅이 되겠네요.
