본문 바로가기

개발 관련/Docker

3장. 컨테이너를 다루는 표준 아키텍처, 쿠버네티스

리눅스 운영 체제의 커널 하나에서 여러 개의 컨테이너가 격리된 상태로 실행되는 인프라 환경을 말한다. 여기서 말하는 컨테이너란 하나 이상의 목적을 위해 독립적으로 작동하는 프로세스다.

 

쿠버네티스를 이용하게 되면서 컨테이너 인프라 환경을 좀 더 효율적으로 관리할 수 있게 되었다. 하지만 실제로 쿠버네티스는 컨테이너 오케스트레이션(orchestration)을 위한 솔루션이다. 오케스트레이션이란 복잡한 단계를 관리하고 요소들의 유기적인 관계를 미리 정의해 손쉽게 사용하도록 서비스를 제공하는 것을 의미하는데, 다수의 컨테이너를 유기적으로 연결, 실행, 종료뿐만 아니라 상태를 추적하고 보존하는 등 컨테이너를 안정적으로 사용할 수 있게 만들어주는 것이 컨테이너 오케스트레이션이다.

 

컨테이너 오케스트레이션을 제공하는 대표적인 솔루션은 쿠버네티스(kubernetes)뿐만 아니라 도커 스웜(docker swarm), 메소스(mesos), 노매드(nomad)가 있다. 각 솔루션의 기능을 정리하면 다음과 같다.

구분 도커 스웜 메소스 노매드 쿠버네티스
설치 난이도 쉬움 매우 어려움 쉬움 어려움
사용 편의성 매우 좋음 좋음 매우 좋음 좋음
세부 설정 지원 거의 없음 있음 거의 없음 다양하게 있음
안정성 매우 안정적 안정적 안정적 매우 안정적
확장성 어려움 매우 잘 됨 어려움 매우 잘 됨
정보량 많음 적음 적음 매우 많음
에코 파트너 없음 거의 없음 있음 매우 많음
학습 곡선 쉬움 매우 어려움 어려움 어려움

 

쿠버네티스 구성 방법은 다음과 같이 크게 3개다.

1. 관리형 쿠버네티스 - 퍼블릭 클라우드 업체에서 제공하는 것으로, 구성이 이미 다 갖춰져 있고, 마스터 노드를 클라우드 업체에서 관리한다. EKS(Amazon Elastic Kubernetes Service), AKS(Azure Kubernetes Services), GKE(Google Kubernetes Engine)이 여기에 속한다.

2. 설치형 쿠버네티스 - 플랫폼에서 제공하는 쿠버네티스로, 유료라 쉽게 접근은 어렵다. Rancher, OpenShift 등이 여기에 속한다.

3. 자동 구성 쿠버네티스 - 사용하는 시스템에 쿠버네티스 클러스터를 구성해주는 솔루션으로, kubeadm, kops, KRIB, kuberspray 등이 여기에 속하며, kubeadm이 가장 널리 알려져있다.


📌 파드 배포를 중심으로 쿠버네티스 구성 요소 살펴보기

설치된 쿠버네티스 구성 요소는 다음의 명령으로 확인해본다.

kubectl get pods --all-namespaces

<마스터 노드>

1. kubectl - 쿠버네티스 클러스테어 명령을 내리는 역할을 한다. 다른 구성 요소들과 다르게 바로 실행되는 명령 형태인 바이너리(binary)로 배포되기 때문에 마스터 노드에 있을 필요는 없다.

2. API 서버 - 쿠버네티스 클러스터의 중심 역할을 하는 통로

3. etcd - 구성 요소들의 상태 값이 모두 저장되는 곳으로, 분산 저장이 가능한 key-value 저장소

4. 컨트롤러 매니저 - 쿠버네티스 클러스터의 오브젝트 상태를 관리

5. 스케줄러 - 노드의 상태와 자원, 레이블, 요구 조건 등을 고려해 파드를 조건에 맞는 워커 노드에 지정

 

<워커 노드>

1. kubelet - 파드의 구성 내용을 받아서 컨테이너 런타임으로 전달

2. 컨테이너 런타임(CRI; Container Runtime Interface) - 파드를 이루는 컨테이너 실행을 담당

3. 파드(Pod) - 한 개 이상의 컨테이너로 단일 목적의 일을 하기 위해 모인 단위로, 파드는 언제라도 죽을 수 잇는 존재다. 웹 서버 역할을 할 수도 있고 로그나 데이터를 분석할 수 있다.

 

<선택 가능한 구성 요소>

1. 네트워크 플러그인 - 쿠버네티스 클러스터의 통신을 위해서 네트워크 플러그인을 선택하고 구성해야 함

2. CoreDNS - 클라우드 네이티브 컴퓨팅 재단에서 보증하는 프로젝트로, 빠르고 유연한 DNS 서버


 ⚙️ 오브젝트란

쿠버네티스를 사용하는 관점에서 파드와 디플로이먼트는 스펙(spec)과 상태(status) 등의 값을 가지고 있다. 이 때 작성하는 파일을 오브젝트 스펙(spec)이라 하며, 일반적으로 야믈(YAML) 문법으로 작성한다.

 

  • 파드(Pod) - 쿠버네티스에서 실행되는 최소 단위
    • 쿠버네티스는 거의 모든 부분이 자동 복구되도록 설계되었는데, 파드의 자동 복구 기술을 셀프 힐링(self-healing)이라 함. 이는 제대로 작동하지 않는 컨테이너를 다시 시작하거나 교체해 파드가 정상적으로 작동하게 함
    • 쿠버네티스는 파드 자체에 문제가 발생하면 파드를 자동 복구해서 파드가 항상 동작하도록 보장하는 기능도 있음
  • 네임스페이스(Namespaces) - 쿠버네티스 클러스터에서 사용되는 리소스들을 구분해 관리하는 그룹
  • 볼륨(Volume) - 파드가 생성될 때 파드에서 사용할 수 있는 디렉터리를 제공함
  • 서비스(Service) - 파드는 클러스터 내에서 유동적이기 떄문에 접속 정보가 고정일 수 없음
    • 쿠버네티스에서는 외부에서 쿠버네티스 클러스터에 접속하는 방법을 서비스(service)라고 함
  • 노드(node) - 쿠버네티스 스케줄러에서 파드를 할당받고 처리하는 역할을 함

외부에서 쿠버네티스 클러스터의 내부에 접속하는 가장 쉬운 방법은 노드포트(nodeport)이다. 노드포트 서비스를 설정하면 모든 워커 노드의 특정 포트(노드포트) 열고 여기로 오는 모든 요청을 노드포트 서비스로 전달한다. 노드포트 서비스는 포트를 중복 사용할 수 없어서 1개의 노드포트에 1개의 디플로이먼트만 적용된다.

그렇다면 여러 개의 디플로이먼트가 있을 때 그 수만큼 노드포트 서비스를 구동해야하기 위해서는 인그레스(Ingress)를 사용한다. 인그레스는 고유한 주소를 제공해 사용 목적에 따라 다른 응답을 제공할 수 있고, 트래픽에 대한 L4/L7 로드밸런서와 보안 인증서를 처리하는 기능을 제공한다.

 


컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 책 3장을 보고 정리한 내용이다.

더 자세한 내용은 다음의 책을 구입하길 바란다.

http://www.yes24.com/Product/Goods/102099414

 

컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 - YES24

실무에 바로 적용할 수 있는 컨테이너 인프라 환경 기술!IT 자원을 효율적으로 빠르게 사용할 수 있는 방법으로 컨테이너 환경이 거론되었으나 그동안 관리가 어렵고 복잡해서 상용되기 어려웠

www.yes24.com