k8s 오브젝트들

우리가 클러스터에 2개의 서버와 1개의 디비가 동작하길 바란다고 해보자. k8s에서는 원하는 상태(2개의 서버, 1개 디비)를 주면 k8s 가 원하는상태로 현재 상태를 변경 시킨다.

그렇다면 원하는 상태를 나타낼 방법이 필요하다. 그 상태들의 집합을 k8s 오브젝트들이라고 한다.

k8s 오브젝트

오브젝트는 의도의 집합이라고 정의 된다. - 원하는 상태(의도의 집합)를 기술한다. - k8s 는 현재 상태와 원하는 상태가 다르면 늘 원하는 상태로 만든다.

어플리케이션

어플리케이션의 상태는 크게 3가지로 표현 할 수 있다.

  • 어떻게 구성 되어 있는가?
    • 어떤 컨테이너를을 어떤 노드에 뛰울것인가
  • 어떤 리소스가 필요한가?
  • 정책들은 어떻게 되는가?
    • 재시작, 장해 복구, 업데이트시 정책정의

k8s 오브젝트 정의 vs 오브젝트 상태

  • 오브젝트 정의는 원하는 상태(의도의 집합)을 의미한다.
  • 오브젝트 상태는 현재 시스템의 상태를 의미한다.

예를 들어 정의는 서버 2대인대 현재 1대만 떠있는 상태라면 k8s는 1대를 더 뛰운다.

Deployment

  • k8s 의 오브젝트는 여러 종류가 있고 그 중 한 개의 어플리케이션에 대한 정의를 Deployment 라고 한다.
  • k8s 에서는 yaml 로 오브젝트를 표현한다.
    • 한 개의 어플리케이션을 부하 분산을 위해 여러 개를 뛰울 수 있다.
      • 여러 개 뛰울수 있기 때문에 앱의 구성을 template 밑에 정의한다.
      • 한 개의 어플리케이션은 여러 개의 컨테이너로 구성될 수 있다.

위의 설명만 정의한 버전

kind: Deployment
spec:
    replicas: 1
    template:
        spec:
            containers:
            - name: server1
              image: server:0.0.1
            - name: server2
              image: server:0.0.1
            - name: DB
              image: server:0.0.1

실제 정의 버전

  • k8s 의 어떤 api 버전을 사용할지도 필요하다.
  • 해당 앱 전체(Deployment)를 나타내는 이름이 필요하다.
  • 각 복제를 나타낼 이름도 필요하다.
apiVersion: apps/v1
kind: Deployment
metadata:
    name: server-deployment
spec:
    replicas: 1
    template:
        metadata:
            labels:
                app: server-replcas
        spec:
            containers:
            - name: server1
              image: server:0.0.1
            - name: server2
              image: server:0.0.1
            - name: DB
              image: server:0.0.1