본문 바로가기

쿠버네티스

[쿠버네티스] pod 심화 과정 - 멀티 컨테이너 생성, 사이드카 파드 생성

728x90

문제 4: 멀티 컨테이너 Pod 생성하기

문제 설명

  • 작업 클러스터: k8s
  • 목표:
    • 4개의 컨테이너(nginx, redis, memcached, consul)를 포함하는 Pod를 생성합니다.
    • Pod 이름은 eshop-frontend입니다.

풀이 전략

  1. Pod YAML 템플릿 생성:
    • kubectl run 명령어를 사용하여 기본 YAML 템플릿을 생성합니다.
    • --dry-run 옵션으로 실제 리소스는 생성하지 않고 YAML 형식으로 출력합니다.
    • 출력된 YAML 파일을 저장합니다.
  2. YAML 수정:
    • YAML 파일을 열고 추가 컨테이너들을 정의합니다.
    • 각 컨테이너는 이름(name)과 이미지(image)를 지정합니다.
  3. Pod 생성:
    • 수정된 YAML 파일을 적용하여 Pod를 생성합니다.
  4. Pod 상태 확인:
    • kubectl get pod 명령어로 생성된 Pod와 컨테이너들이 제대로 실행되고 있는지 확인합니다.

풀이 과정

1. Pod YAML 파일 생성

kubectl run eshop-frontend --image=nginx --dry-run=client -o yaml > 3-2.yaml
 
  • 명령어 설명:
    • kubectl run: Pod를 생성하는 명령어입니다.
    • eshop-frontend: 생성할 Pod의 이름입니다.
    • --image=nginx: Pod 내에 기본으로 추가할 컨테이너의 이미지입니다.
    • --dry-run=client: 명령어 실행 결과만 확인하고 실제 리소스는 생성하지 않습니다.
    • -o yaml: 결과를 YAML 형식으로 출력합니다.
    • > 3-2.yaml: 출력된 YAML 내용을 3-2.yaml 파일로 저장합니다.
  • 결과:
    • 3-2.yaml 파일에 기본 YAML 템플릿이 생성됩니다.

2. YAML 파일 수정

vi 3-2.yaml
  • 작업:
    1. 텍스트 편집기로 3-2.yaml 파일을 엽니다.
    2. 기본적으로 생성된 nginx 컨테이너 외에 추가 컨테이너를 정의합니다.
    3. 수정된 최종 YAML 파일은 아래와 같아야 합니다:
apiVersion: v1
kind: Pod
metadata:
  name: eshop-frontend
spec:
  containers:
  - image: nginx
    name: nginx-container
  - image: redis
    name: redis-container
  - image: memcached
    name: memcached-container
  - image: consul
    name: consul-container
  • 추가된 내용:
    • 각 컨테이너에 대해 image와 name을 지정했습니다.

3. Pod 생성

kubectl apply -f 3-2.yaml
  • 명령어 설명:
    • kubectl apply: YAML 파일의 내용을 Kubernetes 클러스터에 적용합니다.
    • -f 3-2.yaml: 적용할 YAML 파일을 지정합니다.
  • 결과:
    • pod/eshop-frontend created 메시지가 출력됩니다.
    • eshop-frontend라는 이름의 Pod가 생성됩니다.

4. Pod 상태 확인

kubectl get pod
  • 명령어 설명:
    • kubectl get pod: 클러스터에 있는 Pod의 상태를 확인합니다.
  • 결과:
    • 생성된 eshop-frontend Pod와 4개의 컨테이너(nginx, redis, memcached, consul)가 실행 중인지 확인합니다.
    • 출력 예시:
      sql
      코드 복사
      NAME READY STATUS RESTARTS AGE eshop-frontend 4/4 Running 0 1m

문제 풀이 요약

  1. kubectl run 명령어를 사용하여 기본 YAML 템플릿을 생성.
  2. 텍스트 편집기를 사용하여 YAML 파일에 4개의 컨테이너 정의 추가.
  3. kubectl apply 명령어로 수정된 YAML 파일을 클러스터에 적용.
  4. Pod와 컨테이너 상태를 확인하여 정상적으로 실행되었는지 검증.

 

 


 

문제 5: Sidecar Container Pod 생성하기

문제 설명

  1. 작업 클러스터: k8s
  2. 목표:
    • 기존 eshop-cart-app Pod에 로그 스트리밍을 처리하는 사이드카 컨테이너를 추가합니다.
    • 새로 추가될 사이드카 컨테이너 이름은 price이며, 다음 명령을 실행합니다
      /bin/sh -c "tail -n+1 -f /var/log/cart-app.log"
    • /var/log 디렉터리를 마운트하여 cart-app.log 파일에 접근할 수 있어야 합니다.
  3. 제약 조건:
    • 기존의 eshop-cart-app Pod와 cart-app 컨테이너는 수정하지 않습니다.

풀이 전략

  1. YAML 파일 생성:
    • kubectl get pod 명령어로 기존 eshop-cart-app Pod의 YAML 파일을 가져옵니다.
    • 기존 Pod의 구성을 저장한 뒤 수정할 준비를 합니다.
  2. 사이드카 컨테이너 추가:
    • 생성된 YAML 파일에 새로운 컨테이너(price)를 정의합니다.
    • busybox 이미지를 사용하며, 명령어를 실행하고 로그 파일을 읽도록 설정합니다.
    • 볼륨을 사용하여 /var/log를 마운트합니다.
  3. Pod 적용:
    • 수정된 YAML 파일을 클러스터에 적용하여 사이드카 컨테이너가 추가된 Pod를 실행합니다.
  4. 로그 확인:
    • kubectl logs 명령어를 사용하여 price 컨테이너가 로그를 스트리밍하는지 확인합니다.

풀이 과정

1. 기존 Pod YAML 파일 가져오기

kubectl get pod eshop-cart-app -o yaml > 3-3.yaml
 
  • 설명:
    • kubectl get pod: 기존 Pod의 상세 정보를 가져옵니다.
    • -o yaml: 출력 결과를 YAML 형식으로 표시합니다.
    • > 3-3.yaml: 결과를 파일로 저장합니다.
  • 결과:
    • eshop-cart-app Pod의 YAML 파일이 3-3.yaml로 저장됩니다.

2. YAML 파일 수정

vi 3-3.yaml
  • 작업 내용:
    • containers 항목에 새로운 컨테이너를 추가합니다.
    • 볼륨 마운트를 설정하여 /var/log 디렉터리를 공유합니다.
  • 최종 YAML 파일:
apiVersion: v1
kind: Pod
metadata:
  name: eshop-cart-app
spec:
  containers:
  - name: cart-app
    image: busybox
    command:
      - /bin/sh
      - -c
      - "i=1; while :; do echo \"$i: Price: $((RANDOM % 10000 + 1))\" >> /var/log/cart-app.log; i=$((i+1)); sleep 2; done"
    volumeMounts:
    - name: varlog
      mountPath: /var/log
  - name: price
    image: busybox
    args:
      - /bin/sh
      - -c
      - tail -n+1 -f /var/log/cart-app.log
    volumeMounts:
    - name: varlog
      mountPath: /var/log
  volumes:
  - name: varlog
    emptyDir: {}
  • 추가된 항목:
    • price 컨테이너:
      • busybox 이미지 사용.
      • tail -n+1 -f /var/log/cart-app.log 명령어를 실행하여 로그 스트리밍.
    • volumes:
      • emptyDir를 사용하여 /var/log를 공유.
    • volumeMounts란 무엇인가?
    • volumeMounts는 Kubernetes Pod의 컨테이너와 **볼륨(volume)**을 연결하는 설정입니다.
      즉, Pod에 정의된 볼륨을 특정 경로에 마운트하여 컨테이너 내부에서 볼륨을 사용할 수 있게 합니다
    • volumeMounts.name: Pod의 volumes에서 정의된 이름과 연결됩니다.
    • mountPath: 컨테이너 내부 경로로, 볼륨이 마운트됩니다.
    • 컨테이너 간 데이터 공유:
      • 동일한 볼륨을 여러 컨테이너에서 마운트하면 데이터 공유가 가능합니다.
    • 연결 원리:
      • volumeMounts.name은 volumes.name과 일치해야 볼륨이 컨테이너에 연결됩니다.

3. Pod 적용

kubectl apply -f 3-3.yaml
  • 설명:
    • kubectl apply: 수정된 YAML 파일을 Kubernetes 클러스터에 적용합니다.
    • -f 3-3.yaml: 적용할 파일 지정.
  • 결과:
    • 사이드카 컨테이너가 추가된 eshop-cart-app Pod가 실행됩니다.

4. 로그 확인

kubectl logs eshop-cart-app -c price
  • 설명:
    • kubectl logs: Pod의 로그를 확인하는 명령어.
    • -c price: price 컨테이너의 로그를 확인합니다.
  • 결과:
    • price 컨테이너가 cart-app.log의 내용을 스트리밍하는 것을 확인할 수 있습니다.
    • 출력 예시
       
1: Price: 6338
2: Price: 8362
3: Price: 9099
4: Price: 2509

문제 풀이 요약

  1. 기존 eshop-cart-app Pod의 YAML 파일을 가져옵니다.
  2. 새로운 사이드카 컨테이너를 추가하고 로그 파일을 읽도록 설정합니다.
  3. 수정된 YAML 파일을 클러스터에 적용합니다.
  4. price 컨테이너가 로그 스트리밍을 수행하는지 확인합니다.
728x90