Cloud
[Kubernetes] 쿠버네티스 알아보기
날라루
2023. 9. 8. 11:26
기본개념
- 컨테이너: 우리가 구동하려는 애플리케이션을 실행할 수 있는 환경까지 감싸서, 어디서든 쉽게 실행할 수 있도록 해 주는 기술
- 컨테이너 런타임: 컨테이너를 사용할 때 필요한 도구. 컨테이너를 쉽게 내려받거나 공유하고 구동할 수 있도록 해주는 도구. ex) Docker
- 쿠버네티스: 컨테이너 런타임을 통해 컨테이너를 다루는 도구. 여러 서버(노드)에 컨테이너 분산 배치, 문제가 생긴 컨테이너 교체, 컨테이너가 사용할 비밀번호나 환경 설정(컨테이너의 구동 환경) 관리 및 주입 등 컨테이너 오케스트레이션.
컨테이너 중심의 배포
1) Traditional Deployment
: 물리적인 컴퓨터 한 대에 하나의 OS를 깔고 여러 가지 프로그램을 설치하는 방식
- 어떤 프로그램 동작이 다른 프로그램의 동작에 간섭하거나, 특정 프로그램이 리소스를 독점할 경우 다른 프로그램의 성능이 떨어짐
- 물리 서버를 여러 개 구축하여 높은 비용
2) Virtualized Deployment
: 가상머신(Virtual Machine)을 기반으로 배포
- 하이퍼바이저: 하나의 시스템 상에서 가상 컴퓨터를 여러 개 구동할 수 있도록 해 주는 중간 계층
- App: 실행하고자하는 프로그램
- Bin/Library: 프로그램을 실행하는데 필요한 환경과 관련된 파일
- CPU, 메모리, 저장 장치 등을 가상머신에 개별적으로 할당 -> 서로 다른 프로그램을 격리하여 각각의 가상머신에서 실행
- 서버와 같이 다중화와 분산 처리가 중요한 시스템에서 시스템 자원 상황에 따라 가상머신 수를 유연하게 처리
- 전통적 배포 방식보다는 효율적이지만, 가상머신은 완전한 컴퓨터이고 가상머신에 일일이 운영체제를 설치해야 하기 때문에 컨테이너 중심의 배포보다는 무거운 편
3) Container Deployment
: 컴퓨터의 형태와 관련없이 설치된 하나의 OS가 프로그램별로 자원을 할당하고 관리
- OS 커널을 공유하는 가상화
- 프로그램이 독립적으로 구동될 수 있도록 OS가 CPU, 메모리등의 자원을 관리하여 각각의 프로그램이 서로에게 간섭할 수 없음
- 쉽고 효율적인 컨테이너 이미지 생성으로 애자일한 애플리케이션 생성 및 배포
- 로컬 개발 환경과 클라우드가 동일하게 구동되어 개발, 테스팅 및 운영 환경에 일관성을 가짐
- 특정 프로그램의 문제가 OS 문제를 유발할 경우 시스템 중단 가능성
쿠버네티스의 필요성
: 분산 시스템의 탄력적 실행을 목적으로 애플리케이션의 확장과 장애 조치를 처리하고, 배포 패턴 등을 제공
: 독립적이고 조합 가능한 제어 프로세스들로 구성되어 desired state를 달성하도록 함
- 서비스 디스커버리와 로드 밸런싱 : 컨테이너에 대한 트래픽이 많을 때, 네트워크 트래픽을 로드 밸런싱하고 배포함으로써 안정적인 배포
- 스토리지 오케스트레이션 : 원하는 저장소 시스템을 자동으로 탑재
- 롤아웃, 롤백 자동화 : 설정한 속도에 따라 배포된 컨테이너를 원하는 상태로 변경
- Automatic bin packing : 컨테이너가 필요로 하는 효율적인 리소스 사용을 지시
- self-healing : 실패한 컨테이너 재구동, 교체 및 응답하지 않는 컨테이너 kill
- Secret and configuration management : 암호, OAuth 토큰 및 SSH 키 등을 저장하고 관리
쿠버네티스 구성방법
- 미니쿠브(Minikube)
- 용도 : 간단한 학습 및 개발 환경 구성
- 장점 : 설치가 쉽고 인텔리제이와 같은 개발 도구와의 연계가 편리함
- 단점 : 단일 노드만 지원하며 도커, 버추얼박스와 같은 추가적인 가상화 도구 필요
- k3s
- 랜처랩스(Rancher Labs)에서 개발한 경량의 쿠버네티스 배포판
- CNCF(Cloud Native Computing Foundation)의 샌드박스(초기 단계) 프로젝트
- k3s 실행 파일을 통해 서버와 에이전트만 구동하면 쿠버네티스의 각 구성 요소가 간편하게 설치되면서 쿠버네티스 클러스터를 쉽게 구성
- 특히 내장 구성 요소 중 쿠버네티스의 각종 환경 정보를 저장하는 ETCD는 경량의 내장 데이터베이스인 SQLite로 대체되어 매우 가볍게 동작
- 사물인터넷(IoT) 용도 혹은 라즈베리파이 같은 학습용 초소형 컴퓨터에도 사용
- 용도 : 쿠버네티스와 완전히 호환되는 가벼운 배포판
- 장점 : 설치가 쉽고 시스템 리소스를 적게 사용하면서 높은 쿠버네티스 호환성을 보장함
- 단점 : 구조가 매우 단순하므로 높은 성능과 안정성을 요구하는 시스템에는 부적합할 수 있음
- 랜처(Rancher)
- 쿠버네티스 클러스터뿐 아니라 운영에 필요한 모니터링, 보안 관련 기능을 쉽게 설치할 수 있다
- 추가적인 기능이 필요할 때 랜처가 제공하는 마켓 플레이스에서 쿠버네티스 관련 도구를 설치하고 구성
- 랜처의 관리 도구를 사용해서 새로운 쿠버네티스 클러스터를 쉽게 생성하고 여러 클러스터를 한곳에서 관리
- 용도 : 대규모 및 기업용 환경에서도 활용 가능한 다목적 쿠버네티스 관리 플랫폼
- 장점 : 기본적으로 포함되어 있는 기능이 많고 추가 도구 설치도 쉬움. 멀티 클라우드 관리 가능함
- 단점 : 다른 도구에 비해 무거우므로 시스템 환경에 따라 적절한 고려가 필요함
- kubeadm
- 기본적인 상태의 쿠버네티스를 시스템상에 구성해 주는 도구
- 사용자가 기본적인 쿠버네티스 클러스터 구성 이외에 운영에 필요한 서비스, 스토리지, 모니터링 등의 세부 구성 요소를 직접 설정
- 매니지드 쿠버네티스 서비스
- AWS, GCP, Azure과 같은 퍼블릭 클라우드를 통해 쿠버네티스 클러스터를 생성하고 관리
쿠버네티스 컴포턴트
1) 컨트롤 플레인 (Cotrol Plane)
: 쿠버네티스 기능 제어를 전체적으로 담당
- kube-apiserver
- 쿠버네티스 컨트롤 플레인의 프론트 엔드
- 쿠버네티스 클러스터로 들어오는 요청을 가장 앞에서 접수하는 역할
- 전달된 요청의 처리 흐름에 따라 적절한 컴포넌트로 요청을 전달하는 역할
- etcd
- 클러스터 및 리소스의 구성 정보, 상태 정보 및 명세 정보 등을 key-value 형태로 저장하는 저장소
- 안정적인 동작을 위해 자료를 분산해서 저장하는 구조를 채택
- kube-scheduler
- 쿠버네티스 클러스트의 기본 작업 단위인 파드가 새로 생성되었을 때 어떤 노드로 배치할지 결정
- 스케줄링을 위해 노드 및 파드의 각종 요구사항과 제약사항을 종합적으로 판단
- kube-controller-manager
- 다운된 노드가 없는지, 파드가 의도한 복제(Replicas) 숫자를 유지하고 있는지, 서비스와 파드는 적절하게 연결되어 있는지, 네임스페이스에 대한 기본 계정과 토큰이 생성되어 있는지를 확인하고 적절하지 않다면 적절한 수준을 유지하기 위해 조치하는 역할
2) 노드 컴포넌트 (Node Component)
: 컨트롤 플레인 컴포넌트의 요청을 받아 각 노드에서 동작을 담당
- kubelet
- 노드에서 컨테이너가 동작하도록 관리해 주는 핵심 요소
- 각 노드에서 파드를 생성하고 정상적으로 동작하는지 관리하는 역할
- 실제로 쿠버네티스의 워크로드를 관리하기 위해 내려지는 명령을 수행
- kubectl 명령어로 YAML을 적용할 때, 이 YAML이 kube-apiserver로 전송된 후 kubelet으로 전달. kubelet은 이 YAML을 통해 전달된 파드를 생성 혹은 변경하고, 이후 이 YAML에 명시된 컨테이너가 정상적으로 실행되고 있는지 확인
- container runtime
- 파드에 포함된 컨테이너 실행을 실질적으로 담당하는 애플리케이션
- 컨테이너 런타임 인터페이스(CRI)를 준수하여 쿠버네티스와 함께 사용할 수 있는 외부 애플리케이션
- ex) 컨테이너디(containerd), 크라이오(CRI-O)
- kube-proxy
- 쿠버네티스 클러스터 내부에서 네트워크 요청을 전달하는 역할
- 파드 IP가 매번 바뀌는데서 오는 어려움을 해결하기 위해 오브젝트를 통해 고정적으로 파드에 접근할 수 있도록 하는 방법을 제공합니다. 그리고 서비스로 들어온 요청이 파드에 실제로 접근할 수 있는 방법을 관리
- 파드의 IP는 매번 변하지만 kube-proxy가 이 파드에 접근할 수 있는 방법을 그때마다 관리하고 갱신하며, 서비스 오브젝트는 이 정보를 사용하여 파드가 외부에서 접근할 수 있는 경로를 제
참고 Kubernetes the hard way
- 클러스터를 구성하기 위해 필요한 모든 구성 요소를 단계별로 직접 설정하는 가이드
- 쿠버네티스의 전체적인 구성 및 세부 설정에 대한 이해를 위한 학습
- https://github.com/kelseyhightower/kubernetes-the-hard-way
출처
- 컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 (조훈, 심근우, 문성주 저)
- kubernetes docs (https://kubernetes.io/docs/concepts/overview/)