서버 관리의 어려움
Container Orchestration 소개
Kubernetes 소개
Kubernetes 아키텍처
관리해야하는 서버의 수가 늘어날 경우, 어느 서버 혹은 서비스가 어떤 문제를 파악하기 어렵고, 문제들의 가짓수가 늘어나는 등의 어려움이 있음
해결방안 1: 문서화
현재 서비스의 상황과 설정 방법, 문제 해결 방법을 문서화
상황에 따라 의미가 없는 경우가 많고, 지속적으로 업데이트하기 번거로우며 다수의 서버를 문서를 확인하고 일일히 관리하는 것은 거의 불가능하다는 단점 존재
해결방안 2: 코드로 관리
DevOps 엔지니어가 반드시 알아야하는 IaaS 기술
대화형 명령보다는 자동화된 스크립트로 다수의 서버에 명령
Chef, Puppet, Ansible, Terraform 등 다양한 툴 존재
Learning Curve가 높으며, 소프트웨어 충돌 문제 해결에 큰 도움이 되지 않는다는 단점 존재
해결방안 3: Virtual Machine 도입
하나의 물리적 서버에 다수의 VM을 올리고, 서비스별로 하나씩 할당
VM은 리소스를 많이 소비하고 느리며, 특정 VM 벤더 혹은 클라우드에 종속된다는 단점 존재
해결방안 4: Docker 도입
모든 소프트웨어를 Docker Image로 만들면, 어디서든 동작함
기본적으로 리눅스 환경에 최적화됨
Image를 사용해 버전을 관리하고 배포하며, 문제 발생 시 롤백 용이
VM에 비해 리소스 낭비도 적고, 실행 시간도 빠름
오픈소스이기 때문에 특정 클라우드 벤더에 독립적
사용 언어, 환경에 따른 관리 방법에 차이가 없음
개발, 빌드, 등록, 실행 절차가 일관되게 진행(Dev, Test, Production)
모든 서비스를 Docker Image로 만드는 트렌드이기 때문에, 다량의 Container를 효율적으로 관리할 도구가 필요
다수의 Container 동시 관리
놀고 있는 서버, 바쁜 서버 파악
운영되는 서비스 파악
모니터링
Container 수의 탄력적 조절
다량의 Container를 효율적으로 관리하는 기법을 Container Orchestration이라고 부름
한 클러스터 내에 DB, 웹서비스, 백엔드 등 다양한 서비스들이 공존
자원을 요청하면, 마스터가 자원을 할당
기능
소프트웨어 배포
서비스 Image를 Container로 배포
이상 감지 시 이전의 안정된 버전으로 롤백
스케일링
네트워크
서비스가 다수의 Container로 나눠지며 이들을 대표하는 Load Balancer를 만들어줘야 함
서비스들 간 서로를 쉽게 찾을 수 있어야 함
인사이트
노드 / Container에서 문제 발생 시 해결
플러그인을 통한 로그, 분석 등의 기능 제공
Mesos, Marathon, Docker Swarm 등 다양한 툴들이 있지만 대부분 Kubernetes(K8S) 사용
컨테이너 기반 서비스 배포 / 스케일 / 관리를 자동화해주는 오픈소스 프레임워크
주로 Docker Container를 대상으로 하지만, 모든 컨테이너 사용 가능
클라우드, 온프레미스 환경에서 모두 잘 동작
가장 많이 사용되는 Container Orchestration 시스템
사용 회사와 커뮤니티가 많고 활발
Kubernetes에 기능을 추가한 툴들이 등장
모든 글로벌 클라우드가 EKS, AKS, GKE 등의 서비스로 제공
확장성이 좋아서 ML, CI / CD, Service Mesh, Serverless 등 다양한 환경에서 활용됨
다수의 서버에 컨테이너 기반 프로그램(Docker Container)을 실행하고 관리
마스터 - 노드
각 노드는 물리 혹은 가상 서버
클러스터는 1 + 노드의 집합
마스터는 클러스터를 관리하는 역할
Kubernetes 프로세스
마스터 내에서 여러 프로세스가 수행
API Server
Container로 동작
클러스터의 진입점
웹 UI, CLI, API 등
Scheduler
Controller Manager
etcd
Controller runtime
Kubectl: 커맨드라인 툴
kubectl run image_name
: Pod 내의 Image 생성 및 실행
kubectl cluster-info
: 클러스터 세부 정보 조회
kubectl get node
: 특정 노드 조회
Pod
Kubernetes는 컨테이너를 바로 다루지 않음
Pod: Kubernetes 사용자가 사용하는 가장 작은 빌딩 블록
보통 1Pod = 1Container로 구성
하나보다 많은 경우, 보통 helper container를 같이 사용
같은 Pod 내에서는 디스크와 네트워크 공유
Fail-over를 위해 replica를 지정하고, 다양한 방법으로 복제본 유지
Docker를 사용한 Production 환경에서 유의할 점
Production 시에는 named volume을 사용
Docker Container는 read-only로 사용
내용 수정이 필요할 경우 실행 중인 Container를 수정하지 않고, Image를 새로 빌드
용량 문제와 장애에 대응하기 위해 다수의 Container를 다수의 호스트에서 실행
개인 생산성 향상을 위한 Docker
개발시 필요한 모듈을 Docker Image로 받아와서 Container로 실행
여러 개의 소프트웨어를 연동해서 개발시 docker-compose를 활용
일관된 방식으로, 충돌 없이 소프트웨어 설치 가능