CS
[오픈소스] - 컨테이너 오케스트레이션과 Kubernetes
maeng-kim
2024. 10. 29. 17:22
1. 기존 컨테이너의 한계
- 배포의 문제점
- 모든 서버에 직접 접속해서 docker stop, run 실행
- 도커 컨테이너 실행에 필요한 리소스 관리 필요 (모니터링 시스템, 유휴 자원 관리 등)
- 새롭게 배포된 애플리케이션 장애 시 신속하게 대처하기 어려움
- 서비스 접근 및 노출의 문제점
- 서비스 장애, 부하 모니터링의 문제점 (장애 발생해도 정확한 위치 파악 어려움)
2. 컨테이너 오케스트레이션
- 정의 : 복잡한
- 컨테이너 환경을 효과적으로 관리하기 위한 도구
- 기능
- 클러스터 : 중앙제어, 네트워킹, 노드 스케일
- 상태관리
- 스케줄링 : 배포관리
- 롤아웃, 롤백 : 배포 버전 관리
- 서비스 등록 및 조회
- 볼륨 스토리지
3. 쿠버네티스
- 개요
- 컨테이너 오케스트레이션의 업계 표준
- 배포 계획에 맞춰 신속한 애플리케이션 배포 가능
: 컨테이너 개수, cpu사용률, 메모리 사용량 설정 가능 / 저장공간, 네트워크 접근 제어, 로드밸런싱 기능 설정 가능 - 가동중인 애플리케이션을 스케일 아웃/인 할 수 있음
: 요청이 많을 때는 컨테이너 수를 증가시켜 처리 능력 높임 / 요청이 적을 때는 컨테이너 수를 줄여 자원 점유율 및 요금 줄임 - 새로운 버전의 애플리케이션 무정지 업그레이드 가능
- 하드웨어 가동률을 높여 자원 낭비를 줄임
- Scale-out vs Scale-up
- 수평적 확장 vs 수직적 확장
- 스케일 아웃 : 수평적 확장 -> 기존 서버와 같은 사양의 서버 대수를 추가하는 것
- 스케일 인 : 수직적 확장 -> 더 이상 사용하지 않는 서버를 치우는 것
- 쿠버네티스의 발음과 로고
- 쿠버네티스(K8s) : 그리스어로 조타수, 캡틴을 의미함
- 쿠버네티스의 특징
- 다양한 환경에서 쿠버네티스 사용 가능
- 퍼블릭, 프라이빗, 멀티, 하이브리드 클라우드, 온프레미스 위에 구축 가능
- 쿠버네티스는 일관된 인터페이스를 제공하여 인프라의 복잡성을 감춰줌 (온프레미스와 클라우드 환경에서 동일한 인터페이스로 조작 및 운영 가능) - 높은 유연성과 확장성
- 마이크로서비스 애플리케이션에 최적화된 실행 환경
- 느슨한 결합에 의한 유연성, 교체 용이성
- 다양한 스펙의 서버가 혼재하는 클러스터 구성 가능
- 서버의 정지, 추가, 제거가 용이
- 저장소나 로드밸런서의 동적 프로비저닝
- 퍼블릭 클라우드 API와 연동 가능 - 고가용성과 성능관리
- 서버 정지 시 애플리케이션 재배포 자동화
- 애플리케이션의 이상 종료 시 자동 재기동
- 필요한 인스턴스의 개수 유지
- 높은 부하에서 자동 스케일
- 다양한 환경에서 쿠버네티스 사용 가능
- 쿠버네티스의 오브젝트
- 컨테이너
- 컨테이너만을 독자적으로 실행하는 것은 불가능 -> 반드시 파드 내에서 실행해야 함
- 컨테이너 기동 시 설정 가능한 항목들 : 이미지의 이름, 실행 명령어, 실행 인자, 환경 변수, 볼륨, cpu사용시간, 메모리 크기의 요청값 및 상한값 - 파드
- 컨테이너를 실행하는 최소 단위
- 한 개 혹은 여러 개의 컨테이너를 담을 수 있음
- 하나의 파드에 속하는 모든 컨테이너들은 같은 노드에서 동작더보기파트의 특징
1. 컨테이너 재사용 촉진을 위한 플랫폼
2. 파드는 일시적인 존재
3. 파드는 컨테이너의 실행 상태 관리
4. 파드는 초기화 전용 컨테이너를 실행 - 서비스
- 파드와 클라이언트를 연결하는 역할을 수행
- 대표 IP 주소로의 요청 트래픽을 지정된 파드들에 부하분산하며 전송하는 역할도 수행 (로드밸런서) - 컨트롤러
-파드의 실행을 제어하는 오브젝트
- 여러 종류의 컨트롤러가 있어 각 컨트롤러의 기능을 이해하고 목적에 맞게 적절히 구별해서 사용
- 컨테이너
4.매니페스트
- kubectl 커멘드
- kubectl 커맨드의 기본 구조
- (1) 커맨드로 동작을 지정
- (2) 리소스 타입과 이름으로 대상이 되는 오브젝트를 지정
- (3) 옵션을 지정
- kubectl 커맨드의 기본 구조
kubectl <(1) 커맨드> <(2) 리소스 타입> [이름] [(3) 옵션]
- 매니페스트란
- 쿠버네티스의 오브젝트를 생성하기 위한 메타 정보를 YAML or JSON으로 기술한 파일
- 예시 (YAML형식)
apiVersion: v1
kind: Pod
metadata: //파드의 이름을 정하는 name은 필수 항목, 네임스페이스 내에서 유일한 이름이어야 함
name: nginx
sepc:
containers: //컨테이너 사양을 배열로 기술
-name: nginx
image: nginx:latest
- 매니페스트 적용 방법
- 관련 kubectl 서브 커맨드들
- create: 동일한 이름 오브젝트가 있을 때 에러 반환
- apply: 동일한 이름 오브젝트가 있을 때 매니페스트 내용 적용
- delete: 오브젝트 삭제
- -f 뒤에 기재하는 파일명에 url도 사용 가능
- 관련 kubectl 서브 커맨드들
kubectl apply -f 매니페스트_파일명
kubectl delete -f YAML
5. 디플로이먼트
- 개요
- 파드의 개수를 관리
- 레플리카셋과 함께 동작
- 매니페스트 작성법
- deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deploy
spec:
replicas: 3 # 생성하고 유지할 파드의 개수
selector:
matchLabels: # 컨트롤러와 파드를 대응시키는 라벨
app: web #<- 파드에 해당 라벨이 있어야 한다
template: # 파드 템플릿
metadata:
labels:
app: web # 파드의 라벨, 컨트롤러의 matchLabels와 일치해야 함
spec:
containers: # 컨테이너 사양
- name: nginx
image: nginx:latest
- 스케일 기능
: 레플리카의 값을 변경하여 파드의 개수를 조절하여 처리 능력을 높이거나 낮추는 기능
: 이미 배포된 디플로이먼트의 레플리카 값을 변경하여 처리 능력 향상
: 매니페스트의 레플리카 값을 변경하여 적용
: kunectl scale 명령을 사용해 파드 개수 늘리기