학습 목표 : kubernetes namespace사용하기위해 Kubernetes Object를 알아보고 namespace를 생성해본다.
Kubernetes Object 란?
- Kubernetes는 Object(Resource)와 Object를 관리하는 Controller로 나뉜다.
- Object는 Kubernetes 시스템에서 영속성을 갖는다.
- Object를 생성하면 Kubernetes 시스템은 개발자/운영자가 원하는 상태를 보장하기위해 지속적으로 동작한다.
- Object는 cluster 상태를 나타내기위해 사용한다.
- Controller는 status와 spec이 일치하도록 Object를 관리한다.
- status : Kubernetes 시스템과 component에 의해 제공되고 업데이트된 Object의 현재상태를 설명한다.
- spec : Object 특성으로 추구하는 상태
- status 와 spec이 일치하게 관리한다는 것은, Object가 추구하는 상태를 Controller가 유지할수 있게 관리하는것을 의미합니다.
Kubernetes의 기본 Object
- Pod
- Kubernetes에서 가장 기본적인 배포단위
- container를 포함하는 단위
- Kubernetes의 특징중 하나로 container를 개별적으로 배포하는것이 아닌 Pod 단위로 배포한다.
- Pod는 하나 이상의 container를 포함한다.
- Volume
- container는 기본적으로 상태가 없는 app container를 사용한다.
- 상태가 없다는것은 container혹은 node에 문제가 있어 container를 새로 실행했을 때 다른 node에 자유롭게 옮길 수 있다는 뜻이다.
- 하지만 container가 실행되지 않거나 삭제된다면 현재까지 저장한 데이터는 사라진다는 단점이 있다.
- app의 특성에 따라 container에 문제가 발생해도 데이터를 보존해야하는 경우 Volume을 사용한다.
- Volume은 container가 재시작 하더라도 데이터를 유지한다.
- Service
- Pod 집합에서 실행중인 애플리케이션을 네트워크 서비스로 노출하는 추상화 방법
- Service는 Pod에게 고유한 IP 주소와 Pod 집합에 대한 단일 DNS를 부여하여 Pod가 cluster 안 어디에있든 고정주소를 통해 접근할 수 있다.
- Namespace
- Namespace는 Kubernetes cluster 하나를 여러개의 논리적인 단위로 나누어 사용한다.
- Pod와 Service등 namespace별로 생성하고 관리될 수 있다.
Kubernetes Object 기술 방법 - YAML
# Kubernetes Object YAML 파일 예
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: myweb
spec:
containers:
- name: myweb-container
image: nginx:latest
ports:
- containerPort: 80
- apiVersion
- Object를 생성하기 위한 Kubernetes API 버전 명시
- kind
- 어떤 종류의 Object를 생성하고자 하는지 명시
- metadata
- Object 이름 부여
- Object를 유일하게 구분지어줄 데이터
- name : 동일 namesapce상 유일한 값
- labels : 특정 kubernetes Object만 나열하거나 검색할 때 유용하게 쓰이는 key-value 쌍
- spec
- 생성할 Object의 구체적인 내용을 정의한다
- spec의 format은 Kubernetes Object 종류에따라 다르다. 다음은 자주쓰이는 spec 항목이다.
- containers : Pod에는 1개이상의 container를 포함하며, containers에 원하는 만큼 container를 정의할 수 있다.
- image : pull 받아올 docker image의 주소
- replicas : 원하는 Pod개수
- selector : controller가 어떤 Pod를 감시하는지 명시
- template : 새로운 Pod를 생성할 때 사용할 template. selector값이 template의 labels와 일치해야 관리되는 Pod를 제대로 선택할 수 있다.
namespace 란?
- namespace는 Kubernetes cluster 내의 논리적인 분리단위다.
- namespace 단위로는 자원할당, 사용자 접근 권한관리 등을 수행할 수 있다.
- 별도로 namespace를 지정하지 않으면 항상 default namespace에 Object를 생성한다.
- namespace는 논리적인 분리단위를 의미하고 물리적인 분리를 의미하지는 않는다.
- 하나의 cluster를 논리적으로 개발/통합/운영으로 namespace를 분리한다.
- dev namespace(개발) : 개발 용도로 사용
- std namespace(통합) : 통합 목적으로 사용
- prd namespace(운영) : 운영 목적으로 사용
참고