요약
가상화 컨테이너란?
쿠버네티스 기본 오브젝트?
쿠버네티스 라벨?
Workload Resources
※ 가상화 컨테이너란?
컨테이너는 애플리케이션과 애플리케이션을 구동하는 환경을 격리한 공간을 의미한다.
대부분의 서버 장비들은 컴퓨팅 환경을 소프트웨어로 구현한 가상머신 (VM: Virtual Machine) 을 사용하고 있으며 이 서버들은 다수의 운영체제를 동시에 실행하기 위해 하이퍼바이저가 필요하고, 그 상위 계층에 Guest OS가 각각 설치된 가상머신들을 구동시킨다.
반면에 컨테이너로 구성된 서버는 하이퍼바이저를 사용하지 않고 CPU, RAM, Disk, Network 과 같은 운영체제의 자원을 필요한 만큼 격리하여 컨테이너에 할당한다.
※ 쿠버네티스 기본 오브젝트?
오브젝트는 사용자가 쿠버네티스에 바라는 상태 (desired state) 를 의미하고
컨트롤러는 객체가 원래 설정된 상태를 잘 유지할 수 있게 관리하는 역할을 하는데,
쿠버네티스에 의해서 배포 및 관리되는 가장 기본적인 오브젝트는 컨테이너화되어 배포되는 애플리케이션의 워크로드를 기술하는 오브젝트로 Pod, Service, Volume, Namespace 4가지가 있다.
Pod: 컨테이너화된 애플리케이션
- 쿠버네티스는 Pod 단위로 배포한다. (하나의 컨테이너를 개별으로 배포하는 것이 아닌 )
- 쿠버네티스에서 가장 기본적인 배포 단위로 하나 이상의 컨테이너를 포함하는 단위이다
- 일반적으로 1 Pod 1 Container
- Pod 내의 컨테이너들은 IP, Port 를 공유한다
- Pod가 재시작되면 IP가 변경되며 Pod내의 컨테이너들의 로컬디스크 내용이 사라진다
- Pod 내에 배포된 컨테이너간에는 디스크 볼륨 공유 가능
- Pod Templates
apiVersion: batch/v1
kind: Job
metadata:
name: hello
spec:
template:
# This is the pod template
spec:
containers:
- name: hello
image: busybox
command: ['sh', '-c', 'echo "Hello, Kubernetes!" && sleep 3600']
restartPolicy: OnFailure
# The pod template ends here
출처: kubernetes.io/docs/concepts/workloads/pods/#pod-templates
Volume: 일종의 디스크, 저장소
- (Pod가 기동될 때 디폴트로 컨테이너마다 로컬디스크를 생성해서 기동되지만 이 로컬디스크의 경우 영구적이지 못하다.)
- 데이터베이스와 같이 영구적으로 파일을 저장해야하는 경우에는 컨테이터 재시작과 상관없이 파일을 영속적으로 저장해야 하는데, 이러한 형태의 스토리지를 Volume(볼륨)이라고 한다.
- Volume은 Pod와 라이프사이클이 같다.
- Volume은 컨테이너의 외장디스크와 유사하며 Pod가 기동될때 컨테이너에 마운트하여 사용된다.
- 쿠버네티스는 다양한 외장디스크를 제공한다. (iSCSI, NFS - Onpremiss 기반의 외장 스토리지 / AWS EBS, Google PD - 클라으드 외장 스토리지 / github - 오픈소스 기반 외장스토리지 서비스 지원)
Service: 로드밸런서
- Label Selector로 Pod를 선택하여 하나의 Endpoint로 노출 (Lable Selector: 서비스를 정의할 때 어떤 Pod들을 Service로 묶을 것인지를 정의하는 것)
- 일반적으로 하나의 Pod로 서비스하는 경우는 드물고 여러개의 Pod를 서비스하며 이를 로드밸런서를 이용해 하나의 IP와 Port로 묶어서 서비스를 제공
- 프리버전을 사용하게 되면 WorkerNode의 NodePort로 밖에 접근할 방법이 없다.
- 각 Pod를 생성할 때 Object Spec의 metadata 부분에서 Pod에서 사용할 Label을 정의할 수 있다.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
출처: kubernetes.io/docs/concepts/services-networking/service/#defining-a-service
Namespace: 패키지명
- 하나의 쿠버네티스 클러스터내의 논리적인 분리 단위이다. (물리적인 기타 장치를 통해서 환경을 분리 (Isolation) 한 것이 아님)
- 다른 Namespace 간의 Pod라도 통신은 가능하다.
- Namespace 는 사용자별로 접근 권한을 다르게 운영 가능하고
- Namespace 별 리소스의 할당량 저장 가능하며
- Namespace 별 리소스를 나눠서 관리 가능하다 (Pod, Service 등)
※ 쿠버네티스 라벨
- 쿠버네티스 리소스
- 라벨은 쿠버네트스의 리소스를 선택하는데 사용된다
- 각 리소스는 라벨을 가질 수 있고, 라벨 검색 조건에 따라서 특정 라벨을 가지고 있는 리소스만을 선택 가능하다
- 특정 리소스만 배포/업데이트할 수 있다
- 라벨로 선택된 리소스만 Service에 연결하거나
- 특정 라벨로 선택된 리소스에만 네트워크 접근 권한을 부여하는 등의 행위 가능하다
- Label은 metadata 섹션에 키/값 의 쌍으로 정의가 가능하다
"metadata": {
"labels": {
"key1" : "value1",
"key2" : "value2"
}
}
출처: kubernetes.io/docs/concepts/overview/working-with-objects/labels/
※ Workload Resources
요약
- Replication Controller
- ReplicaSet
- Deployment
- DaemonSet
- Job
- StatefulSet
- ...
1. Replication Controller (이하 RC)
RC는 Pod를 관리해주는 역할로 지정된 숫자로 Pod를 기동 시키고 , 관리하는 역할
RC는 크게 3가지로 구성된다.
: replicas 의 수 / (pod) selector / (pod) template
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 3
selector:
app: nginx
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
2. ReplicaSet
RC의 새버전
RC는 Equlity 기반의 Selector를 이용하는데 반해
ReplicaSet은 Set 기반의 Selector를 이용
참고: kubernetes.io/docs/concepts/workloads/controllers/replicaset/
3. Deployment
Deployment RC와 ReplicaSet의 좀 더 상위 추상화 개념
실제 운영에서는 RC나 ReplicaSet을 바로 사용하는 것 보다 좀 더 추상화된 Deployment 를 사용한다.
참고: kubernetes.io/docs/concepts/workloads/controllers/deployment/
4. DaemonSet (이하 DS)
DS는 Pod가 각각의 노드에서 하나씩만 돌게 하는 형태로 Pod를 관리하는 컨트롤러
DS에 의해 관리되는 Pod는 모든 노드에서 균등하게 하나씩만 배포된다
특정 노트에서만 Pod를 배포할 수 있도록 Pod의 'node selector' 라벨을 이용하여 특정 노드만을 선택할 수 있게 지원
참고: kubernetes.io/docs/concepts/workloads/controllers/daemonset/
5. Job
워크로드 모델중에서 배치 / 한번 실행되고 끝나는 형태의 워크로드 모델을 지원하는 컨트롤러
Job에 의해서 관리되는 Pod는 Job 종료되면 Pod도 같이 종료된다
Job을 정의할 때 컨테이너 스펙 부분에서 image 뿐만 아니라 , Job을 수행하기 위한 command 같이 입력할 수 있다.
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
참고: kubernetes.io/docs/concepts/workloads/controllers/job/
6. StatefulSet
데이터베이스등과 같이 상태를 가지고 있는 Pod를 지원하기 위해서 새롭게 등장했다.
쿠버네티스의 디스크 볼륨에 대한 선행적 이해가 필요하다.
참고: kubernetes.io/docs/concepts/workloads/controllers/statefulset/
Kubernetes Concepts
https://kubernetes.io/docs/concepts/
Concepts
Production-Grade Container Orchestration
kubernetes.io
와 한글이다
kubernetes.io/ko/docs/concepts/overview/what-is-kubernetes/
쿠버네티스란 무엇인가?
쿠버네티스는 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식할 수 있고, 확장 가능한 오픈소스 플랫폼으로, 선언적 구성과 자동화를 모두 지원한다. 쿠버네티스는 크고 빠르게 성장하
kubernetes.io
'database > DevOps를 위한 Kubernetes 시작' 카테고리의 다른 글
{쿠버네티스 모니터링} 프로메테우스 기반 모니터링 (0) | 2020.12.01 |
---|---|
{쿠버네티스 배포} 롤링 업데이트, Deployment, ConfigMap (0) | 2020.11.30 |
{쿠버네티스 운영} 쿠버네티스 서비스 (0) | 2020.11.26 |
{쿠버네티스와 클러스터 아키텍쳐} 컴포넌트와 애드온 (0) | 2020.11.25 |
댓글