Infrastructure/Kubernetes

[Basic] 쿠버네티스와 오브젝트 모델

RoyOps 2024. 6. 9. 18:49

쿠버네티스 오브젝트 모델

쿠버네티스 오브젝트

쿠버네티스 생태계 (CNCF: Cloud Native Computing Foundation)

쿠버네티스 아키텍처

쿠버네티스 개념

  • 자세한 내용은 쿠버네티스 공식문서를 참고한다.
  • 클러스터 전체를 관리하는 컨트롤러로서 마스터 노드가 있다.
  • 컨테이너가 배포되는 머신(가상머신 또는 물리적인 서버 머신)인 노드가 있다.

쿠버네티스 오브젝트

  • 쿠버네티스는 상태를 관리하기 위한 대상을 오브젝트로 정의한다.
  • 쿠버네티스 오브젝트는 쿠버네티스 시스템에서 영속성을 가지는 객체다.
  • 쿠버네티스는 클러스터의 상태를 나타내기 위해 이 객체를 이용한다.
  • 쿠버네티스 객체는 아래와 같은 특징을 가지고 있다.
    • 어떤 컨테이너화된 애플리케이션이 동작 중인지 또는 어느 노드에서 동작 중인지 확인할 수 있다.
    • 애플리케이션이 이용할 수 있는 리소스를 정의할 수 있다.
    • 애플리케이션이 어떻게 재구동할 것인지, 업데이트할 것인지, 내결함성 (fault tolerance)과 같이 어떻게 동작해야 하는지에 대한 정책을 생성할 수 있다.
  • 기본 오브젝트(Basic object), 컨트롤러(Controller), 오브젝트 스펙 및 메타 정보로 구성된다.

쿠버네티스 기본 오브젝트

  • 쿠버네티스에 의해서 배포 및 관리되는 가장 기본적인 오브젝트는 컨테이너화되어 배포되는 애플리케이션의 워크로드를 기술하는 오브젝트다.
  • 오브젝트는 사용자가 쿠버네티스에 바라는 상태(Desired state)를 의미하고 컨트롤러는 객체가 원래 설정된 상태를 잘 유지할 수 있도록 관리하는 역할을 한다.
  • Pod, Service, Volume, Namespace 4가지 속성이 있다.
  • Pod는 컨테이너화된 애플리케이션, Volume은 디스크, Service는 로드밸런서, Namespace는 패키지 이름을 의미한다.

Pod

  • 쿠버네티스는 하나의 컨테이너를 개별적으로 배포하는 것이 아닌 Pod 단위로 배포한다.
  • 쿠버네티스에서 가장 기본적인 배포 단위로 하나 이상의 컨테이너를 포함하는 단위다.
  • 일반적으로 하나의 Pod에 하나의 컨테이너를 실행한다.
  • Pod 내의 컨테이너들은 IP, Port를 공유한다.
  • Pod가 재시작되면 IP가 변경되며 Pod내의 컨테이너들의 로컬 디스크의 내용이 사라진다.
  • Pod 내에 배포된 컨테이너간에는 디스크 볼륨을 공유할 수 있다.
  • 아래는 Pod의 Object spec 예시이다.
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
    - name: nginx
      image: nginx:1.7.9
      ports:
        - containerPort: 8090

Volume

  • Pod가 기동될 때 기본값으로 컨테이너마다 로컬 디스크를 생성해서 기동되는데, 이렇게 생성된 로컬 디스크의 경우에는 영구적이지 않다.
  • 데이터베이스와 같이 영구적으로 파일을 저장해야 하는 경우에는 컨테이너 재시작과 상관없이 파일을 영속적으로 저장해야 하는데, 이러한 형태의 스토리지 볼륨을 의미한다.
  • Pod와 동일한 Lifecycle을 가진다.
  • Volume(볼륨)은 컨테이너의 외장 디스크와 유사하며 Pod가 기동될 때 컨테이너에 마운트하여 사용할 수 있다.
  • 쿠버네티스는 다양한 외장 디스크를 제공한다. iSCSI나 NFS와 같은 On-Premise 기반의 외장 스토리지 이외에 클라우드 외장 스토리지인 AWS EBS, Google PD 그리고 Github 등의 오픈소스 기반 외장 스토리지 서비스를 지원한다.

Service

  • Label Selector로 Pod를 선택하여 하나의 Endpoint로 노출한다.
  • 프리버전을 사용하게 되면 WorkerNode의 NodePort로 밖에 접근할 방법이 없다.
  • 아래와 같은 종류가 있다.
    • ClusterIP
    • NodePort
    • LoadBalancer
    • ExternalName
  • Pod와 Volume을 이용하여 컨테이너들을 정의한 후에 Pod 서비스로써 제공할 때 일반적으로 하나의 Pod로 서비스하는 경우는 드물고 여러개의 Pod를 서비스하며 이를 로드밸런서를 이용해 하나의 IP와 포트로 묶어서 서비스를 제공한다.
  • 서비스를 정의할 때 어떤 Pod들을 Service로 묶을 것인지를 정의하는데 이를 Label Selector를 통해서 정의한다.
  • 각 Pod를 생성할 때 Object Spec의 metadata 부분에 Pod에서 사용할 라벨(Label)을 정의한다.
  • Service는 Label Selector에서 특정 라벨을 가진 Pod만을 선택하여 Service에 연결한다.
kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: myapp
  ports:

Namespace

  • 네임스페이스는 하나의 쿠버네티스 클러스터내의 논리적인 분리 단위다.
  • Pod, Service 등은 네임스페이스 별로 생성이나 관리가 될 수 있고, 사용자의 권한 역시 이 네임스페이스 별로 나눠서 부여가 가능하다.
  • 네임스페이스로 할 수 있는 것은 사용자별로 네임스페이스별 접근 권한을 다르게 운영이 가능하고 네임스페이스별로 리소스를 쿼타(할당량)을 지정할 수 있고 네임스페이스별로 리소스를 나눠서 관리할 수 있다. (Pod, Service 등)
  • 네임스페이스는 논리적인 분리 단위이지 물리적이나 기타 장치를 통해서 환경을 분리(Isolation)한 것이 아니며 다른 네임스페이스 간의 Pod라도 통신은 가능하다.

쿠버네티스 라벨

쿠버네티스 리소스

  • 라벨은 쿠버네티스의 리소스를 선택하는데 사용된다.
  • 각 리소스는 라벨을 가질 수 있고, 라벨 검색 조건에 따라서 특정 라벨을 가지고 있는 리소스만을 선택할 수 있다.
  • 특정 리소스만 배포하거나 업데이트할 수 있고 또는 라벨로 선택된 리소스만 Service에 연결하거나 특정 라벨로 선택된 리소스에만 네트워크 접근 권한을 부여하는 등의 행위가 가능하다.
  • 라벨은 metadata 섹션에 키/값 쌍으로 정의가 가능하다.
"metadata": {
  "labels": {
    "key1": "value1",
    "key2": "value2"
  }         
}

쿠버네티스 컨트롤러

  • 컨트롤러는 기본 오브젝트들을 생성하고 이를 관리하는 역할을 한다.
  • 컨트롤러는 Replication Controller (aka RC), Replication Set, DaemonSet, Job, StatefulSet, Deployment 등이 존재한다.

Replication Controller

  • Replication Controller는 Pod를 관리해주는 역할을 하는데, 지정된 숫자로 Pod를 기동시키고, 관리하는 역할을 한다.
  • Replication Controller는 크게 3가지 파트로 구성되는 Replica의 수, Pod Selector, Pod Template 총 3가지로 구성된다.

ReplicaSet

  • ReplicaSet은 Replication Controller의 새로운 버전이다.
  • Replication Controller는 Equality 기반 Selector를 이용하는데 반해, Replica Set은 Set 기반의 Selector를 이용한다.

Deployment

  • Deployment는 Replication Controller와 ReplicaSet의 상위 추상화 개념이다.
  • 실제 운영에서는 ReplicaSet이나 Replication Controller를 바로 사용하는 것보다, 더 추상화된 Deployment를 사용한다.

DaemonSet

  • DaemonSet은 Pod가 각각의 노드에서 하나씩만 돌게 하는 형태로 Pod를 관리하는 컨트롤러다.
  • DaemonSet에 의해 관리되는 Pod는 모든 노드에 균등하게 하니씩만 배포할 수 있다.
  • 특정 노드에만 Pod를 배포할 수 있도록, Pod의 "node selector"를 이용해서 라벨을 이용하여 특정 노드만을 선택할 수 있게 지원한다.

Job

  • 워크로드 모델 중에서 배치나 한번 실행되고 끝나는 형태의 워크로드 모델을 지원하는 컨트롤러다.
  • Job에 의해서 관리되는 Pod는 Job이 종료되면 Pod를 같이 종료시킨다.
  • Job을 정의할 때 컨테이너 스펙 부분에 Image 뿐만 아니라 컨테이너에서 Job을 수행하기 위한 커멘드를 같이 입력한다.

StatefulSet

  • 데이터베이스 등과 같이 상태를 가지고 있는 Pod를 지원하기 위해서 StatefulSet이 사용된다.
  • 쿠버네티스의 디스크 볼륨에 대한 이해가 필요하다.