쿠버네티스 오브젝트란

쿠버네티스 오브젝트는 쿠버네티스 시스템에서 영속성을 가지는 개체이다. 쿠버네티스는 클러스터의 상태를 나타내기 위해 이 개체를 이용한다. 간단하게 kubectl을 통해 생성되는 모든것을 오브젝트라 할 수 있다.

  • 어떤 컨테이너화된 애플리케이션이 동작 중인지 (그리고 어느 노드에서 동작 중인지)
  • 그 애플리케이션이 이용할 수 있는 리소스
  • 그 애플리케이션이 어떻게 재구동 정책, 업그레이드, 그리고 내고장성과 같은 것에 동작해야 하는지에 대한 정책

참고 쿠버네티스 오브젝트 이해하기


오브젝트 필수 정보

  • apiVersion : 오브젝트에 맞는 apiVersion 작성
  • kind : 오브젝트 종류
  • metadata : 생성된 오브젝트의 이름, 레이블 지정, etc
    • name
    • labels
    • etc..
  • spec(거의 필수) : 오브젝트별 필요 요소 기술

YAML 파일 작성법

쿠버네티스에서 생성할 오브젝트를 기술하거나 생성된 오브젝트 정보는 yaml로 표현된다. 오브젝트에 대해 자세히 알기전에 yaml 에대해 알아보자.

yaml 파일은 key: value 형식으로 이루어져 있으며 공백으로 요소의 level을 결정한다.

탭을 사용하면 에러가 발생한다. 공백사용권장(에디터가 tab을 공백으로 처리하는 경우 괜찮음)

ex) 공백 0칸시 Root level, 2칸시 level1 ...

Root level을 제외한 경우 가장 가까운 상위레벨에 하위요소가 된다

ex)아래의 경우 first에 second가 포함되어있다. first.second == 2, second == 3 이다

1
2
3
first: 1
  second: 2
second: 3

쿠버네티스 배포시 yaml 파일을 작성하여 배포(kubectl apply -f {file-name}

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: Pods
metadata:
  name: myapp-nginx
  labels:
    app: myapp
    type: backend
spec:
  containers:
    - name : nginx-container
      image : nginx

명령줄에서 바로 배포

kubectl run myapp-nginx--image nginx --labels="app=myapp,type=backend"

2개의 명령어는 같은 행위를 한다.


pod 배포 관련 오브젝트

Pod

Docker등 컨테이너 가상화 도구를 통해 생성된 컨테이너를 쿠버네티스에 배포하기 위해 캡슐레이션한 배포의 단위이다

보통 컨테이너와 POD은 1:1로 배핑된다.

ReplicaController

pod을 한단계 추상화한 오브젝트로써 지정된 팟의 복제본을 지정한 개수만큼 유지 및 관리한다.

matchlabels를 통해 =, ==(=과 같은의미), =! 과 같은 동등비교를 한다.

ReplicaSet

ReplicaController와 같으나 selector에서 집합 연산자를 사용한다

각 연산자는 아래의 경우 참이다.

  • In : Key가 존재하며 Value가 일치
  • NotIn: Key가 존재하며 Value가 불일치
  • Exist : Key가 존재

Deployment

ReplicaSet, ReplicaController를 한단계 더 감싸 배포로 만든다. 이러한 배포에서 구성요소(pod) 버전업그레이드시 롤링업데이트 b/g 배포등 이 가능해진다.

Daemon Sets

지정된 노드에(보통의 경우 모든노드에대해 사용) 각 1개 씩 팟을 배포한다

내부적으로 NodeAffinity를 사용하여 노드당 1개씩 배포한다.

데몬 셋의 대표적인 용도는 아래와 같다.

  • 모든 노드에서 클러스터 스토리지 데몬 실행
  • 모든 노드에서 로그 수집 데몬 실행
  • 모든 노드에서 노드 모니터링 데몬 실행

네임스페이스

c++ using namespace 등 과 같이 같은 이름의 오브젝트가 있더라도 네임스페이스가 다르면 괜찮다.

{namespace}.{object-name}식으로 명명하게되면 겹칠일이 없다.

namespace.png


서비스

쿠버네티스에서 생성된 오브젝트중 deployment나 레플리카셋(컨트롤러) 등을 외부에 노출시켜준다. 이때 NodePort, ClusterIP, LoadBalancer를 사용할 수 있다.

ClusterIP 는 오브젝트를 클러스터 내부아이피에 노출시킨다.

NodePort는 레이블을 기반으로 다른 노드에 있더라도 같은 레이블을 가지고 있는 팟을 선택한다.

내부적으로 ClusterIP를 생성한다. 그뒤 외부에서 접속 할 수 있도록 노출시킨다.

LoadBalance는 클라우드 환경에서만 사용이 가능하다. 서비스공급자(클라우드업체)의 로드밸런서를 사용하기때문이다.