Kubernetes
4. 쿠버네티스
쿠버네티스는 최근 가장 유명한 오케스트레이션 오픈 소스입니다.
오늘 쿠버네티스의 주요 구성 요소 개괄, 디자인을 알아보고 실제 투표 애플리케이션을 배포하겠습니다.
서론
- 쿠버네티스는 오픈 소스 시스템으로 구글에 의해서 처음 개발되었으며 클러스터 환경에서 컨테이너화된 애플리케이션을 관리합니다.
- 연계되어 있고 분산되어있는 구성 요소들을 더 쉽게 관리하고 다양한 인프라에 서비스를 제공하고자 합니다.
- 오픈 소스이기 때문에 누구나 다운로드해서 사용할 수 있고 그 이점을 누릴 수 있습니다.
간략한 역사
- 구글은 일주일에 20억 개가 넘는 컨테이너를 배포합니다. 모두 쿠버네티스의 전신인 보그(Borg) 플랫폼 상에서 작동합니다.
- 쿠버네티스는 본래 구글 내부 프로젝트였지만, 2015년 클라우드 네이티브 컴퓨팅 재단으로 기부됩니다.
예시 사용법: 웹에서 실행되는 애플리케이션 만들기
단계 1. 클라우드 환경을 만듭니다.
단계 2. 애플리케이션을 컨테이너화 합니다.
단계 3. 컨테이너화 된 애플리케이션을 클라우드에 배포합니다.
개괄
- 쿠버네티스, k8s, 또는 쿠브는 컨테이너 작업(오케스트레이션)을 자동화하는 오픈 소스 플랫폼입니다.
- 배포, 스케일링, 컨테이너화된 애플리케이션 관리를 포함하는 기존 수작업을 없앴습니다.
- 롤아웃, 롤백 그리고 배포된 서비스 상태 관리를 자동화합니다.
- 사용도에 따라 서비스의 크기를 키우거나 줄일 수 있어서 필요한 것만 실행할 수 있도록 합니다.
- 컨테이너처럼 쿠버네티스는 클러스터를 제어하여 버전을 관리하고 복제할 수 있도록 합니다.
쿠버네티스 아키텍처
쿠버네티스 객체
- 파드는 한 노드에 배포할 수 있는 가장 작은 단위입니다. 함께 실행되어야하는 컨테이너 그룹입니다.
- 서비스는 파드의 논리 집합과 이에 접근하기 위해 필요한 정책을 정의하는데 사용됩니다.
- 볼륨은 기본적으로 파드에서 실행되고 있는 모든 컨테이너에 접근 가능한 디렉터리입니다.
- 네임스페이스는 물리 클러스터를 기반으로 하는 가상 클러스터입니다.
쿠버네티스 관리자
이 관리자는 기본 쿠버네티스 객체를 기반으로 만들어지고 추가적인 기능을 제공합니다.
- ReplicaSet은 복제된 파드가 주어진 시간 동안 특정 개수만 실행 될 수 있도록 합니다.
- Deployment는 현재 상태에서 원하는 상태로 바꾸기 위해서 사용합니다.
- StatefulSet은 배포 순서와 볼륨 접근을 제어하기 위해 사용합니다.
- DaemonSet은 복제된 파드를 클러스터의 모든 노드 또는 특정 노드에 실행하고 싶을 때 사용합니다.
- Job은 어떤 작업을 실행하고 작업이 성공적으로 끝나거나 일정 시간이 지나면 종료하기 위해 사용합니다.
쿠버네티스 제어판
- 쿠버네티스 제어판은 클러스터의 현재 상태가 원하는 상태가 되도록 해줍니다.
- 객체의 상태를 기록하고 객체의 현재 상태가 원하는 상태와 일치하는지 확인하기 위해 제어 루프를 계속해서 실행합니다.
- 제어판은 여러 도시를 운영하는 정부로 생각할 수 있습니다.
쿠버네티스 마스터
- 쿠버네티스 마스터는 클러스터 전체가 원하는 상태를 계속 유지할 수 있도록 합니다.
- kubectl 명령어가 쿠버네티스 API를 통해 클러스터의 쿠버네티스 마스터와 통신할 수 있는 방법입니다.
- 법과 질서를 유지해야하는 경찰 인력 처럼 생각하세요.
각 클러스터의 쿠버네티스 마스터는 아래의 세 가지를 실행합니다:
- kube-apiserver: 전체 클러스터를 관리하는 단일 관리 지점입니다. 이 API 서버는 여러 도구 및 라이브러리와 통신하기 위한 RESTful 인터페이스를 제공합니다. kubectl 명령어로 API 서버와 직접적으로 상호작용합니다.
- kube-controller-manager: 다른 종류의 컨트롤러를 관리하여 클러스터의 상태를 관리합니다.
- kube-scheduler: 클러스터 내의 가용 노드 간 작업량을 조정합니다.
쿠버네티스 노드
- 쿠버네티스 노드는 기본적으로 작업을 실행하고는 있는 클러스터 안에 있는 작업 기기(가상 머신, 물리적 실제 서버 등)입니다.
- 노드들은 쿠버네티스 마스터에 의해 제어되고 애플리케이션의 원하는 상태를 유지하기 위해 계속해서 감시됩니다.
- 예전에는 미니언이라고 불렸습니다. 마스터와 비슷하게 클러스터 내의 각 쿠버네티스 노드는 아래 두 가지를 실행합니다.
- kubelet은 노드와 쿠버네티스 마스터 간의 통신 인터페이스입니다.
- kube-proxy는 각 노드의 쿠버네티스 API에 정의된 서비스를 반영하는 네트워크 프록시입니다. 간단한 TCP와 UDP 스트림 포워딩을 실행할 수 있습니다.
주요 개념
- 레이블(Labels): 파드를 구분하기 위한 레이블
- 쿠버렛(Kuberlet): 컨테이너 에이전트
- 프록시(Proxy): 파드를 위한 로드 발란서
- etcd: 메타데이터 서비스
- cAdvisor: 자원의 사용/성능 통계를 제공하는 컨테이너 조언기
- 복제 제어기(Replication Controller): 파드의 복제를 관리
- 스케쥴러(Scheduler): 작업 노드의 파드 스케쥴러
- API 서버(API Server): 쿠버네티스 API 서버
튜토리얼: 투표 애플리케이션
쿠버네티스 상에서 애플리케이션을 실행해봅시다.
단계 1 : 설치
- 쿠버네티스 설치 (도커): https://hub.docker.com/search/?type=edition&offering=community 에서 다운로드 받으세요. (운영체제에 맞는 데스크톱 도커 Community Edition을 선택하세요)
- 맥OS: 17.12 Edge (mac45)나 더 높은 버전을 다운 받으세요. 18.06 Stable (mac70)나 더 높은 버전을 다운 받으세요.
- 윈도우: 18.02 Edge (win50)나 더 높은 버전을 다운 받으세요. 18.06 Stable (win70)나 더 높은 버전을 다운 받으세요.
- MiniKube 설치 : 쿠버네티스를 로컬에서 실행하기 위해서는 MiniKube를 설치해야합니다. (개발과 테스트 목적으로만 사용됩니다.)
- 맥OS 10.12 (시에라)
- hyperkit(추천)과 같은 하이퍼바이저를 설치해야합니다. VirtualBox도 괜찮습니다.
brew로 설치:
brew cask install minikube
수동 설치:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64 && sudo install minikube-darwin-amd64 /usr/local/bin/minikube
- 윈도우 10
- VirtualBox (추천) 이나 HyperV와 같은 하이퍼바이저가 필요합니다.
- VT-x/AMD-v 가상화가 BIOS에서 활성화 되어 있어야합니다.
chocolatey로 설치:
choco install minikube
수동 설치: installer(https://storage.googleapis.com/minikube/releases/latest/minikube-installer.exe)를 다운 받아서 실행합니다.
단계 2: 단일 노드 클러스터 실행
- 단순히 명령어 minikube start를 실행하세요.
$ minikube start
Starting local Kubernetes v1.10.0 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.
Loading cached images from config file.
단계 3: 투표 애플리케이션 가져오기
- git clone https://github.com/docker/example-voting-app으로 코드를 받으세요.
- “k8s-specifications” 디렉토리에 투표 애플리케이션의 쿠버네티스의 yaml 명세가 있습니다.
- 두 개의 yaml 파일이 있습니다. 서비스 파일과 배포 파일 입니다.
- 서비스 파일(Service file)은 파드의 논리 집합과 정책을 정의합니다.
- 배포 파일(Deployment file)은 특정 시간에 실행되어야할 복제 개수와 같이 원하는 애플리케이션의 상태를 정의합니다.
단계 4: 서비스 와 배포 객체 만들기
$ kubectl create -f k8s-specifications/
deployment "db" created
service "db" created
deployment "redis" created
service "redis" created
deployment "result" created
service "result" created
deployment "vote" created
service "vote" created
deployment "worker" created
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
db-86b99d968f-s5pv7 1/1 Running 0 1m
redis-659469b86b-hrxqs 1/1 Running 0 1m
result-59f4f867b8-cthvc 1/1 Running 0 1m
vote-54f5f76b95-zgwrm 1/1 Running 0 1m
worker-56578c48f8-h7zvs 1/1 Running 0 1m
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
db ClusterIP 10.109.241.59 5432/TCP 2m
kubernetes ClusterIP 10.96.0.1 443/TCP 23m
redis ClusterIP 10.102.242.148 6379/TCP 2m
result NodePort 10.106.7.255 5001:31001/TCP 2m
vote NodePort 10.103.28.96 5000:31000/TCP 2m
결론
쿠버네티스는 가장 유명한 컨테이너 오케스트레이션 엔진입니다. 클라우드 컨테이너화 전략을 확대하는 데 사용할 수 있습니다. 배포, 스케일링 그리고 컨테이너 운영을 자동화하기 위해 만들어졌기 때문입니다.
추가 자료
-
https://kubernetes.io
- 공식 쿠버네티스 튜토리얼. 매우 포괄적입니다.
-
https://www.keycdn.com
- 간단하고 포괄적인 튜토리얼

- Udacity 무료 강좌
https://www.udacity.com
- 구글의 쿠버네티스를 이용한 확장성 있는 마이크로 서비스
-
https://www.kubeflow.org
- 쿠버네티스를 위한 기계 학습 도구
참고 자료
-
https://www.digitalocean.com

-
https://medium.freecodecamp.org
- 파드
https://kubernetes.io
- 서비스
https://kubernetes.io
- 볼륨
https://kubernetes.io
- 네임스페이스
https://kubernetes.io
- ReplicaSet
https://kubernetes.io
- Deployment
https://kubernetes.io
- StatefulSet
https://kubernetes.io
- DaemonSet
https://kubernetes.io
- Job
https://kubernetes.io
comment