쿠버네티스란 무엇일까?
- 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성이 있고 확장가능한 오픈소스 플랫폼
- 선언적 구성과 자동화를 모두 용이하게 해줌
- k8s라는 표기는 “k”와 “s” 사이에 있는 8글자를 나타내는 약식 표기
- 구글이 2014년에 쿠버네티스 프로젝트를 오픈소스화 했음
쿠버네티스를 왜 사용할까?
초기의 배포 방법
- 초기 조직은 애플리케이션을 물리 서버에서 실행함
- 한 물리 서버에서 여러 애플리케이션의 리소스 한계를 정의할 방법이 없었기에, 리소스 할당 문제 발생
- 물리 서버 유지를 위한 많은 비용 필요
- 이에 대한 해결책으로 가상화가 도입됨
가상화 배포
- 단일 물리 서버의 CPU에서 여러 가상 시스템(VM)을 실행할 수 있게 함
- VM 간에 애플리케이션을 격리하여 정보를 다른 애플리케이션에서 자유롭게 액세스 할 수 없으므로 일정 수준의 보안성 제공
- 쉽게 애플리케이션을 추가하거나 업데이트 가능
- 리소스를 보다 효율적으로 활용, 하드웨어 비용 절감, 더 나은 확장성
- 각 VM은 가상화된 하드웨어 상에서 자체 운영체제를 포함한 모든 구성요소를 실행하는 하나의 완전한 머신
컨테이너 개발
- 컨테이너는 VM과 유사하지만 격리 속성을 완화하여 애플리케이션 간에 OS를 공유하므로 가벼움
- VM과 마찬가지로 컨테이너에는 자체 파일 시스템, CPU 점유율, 메모리, 프로세스 공간 등이 있음
- 기본 인프라와의 종속성을 끊었기 때문에 클라우드나 OS 배포본에 이식 가능
컨테이너의 장점
- 기민한 애플리케이션 생성과 배포
- VM 이미지를 사용하는 것에 비해 컨테이너 이미지 생성이 보다 쉽고 효율적
- 지속적인 개발, 통합 및 배포
- 안정적이고 주기적으로 컨테이너 이미지를 빌드하여 배포 가능
- 이미지의 불변성 덕에 빠르고 효율적으로 롤백 가능
- 개발과 운영의 관심사 분리
- 배포 시점이 아닌 빌드/릴리즈 시점에서 애플리케이션 컨테이너 이미지를 만들기 때문에 애플리케이션이 인프라스트럭처에서 분리됨
- 가시성(observability)
- OS 수준의 정보와 메트릭에 머무르지 않고, 애플리케이션의 헬스와 그 밖의 시그널을 볼 수 있음
- 개발, 테스팅 및 운영 환경에 걸친 일관성
- 클라우드 및 OS 배포판 간 이식성
- Ubuntu, RHEL, CoreOS, 온-프레미스, 주요 퍼블릭 클라우드와 어디서등 구동됨
- 애플리케이션 중심 관리
- 논리적인 리소스를 사용하는 OS 상에서 애플리케이션을 실행하는 수준으로 추상화 수준이 높아짐
- 느슨한 결합, 분산 가능, 유연함, 자유로운 마이크로서비스
- 애플리케이션이 작고 독립적인 단위로 쪼개져 동적으로 배포・관리 가능
- 리소스 격리
- 자원 사용량과 리소스 사용량이 고효율 고집적
쿠버네티스의 필요성
- 프로덕션 환경에서 애플리케이션을 실행하는 컨테이너를 관리하고 가동 중지 시간이 없는지 확인 필요
- ex) 컨테이너가 다운 되면 다른 컨테이너를 다시 시작해야 하는 경우 시스템에 의해 처리한다면 더 쉬울 것
- 쿠버네티스는 분산 시스템을 탄력적으로 실행하기 위한 프레임워크를 제공
- 애플리케이션의 확장과 장애 조치를 처리하고 배포 패턴 등을 제공
쿠버네티스의 기능
- 서비스 디스커버리와 로드 밸런싱
- DNS 이름을 사용하거나 자체 IP 주소를 사용해 컨테이너 노출 가능
- 컨테이너에 대한 트래픽이 많으면 네트워크 트래픽을 로드밸런싱하고 배포하여 안정적 배포 가능
- 스토리지 오케스트레이션
- 로컬 저장소, 공용 클라우드 공급자 등과 같이 원하는 저장소 시스템을 자동 탑재 가능
- 자동화된 롤아웃과 롤백
- 배포된 컨테이너의 원하는 상태 서술 가능
- 현재 상태를 원하는 상태로 설장한 속도에 따라 변경 가능
- ex) 쿠버네티스 자동화를 통해 배포용 새 컨테이너를 만들고, 기존 컨테이너를 제거하고, 모든 리소스를 새 컨테이너에 적용 가능
- 자동화된 bin packing
- 컨테이너화된 작업을 실행하는데 사용할 수 있는 쿠버네티스 클러스터 노드 제공
- 각 컨테이너가 필요로하는 CPU와 메모리를 쿠버네티스에게 지시
- 컨테이너를 노드에 맞춰 리소스를 가장 잘 사용 가능하게 함
- 자동화된 복구(self-healing)
- 실패한 컨테이너를 다시 시작하고, 컨테이너를 교체하며, ‘사용자 정의 상태 점사'에 응답하지 않는 컨테이너를 죽이고, 서비스 준비가 끝날 때까지의 과정을 클라이언트에게 보여주지 않음
- 시크릿과 구성 관리
- 암호, OAuth 토큰 및 SSH 키와 같은 중요한 정보를 저장하고 관리 가능
- 컨테이너 이미지를 재구성하지 않고 스택 구성에 시크릿을 노출하지 않고도 시크릿 및 애플리케이션 구성을 배포 및 업데이트 가능
참고자료: https://kubernetes.io/ko/docs/concepts/overview/what-is-kubernetes/