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