클라우드/쿠버네티스

[Kubernetes] 13. 쿠버네티스 사이드카 패턴(Sidecar pattern) 및 실습

윤창이 2023. 3. 5. 16:00
728x90

[주의] 개인 공부를 위해 쓴 글이기 때문에 주관적인 내용은 물론, 쓰여진 정보가 틀린 것일 수도 있습니다!

피드백 부탁드립니다. (- -)(_ _) 꾸벅

 

 

 

Logging Architecture

Application logs can help you understand what is happening inside your application. The logs are particularly useful for debugging problems and monitoring cluster activity. Most modern applications have some kind of logging mechanism. Likewise, container e

kubernetes.io


[ 사이드카 패턴(Sidecar pattern)이란? ]

클라우드 네이티브 애플리케이션 설계와 구현을 위한 쿠버네티스 패턴 24개 중 하나이다.

사이드카 패턴은 원래 사용하려고 했던 기본 컨테이너의 기능을 확장하거나 보조하는 용도의 컨테이너를 추가하는 패턴이다.

 

오토바이 옆에 붙은 사이드카는 붙이든 떼든 오토바이에 영향을 주지 않는다

즉, 기본 컨테이너와 독립적으로 동작하는 별도의 컨테이너를 붙이는 패턴이기 때문에 어플리케이션 컨테이너의 변경이나 수정 없이 독립적으로 동작하는 컨테이너를 붙였다 뗐다 할 수 있다.

 

 

일반 어플리케이션 환경처럼 Container 환경에서도 Logging은 필수적이며, Logging에 가장 일반적인으로 사용하는 stdout, stderr 와 같은 표준 입출력 스트림(Standard I/O Stream)을 활용하는 것은 Container 환경에서 다소 부적절할 수 있다고 한다, 예를 들어 Pod, Node 등과 같은 Container 환경에 문제가 생겼을 때 Log에 접근하기 쉽지도 않으며 각 Log 파일이 손상되거나 사라질 수 있기 때문에 쿠버네티스에서는 Cluster Level Logging 방식을 추천하고 있다.

 

 

쿠버네티스는 Cluster Level Logging을 위한 네이티브 솔루션을 제공하진 않지만 아래와 같은 방법을 고려할 수 있다.

  • 모든 노드에서 실행되는 Node-Level 로깅 에이전트를 사용한다. (DemonSet)
  • 애플리케이션 파드에 로깅을 위한 전용 사이드카 컨테이너를 포함한다.
  • 애플리케이션 내에서 로그를 백엔드로 직접 푸시한다.

이 글에서는 SideCar를 활용하여 Logging하는 방법을 실습할 예정입니다.

 

Sidecar를 활용한 Logging Architecture

 

위 아키텍처에 볼 수 있듯 App-Container가 직접 Log를 쓰는 것이 아닌 추가 Container에서 Stream를 사용하여 Log를 쓴다. 로그를 Redirection 하는 작업은 최소화되어 있기 때문에 심각한 오버헤드가 아니며, 그렇기에 App-Container에서 로그 스트림을 분리하여 stdout, stderr를 쓰는데 필요한 자원을 아낄 수 있다.

 

 


[ 사이드카 실습 ]

Question : An existing Pod needs to be integrated into the K8s built-in logging architecture (e.g. kubectl logs )Adding a streaming sidecar container is good and common way to accomplish this requirement.

TASK :
    - Add a sidecard container named sidecar, using ghcr.io/shclub/busybox image, to the existing Pod eshop-cart-app.
    - The new sidecar container has to run the following command: /bin/sh -c 'tail -n +1 -F /var/log/cart-app.log'
    - Use a Volume mounted at /var/log, to make the log file cart-app.log avaiable to the sidecar container.
    - Don't modify the eshop-cart-app

 

기존 Pod에 로그 분석을 위한 별도 Container를 Side-car 방식으로 추가한다.

 

기존 eshop-cart-app Pod는 아래와 같습니다. (2초마다 한줄 씩 /var/log/cart-app.log 파일에 랜덤 로그를 남기는 포드)

apiVersion: v1
kind: Pod
metadata:
  name: eshop-cart-app
spec:
  containers:
  - image: busybox
    name: cart-app
    command:
    - /bin/sh
    - -c    
    - 'i=1;while :;do  echo -e "$i: Price: $((RANDOM % 10000 + 1))" >> /var/log/cart-app.log;
      i=$((i+1)); sleep 2; done'
    volumeMounts:
    - name: varlog
      mountPath: /var/log
  volumes:
  - emptyDir: {}
    name: varlog

 

위의 App 작동하는 Pod에 Sidecar Container를 추가해 준 뒤 배포를 하면 된다 (아래 --- 사이에 있는 것을 추가하였다)

apiVersion: v1
kind: Pod
metadata:
  name: eshop-cart-app
spec:
  containers:
  - image: busybox
    name: cart-app
    command:
    - /bin/sh
    - -c    
    - 'i=1;while :;do  echo -e "$i: Price: $((RANDOM % 10000 + 1))" >> /var/log/cart-app.log;
      i=$((i+1)); sleep 2; done'
    volumeMounts:
    - name: varlog
      mountPath: /var/log
------------------------------------
  - name: count-log-1
    image: busybox:1.28
    args: [/bin/sh, -c, 'tail -n+1 -F /var/log/cart-app.log']
    volumeMounts:
    - name: varlog
      mountPath: /var/log
------------------------------------
  volumes:
  - emptyDir: {}
    name: varlog

count-log-1 컨테이너는 똑같은 /var/log 경로에 볼륨을 마운트하며

tail 명령을 통해 cart-app.log를 실시간으로 출력해주는 명령을 실행하는 컨테이너이다.

 

 

- exec 명령으로 직접 sidecar 컨테이너에 접속해서 확인해보기

master@master:~$ kc exec -it eshop-cart-app -c sidecar -- /bin/sh
/ #
/ # tail -n+1 -F /var/log/cart-app.log
1: Price: 9237
2: Price: 2712
3: Price: 3501
4: Price: 7691
5: Price: 7763
6: Price: 1684
...

(실시간으로 나옴)

- log 명령으로 확인해보기

master@master:~$ kubectl logs eshop-cart-app -c sidecar
1: Price: 9237
2: Price: 2712
3: Price: 3501
4: Price: 7691
5: Price: 7763
6: Price: 1684
7: Price: 3086
8: Price: 2682
...

 

728x90