Docker, Kubernetes...

Hayoung Kim·2020년 6월 25일
0

Kubernetes

목록 보기
1/1
post-thumbnail

Docker란?
컨테이너 기반의 오픈소스 가상화 플랫폼이다.
프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해준다.
백엔드 프로그램, 데이터베이스 서버, 메시지 큐 등 어떤 프로그램도 컨테이너로 추상화할 수 있고, 조립PC, AWS, Azure, Google Cloud등 어디에서든 실행 가능하다.

컨테이너는 격리된 공간에서 프로세스가 동작하는 기술로 가상화 기술의 하나지만 기존 OS를 가상화하는 방식과는 차이가 존재함.
 OS 가상화 : 호스트 자체를 가상화하기 때문에 비교적 사용법이 간단하지만 무겁고 느려서 운영환경에서는 사용하기 어려움
 CPU의 가상화, 반가상화 : 게스트 OS를 수정하여 게스트 OS가 가상화되고 있음을 인식하도록 하여 하이퍼바이저가 필요할 때 자동 호출(하이퍼콜) 되도록 하는 것, 반가상화는 하이퍼바이저가 호출되어야 하는 횟수를 최소화함으로 성능을 대폭 향상시킬 수 있지만, 게스트 OS가 수정되어야 하기 때문에 OS 소스코드에 접근 가능해야하고 도입이 어려움.
 프로세스 격리 : 운영체제에서 프로세스를 격리시키는 방법. 리눅스에서는 이 방식을 리눅스 컨테이너라고 하고 가볍고 빠르게 동작한다. CPU나 메모리는 딱 프로세스가 필요한 만큼만 추가로 사용하고 성능적으로도 거의 손실이 없다.
컨테이너의 특징
1. 실행중인 컨테이너에 접속하여 명령어를 입력할 수 있고, apt-get이나 yum으로 패키지를 설치할 수 있으며 사용자도 추가하고 여러 개의 프로세스를 백그라운드로 실행할 수도 있다. CPU나 메모리 사용량을 제한할 수 있고 호스트의 특정 포트와 연결하거나 호스트의 특정 디렉토리를 내부 디렉토리인 것처럼 사용할 수도 있다.
2. 이미지는 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 것으로 상태값이 변하지 않는다. 즉, 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장된다. 따라서 같은 이미지에서 여러 개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 삭제되더라도 이미지는 변하지 않고 그대로 남아있게 된다.
이미지파일의 크기는 클 수 밖에 없는데 기존 이미지에 파일 하나 추가했다고 다시 수백메가를 다운받는 일은 비효율적이다. 도커는 이런 문제를 해결하기 위해 레이어라는 개념을 사용하고 유니온 파일시스템을 이용하여 여러 개의 레이어를 하나의 파일시스템으로 사용할 수 있게 해준다.
컨테이너를 생성할 때도 레이어 방식을 사용하는데 기존의 이미지 레이어 위에 읽기/쓰기 레이어를 추가한다. 이미지 레이어를 그대로 사용하면서 컨테이너가 실행중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러 개의 컨테이너를 생성해도 최소한의 용량만 사용하게 된다.
Kubernetes란?
여러 개의 호스트를 하나로 묶어 관리하기 위한 오케스트레이션 툴.
Pod : 쿠버네티스의 최소 배포 단위로 1개 이상의 컨테이너, 네트워크, 스토리지 등이 포함된다.
여러 호스트를 하나로 묶어 관리하기 때문에 분산 환경에서 여러 대의 컴퓨팅 자원을 한 대의 컴퓨터처럼 운영할 수 있다.

주요기능
1. 여러 서버에 동작하는 Pod관리
2. Pod 간 네트워크 관리
3. Pod의 부하분산
4. Pod의 모니터링
5. 무중단 배포 및 업데이트(Rolling Update)

쿠버네티스 클러스터는 크게 클러스터의 모든 상태를 저장/관리하는 Master와 실제 Pod를 운영하는 Node로 구성된다.

Kubernetes Master.
1. API Server
쿠버네티스에서 가장 중요한 컴포넌트.
쿠버네티스 내부의 모든 동작은 HTTP/HTTPS REST API를 통해 호출된다.
각각의 쿠버네티스 컴포넌트가 서로 직접 연결 형태가 안니 API Server를 경유하여 통신하고 컴포넌트들은 API Server를 보고 있다가 자신과 관련된 부분의 변경사항이 있으면 변경사항을 업데이트 하게 된다.
2. Controller Manager
ReplicaSet, Deployment등의 Controller는 Pod의 복제/배포를 변경하는 명령을 수행하고 Pod의 상태를 관리한다.
Controller Manager는 이 Controller들을 데몬형태로 포함하고 있다.
 Desired State : Pod는 Deployment, ReplicaSet에서 사용자가 설정한 Pod 수를 유지하는 것
Controller Manager에서 현재 상태를 감시하다가 Desired State와 다르면 설정한 수를 유지하기 위한 작업을 실행하여 사용자가 지정한 Pod의 수를 유지한다.
3. Scheduler
어떤 Pod를 어떤 Node에서 실행할 지 결정.
각 Node의 자원 사용 현황, 노드당 클러스터 분배 비율을 기반으로 컨테이너를 배치한다.
Node에 배치된 Pod는 각 Node의 Kubelet 컴포넌트에 의해 컨테이너로 생성된다.
4. Etcd
분산 key/value 저장소
클러스터 설정 및 현재 상태(클러스터의 각 노드, 노드에서 동작중인 Pod 등의 모든 상태)를 저장.
Service Discovery에서 사용하는 SkyDNS의 데이터를 저장한다.
Kubernetes Node
1. Kubelet
Node 마다 한 개씩 있는 Node Agent
주기적으로 API Server에 Node 상태를 Check & Report Access하면서 Pod를 실행/중지하고 desired state를 유지한다.
2. cAdvisor
동작중인 컨테이너의 리소스 사용량과 퍼포먼스를 모니터링하고 모니터링한 결과는 Kubelet에 의해 Master의 API Server로 전달된다.
3. Kube-Proxy
네트워크 프록시 + 로드밸런서의 역할이다.
외부의 요청을 분한된 Pod로 전달하고 컨테이너간의 통신을 위해서 iptables rules를 변경한다.
4. Pod
쿠버네티스의 가장 작은 배포 단위로 컨테이너가 가장 작은 배포 단위가 아니라 Pod가 가장 작은 단위로 취급된다.
1개의 Pod 내부에는 1개 이상의 컨테이너가 존재한다.
1개의 Pod는 여러 개의 물리서버에 나눠지는 것이 아니고 1개의 물리서버(Node)위에 올라간다.
Pod 내부의 컨테이너들은 네트워크와 볼륨을 공유하기 때문에 localhost로 통신이 가능하다.

0개의 댓글