쿠버네티스 오브젝트

쿠버네티스 오브젝트

쿠버네티스 오브젝트는 쿠버네티스를 구성하는 단위로 클러스터 내에서 관리되는 모든 리소스이다. 파드나 서비스 등등을 파드 오브젝트, 서비스 오브젝트와 같이 부르기도 한다. 

이들을 이렇게 부르는 이유는 etcd에 등록된 상태에서는 ㅇㅇ오브젝트 형태로 관리되기 때문

etcd에 등록된 내용을 따라 실제로 생성된 것을 인스턴스instance 라고 한다.

(같은 대상을 오브젝트, 인스턴스, 리소스 등등으로 칭하는 경우가 있어 헷갈리는 듯 하다.)

서비스

서비스는 여러개의 파드를 모은 것. 쉽게 말해서 로드 밸런서 역할을 한다.

각 서비스는 자동으로 고정된 IP를 부여 받으며 이 주소로 들어오는 통신을 처리한다.

파드가 변경되어도 서비스의 IP는 변하지 않기 때문에 클러스터 내/외부와 통신을 유지할 수 있다.

단, 서비스가 분배하는 통신은 하나의 워커 노드 안으로 국한됨. 여러 워커 노드 간의 분배는 실제 로드밸런서가 하는 역할이다.

네임스페이스

리소스들을 논리적으로 구분할 수 있게 해주는 하나의 단위

리소스의 이름은 네임스페이스 내에서 유일해야한다. 네임스페이스 간에서 유일할 필요는 없다.

네임스페이스 기반 스코핑은 네임스페이스 기반 오브젝트에만 적용이 가능하다고 한다.

여기서 네임스페이스 기반 오브젝트란? 특정 네임스페이스 내에서만 유효한 오브젝트를 의미한다.

(파드, 서비스, 디플로이먼트, configmap, secret 등)

 

네임스페이스는 서로 중첩될 수 없다.

동일한 네임스페이스 내에서 리소스를 구별하기 위해서는 레이블이 사용된다.

모든 오브젝트가 네임스페이스에 속하지는 않는다.

 

kube-
접두사로 시작하는 네임스페이스는 쿠버네티스 시스템용으로 예약되어있음

네임스페이스 조회 명령어

kubectl get namespace

초기 네임스페이스에는 4가지가 있는데

-default : 기본 네임스페이스

-kube-system : 쿠버네티스 시스템에서 생성한 오브젝트를 위한 네임스페이스

-kube-public : 모든 사용자가 읽기 권한으로 접근할 수 있음

-kube-node-lease : 각 노드와 연관된 리스 오브젝트를 갖는다. 

 

--namespace 를 사용해 네임스페이스 설정하기

kubectl run nginx --image=nginx --namespace=<insert-namespace-name-here>
kubectl get pods --namespace=<insert-namespace-name-here>

레플리카셋

파드를 얼마나 동작시킬지 관리하는 오브젝트다. 레플리카셋에서 파드의 수를 설정하면 그만큼의 파드가 동작하는 것을 보장한다. 

디플로이먼트

디플로이먼트는 파드의 배포를 관리하는 요소.

디플로이먼트는 적용 이력도 관리하므로 새로운 버전의 릴리스 이후 문제가 발생하면 바로 이전 버전으로 쉽게 롤백이 가능하다.

 

레이블과 셀렉터

레이블은 파드나 서비스 같은 오브젝트에 첨부된 키와 값의 쌍 형태로 메타데이터로 설정한다.

레이블이 부여되면 셀렉터 기능을 사용해 레이블이 부여된 파드만 배포하기 등 특정 파드만 선택해 설정할 수 있다.

"metadata": {
  "labels": {
    "key1" : "value1",
    "key2" : "value2"
  }
}

유효한 레이블 값은 다음과 같다.

  • 63 자 이하여야 하고 (공백일 수도 있음),
  • (공백이 아니라면) 시작과 끝은 알파벳과 숫자([a-z0-9A-Z])이며,
  • 알파벳과 숫자, 대시(-), 밑줄(_), 점(.)을 중간에 포함할 수 있다.

다음과 같은 구성파일이 있을때, 

apiVersion: v1
kind: Pod
metadata:
  name: label-demo
  labels:
    environment: production
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

레이블의 키는 enviromen, app이 있고 해당 값은 각각 production, nginx이다.

 

셀렉터에서 일치성 기준과 적합성 기준이라는 두 종류의 셀렉터를 지원한다.

일치성 기준에는 레이블의 명시된 제약조건을 모두 만족해야하고 =, ==, != 이 세가지 연산자를 사용한다.

environment = production
tier != frontend

에서 enviroment키에서 production값을 가지는 모든 리소스를 선택하고

tier에서 frontend를 가지는 리소스를 제외한 모든 리소스스를 선택한다.

 

적합성 기준 요건은 in, notin과 exist의 3개 연산자를 지원한다.

environment in (production, qa)
tier notin (frontend, backend)
partition
!partition

enviroment에서 값이 production이거나 qa인 리소르를 모두 선택한다.

두번째에선 tier가 frontend와 backend를 가지는 리소스를 모두 제외한다.

세번째는 레이블의 값에 상관없이 키가 partition인 모든 리소스를 선택한다.

 

쉼표는 AND연산자로 작동한다.

쿠버네티스 오브젝트 이름

클러스터의 각 오브젝트는 해당 유형의 리소스에 대하여 고유한 이름을 가지고 있다.

모든 쿠버네티스 오브젝트는 전체 클러스터에 걸쳐 고유한 UID를 가지고 있다.

ex) myapp-1234인 파드는 동일 네임스페이스 내에 하나만 존재할 수 있지만, 같은 이름을 가진 파드와 디플로이먼트는 각각 존재 가능

 

특정 시점에 같은 종류내에서 하나의 이름은 하나의 오브젝트에만 지정될 수 있다.

여기서 오브젝트가 삭제될 경우 같은 이름을 새로운 오브젝트에 지정 가능하다.

하지만 물리적 호스트를 나타내는 노드 같이 물리적인 엔티티를 나타내는 오브젝트는 노드를 삭제 한 후 다시 생성하지 않은채 같은 이름으로 호스트를 다시 생성하면 쿠버네티스는 이전 호스트로 취급한다.

 

이름을 지정할 때는 235자를 넘으면 안되고, 문자(알파벳, 숫자, 대시-)로만 구성될 수 있으며 알파벳으로 시작해야하고 대시로 끝날 수 없다.

 

UID

UID는 오브젝트를 중복 없이 식별하기 위해 쿠버네티스 시스템이 생성하는 문자열이다.

모든 오브젝트는 서로 구분되는 UID를 갖는다.

 

서비스

배포한 파드를 쿠버네티스 클러스터 외부에 공개하기 위한 구조를 제공한다. 

 

 

 

myoskin