사이드카 컨테이너 패턴

사이드카 컨테이너는 컨테이너를 변경하지 않고 기존 컨테이너의 기능을 추가하거나 확장하는 것을 목표로 합니다. 이전에 논의한 초기 컨테이너와 비교하여 사이드카 컨테이너는 애플리케이션 컨테이너로 동시에 시작되고 실행됩니다. 사이드카는 컨테이너 목록에 있는 두 번째 컨테이너일 뿐이며 시작 순서는 보장되지 않습니다.

아마도 사이드카 컨테이너의 가장 인기 있는 구현 중 하나는 Istio 서비스 메시에 있을 것입니다. 사이드카 컨테이너(Envoy 프록시)는 애플리케이션 컨테이너 옆에서 실행되며 인바운드 및 아웃바운드 요청을 가로챕니다. 이 시나리오에서 사이드카는 기존 컨테이너에 기능을 추가하고 운영자가 트래픽 라우팅, 장애 주입 및 기타 기능을 수행할 수 있도록 합니다.



더 간단한 아이디어는 응용 프로그램 컨테이너의 로그를 수집하고 저장하는 사이드카 컨테이너( log-collector )를 갖는 것입니다. 이렇게 하면 애플리케이션 개발자가 로그 수집 및 저장에 대해 걱정할 필요가 없습니다. 사이드카 컨테이너가 로그를 수집하고 추가 처리 또는 보관을 위해 보낼 수 있는 위치(컨테이너 간에 공유되는 볼륨)에 로그를 작성하기만 하면 됩니다.

초기화 컨테이너에 사용한 예제를 계속 진행하면; 정기적으로 실행git pull을 업데이트하고 저장소를 업데이트하는 사이드카 컨테이너를 생성할 수 있습니다. 이것이 작동하려면 초기 복제를 수행하기 위한 초기화 컨테이너와 주기적으로(예: 60초마다) 리포지토리 변경 사항을 확인하고 가져오는 사이드카 컨테이너를 유지합니다.

이를 시도하려면 original Github repository을 포크하고 아래 YAML에서 포크를 사용하십시오.

apiVersion: v1
kind: Pod
metadata:
  name: website
spec:
  initContainers:
    - name: clone-repo
      image: alpine/git
      command:
        - git
        - clone
        - --progress
        - https://github.com/peterj/simple-http-page.git
        - /usr/share/nginx/html
      volumeMounts:
        - name: web
          mountPath: "/usr/share/nginx/html"
  containers:
    - name: nginx
      image: nginx
      ports:
        - name: http
          containerPort: 80
      volumeMounts:
        - name: web
          mountPath: "/usr/share/nginx/html"
    - name: refresh
      image: alpine/git
      command:
        - sh
        - -c
        - watch -n 60 git pull
      workingDir: /usr/share/nginx/html
      volumeMounts:
        - name: web
          mountPath: "/usr/share/nginx/html"
  volumes:
    - name: web
      emptyDir: {}


위의 YAML에 refresh라는 컨테이너를 추가했습니다. 초기화 컨테이너와 동일한 이미지인 alpine/git 이미지를 사용하고 watch -n 60 git pull 명령을 실행합니다.

The watch command periodically executes a command. In our case, it executes git pull command and updates the local repository every 60 seconds.



이전에 언급하지 않은 또 다른 필드는 workingDir 입니다. 이 필드는 컨테이너의 작업 디렉토리를 설정합니다. 초기 컨테이너를 사용하여 repo를 원래 복제한 위치이므로 /usr/share/nginx/html로 설정합니다.

위의 YAML을 sidecar-container.yaml에 저장하고 kubectl apply -f sidecar-container.yaml를 사용하여 포드를 생성합니다.

초기화 컨테이너가 실행된 후 kubectl get pods를 실행하면 이제 READY 열에 2/2가 표시됩니다. 이 숫자는 이 포드에 총 2개의 컨테이너가 있고 둘 다 준비되었음을 즉시 알려줍니다.

$ kubectl get po
NAME READY STATUS RESTARTS AGE
website 2/2 Running 0 3m39s

kubectl port-forward pod/website 8000:80 명령을 사용하여 Pod로 포트 포워드를 설정하고 http://localhost:8000로 브라우저를 열면 이전과 동일한 웹 페이지가 표시됩니다.

별도의 터미널 창을 열고 refresh 포드 내부의 website 컨테이너에서 로그를 볼 수 있습니다.

$ kubectl logs website -c refresh -f

Every 60.0s: git pull
Already up to date.

watch 명령이 실행 중이고 마지막git pull 명령의 응답은 Already up to date 입니다. 포크한 저장소의 index.html를 변경해 보겠습니다.
<div> 요소를 추가했으며 업데이트된index.html 파일은 다음과 같습니다.

<html>
  <head>
    <title>Hello from Simple-http-page</title>
  </head>
  <body>
    <h1>Welcome to simple-http-page</h1>
    <div>Hello!</div>
  </body>
</html>


다음으로 이것을 준비하고 master 분기에 커밋해야 합니다. 가장 쉬운 방법은 Github의 웹 페이지에서 하는 것입니다. Github에서 index.html를 엽니다(저는 https://github.com/peterj/simple-http-page/blob/master/index.html를 엽니다. 하지만 내 사용자 이름peterj을 사용자 이름 또는 저장소를 포크한 조직으로 바꿔야 합니다.) 연필 아이콘을 클릭하여 파일을 편집합니다(아래 그림 참조). ).


index.html 파일을 변경하고 변경 사항 커밋 버튼을 클릭하여 브랜치에 커밋합니다. 다음으로 refresh 컨테이너의 출력을 보면 다음과 같은 출력이 표시되어야 합니다.

Every 60.0s: git pull

From https://github.com/peterj/simple-http-page
   f804d4c..ad75286 master -> origin/master
Updating f804d4c..ad75286
Fast-forward
 index.html | 1 +
 1 file changed, 1 insertion(+)


위의 출력은 리포지토리에 대한 변경 사항을 나타냅니다. Git은 업데이트된 파일을 공유 볼륨으로 가져옵니다. 마지막으로 http://localhost:8000를 연 브라우저를 새로 고침하면 페이지의 변경 사항을 확인할 수 있습니다.



더 많은 변경을 할 수 있으며 매번 페이지가 60초 이내에 업데이트됩니다. kubectl delete po website 를 실행하여 포드를 삭제할 수 있습니다.

좋은 웹페이지 즐겨찾기