Go, Vantage point
가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.
Github | https://github.com/overnew/
Blog | https://everenew.tistory.com/
티스토리 뷰
쿠버네티스란?
쿠버네티스(Kubernetes)는 쿠버네티스는 컨테이너의 배포, 관리, 확장, 네트워킹을 자동화하는 컨테이너 오케스트레이션 플랫폼이다.
MSA 발전과 함께 성장한 쿠버네티스
과거에 서버 관리를 코드로 하는 툴들이 먼저 등장했다. 여기에 서버 자원들을 논리적인 나누어 효율적으로 사용하는 가상화 기술들이 도입되기 시작한다.
이러한 가상화 자원들은 여전히 많이 사용되지만, 가상화가 가진 한계(오버헤드)로 프로비저닝과 서비스 속도가 떨어진다.
그래서 등장한 것이 컨테이너로, 컨테이너들은 각각이 커널을 가지지 않기 때문에 가볍고 프로비저닝과 서비스 속도에서 우수하다.
하지만 점점 증가하는 컨테이너 개수를 모두 관리하는 것은 쉽지 않은 일이다.
예를 들어 트래픽 부하로 새로운 도커 컨테이너를 실행시켜도, 로드밸런서의 설정을 변경해주지 않으면 새로운 컨테이널로 트래픽이 분산되지 않는다. 또한 각각의 컨테이너의 부하도를 모니터링하는 것도 어려운 일이다. 따라서 컨테이너에 의해 MSA가 발전하면서 자연스럽게 수많은 컨테이너의 오케스트레이션 서비스가 필요하게 되었다.
여기서 모든 경쟁자를 물리치고 표준으로 자리잡은 컨테이너 오케스트레이션 툴이 쿠버네티스이다.
쿠버네티스 아키텍처
쿠버네티스는 마스터(Control Plane)와 워커 노드(Node)로 구분된다.
마스터(Control Plane) 노드
마스터 노드가 모든 컨테이너를 관리 감독하므로, 다양한 서비스 컨테이너가 동작하게 된다.
따라서 마스터 노드는 워커 노드에 비해 비교적 큰 자원을 할당해 주어야 정상적인 실행이 가능하다.
Kube-apiserver
모든 요청을 중계하는 API 서버(컨테이너)
쿠버네티스는 모든 서비스가 REST API 형태로 구성되어 있어서, 해당 API를 검증 후에 다른 곳으로 전달한다.
중간다리의 역할로 부하가 심하다면 API 서버도 스케일링이 된다.
하지만 쿠버네티스의 API server는 단순한 상태 응답을 하도록 설계되었기 때문에, 상태를 파악하고 특정 컴포넌트에 지시를 내리는 것보다는 과부하가 낮다.
이러한 API들의 주요 상태 질의 대상은 모든 클러스터 상태 및 데이터를 저장하는 etcd이다.
etcd
모든 클러스터 상태 및 데이터를 key-value형태로 저장한다.
이 상태 정보로 각 워커 노드들이 container를 실행하고 중지하기 때문에 매우 중요한 데이터이다.
따라서 3개의 분산 시스템으로 고가용성을 보장한다.
또한, 이 데이터를 백업하는 것도 추천된다.
kube-controller-manager
control loop를 돌면서, etcd에 명시된 desired state와 current state를 비교하여 클러스터가 desired state가 되도록 할당을 요청한다.
kube-Scheduler
노드의 리소스와 상태를 계속 파악하여, 실행할 노드를 선택해주는 컴포넌트.
즉 컨테이너가 어떤 노드에 배치될지를 정하게 된다.
워커 노드
Kubelet
클러스터의 각 노드에서 실행되는 에이전트, Kubelet은 파드에서 컨테이너가 동작하도록 관리하면 자신의 상태를 마스터와 주고받는다.
노드에서 마스터의 API server와 통신하는 주체가 된다.
kube-proxy
클러스터의 각 노드에서 실행되는 네트워크 프록시로, 노드의 네트워크 규칙을 유지 관리한다.
(이를 통해 노드 또한 외부 접속이 가능할 수 있다.)
쿠버네티스 전체 Flow
Flow를 정리하면 Client는 외부에 유일하게 노출된 API 서버에게 Pod 생성 요청을 보낸다.
받은 요청은 etcd에 desired state에 명시되고, Controller manager가 해당 요청을 확인하여 새 Pod 할당을 요청한다.
이 할당 요청을 Scheduler가 확인하면 노드에 Pod가 할당되고, 이 상태가 해당노드가 유지해야 할 desired state가 된다.
노드의 kubelet은 desired state를 확인하고 자신의 상태를 이와 맞추기 위해 pod를 생성하게 된다.
이처럼 쿠버네티스는 모든 하드웨어 자원을 마스터 노드가 관리해내야 하기 때문에, 기존 OS위에 설치하는 것이 상당히 까다롭다.
따라서 최근에는 클라우드 서비스사가 관리해 주는 쿠버네티스 환경을 많이 사용한다.
이러한 설치방법을 kOps라고 한다.
kOps
KOPS는 Kubernetes Operation의 약자로, 쿠버네티스 클러스터를 쉽게 배포, 관리, 업그레이드할 수 있는 오픈소스 도구이다.
KOPS는 클라우드 플랫폼(AWS, GCP, Azure 등)에서 쉽게 k8s를 설치할 수 있도록 도와준다. KOPS는 자동화된 프로비저닝 시스템으로, 완전 자동화된 설치가 가능하기 때문에 다른 설치 방식보다는 간편하다.
대표적인 예가 EKS와 GKE이다.
이외의 설치 방법은 직접 설치를 진행하는 kubeadm 방식
[Vagrant] Kubeadm로 쿠버네티스 직접 설치하기
이보는 간단한 kubespray 방식이 있다.
'개발 > Kubernetes' 카테고리의 다른 글
Kubernetes Pod 활용하기 (Pause container, label, volume) (0) | 2024.03.03 |
---|---|
Kubernetes Kubectl 기본 명령어 정리 (0) | 2024.03.03 |
Kubernetes Namespaces VS Linux Namespaces (Pause 컨테이너) (0) | 2024.03.03 |
KubeSpary로 Kubernetes 설치하기 (0) | 2024.03.03 |
[Vagrant] Kubeadm로 쿠버네티스 직접 설치하기 (0) | 2024.03.02 |