MEDIUM 에서 원문 보기

안녕하세요? 이번 포스팅에서는 컨테이너 오케스트레이션 플랫폼인 쿠버네티스에 대해 알아보고 간단한 웹 서비스를 배포해보겠습니다.

쿠버네티스란?

쿠버네티스(Kubernetes = k8s)를 알기 위해서는 먼저 컨테이너를 꼭 알아야 합니다. 컨테이너란 애플리케이션과 애플리케이션을 구동하는 환경을 격리한 공간을 뜻합니다 (자세한 내용은 위의 ‘컨테이너와 쿠버네티스 쉽게 이해하기’ 포스팅을 참고해주세요). 컨테이너를 사용하면 서버의 자원을 효율적으로 사용할 수 있다는 장점이 있습니다. 그러나 컨테이너가 많아지면 오히려 관리가 어려워져서 운영상의 효율성이 떨어지게 됩니다. 이런 문제를 해결해주는 도구가 바로 쿠버네티스입니다. 쿠버네티스는 컨테이너 오케스트레이션 플랫폼 중 하나로, 구글이 자사 서비스를 위해 개발했던 Borg에서 얻은 운영 노하우를 오픈소스로 공개한 플랫폼입니다. 사용자는 쿠버네티스로 애플리케이션을 빠르게 배포 및 확장할 수 있으며 자원을 필요한 만큼 효율적으로 사용할 수 있습니다.

쿠버네티스의 컨셉



Pod
쿠버네티스에서 만들고 배포할 수 있는 가장 작은 단위로, 파드는 한 개 이상의 컨테이너, 볼륨 자원, 네트워크 자원(IP, port) 그리고 컨테이너의 옵션 등이 포함하고 있습니다.
ReplicaSet
복제된 Pod들이 유지되도록 관리합니다.
Namespace
쿠버네티스에서 지원하는 가상 클러스터로, 클러스터들을 구분하여 다른 프로젝트를 수행할 수 있습니다.
Volume
파드 안의 데이터를 영구적으로 보관할 수 있는 저장소입니다.
Service
파드들의 네트워크 통신을 관리합니다.

쿠버네티스의 장점

1. 무중단 서비스 제공.
쿠버네티스는 서비스가 고장 없이 오랫동안 지속하게 하기 위해서 파드를 복제하고 항상 파드의 개수를 유지합니다. 파드를 여러 개 복제해 놓으면, 하나의 파드에 장애가 발생하더라도 쿠버네티스는 다른 파드를 통해 서비스를 지속할 수 있습니다. 또한, 쿠버네티스는 자가회복 기능(auto-placement, auto-restart, auto-replication, auto-scaling)으로 장애가 발생한 파드를 회복시킵니다.

2. 뛰어난 이식성.
쿠버네티스가 운영하는 컨테이너들은 독립적인 특성이 있기 때문에 특정한 클라우드 환경에 구애받지 않습니다. 예를 들어, 특정 클라우드 환경(Public, Private)에서 다른 클라우드 환경으로 서비스를 이전하거나 다른 Vendor의 클라우드로 서비스를 이전하는 경우에도 쿠버네티스 사용자는 복잡한 과정 없이 컨테이너들만 이전시키면 됩니다. 또한, 쿠버네티스 패키지 매니저인 Helm을 사용하면 쿠버네티스의 애플리케이션들을 쉽고 빠르게 다른 클라우드 환경으로 이식할 수 있습니다.

3. 효율적인 자원 사용.
쿠버네티스는 파드가 사용할 자원들(CPU, Memory 등)의 사용량을 사전에 지정함으로써, 필요한 만큼의 자원만 파드에 할당합니다. 가상머신이 게스트 OS의 일부 자원만을 사용하여 메모리 오버헤드가 발생하는 반면, 쿠버네티스의 컨테이너는 호스트 운영체제를 공유하면서 각 컨테이너가 필요한 만큼의 자원들을 사용하기 때문에 자원을 더 효율적으로 사용할 수 있습니다.

4. 유연한 확장성.
쿠버네티스는 자원 사용률에 따라 자동으로 파드의 수를 관리합니다. 예를 들어, CPU 사용률이 300%로 증가하게 되면 쿠버네티스의 Horizontal Pod Autoscaler가 파드를 1개에서 7개까지 증가시킵니다. CPU 사용률이 다시 감소하게 되면 파드의 개수도 점차 줄어들게 됩니다.


실습 FLOW

1. 공개 저장소인 Docker Hub에서 Docker image를 불러옵니다.
2. Image로 Pod를 생성합니다.
3. 외부에서 Container의 웹 서비스에 접속합니다.

Tutorial : 웹서비스를 쿠버네티스에 올리기

1. 쿠버네티스를 설치해주세요.
링크참조

2. 서버에 접속한 다음, 실습에 사용할 이미지를 검색합니다.

docker search dodghek


2-1. 이전 컨테이너 실습에서 배포한 이미지(myimage)를 불러오겠습니다.

docker pull dodghek/myimage -a

2-2. 이미지가 정상적으로 다운되었는지 확인합니다.

docker images

3. 이미지로 deployment를 생성합니다. deployment가 생성되면 image로부터 Pod가 생성됩니다.

kubectl run myapp --image=dodghek/myimage:0.1 --port=80

* deployment의 이름을 myapp으로 설정하고 웹 서비스를 위한 80번 포트를 설정하겠습니다.
* deployment란, 생성할 파드를 정의해놓은 명세서 역할을 수행합니다.


3-1. Pod의 네트워크 통신을 담당하는 Service를 deployment expose하여 생성하겠습니다.

kubectl expose deployment myapp

3-2. 생성된 Service의 상태를 확인해보겠습니다.

* Service는 내부 및 외부 통신과 관련 있는 정책들을 정의하고 있습니다.
* 생성된 서비스는 현재 ClusterIP Type으로 내부 통신만 가능한 상태입니다.


3-3. 외부(브라우저)에서 Pod의 웹 서비스에 접근할 수 있도록 서비스를 수정하겠습니다.

kubectl edit service myapp


type의 ClusterIP를 NodePort로 변경 후 저장합니다.

* Service Types
– ClusterIP (default) : Cluster 내에서만 통신할 수 있습니다.
– NodePort : Cluster 외부와 통신할 수 있습니다.
– LoadBalancer : 로드밸런싱을 할 수 있습니다.

3-4. 서비스가 어떻게 변경되었는지 확인해보겠습니다.

kubectl get service


* 서비스 타입이 NodePort로 변경되면서 30970번 외부 포트가 생성되었습니다.

4. 마지막으로, 외부(브라우저)에서 컨테이너의 웹서비스에 접속해보겠습니다.
브라우저 창을 열고 IP:30970으로 Pod의 웹 서비스에 접속해보겠습니다.

감사합니다.

이전 포스팅
컨테이너와 쿠버네티스 쉽게 이해하기
컨테이너 실습(Tutorial)


참고문헌

쿠버네티스 공식 페이지 : http://kubernetes.io/