Kubernetes 개념 한판 정리
Kubernetes의 정의
- Container화 된 application을 배포/관리해주는 오픈소스 Container Orchestrator Framework
Kubernetes에서 제공하는 기능
- Service Discovery
DNS 이름 또는 자체 IP주소를 사용해서 Client가 사용할 Container를 노출할 수 있음. Traffic을 Load Balancing하고, AutoScaling이 가능하다.
- Storage Orchestration
원하는 저장소 시스템을 탑재할 수 있다.
- 자동화된 binPacking
container화된 작업을 실행하는데 사용할 수 있는 kubernetes cluster 노드를 제공하며, 각 container가 필요로 하는 CPU , RAM을 설정하면 kubernetes가 container를 resource를 가장 잘 사용할 수 있는 node에 배포한다.
- self-healing
실패한 container 재시작, 교체기능을 가지고 있다.
Kubernetes Object 이해하기
object
란 k8s cluster에 대해 의도한 상태를 명세해놓은 하나의 “의도를 담은 레코드”이다.
( https://kubernetes.io/ko/docs/concepts/overview/working-with-objects/kubernetes-objects/ )
object에는 대표적으로 pod
, service
, volume
, namespace
등 이 있다.
object를 관리하는 controller
는 사용자가 바라는 상태와 현재 상태가 일치하도록 object를 생성/삭제한다.
controller에는 대표적으로 ReplicaSet
, Deployment
, DemonSet
, Job
등이 있다.
스쿼드별로 하나의 kubernetes cluster를 공유하기
namespace
는 하나의 k8s cluster를 여러 개의 논리적인 단위로 쪼개서 사용한다.- namespace를 통해 하나의 k8s cluster를 공유하되, 논리적으로 구분할 수 있다.
- 기본적으로 k8s 를 실행하면 몇 개의 namespace가 자동으로 생성됩니다. 이 중
default
namespace는 기본 namespace로 별도로 k8s에 namespace를 지정하지 않으면 항상 이default
namespace에 명령이 적용된다.
Kubernetes Object 기술하기
kubernetes에서는 object를 생성할때, object의 spec을 지정해주어야 한다.
대부분 yaml파일로 kubectl CLI에 제공한다.
1 | apiVersion: apps/v1 |
대표적으로 사용되는 필드값들은 다음의 의미를 나타낸다.
- apiVersion : object를 생성하기 위한 Kubernetes버전
- kind : 생성할 object의 종류
- metadata : object를 유일하게 구분지어 줄 데이터
- spec : object에 의도하는 상태값들
Kubernetes - Pod Object
- kubernetes에서 배포 가능한 가장 작은 컴퓨팅 단위이다.
- 하나 이상의 Container의 그룹이며, 동일한 스토리지 * 네트워크 * 해당 컨테이너 구동방식에 대한 명세를 공유한다.
- 한 pod내에서 container들간의 port가 중복될 수는 없다.
- pod별로 ip가 할당되는데 이는 동적으로 변경되는 내부 IP이다.
- pod를 포함한 kubernetes object에는 key-value 형태의 label을 달 수 있다.
(metadata.labels.type
)
type - production , type - develop과 같이 사용 목적에 따라 원하는 pod를 선택할 수 있다. - pod가 어떤 물리 node에 띄워질지는 직접 선택 또는 node scheduler에 의해 자동 선택될 수 있다.
- 직접 선택하는 경우는
spec.nodeSelector.hostname: 노드명
꼴로 배포할 노드명을 선택할 수 있다. - 자동 선택되는 경우에는 pod에서 요구되는 resource(예:
spec.containers.reqeusts.memory: 2Gi
)를 수용할 수 있는 적합한 물리 node에서 배포된다.
Pod * Service 생성 예시
- pod생성
1
2
3
4
5
6
7
8
9
10
11## Pod yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-2
labels:
lo: dev ## label (lo[key] - dev[value])꼴로 지정할 수 있다.
spec:
containers:
- name: container
image: kubetm/init - service 생성다음과 같이 spec.selector 를 이용하면 특정 label을 가진 pod를 선택할 수 있다.
1
2
3
4
5
6
7
8
9apiVersion: v1
kind: Service
metadata:
name: svc-1
spec:
selector:
lo: dev
ports:
- port: 8080
- 다음과 같이 특정 물리 node에 pod를 띄우도록 설정할 수 있다.
1 | apiVersion: v1 |
- nodeSelector에 특정 노드를 명시하지 않은 경우에는 node Scheduler에 의해 pod에 명시된 resource 필드값을 충족시킬 수 있는 node에 pod가 배포된다.
1 | apiVersion: v1 |