[k8s] Pod,ReplicaSet,Deployment 란?

jjuyaa·2022년 12월 5일
0

CloudClub

목록 보기
7/8

쿠버네티스란 무엇인가?

쿠버네티스는 컨테이너화된 워크로드를 관리하기 위한 오픈소스 플랫폼이다.

  • 워크로드 : 워크로드는 쿠버네티스에서 구동되는 애플리케이션

쿠버네티스는 Container 화된 애플리케이션을 자동화된 배포 , 선언적 구성를 용이하게 한다.

또한 애플리케이션의 확장과 장애 조치를 처리하고, 배포 패턴 등을 제공한다.

❓  쿠버네티스는 어떻게 동작해서 컨테이너화된 애플리케이션을 관리할까?

쿠버네티스의 구성

클러스터

컨테이너화된 애플리케이션을 실행하는 노드라고하는 워커 머신의 집합. 모든 클러스터는 최소 한 개의 워커 노드를 가진다.

  • Node : 애플리케이션의 구성요소인 Pod 를 호스트한다.
  • 클러스터 내부에는 다양한 Component 가 상호작용한다.

Control Plane → 마스터

컨테이너의 라이프 사이클을 정의, 배포, 관리하기 위한 API와 인터페이스를 노출하는 컨테이너 오케스트레이션 레이어

  • 마스터 : Control Plane component 를 실행하는 호스트를 마스터라 한다.
  • 이 계층은 다음과 같은 다양한 컴포넌트로 구성된다
    • etcd: 모든 클러스터 데이터를 담는 쿠버네티스 뒷단의 저장소로 사용되는 일관성, 고가용성 key-value 저장소이다. 백업은 필수!
    • API 서버: 마스터의 프론트엔드로 쿠버네티스 API를 노출한다. 주요 구현은 kube-apiserver 로 수평 확장이 가능해 더 많은 인스턴스를 배포할 수 있다.
    • 스케줄러: 노드가 배정되지 않은 파드를 감지하고, 해당 파드를 실행할 노드를 선정한다.
    • 컨트롤러 매니저: 컨트롤러 프로세스를 실행한다. 컨트롤러란 클러스터의 상태를 관찰해 의도한 상태에 가깝게 만들어준다.
    • 클라우드 컨트롤러 매니저: 쿠버네티스를 타사 클라우드 공급자와 연결시킨다.

노드

노드 컴포넌트는 동작 중인 파드를 유지시키고 쿠버네티스 런타임 환경을 제공한다.

  • 쿠버네티스는 컨테이너를 파드내에 배치하고 Node 에서 실행함으로 워크로드를 구동한다.
  • 컨트롤 플레인에 의해 관리된다.
  • 이 계층은 다음과 같은 다양한 컴포넌트로 구성된다.
    • kubelet : 파드에서 컨테이너가 확실하게 파드 스펙에 따라 건강하게 동작하는 것을 확실하게 한다.
    • kube-proxy : 각 노드에서 실행되는 네트워크 프록시로 서비스개념의 구현부이다. 파드와 클러스터 내외부 네트워크 통신을 돕는다.
    • 컨테이너 런타임 : 컨테이너 실행을 담당하는 소프트웨어로 대표적으로 docker 가 있다.


❓ 쿠버네티스는 컨테이너를 파드내에 배치하고 Node 에서 실행해 관리한다. Pod는 무엇일까?

Pod

쿠버네티스에서 생성하고 관리할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위

  • 하나 이상의 Container 의 그룹이다.
  • pod 내 container는 스토리지네트워크 를 공유하고, 해당 컨테이너를 구동하는 방식에 대한 명세 를 갖는다.
  • 파드는 비영구적 리소스로 언제든지 생성하고 제거될 수 있다.
  • 각 파드는 고유한 IP 주소를 갖는다.

Controller

마스터의 컨트롤 매니저 는 클러스터의 상태를 관찰해 의도한 상태에 가깝게 만들어주는 컨트롤러를 실행한다.

  • 컨트롤러는 클러스터를 관찰하고,필요한 경우에 생성 또는 변경을 요청한다.
  • 현재 클러스터 상태를 의도한 상태에 가깝게 이동한다.
  • 컨트롤러는 컨트롤 플레인의 일부인 api 서버 를 통해 클러스터의 상태를 감시한다.
  • 컨트롤러의 종류에는 Deployment , ReplicaSet , Deployment , StatefulSet , DaemonSet , Job , CronJob 등이 있다.

ReplicaSet

Pod 를 여러 개 복제하여 관리하는 오브젝트

  • 정해진 수의 동일한 파드가 항상 실행되도록 관리한다.
  • 사용자가 직접 파드를 생성하는 경우와는 다르게, 레플리카셋은 노드 장애 또는 노드의 커널 업그레이드와 같은 관리 목적의 중단 등 어떤 이유로든 종료되거나 삭제된 파드를 교체한다. 따라서 레플리카셋 이용을 권장
  • 레플리카셋을 직접적으로 사용하기 보다는 디플로이먼트를 사용하는 것을 권장 → 레플리카 오브젝트를 직접 조작할 필요 없다.

Deployment

파드와 레플리카셋에 대한 선언적 업데이트를 제공한다.
** 선언적 업데이트 : YAML 파일을 통해 정의한 상태를 시스템이 알아서 판단하고 수행해주는 것

  • 레플리카셋을 소유하거나 업데이트를 하고, 파드의 선언적인 업데이트와 서버측 롤링 업데이트를 할 수 있는 오브젝트이다.
  • 로컬 상태가 없는 파드를 실행하여 복제된 애플리케이션을 관리한다.
  • 레플리카셋을 사용해 해당 레플리카셋의 스펙에 따라 구성된 파드의 수를 클러스터에서 관리한다.
  • Deployment가 ReplicaSet 을 관리해주기때문에 ReplicaSet을 따로 관리하면 안된다.

Minikube 를 사용해 Pod, Deployment 띄워보기

준비 (macOS,Homebrew 사용)

kubectl 설치

클러스터와 통신하기 위해 kubectl 커맨드-라인 툴 설치가 필요하다.

  1. 설치 명령 실행 : brew install kubectl
  2. 설치 버전 확인 : kubectl version --client

minikube 설치

클러스터를 구성하는 것은 어려우므로 minikube 를 활용해 로컬에서 단일 노드 쿠버네티스 클러스터를 실행한다.

  1. 설치 명령 실행 : brew install minikube
  2. 버전 확인 : minikube version
  3. minikube 를 지원하는 driver 가 많지 않아 Docker Desktop 를 설치한 후, Docker 드라이버를 사용한다.

minikube 실행

  1. Docker를 먼저 실행 시켜야한다.
  2. minikube 시작 : minikube start
  3. 브라우저에서 쿠버네티스 대시보기 열기 : minikube dashboard

Pod 생성하기

nginx:1.14.2 이미지를 실행하는 컨테이너로 구성되는 파드 예시

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

해당 파드 생성 위해 다음 명령어 실행

kubectl apply -f https://k8s.io/examples/pods/simple-pod.yaml

삭제하기

kubectl delete pod/nginx

Deployment 생성하기

3개의 nginx 파드를 불러오기 위한 레플리카 셋을 생성하는 Deployment

apiVersion: apps/v1
kind: Deployment # 오브젝트 명시
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
  • .metadata.namenginx-deployment 이름으로 디플로이먼트가 생성된다.
  • .spec.replicas : 디플로이먼트는 3개의 레플리카 파드를 생성한다.
  • spec.selector: 디플로이먼트가 관리할 파드를 찾는 방법을 정의한다. 이 사례에서는 파드 템플릿에 정의된 레이블(app: nginx)을 선택
  • spec.selector.matchLabels:는 .spec.template.metadata.labels과 일치해야 하며, 그렇지 않으면 API에 의해 거부된다
  • .template.spec : 파드가nginx1.14.2 버전 이미지를 실행하는 nginx컨테이너 1개를 실행하는 것을 나타낸다.

  • yaml 파일에 명세한대로 nginx 이미지로 만들어진 파드 레플리카 3개를 가진다. app:nginx 레이블을 가지고 관리할 Pod 를 인식한다.
  • 레플리카셋의 이름은 항상 [DEPLOYMENT-NAME]-[RANDOM-STRING] 형식으로 된 것을 알 수 있다
  • Pod-template-hash 레이블 : 이 레이블은 디플로이먼트 컨트롤러에 의해서 디플로이먼트가 생성 또는 채택한 모든 레플리카 셋에 추가된다. 다른 자식 레플리카 셋과 겹치지 않도록 보장하므로 변경하면 안된다.

Pod 와 Deployment 의 차이

pod 는 컨테이너를 관리하는 쿠버네티스의 가장 작은 오브젝트이다.

Deployment 는 클러스터의 컨트롤 도메인에 속하는 컨트롤러 중 하나로 레플레카셋을 관리하여 복제된 다수의 Pod 를 생성, 관리한다.


참고

0개의 댓글