GW LABS

kubernetes 시작하기 본문

Infrastructure/Kubernetes

kubernetes 시작하기

GeonWoo Kim 2020. 12. 15. 11:08

kubernetes

Docker와 같은 컨테이너 기술은 개발팀의 개발환경 구성문제, 애플리케이션 단위로 격리하여 코드로 서버를 관리하는 등 다양한 운영과 관련된 문제를 해결해줬다(44bits Docker 필요성 포스팅).

그러나 Docker로 서버 및 앱들을 관리하면서 규모가 점점 커지게 되면 컨테이너 운영의 문제가 발생한다. 여러 대의 서버에서 컨테이너들을 관리해야 할 때 네트워크 문제, 배포 문제 등을 해결하기 위해 대두된 기술이 컨테이너 오케스트레이션이다. Docker swarm, AWS ECS 등의 오케스트레이션 서비스들이 있지만 현재 컨테이너 오케스트레이션의 표준으로 자리잡고 있는 Kubernetes에 대해 알아보자.

 


Kubernetes 소개

Kubernetes는 구글의 노하우가 담긴 프로덕션급 컨테이너 오케스트레이터이다. 온프레미스 환경, 클라우드 환경 모두에서 Kubernetes를 사용할 수 있고 컨테이너 애플리케이션의 배포/확장 등의 관리 기능들을 모두 자동화하여 제공해주고 있다.

 

Kubernetes 필요성

앞서 기술했듯이, Kubernetes는 컨테이너 단위로 애플리케이션을 관리할 때 다양한 문제들을 자동화해준다. 컨테이너로 구상한 분산 시스템의 확장과 장애 조치들을 처리해주고 다양한 배포 전략을 사용할 수 있게 해준다. Kubernetes의 가이드 문서에는 아래와 같은 기능들을 제공해준다고 한다.

  • 서비스 디스커버리와 로드 밸런싱
  • 스토리지 오케스트레이션
  • 자동화된 롤아웃과 롤백
  • 자동화된 빈 패킹
  • 자동화된 복구
  • 시크릿과 구성 관리

 

Kubernetes 구성요소

kubernetes의 구성요소

Kubernetes는 거대한 시스템이므로 구성요소에도 아주 많은 것들이 있다. 이 포스팅에서는 핵심적인 개념과 요소들을 익히고 간단한 실습을 통해 개념을 확인하는 방식으로 Kubernetes를 쉽게 풀어보려고 한다.

  • 클러스터(Cluster) : Kubernetes는 클러스터 단위로 작동한다. 클러스터란 노드라고 불리는 머신들의 집합이다. 클러스터는 여러 개의 워커 노드와 1개 이상의 마스터 노드로 구성된다.
  • 노드(Node) : Kubernetes의 워커 머신이다. 클러스터에 속하는 VM이거나 물리 머신이다. 노드는 Pod들을 구동하기 위해 필요한 서비스들을 가지며, 마스터 컴포넌트에 의해 관리된다. 노드 상의 서비스들로는 docker, kubelet, kube-proxy가 포함된다.
  • 파드(Pod) : Kubernetes의 최소단위 객체이다. 클러스터 상에서 동작하는 컨테이너들의 집합이다. 일반적으로 Deployment로 관리된다.
  • 서비스(Service) : 파드 집합과 같은 애플리케이션들에 접근하는 정책을 기술하는 추상적인 개념이다. 포트, 로드밸런서를 기술할 수 있다.
  • 컨트롤 플레인 : 클러스터에 관한 전반적인 결정들을 수행하고 클러스터 이벤트(새로운 파드를 구동시키는 등)를 감지하고 반응한다.

 

Minikube 실습

Minikube는 로컬환경에서 kubernetes를 개발할 수 있도록 도와주는 툴이다. Linux, MacOS, Windows 모두 지원하기 때문에 어떤 개발환경이든 사용할 수 있다. 설치방법과 자세한 사항은 Minikube 홈페이지에서 확인할 수 있다. 그럼 시작해보자 !

이번 포스팅의 실스에서는 php의 내장 웹 서버를 활용해서 kubernetes의 서비스 로드 밸런싱 기능을 확인해보려고 한다. 내장 php 웹 서버를 담고 있는 docker 이미지를 생성하고, kubernetes에서 그것을 10개의 파드로 생성할 것이다. 그 후 서비스를 외부에 로드 밸런스 타입으로 노출하면 하나의 서비스 URL로 10개의 파드로 로드 밸런싱되는 모습을 확인할 수 있다. 소스는 아래의 github 주소에서 다운받을 수 있다.

 

 

youlive789/kubernetes-php-example

example for checking concepts of kubernetes using php internal web server - youlive789/kubernetes-php-example

github.com

 

 

php 내장 웹 서버를 통해 로드밸런서 기능을 확인해보자.

컨테이너로 만들 php소스는 간단하다. 직접 리눅스에 IP 정보를 가져와서 표출만 해주는 역할이다.

 

php 내장서버를 포함하는 도커 파일

Minikube는 윈도우 환경에서 Docker windows 버전을 엔진으로 사용하고 있다. 따라서 Minikube가 우리가 만든 docker image를 사용하게 하려면 Minikube의 Docker 환경으로 전환해줘야 한다. 해당 명령어는 "minikube docker-env"이며, 입력시 위와 같은 출력을 볼 수 있다. 윈도우 환경이라면 출력의 맨 아래 명령어를 입력해주면 Minikube의 docker환경으로 전환된다.

 

php 내장 웹 서버 이미지를 빌드하는 모습

Minikube docker 환경으로 전환했으면 docker image를 빌드해준다. 명령어는 "docker build -t gwkim/php ."로 빌드해줄 수 있다.

 

kubernetes deployment 생성하기

kubernetes의 deployment를 생성하면 파드가 자동적으로 deployment 문서에 따라 생성된다. 위의 deployment 문서는 방금 생성한 docker 이미지를 10개를 생성하겠다는 replicas 옵션이 들어있다. 또 파드의 할당된 IP를 컨테이너의 환경변수로 입력하도록 env 옵션을 줬다. 이 deployment의 이름은 "sample"이 되며, 이 deployment에 속하는 파드들은 "sample"이라는 선택자를 통해서 선택될 수 있게된다. deployment 문서를 적용하려면 "kubectl apply -f sample-deployment.yaml" 명령어를 입력하면 된다.

 

로드 밸런서 타입으로 서비스 생성

deployment를 공개하면 kubernetes는 서비스를 생성한다. "kubectl expose deployment sample --type=LoadBalancer" 명령어를 통해 로드 밸런서 타입의 서비스를 생성했다. 

 

minikube service를 통해 접근가능한 아이피를 할당받는 모습

클라우드 환경이라면 로드밸런서 타입으로 서비스를 공개하면 클라우드 제공자에 따라 로드 밸런서가 생성될 것이고 그에 맞는 고정 IP를 할당받을 것이다. Minikube를 사용하면 로컬 개발환경이므로 minikube service 명령어를 통해 접근가능한 IP를 할당받아야 한다. "minikube service sample" 명령어로 생성한 서비스의 URL을 받을 수 있다.

 

브라우저를 통해 URL에 접근하면 다음과 같은 화면을 볼 수 있다. 새로고침할 때마다 Pod IP 부분이 변경됨을 알 수 있다. 생성한 10개에 파드에 로드밸런서가 작동하고 있다!

실습과 함께 기본적인 kubernetes의 개념과 기능들을 알아봤다. 거대한 kubernetes를 자유자재로 다루기 위해서는 기본적인 개념과 함께 설명하고 있는 개념을 로컬 개발환경에서 확인하는 과정을 꾸준히 거쳐야만 제대로 사용할 수 있을 것 같다. 앞으로도 계속 노력하자!

 

 

 

 

 

Reference

 - https://zetawiki.com/wiki/쿠버네티스

 - https://www.redhat.com/ko/topics/containers/whats-a-linux-container

 - https://stackoverflow.com/questions/30746888/how-to-know-a-pods-own-ip-address-from-inside-a-container-in-the-pod

Comments