Kubernetes 시작하기: 초보자를 위한 소개
쿠버네티스는 컨테이너화된 개발 과정을 자동화하는 데 있어 가장 널리 사용되는 오픈소스 소프트웨어입니다.
클라우드 네이티브 컴퓨팅 재단(CNCF)의 연례 조사에 따르면, 조직의 96%가 이미 쿠버네티스를 사용 중이거나 도입을 고려하고 있다고 합니다. 전 세계적으로 580만 명의 개발자가 쿠버네티스를 활용하고 있으며, 이는 전체 백엔드 개발자 수의 약 31%에 해당합니다.
쿠버네티스가 선호되는 이유는 뛰어난 확장성, 고가용성, 그리고 빠른 배포 시간 때문입니다. 많은 개발자들이 도커(CLI를 통해 컨테이너와 상호작용하는 포괄적인 도구)를 사용하면서 컨테이너 여정을 시작하지만, 쿠버네티스는 애플리케이션과 인프라를 도식화하여 협업을 가능하게 하는 높은 수준의 추상화를 제공합니다.
만약 쿠버네티스를 처음 접하신다면, 이 글이 여러분에게 소개와 함께 시작에 필요한 정보를 제공할 수 있도록 특별히 준비되었습니다. 쿠버네티스가 개발자로서 여러분의 디지털 제품을 어떻게 강화할 수 있는지 알아보십시오.
쿠버네티스란 무엇이며 왜 필요할까요?
쿠버네티스는 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하는 데 사용되는 오픈소스 오케스트레이션 엔진(프레임워크)입니다. 여기에는 예측 가능성과 가용성 처리가 포함됩니다.
간단히 말해, 컨테이너화된 애플리케이션을 생각해 봅시다. 애플리케이션 사용자에게 서비스를 제공하려면 여러 개의 컨테이너가 실행되어야 합니다. 이러한 컨테이너를 관리해야 할 때 어려움이 발생합니다. 컨테이너들이 반드시 같은 시스템에 있을 필요도 없기 때문에 상황은 더욱 복잡해집니다. 그렇다면 이 문제에 대한 해결책은 무엇일까요?
쿠버네티스는 이러한 모든 프로세스를 원활하게 처리할 수 있는 효율적인 방법을 제공합니다. 쿠버네티스를 도커와 같은 컨테이너 엔진에 비유할 수 있지만, 쿠버네티스는 컨테이너 오케스트레이터입니다. 이제 막 시작하는 개발자라면 쿠버네티스가 어떻게 오케스트레이션을 수행하는지 걱정할 필요가 없습니다. 여러분이 직접 애플리케이션을 위한 쿠버네티스 클러스터를 설정할 필요는 없을 것입니다. 이에 대해서는 곧 더 자세히 알아보겠습니다.
대신, 인프라 팀이 설정한 클러스터와 상호작용하게 될 것입니다. 상호작용하게 될 객체에 익숙해지는 것이 중요합니다. 하지만 그전에, 내부적으로 무슨 일이 일어나는지 파악하기 위해 아키텍처에 대한 기본적인 이해가 필요합니다.
쿠버네티스의 특징
쿠버네티스는 컨테이너 및 관련 인프라를 실행하기 위한 다양한 기능을 제공합니다. 주요 특징은 다음과 같습니다.
- 자동화된 롤아웃, 확장 및 롤백 - 쿠버네티스는 지정된 수의 복제본을 생성하고, 최적의 하드웨어에 배포하며, 노드에 장애가 발생하면 컨테이너를 재배치하는 과정을 자동화합니다. 또한 수요나 CPU 사용량과 같은 변화하는 요구사항에 따라 즉시 복제본을 확장할 수 있습니다.
- 서비스 검색, 로드 밸런싱 및 네트워크 진입 - 쿠버네티스는 내부 서비스 검색 및 공용 컨테이너 노출을 포함한 자체 네트워킹 솔루션을 제공합니다.
- 스테이트풀 또는 스테이트리스 애플리케이션 - 초기에는 쿠버네티스가 주로 스테이트리스 컨테이너에 초점을 맞추었지만, 기술이 발전함에 따라 스테이트풀 애플리케이션을 나타내는 내장 객체도 지원합니다. 쿠버네티스에서는 승인된 모든 애플리케이션을 실행할 수 있습니다.
- 스토리지 관리 - 쿠버네티스는 로컬 파일 시스템, 네트워크 공유 또는 클라우드에 관계없이 컨테이너에서 실행되는 애플리케이션에 (추상화된) 영구 스토리지를 제공합니다. 추상화를 통해 기본 인프라에 상관없이 스토리지 요구 사항을 정의할 수 있습니다. 이 글에서는 자세히 다루지 않겠지만, 영구 볼륨(PV), 영구 볼륨 클레임(PVC), 스토리지 클래스 및 볼륨 플러그인과 같은 개념을 통해 작동합니다.
- 선언적 상태 - 쿠버네티스는 객체 매니페스트라고 불리는 YAML 파일을 사용하여 클러스터에 대해 원하는 상태를 지정합니다. 매니페스트는 원하는 애플리케이션 인스턴스 및 네트워킹 규칙을 포함하여 클러스터의 모습을 정의합니다. 매니페스트를 적용하면 쿠버네티스가 모든 상태 전환을 자동으로 처리하며, 이를 위해 별도의 스크립트를 작성할 필요가 없습니다.
- 다양한 작업 환경 - 클라우드 또는 개발자 워크스테이션 등 어디에서든 쿠버네티스를 사용할 수 있습니다. 특정 사용 사례에 맞춰 다양한 배포판을 사용할 수 있습니다. Amazon Web Services, Google Cloud, Microsoft Azure와 같은 주요 클라우드 기술 제공업체에서 관리형 쿠버네티스 서비스를 제공하며, Minikube 및 K3s와 같은 단일 노드 배포판을 로컬에서 사용할 수도 있습니다.
- 뛰어난 확장성 - 쿠버네티스는 다양한 기능들을 제공하며, 필요에 따라 확장하여 기능을 강화할 수도 있습니다. 사용자 정의 객체 유형, 연산자 및 컨트롤러를 구축하여 워크플로우를 간소화할 수 있습니다.
쿠버네티스 아키텍처
쿠버네티스 아키텍처의 핵심은 단일 마스터 노드와 여러 작업자 노드로 구성됩니다. 마스터 노드는 클러스터 전체를 관리하고, 작업자 노드는 마스터 노드의 지시에 따라 애플리케이션을 실행합니다.

출처: kubernetes.io
아래에서 각 구성 요소에 대해 더 자세히 살펴보겠습니다.
마스터 노드
마스터 노드는 클러스터의 상태를 지시하고, 각 노드의 작업을 결정합니다. 마스터 노드를 설정하려면 다음과 같은 여러 프로세스가 필요합니다.
- API 서버: 모든 클러스터 통신은 API 서버를 기반으로 합니다. 이는 모든 클러스터 구성 요소가 정보를 교환할 수 있도록 하는 관문 역할을 하며, 쿠버네티스 API를 제공합니다. API 서버는 두 가지 주요 역할을 합니다. 첫째, 사용자가 클러스터와 상호작용할 수 있는 진입점입니다. 예를 들어, Kubectl을 사용할 때 요청을 보내는 곳입니다. 둘째, 요청을 인증하고 검증하는 역할을 합니다. 이를 통해 특정 사용자만 요청을 실행할 수 있도록 합니다.
- 스케줄러: 스케줄러는 애플리케이션 또는 쿠버네티스 워크로드 객체를 작업자 노드에 할당합니다. 스케줄러는 리소스 요구사항에 따라 노드에 포드를 배치합니다. 여기서 포드는 쿠버네티스의 가장 작은 배포 단위입니다.
- 컨트롤러 관리자: 컨트롤러 관리자는 노드 장애와 같은 클러스터 상태를 모니터링하고, 올바른 수의 포드를 유지하는 역할을 합니다. 예를 들어, 포드가 예기치 않게 종료되면 컨트롤러 관리자는 스케줄러에 새 포드를 할당할 노드를 지정하고, Kubelet이 새 포드를 실행하도록 요청합니다.
- etcd: etcd는 클러스터의 핵심 데이터 저장소 역할을 하며, 클러스터 구성에 대한 키-값 쌍을 저장합니다. 모든 클러스터 변경 사항이 이곳에 기록됩니다. etcd는 애플리케이션 데이터가 아닌 클러스터 상태 데이터만 저장한다는 점에 유의해야 합니다. 이 데이터 저장소는 클러스터 상태 정보를 유지하고 클러스터에 대한 인식을 제공하는 데 사용됩니다.
작업자 노드
모든 작업자 노드에는 쿠버네티스가 노드와 상호 작용하고, 노드 내에서 포드를 개별적으로 실행할 수 있도록 하는 3가지 프로세스가 설치되어 있습니다. 필요한 프로세스는 다음과 같습니다.
- Kubelet: Kubelet은 컨테이너 실행 레이어를 실행하는 쿠버네티스의 기본 서비스입니다. 이 구성 요소가 없다면, 쿠버네티스는 단순히 키-값 저장소에 의해 인증된 REST API일 뿐입니다. 기본적으로 쿠버네티스는 컨테이너 애플리케이션을 실행하며, 컨테이너는 서로 격리되고 기본 호스트 시스템과 격리됩니다. 이는 물리적 또는 가상 인프라에서 개별 애플리케이션 관리를 분리하는 분석에서 증명되었습니다. Kubelet은 API에서 승인된 포드를 거부하거나 추가 제약 조건을 추가할 수 있지만, 스케줄러나 데몬셋이 아닌 특정 노드에서 실행되는 포드의 최종 승인자입니다. 요약하자면, Kubelet은 노드 및 컨테이너와 상호 작용하고, 구성 파일을 가져와 컨테이너 런타임을 사용하여 포드를 작동시킵니다.
- 컨테이너 런타임: 컨테이너 런타임은 실제로 컨테이너를 실행하는 역할을 합니다. 예를 들어, 도커, rkt 또는 containerd를 사용할 수 있습니다.
- Kube-Proxy: Kube-Proxy는 로드 밸런싱과 같은 일반적인 정책에 따라 노드 포드 그룹에 대한 추상화 레이어를 제공합니다. 모든 노드는 Kube-Proxy를 사용하여 동적 포드에 액세스하는 클라이언트에게 가상 IP 주소를 제공합니다. 이 구조는 낮은 성능 오버헤드를 유지하면서 로드 밸런싱을 위한 솔루션을 제공합니다.
컨테이너화 작동 방식
컨테이너화는 소프트웨어 애플리케이션의 필요한 모든 부분을 단일 단위로 가상화하는 것을 포함합니다. 컨테이너 내부에는 라이브러리, 바이너리 및 필요한 모든 애플리케이션 구성 요소가 포함되어 있지만, 커널 리소스나 가상화된 하드웨어는 포함되지 않습니다.
컨테이너는 '최상위' 컨테이너 런타임을 실행하여 리소스를 할당받습니다. 컨테이너는 기본 구성 요소와 애플리케이션 종속성만 포함하므로, 가상 머신과는 달리 가볍고 더 빠릅니다.
참고: 컨테이너와 가상 머신: 차이점 설명
쿠버네티스 설치 및 설정 방법
지금까지 이론적인 내용에 많은 시간을 할애했습니다. 이제부터는 좀 더 실용적인 내용으로 넘어가서 컨테이너에 대한 실습 경험을 쌓아보겠습니다. 이 튜토리얼에서는 특히 Windows 운영 체제에서의 설치를 다룹니다.
Windows에서 쿠버네티스를 설치하는 방법은 여러 가지가 있습니다. 명령줄 또는 그래픽 사용자 인터페이스를 선택할 수 있지만, 다음 필수 사양을 충족해야 합니다.
하드웨어 요구 사항으로는 2GB 이상의 메모리가 필요하며, 작업자 노드에는 700MB가 필요합니다. 소프트웨어 요구 사항으로는 Hyper-V, Docker Desktop, 고유한 MAC 주소, 모든 노드에 대한 고유한 제품 UUID가 필요합니다. 다음은 단계별 접근 방식입니다.
Hyper-V 설치 및 설정
Hyper-V는 Windows의 기본 가상화 소프트웨어입니다. 본질적으로, Hyper-V는 VirtualBox의 강력한 버전이라고 할 수 있습니다. Microsoft GUI 또는 명령줄을 사용하여 가상 머신을 관리할 수 있습니다. Hyper-V를 활성화하려면 다음 단계를 따르십시오.
- 제어판을 엽니다.
- 왼쪽 패널에서 프로그램을 클릭합니다.
- 프로그램 및 기능 페이지에서 'Windows 기능 켜기 또는 끄기'를 클릭합니다.
- Windows용 Hyper-V 및 Hypervisor 기능을 선택합니다.
- 다음을 클릭하고 이 단계에서 확인을 선택합니다. 새 설정을 활성화하려면 컴퓨터를 다시 시작해야 합니다.
경우에 따라 모든 것이 올바르게 구성되었는지 확인하기 위해 PC가 여러 번 다시 시작될 수 있습니다. PowerShell에서 다음 명령을 입력하여 설치 성공 여부를 확인할 수 있습니다.
Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V
화면에 '사용' 상태로 표시되는지 확인합니다.
도커 설치
이미 배운 것처럼 쿠버네티스는 컨테이너 위에 구축된 컨테이너 오케스트레이션 도구입니다. 이 경우 도커가 좋은 선택입니다. 쿠버네티스는 도커와 통신하고 기업 수준에서 모든 것을 관리합니다. Windows용 도커를 다운로드하여 설치를 진행하십시오. Docker Desktop을 사용해야 하는 이유가 궁금하다면, Docker Desktop은 도커화된(컨테이너화된) 애플리케이션의 개발, 배송 및 실행을 단순화하는 데 적합합니다.
또한 Hyper-V 및 네트워킹을 사용하여 Windows에서 Docker 앱을 구축하는 가장 빠른 방법입니다. 성공적으로 설치한 후에는 Docker가 실행되는 동안 모든 터미널에서 항상 액세스할 수 있습니다. 설치에 대한 자세한 내용은 공식 Docker 문서를 참조하십시오. 설치 후 숨겨진 아이콘과 같은 문제가 발생하는 경우 컴퓨터를 다시 시작하여 문제를 해결할 수 있습니다.
쿠버네티스 설치
Docker GUI를 사용하면 설정을 구성하고 쿠버네티스를 설치 및 활성화할 수 있습니다. 쿠버네티스를 설치하려면 다음 단계를 따르십시오.
- Docker 트레이 아이콘을 마우스 오른쪽 버튼으로 클릭하고 속성을 선택합니다.
- '속성'을 클릭한 후 드롭다운 메뉴에서 '설정'을 선택합니다.
- 왼쪽 패널에서 'Kubernetes'를 선택하고 '적용'을 클릭합니다.
그러면 도커가 몇 가지 추가 패키지 및 종속성을 설치합니다. 이 프로세스는 인터넷 속도에 따라 약 5분에서 10분 정도 걸릴 수 있습니다. Docker 앱을 사용하여 모든 것이 올바르게 작동하는지 확인할 수 있습니다.
쿠버네티스 앱은 CLI를 사용하여 배포할 수 있지만, 쿠버네티스 대시보드는 기본적으로 설치되지 않으므로 직접 설치해야 할 수 있습니다. 다음 단계를 사용하여 대시보드를 설치합니다.
- YAML 구성을 다운로드합니다.
- 다음 코드를 사용하여 애플리케이션을 배포합니다. kubectl apply -f .recommended.yaml
- kubectl.exe get -f .recommended.yaml.txt를 통해 모두 제대로 설정되었는지 확인합니다.
대시보드에 액세스하려면 PowerShell(CMD 아님)에서 다음 명령을 실행합니다.
- 다음 코드를 실행합니다: ((kubectl -n kube-system describe secret default | select-string "token:") -split "+")[1]
- 생성된 토큰을 복사하고 kubectl proxy를 실행합니다.
- 브라우저에서 이 링크를 엽니다.
- '토큰'을 클릭하고 여기에 토큰을 붙여넣으세요.
- 로그인합니다.
여기까지 완료되었다면 쿠버네티스 대시보드가 표시되어야 합니다. 이제 CLI를 사용하지 않고도 애플리케이션을 관리할 수 있습니다.
관련 자료: Ubuntu 18에 Kubernetes를 설치하는 방법
쿠버네티스 클러스터를 만들고 관리하는 방법
위 단계를 따라했다면 호스트에 쿠버네티스를 성공적으로 설치했을 것입니다. 다음 단계에 따라 클러스터에서 간단한 관리를 생성하고 수행합니다.
- 네트워킹 구성: 클러스터 노드 간에 네트워킹을 설정하여 서로 통신할 수 있도록 합니다.
- 클러스터 인증 설정: 클러스터 액세스를 위한 인증 및 권한 부여 메커니즘을 생성합니다.
- 마스터 구성 요소 설정: API 서버, 스케줄러 및 컨트롤러 관리자를 설정합니다.
- 작업자 노드 가입: 클러스터 설정 프로세스에서 제공하는 구성 파일을 사용하여 작업자 노드를 클러스터에 연결합니다.
- 애드온 배포: 확장을 설치하여 클러스터의 기능을 향상시킬 수 있습니다.
- 워크로드 관리: 이제 앱을 배포할 차례입니다.
이것은 클러스터 생성 프로세스의 개요일 뿐이며, 여러 명령을 포함하는 많은 단계를 포함합니다. 다음은 배포 전에 클러스터를 생성하는 방법에 대한 공식 설명서 가이드입니다. 이를 참조하여 진행하십시오.
쿠버네티스를 사용하여 첫 번째 애플리케이션을 배포하는 방법
쿠버네티스를 사용할 때 가장 일반적인 명령은 kubectl action resource입니다. 이를 통해 지정된 리소스를 생성하거나 삭제하는 것과 같은 특정 작업을 수행할 수 있습니다.
명령이 막힐 경우 특정 하위 명령 뒤에 --help를 추가하여 추가 정보를 얻을 수 있습니다.
예를 들어, 쿠버네티스는 노드 --help를 입력하여 정보를 얻을 수 있습니다. 다음 명령을 사용하여 첫 번째 쿠버네티스 앱을 배포하십시오: kubectl create deployment Kubernetes-bootcamp --image=gcr.io/google-samples/Kubernetes-bootcamp:v1.
마지막 말
이 가이드는 쿠버네티스 기술을 시작하는 첫걸음이 되었습니다. 쿠버네티스의 장점, 기능 및 아키텍처에 대해 알아보았습니다. 아마 시작을 위해 몇 가지 지침(외부 리소스)을 참고해야 했을 수도 있습니다. 또한 내부적으로 어떻게 작동하는지에 대해서도 설명했습니다.
초보자에게는 전체 기술 스택을 파악하는 것이 어려워 보일 수 있지만, 이 글이 쿠버네티스를 시작하는 데 도움이 되었기를 바랍니다. 이 기술을 사용하는 데 익숙해지려면 약간의 연습이 필요하므로, 공식 쿠버네티스 문서를 참조하여 학습을 지속하시기 바랍니다. 연습량이 많을수록 더 빨리 쿠버네티스 전문가가 될 수 있습니다.
다음으로, 초보자부터 전문가까지 쿠버네티스 튜토리얼을 확인해 보시기 바랍니다.