본문 바로가기

컴퓨터/클라우드

[GCP Associate Cloud Engineer] 컨테이너

IaaS & VM

IaaS는 하드웨어를 가상화한 VM을 통해 컴퓨팅 자원을 공유한다.

각 개발자는 자신만의 운영체제(OS)를 배포하고 하드웨어에 접근하여 독립적인 환경에서 애플리케이션을 빌드하여 RAM, 파일 시스템, 네트워킹 인터페이스 등을 활용 가능하다.

컨테이너

IaaSPaaS의 장점을 결합한 방식으로, 독립적인 작업 확장성과 OS 및 하드웨어 추상화 계층을 제공한다.

다만 VM 단위로 실행되기 때문에 크기가 클 수 있으며, 게스트 OS부팅 시간이 걸린다.

그리고 애플리케이션 수요 증가 시 전체 VM 복사 및 OS 부팅이 필요하여 확장성이 느리고 비용이 많이 든다.

 

컨테이너는 코드와 의존성에 대한 보이지 않는 박스로 파일 시스템 및 하드웨어의 일부 파티션에 제한적으로 접근할 수 있다. 

컨테니어는 몇 가지 시스템 호출만으로 생성 가능하기 때문에 프로세스처럼 빠르게 시작할 수 있다.

이때 필요한 것은 컨테이너를 지원 OS 커널과 컨테이너 런타임이다.

 

컨테이너의 장점

 - 유연성과 확장성: IaaS의 유연성과 PaaS의 확장성을 결합하여 컨테이너를 사용하면 코드 이식성이 극대화되어 OS와 하드웨어를 블랙박스처럼 취급 가능하다.

 

 - 환경 독립성개발 스테이징 프로덕션, 혹은 로컬 환경 클라우드로 변경해도 코드나 빌드 수정 불필요하다.

 

 - 빠른 확장웹 서버를 컨테이너로 구성하면 몇 초 만에 수십~수백 개 인스턴스를 단일 호스트에서 실행 가능하다.

 

 - 모듈화마이크로서비스 방식으로 각 컨테이너가 특정 기능을 담당하도록 설계 가능하다. 네트워크 연결로 컨테이너 간 연결을 유지하며, 모듈 단위로 쉽게 배포 및 독립적으로 확장한다.

Kubernetes

Kubernetes는 오픈 소스 플랫폼으로, 컨테이너화된 워크로드와 서비스를 관리하는 도구이다.

여러 컨테이너를 오케스트레이션하여 확장 및 배포를 간편화하고, 롤아웃(업데이트 배포) 및 롤백(업데이트 취소)을 쉽게 수행할 수 있다.

API를 통해 컨테이너를 클러스터라는 노드 집합에 배포된다.

 

Kubernetes의 주요 구성 요소

 

클러스터

 - 컨트롤 플레인: Kubernetes의 중앙 관리 시스템이다.

 - 노드: 컨테이너를 실행하는 컴퓨팅 인스턴스로 Google Cloud에서 노드인 Compute Engine VM과는 다르다. 즉, Kubernetes에서 말하는 노드가 컨테이너를 실행하는 논리적·물리적 단위라면, Google Cloud 환경에서는 그 노드를 실제로 제공해주는 것이 Compute Engine VM이 된다.

 

파드

Kubernetes에서 컨테이너를 배포할 수 있는 가장 작은 단위로 클러스터에서 실행 중인 프로세스를 애플리케이션의 구성 요소 또는 전체 앱으로 나타낸다.

일반적으로 포드당 컨테이너는 하나만 있지만, 하드 종속성이 있는 여러 컨테이너가 있는 경우 단일 포드로 패키징하고 네트워킹 및 스토리지 리소스를 공유한다. 이때 포드는 컨테이너에 대한 고유한 네트워크 IP와 포트 집합을 제공한다.

 

배포(Deployment)

동일한 파드의 복제본 그룹을 나타내며, 노드 장애 시에도 파드를 유지한다.

kubectl run 명령어로 포드에서 컨테이너 사용

kubectl get pods 명령어로 실행 중인 파드 확인

 

서비스(Service)

kubectl expose로 파드의 동적 IP 변경과 무관하게 파드에 대한 고정 IP 주소로 서비스를 생성한다.

외부 로드 밸런서를 연결하여 클러스터 외부에서 접근 가능한데 GKE에서는 네트워크 로드 밸런서로 생성이 가능하다.

배포가 파드를 생성하고 파괴함에 따라 파드에 고유한 IP 주소가 할당되지만 해당 주소는 시간이 지나도 안정적으로 유지되지 않는다. 따라서 서비스 그룹은 포드 집합이고, 포드에 대한 안정적인 엔드포인트 또는 고정 IP 주소를 제공한다.

 

스케일링(Scaling)

kubectl scale 명령어로 디플로이먼트를 확장한다.

확장을 하는 이유는 예를들어 CPU 사용량이 특정 한도에 도달하면 추가적인 자원이 필요하기 때문에 스케일링을 한다.

 

선언적 구성(Declarative Configuration)

명령 대신 쿠버네티스에 원하는 상태를 알려주는 구성 파일을 제공하여 클러스터의 원하는 상태를 정의한다.

kubectl apply 명령어로 구성 파일을 적용하여 Kubernetes가 상태를 조정한다.

 

롤링 업데이트(Rolling Update)

앱의 새 버전을 업데이트하려고 할 때 컨테이너를 업데이트하여 새 코드를 사용자에게 제공하고 싶지만 모든 변경 사항을 한 번에 롤아웃하는 것은 위험하다.

따라서 kubectl rollout 명령어 또는 구성 파일 변경한 다음 kubectl apply를 통해 새로운 버전의 파드를 점진적으로 배포한다.

Google Kubernetes Engine (GKE)

GKEGoogle Cloud에서 제공하는 관리형 Kubernetes 서비스로, 클라우드에서 Kubernetes 클러스터를 손쉽게 생성하고 관리할 수 있게 한다.

GKE 환경은 Compute Engine 인스턴스로 구성된 클러스터로 이루어져 있다.

 

KubernetesGKE의 차이점 - 제어 평면(Control Plane)

Kubernetes: 사용자가 제어 평면의 설정 및 관리를 직접 수행해야 한다.

GKE: GKE가 제어 평면의 인프라를 프로비저닝 및 관리하며, 사용자는 Kubernetes API를 통해 클러스터와 상호작용한다.

 

노드 관리

Autopilot 모드: GKE가 노드 구성, 자동 확장, 자동 업그레이드, 기본 보안 설정 및 네트워킹 구성을 모두 관리한다.

Standard 모드: 사용자가 노드 구성, 클러스터 관리 및 최적화를 직접 수행한다.

 

Autopilot 모드의 장점

 

운영 효율성: 생산 환경에 최적화된 설정 제공한다.

보안 강화: 기본 보안 및 네트워킹 구성을 자동으로 관리하고 강력한 보안 상태를 유지하도록 설계되어있다.

운영 간소화노드 설정, 확장, 업그레이드 등 인프라 관리 부담 감소된다.

 

GKE 클러스터 생성 및 관리

클러스터 생성 방법

gcloud container clusters create k1

클러스터는 사용자의 요구에 맞게 머신 유형, 노드 수, 네트워크 설정 등을 사용자 요구에 맞게 조정 가능하다.

 

GKE의 고급 클러스터 관리 기능

Google Cloud 로드 밸런싱Compute Engine 인스턴스를 위한 로드 밸런싱 제공

노드 풀(Node Pools): 클러스터 내 특정 노드 그룹을 지정해 유연성 제공

자동 확장클러스터의 노드 인스턴스 수를 자동으로 조정

자동 업그레이드클러스터 노드 소프트웨어를 자동으로 최신 상태로 유지

노드 자동 복구노드의 상태와 가용성을 유지

로그 및 모니터링Google Cloud Observability를 통해 클러스터의 가시성과 상태 확인

 

요약

서비스  세부사항  카테고리
Compute Engine 고성능 및 전 세계적으로 확장 가능한 범용 VM IaaS
Google Kubernetes Engine Kubernetes에서 컨테이너화된 마이크로서비스를 오케스트레이션고급 클러스터 구성 및 모니터링 필요 CaaS
App Engine 친숙하고 개방된 언어와 도구를 사용해 완전 관리형 플랫폼에서고도로 확장 가능한 애플리케이션을 빌드 PaaS (CaaS, Serverless)
Cloud Functions 간단하고 단일 목적의 함수로 이벤트 기반 애플리케이션을 빌드 FaaS, Serverless
Cloud Run 고도로 확장 가능한 컨테이너화된 애플리케이션을 개발 및 배포하여 클러스터가 필요하지 않음 CaaS (Serverless)