DevOps/Kubernetes

쿠버네티스(kubernetes) Pod, Replica Set

알로그 2022. 5. 8. 16:14
반응형

쿠버네티스(kubernetes) 포드(Pod), 레플리카셋(Replica Set)

쿠버네티스의 모든 리소스는 오브젝트 형태로 관리된다.

$ kubectl api-resources
$ kubelctl explain pod

 

쿠버네티스는 명령어보다 YAML 파일을 더 많이 사용한다.

 

쿠버네티스는 여러 개의 컴포넌트로 구성되어 있다.

  • 마스터 노드는 클러스터를 관리하는 역할을 담당하고, 워커 노드에 애플리케이션 컨테이너가 생성됨
  • 마스터 노드에는 API 서버, 컨트롤러 매니저, 스케줄러, DNS 서버 등이 실행되며 모든 노드에는 오버레이 네트워크 구성을 위해 프락시와 네트워크 플러그인이 실행됨
  • 마스터 노드에서 "docker ps" 명령어를 실행해보면 매우 많은 컨테이너가 실행되고 있음
  • kubelet이라는 에이전트가 모든 노드에서 실행되는데, 컨테이너 생성, 삭제 뿐만 아니라 마스터와 워커 노드 간의 통신 역할을 담당하는 에이전트임
  • 쿠버네티스가 반드시 도커를 사용해야 하는 것은 아니며, OCI(Open Container Initiative)라는 컨테이너 런타임 표준을 구현한 CRI(Container Runtime Interface)를 갖추고 있다면 어떤 컨테이너를 써도 상관없음

 

 

포드(Pod): 컨테이너를 다루는 기본 단위

1개 이상의 컨테이너로 구성된 컨테이너의 집합

YAML 파일은 일반적으로 apiVersion, kind, metadata, spec 4가지 항목으로 구성됨

 

<nginx-pod.yaml>

apiVersion: v1        # 오브젝트의 API 버전
kind: Pod             # 리소스 종류
metadata:             # 라벨, 주석, 이름 등 부가 정보 입력
  name: my-nginx-pod
spec:                 # 리소스 생성을 위한 자세한 정보 입력
  containers:
  - name: my-nginx-container
    image: nginx:latest
    ports:
    - containerPort: 80
      protocol: TCP

 

포드 생성하기

$ kubectl apply -f nginx-pod.yaml

 

포드 목록 출력

$ kubectl get pods

 

리소스의 자세한 정보를 얻어오려면..

$ kubectl describe pods my-nginx-pod

 

포드의 IP가 출력되는데, 이는 외부에서 접근할 수 있는 IP가 아니라 클러스터 내부에서만 접근 가능하다.

따라서 외부 또는 내부에서 포드에 접근하려면 서비스(service)라고 하는 오브젝트를 따로 생성해야 한다.

 

일단은 클러스터의 노드 중 하나에 접속한 뒤 nginx 포드의 ip로 http 전송하면 정상 실행임을 알 수 있다.

 

 

포드 컨테이너 내부로 접속하려면..

$ kubectl exec -it my-nginx-pod bash

 

로그 확인

$ kubectl logs my-nginx-pod

 

쿠버네티스의 오브젝트는 kubectl delete -f 명령어로 삭제할 수 있음

$ kubectl delete -f nginx-pod.yaml

 

쿠버네티스가 포드를 사용하는 이유는 여러가지가 있지만 그 이유 중 하나는 여러 리눅스 네임스페이스를 공유하는 여러 컨테이너를 추상화된 집합으로 사용하기 위해서이다.

 

kubectl get pods 명령어로 포드의 목록을 출력했을 때, READY 항목의 1/1 이라는 출력은 1개의 컨테이너가 정의돼있으며 이 컨테이너는 정상적으로 준비되었다는 뜻이다.

 

<nginx-pod-with-ubuntu.yaml>

apiVersion: v1        # 오브젝트의 API 버전
kind: Pod             # 리소스 종류
metadata:             # 라벨, 주석, 이름 등 부가 정보 입력
  name: my-nginx-pod
spec:                 # 리소스 생성을 위한 자세한 정보 입력
  containers:
  - name: my-nginx-container
    image: nginx:latest
    ports:
    - containerPort: 80
      protocol: rep
  - name: ubuntu-sidecar-container
    image: alicek106/rr-test:curl
    command: ["tail"]
    args: ["-f", "/dev/null"] # 컨테이너가 종료되지 않도록 유지

 

yaml 파일을 쿠버네티스에 적용해보면 2개의 컨테이너가 실행중인 것을 확인할 수 있음

$ kubectl apply -f nginx-pod-with-ubuntu.yaml
$ kubectl get pods

 

우분투 컨테이너 내부로 들어가려면..

$ kubectl exec -it my-nginx-pod -c ubuntu-sidecar-container bash

위 컨테이너에서 로컬호스토로 HTTP 전송을 하면 nginx 서버 응답이 도착하는데, 이는 포드 내의 컨테이너들이 네트워크 네임스페이스 등과 같은 리눅스 네임스페이스를 공유해 사용하기 때문이다.

 

실제 쿠버네티스 환경에서는 1개의 컨테이너로 구성된 포드를 사용하는 경우가 많지만 기능 확장을 위한 추가 컨테이너를 포함시킬 수 있으며 이러한 부가적인 컨테이너를 사이드카(sidecar) 컨테이너라고 부른다.

 

 

 

레플리카셋(Replica Set): 일정 개수의 포드를 유지하는 컨트롤러

동일한 여러 개의 포드를 직접 생성하는 방법은 적절하지 않다.

포드가 어떤 이유로 삭제되거나 장애가 발생해 더 이상 포드에 접근하지 못 하게 됐을 때, 직접 삭제하고 생성하지 않는 한 해당 포드는 복구되지 않는다.

 

이런 한계점을 해결해주는 것이 레플리카셋인데 정해진 수의 동일한 포드가 항상 실행되도록 관리하거나 노드 장애 등의 이유로 포드를 사용할 수 없다면 다른 노드에서 포드를 다시 생성할 수 있다.

 

<replicaset-nginx.yaml>

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-nginx
spec:
  replicas: 2
  selector:
    matchLabels: 
      app: my-nginx-pods-label
  template:
    metadata:
      name: my-nginx-pod
      labels:
        app: my-nginx-pods-label
    spec:
      containers:
      - name: my-nginx-container
        image: nginx:latest
        ports:
        - containerPort: 80

 

레플리카셋 생성

 $ kubectl apply -f replicaset-nginx.yaml

 

레플리카셋과 포드 목록 확인

$ kebectl get po
$ kubectl get rs

 

yaml 파일에서 포드를 3개로 늘리면 이미 생성된 래플리카셋을 다시 삭제하고 생성할 필요없이 1개가 더 추가된다.

이는 Label Selector를 이용해 이뤄지기 때문에 동일한 라벨을 가지는 포드를 미리 생성한다음 레플리카셋을 생성하더라도 동일하게 동작한다.

 

레플리카셋이 생성해 놓은 1개 포드의 라벨을 삭제한다면?

$ kubectl edit pods replicaset-nginx-(hash값)

 

기존 파드는 이제 더 이상 관리 대상이 아니게 되며, 새로운 파드를 하나 더 생성된다.

$ kubectl get pods --show-label

 

따라서 더 이상 관리대상이 아니기 때문에 레플리카셋을 삭제하더라도 해당 포드는 삭제되지 않으므로 직접 수동으로 삭제해야 한다.

$ kubectl delete rs replicaset-nginx
$ kubectl get pods
$ kubectl delete pods replicaset-nginx-(hash값)

 

레플레카셋의 목적은 포드를 생성하는 것이 아닌 일정 개수의 포드를 유지하는 것이기 때문에 포드가 너무 많으면 포드를 삭제해 replicas에 설정된 숫자만큼 포드를 유지하고자 한다.

 

 

대세는 쿠버네티스 인프런 강의자료

 

 

References.

http://www.yes24.com/Product/Goods/84927385

 

시작하세요! 도커/쿠버네티스 - YES24

본서는 도커를 처음 접하는 개발자를 위한 도커 컨테이너와 이미지의 기본적인 개념을 먼저 설명한 뒤, 도커 컴포즈와 스웜 모드를 통해 컨테이너 애플리케이션을 YAML 파일로 작성하고 클러스

www.yes24.com

https://kubetm.github.io/k8s/04-beginner-controller/replicaset/

 

Replication Controller, ReplicaSet

Template, Replicas, Selector

kubetm.github.io

 

반응형