Kubernetes
업데이트:
Kubernetes
쿠버네티스는 컨테이너를 쉽고 빠르게 배포 & 확장하고 관리를 자동화해주는 오픈소스 플랫폼
- 쿠버네티스는,
- 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성이 있고, 확장가능한 오픈소스 플랫폼입니다.
- 선언적 구성과 자동화를 모두 용이하게 해줍니다.
- 크고 빠르게 성장하는 생태계를 가지고 있습니다. 쿠버네티스 서비스, 기술 지원 및 도구는 어디서나 쉽게 이용할 수 있습니다.
몇 가지 수식어로 운영환경에서 사용 가능한(production ready), de facto(사실상 표준), 조타수(helmsman, 그리스에서 유래), 조종사(pilot), 행성 스케일(Planet Scale), 갓(god) 등을 가지고 있습니다.
쿠버네티스^^kubernetes^^가 너무 길어서 오타가 많아서 흔히 케이(에이)츠^^k8s^^ 또는 큐브^^kube^^라고 줄여서 부릅니다.
구글이 1주일에 수십억 개의 컨테이너를 생성하고 내부 배포 시스템으로 사용하던 borg를 기반으로 2014년에 쿠버네티스 프로젝트를 오픈소스화했습니다. 쿠버네티스는 프로덕션 워크로드를 대규모로 운영하는 15년 이상의 구글 경험과 커뮤니티의 최고의 아이디어와 적용 사례가 결합되어 있습니다.
쿠버네티스 특징
전 세계적 스케일의 경험과 기술이 고스란히 녹아들어 있습니다. 거대한 커뮤니티와 생태계가 있어 잘 안 되는 건 찾아보면 되고 이런 거 만들어 볼까 하면 누군가 만들어 놨습니다. 서비스메시(Istio, linkerd), CI(Tekton, Spinnaker), 컨테이너 서버리스(Knative), 머신러닝(kubeflow)이 모두 쿠버네티스 환경에서 돌아갑니다. 클라우드 네이티브 애플리케이션 대부분이 쿠버네티스와 찰떡궁합입니다.
- Cloud Native Landscape
Kubernetes Architecture
쿠버네티스 클러스터는 크게 2가지 종류로 구성됩니다.
클러스터를 관리하는 역할을 하는 마스터(master)와 실제 컨테이너를 실행시키는 작업을 하는 노드(worker)입니다. 구성도는 다음과 같습니다.
Master에는 etcd, kube-apiserver, kube-scheduler, kube-controller-manager, kubelet, kube-proxy, docker등이 실행됩니다. 각 프로세스들이 다른 장비에 별개로 떠도 실제 쿠버네티스 클러스터를 운영하는데 이상은 없지만 마스터 장비 1대에는 위에 있는 프로세스 한 묶음을 같이 실행하는게 일반적인 구성입니다.
마스터는 고가용성을 위해서 3대 정도를 실행해서 운영합니다. 평소에 실제 리더로서 클러스터를 관리하는 마스터는 1대이고 나머지 2대는 대기중입니다.
그러다가 리더 마스터에 장애가 발생하면 자연스럽게 나머지 2대중 1대로 리더역할이 넘어가게 됩니다. 클러스터를 좀 더 안정적으로 운영하려면 마스터를 5대로 운영할 수도 있습니다.
Worker는 쿠버네티스 초기에는 미니언(minion)이라고 불렸었는데, 현재는 노드라고 부릅니다.
쿠버네티스 소스나 데이터 저장구조를 보면 아직까지 미니언이라고 쓰여 있는 부분들이 남아 있습니다. 노드에는 kubelet, kube-proxy, docker등이 실행됩니다. 실제 사용자가 사용하는 컨테이너들은 대부분 노드에서 실행됩니다
Kubernetes Components
쿠버네티스를 배포하면 클러스터가 생성됩니다.
쿠버네티스 클러스터는 컨테이너화된 애플리케이션을 실행하는 노드라고 하는 워커 머신의 집합. 모든 클러스터는 최소 한 개의 워커 노드를 가집니다.
워커 노드는 애플리케이션의 구성요소인 파드를 호스트 생성합니다. 컨트롤 플레인은 워커 노드와 클러스터 내 파드를 관리합니다.
프로덕션 환경에서는 일반적으로 컨트롤 플레인이 여러 컴퓨터에 걸쳐 실행되고, 클러스터는 일반적으로 여러 노드를 실행하므로 내결함성과 고가용성이 제공됩니다.
이 문서는 완전히 작동하는 쿠버네티스 클러스터를 갖기 위해 필요한 다양한 컴포넌트들에 대해 요약하고 정리한 내용입니다.
여기에 모든 컴포넌트가 함께 있는 쿠버네티스 클러스터 다이어그램이 있습니다.
Control Plane Components
컨트롤 플레인 컴포넌트는 클러스터에 관한 전반적인 결정(예를 들어, 스케줄링)을 수행하고 클러스터 이벤트(예를 들어, 디플로이먼트의 replicas 필드에 대한 요구 조건이 충족되지 않을 경우 새로운 파드를 구동시키는 것)를 감지하고 반응합니다.
컨트롤 플레인 컴포넌트는 클러스터 내 어떠한 머신에서든지 동작할 수 있습니다. 그러나 간결성을 위하여, 구성 스크립트는 보통 동일 머신 상에 모든 컨트롤 플레인 컴포넌트를 구동시키고, 사용자 컨테이너는 해당 머신 상에 동작시키지 않습니다.
kube-apiserver
API 서버는 쿠버네티스 API를 노출하는 쿠버네티스 컨트롤 플레인 컴포넌트입니다. API 서버는 쿠버네티스 컨트롤 플레인의 프론트 엔드입니다.
쿠버네티스 API 서버의 주요 구현은 kube-apiserver입니다. kube-apiserver 는 수평으로 확장되도록 디자인되었습니다.
즉, 더 많은 인스턴스를 배포해서 확장할 수 있습니다. 여러 kube-apiserver 인스턴스를 실행하고, 인스턴스간의 트래픽을 균형있게 조절할 수 있다.
etcd
모든 클러스터 데이터를 담는 쿠버네티스 뒷단의 저장소로 사용되는 일관성·고가용성 키-값 저장소 입니다.
쿠버네티스 클러스터에서 etcd를 뒷단의 저장소로 사용한다면, 이 데이터를 백업하는 계획은 필수입니다.
etcd에 대한 자세한 정보는, 공식 문서를 참고한다.
kube-scheduler
노드가 배정되지 않은 새로 생성된 파드를 감지하고, 실행할 노드를 선택하는 컨트롤 플레인 컴포넌트 입니다.
스케줄링 결정을 위해서 고려되는 요소는 리소스에 대한 개별 및 총체적 요구 사항, 하드웨어/소프트웨어/정책적 제약, 어피니티(affinity) 및 안티-어피니티(anti-affinity) 명세, 데이터 지역성, 워크로드-간 간섭, 데드라인을 포함합니다.
kube-controller-manager
컨트롤러를 구동하는 마스터 상의 컴포넌트입니다.
논리적으로, 각 컨트롤러는 개별 프로세스이지만, 복잡성을 낮추기 위해 모두 단일 바이너리로 컴파일되고 단일 프로세스 내에서 실행됩니다. 이들 컨트롤러는 다음을 포함합니다.
- 노드 컨트롤러: 노드가 다운되었을 때 통지와 대응에 관한 역할
- 레플리케이션 컨트롤러: 시스템의 모든 레플리케이션 컨트롤러 오브젝트에 대해 알맞은 수의 파드들을 유지시켜 주는 역할
- 엔드포인트 컨트롤러: 엔드포인트 오브젝트를 채운다(즉, 서비스와 파드를 연결.)
- 서비스 어카운트 & 토큰 컨트롤러: 새로운 네임스페이스에 대한 기본 계정과 API 접근 토큰을 생성
cloud-controller-manager
cloud-controller-manager는 클라우드 제공자 전용 컨트롤러만 실행합니다.
자신의 사내 또는 PC 내부의 학습 환경에서 쿠버네티스를 실행 중인 경우 클러스터에는 클라우드 컨트롤러 매니저가 없습니다.
kube-controller-manager와 마찬가지로 cloud-controller-manager는 논리적으로 독립적인 여러 컨트롤 루프를 단일 프로세스로 실행하는 단일 바이너리로 결합합니다.
수평으로 확장(두 개 이상의 복제 실행)해서 성능을 향상시키거나 장애를 견딜 수 있다.
다음 컨트롤러들은 클라우드 제공 사업자의 의존성을 가질 수 있습니다.
- 노드 컨트롤러: 노드가 응답을 멈춘 후 클라우드 상에서 삭제되었는지 판별하기 위해 클라우드 제공 사업자에게 확인하는 것
- 라우트 컨트롤러: 기본 클라우드 인프라에 경로를 구성하는 것
- 서비스 컨트롤러: 클라우드 제공 사업자 로드밸런서를 생성, 업데이트 그리고 삭제하는 것
Node Components
노드 컴포넌트는 동작 중인 파드를 유지시키고 쿠버네티스 런타임 환경을 제공하며, 모든 노드 상에서 동작합니다.
kubelet
클러스터의 각 노드에서 실행되는 에이전트. Kubelet은 파드에서 컨테이너가 확실하게 동작하도록 관리합니다.
Kubelet은 다양한 메커니즘을 통해 제공된 파드 스펙(PodSpec)의 집합을 받아서 컨테이너가 해당 파드 스펙에 따라 건강하게 동작하는 것을 확실히 합니다.
Kubelet은 쿠버네티스를 통해 생성되지 않는 컨테이너는 관리하지 않습니다.
kube-proxy
kube-proxy는 클러스터의 각 노드에서 실행되는 네트워크 프록시로, 쿠버네티스의 서비스 개념의 구현부입니다.
kube-proxy는 노드의 네트워크 규칙을 유지 관리합니다. 이 네트워크 규칙이 내부 네트워크 세션이나 클러스터 바깥에서 파드로 네트워크 통신을 할 수 있도록 해줍니다.
kube-proxy는 운영 체제에 가용한 패킷 필터링 계층이 있는 경우, 이를 사용한다. 그렇지 않으면, kube-proxy는 트래픽 자체를 포워드(forward)합니다.
애드온
애드온은 쿠버네티스 리소스(데몬셋, 디플로이먼트 등)를 이용하여 클러스터 기능을 구현합니다. 이들은 클러스터 단위의 기능을 제공하기 때문에 애드온에 대한 네임스페이스 리소스는 kube-system 네임스페이스에 속합니다.
선택된 일부 애드온은 아래에 설명하였고, 사용 가능한 전체 확장 애드온 리스트는 애드온을 참조합니다.
DNS
여타 애드온들이 절대적으로 요구되지 않지만, 많은 예시에서 필요로 하기 때문에 모든 쿠버네티스 클러스터는 클러스터 DNS를 갖추어야만 합니다.
클러스터 DNS는 구성환경 내 다른 DNS 서버와 더불어, 쿠버네티스 서비스를 위해 DNS 레코드를 제공해주는 DNS 서버입니다.
쿠버네티스에 의해 구동되는 컨테이너는 DNS 검색에서 이 DNS 서버를 자동으로 포함합니다.
웹 UI (대시보드)
대시보드는 쿠버네티스 클러스터를 위한 범용의 웹 기반 UI입니다. 사용자가 클러스터 자체뿐만 아니라, 클러스터에서 동작하는 애플리케이션에 대한 관리와 문제 해결을 할 수 있도록 해줍니다.
컨테이너 리소스 모니터링
컨테이너 리소스 모니터링은 중앙 데이터베이스 내의 컨테이너들에 대한 포괄적인 시계열 매트릭스를 기록하고 그 데이터를 열람하기 위한 UI를 제공해 줍니다.
클러스터-레벨 로깅
클러스터-레벨 로깅 메커니즘은 검색/열람 인터페이스와 함께 중앙 로그 저장소에 컨테이너 로그를 저장하는 역할을 합니다.
댓글남기기