애플리케이션 배포: 디플로이먼트-레플리카셋-파드

코딩노잼·2022년 6월 6일
0

디플로이먼트-레플리카셋-파드-노드 의 관계

terms

워크로드 = 파드의 집합 내에서 실행되는 애플리케이션.
파드 = 클러스터에서 실행중인 컨테이너의 집합
워크로드 리소스 = 사용자 대신 pod를 관리해줌 (Deployment, ReplicaSet...)


파드

컨테이너의 집합이자 컨테이너 실행환경으로, 애플리케이션을 배포하기 위한 기본 단위이다.

일반적으로 파드를 직접 생성하지는 않고 디플로이먼트 등 워크로드 리소스 사용하여 생성하며,
특별한 이유 없다면 하나의 파드에는 하나의 컨테이너가 사용된다.

파드는 private ip 만 가지고 있기 때문에 외부에서 접근하기 위해서는 service 라는 오브젝트를 생성해야 함. (클러스터 노드에 ssh 접속해서 직접 접근은 가능)

도커 컨테이너 vs 파드

쿠버네티스에서 도커 컨테이너가 아닌 '파드'라는 새로운 개념을 사용하는 이유는 여러 컨테이너들을 추상화된 집합으로 사용하기 위해서이다.

파드 안의 컨테이너들은 리눅스 네임스페이스의 공유 개념을 사용하여, 스토리지, 네트워크, 구동 방식을 공유하며 함께 스케줄되고 공유 컨텍스트에서 실행됨. (여러 컨테이너들이 cgroup 등으로 격리된 상태에서 공유 네임스페이스, 공유 파일시스템 갖는 환경 상상하면 된다.)

어떤 경우에 하나의 컨테이너/여러 컨테이너로 파드를 구성해야 할까?
-> 파드 = 하나의 완전한 애플리케이션이 되도록 잘 구성하기...

apiVersion: v1
kind: Pod
metadata:
  name: my-nginx-pod
spec:
  containers:
  - name: my-nginx-container
    image: nginx:latest
    ports:
    - containerPort: 80
      protocol: TCP

  - name: ubuntu-sidecar-container
    image: alicek106/rr-test:curl
    command: ["tail"]
    args: ["-f", "/dev/null"] # 포드가 종료되지 않도록 유지합니다

위 예시에서는 엔진엑스 컨테이너 + 빈 우분투 컨테이너를 사용해 파드를 생성했다. 파드 내의 컨테이너들은 동일한 네트워크 환경을 가지므로 우분투 컨테이너의 로컬호스트에서 nginx 서버로 접근이 가능하다.

컨테이너 이미지

컨테이너 이미지란 모든 소프트웨어 의존성과 애플리케이션을 캡슐화한 실행 가능한 소프트웨어 번들.
일반적으로 애플리케이션의 컨테이너 이미지를 레지스트리에 푸시한 다음 파드에서 이미지를 참조하도록 구성하여 배포함


레플리카셋

일정 개수의 파드를 유지해주는 컨트롤러

쿠버네티스는 보통 동일한 여러 외부 요청을 여러 파드로 적절히 분배하기 때문에 동일한 여러 파드가 필요하다. 레플리카셋은 정해진 수의 동일한 파드가 항상 실행되도록 관리하는 역할을 한다. (노드에 장애가 생기면 다른 노드에 파드를 새로 생성하는 등..)

동작 원리

레플리카셋에 정의된 라벨 셀렉터를 이용해 파드와 느슨한 연결을 유지한다.

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-nginx-pods-label
  template: # 파드 템플릿 정의
    metadata:
      name: my-nginx-pod
      labels: 
        app: my-nginx-pods-label
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

위와 같은 레플리카셋을 생성하면 app: my-nginx-pods-label 이라는 라벨을 가진 파드의 개수가 3개가 되도록 파드를 관리한다.


디플로이먼트

애플리케이션을 배포하고 관리하는 역할 담당.

실제 운영환경에서는 파드, 레플리카셋을 직접 사용하는 대신 디플로이먼트를 사용해 애플리케이션을 배포한다.

애플리케이션 업데이트 시 레플리카셋의 변경사항을 저장하는 리비전을 남겨 문제가 생기면 이전 버전으로 롤백 가능하게 해주고, 무중단 서비스를 위해 파드의 롤링 업데이트 전략을 지정할 수도 있다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-nginx
  template:
    metadata:
      name: my-nginx-pod
      labels:
        app: my-nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.10
        ports:
        - containerPort: 80

imagePullPolicy

kubelet 이 특정 이미지를 pull 하려고 할때

  • IfNotPresent: 이미지가 로컬에 없는 경우만 다운로드
  • Always
  • Never

    프로덕션 환경에서 이미지 버전 :latest 태그 사용은 지양하자

imagePullBackOff 오류: 쿠버네티스가 어떤 이유로 컨테이너 이미지를 가져올수 없을때 (쿠버네티스는 계속 이미지 가져오려고 시도함)


References

쿠버네티스 공식문서
시작하세요 도커 쿠버네티스

profile
올해는 진짜 블로그 써야지 (라고 매년 말하기)

0개의 댓글