안녕하세요. Humanscape Software Engineer David 입니다.
이번 포스팅에서는 Kubernetes를 직접 사용해보며 특징을 알아보겠습니다.
Kubernetes는 친절하게도 실서비스 도입 전 미리 사용해 볼 수 있는 Minikube(Mini Kubernetes)를 지원합니다 :)
진행에 앞서 Docker for mac, Node.js 을 설치해주세요.
Minikube 설치
macOS에서 Homebrew를 통해 Minikube를 설치 할 수 있습니다.
$ brew cask install minikube
MiniKube는 Kubernetes VM을 관리하기위해 Docker Machine을 사용합니다. Docker Machine을 사용하기 때문에 다양한 VM providers를 일관되게 관리할 수 있다는 이점이 있습니다. Minikube는 VirtualBox와 VMware Fusion drivers는 내장하고 있어 사용을 지원하지만, 다른 드라이버들은 별도의 설정이 필요합니다.
HyperKit driver를 설치해줍니다.
$ curl -Lo docker-machine-driver-hyperkit https://storage.googleapis.com/minikube/releases/latest/docker-machine-driver-hyperkit \&& chmod +x docker-machine-driver-hyperkit \&& sudo cp docker-machine-driver-hyperkit /usr/local/bin/ \&& rm docker-machine-driver-hyperkit \&& sudo chown root:wheel /usr/local/bin/docker-machine-driver-hyperkit \&& sudo chmod u+s /usr/local/bin/docker-machine-driver-hyperkit
Kubernetes의 클러스터들과의 상호작용을 하기위해 kubectl(Kubernetes Command-Line Tool)을 설치합니다.
$ brew install kubernetes-cli
아래 명령어로 docker의 이미지들을 볼 수 있습니다. 이 단계에서 도커가 running 상태인지 확인합니다.
$ docker images
Minikube 클러스터 실행
프록시 없이 Minikube 클러스터 실행
$ minikube start --vm-driver=hyperkit
프록시가 필요하다면 아래와 같이 설정해주면 됩니다.
$ minikube start --vm-driver=hyperkit --docker-env HTTP_PROXY=http://your-http-proxy-host:your-http-proxy-port --docker-env HTTPS_PROXY=http(s)://your-https-proxy-host:your-https-proxy-port
Kubernetes의 설정은 ~/.kube/config 파일에서 보실 수 있습니다.
Minikube 클러스터를 사용한다고 정의합니다.
$ kubectl config use-context minikube
use-context 명령어는 클러스터 변경시 사용합니다.
cli로 cluster의 정보를 볼 수 있습니다.
$ kubectl cluster-info
아래 명령을 입력하면 대시보드가 나옵니다.
$ minikube dashboard
minikube는 dashboard와 같은 addon을 여러가지 가지고 있습니다.
$ minikube addons list
Addon 소개
Dashboard : Kubernetes 클러스터 또는 클러스터에서 실행중인 프로그램들을 웹 UI기반으로 관리합니다.
Heapster : (Deprecated) Metrics-server 와 같은 타사의 메트릭 파이프 라인을 사용하라고 합니다.
Elasticsearch Add-On :Elasticsearch에 저장된 로그를 보고 쿼리하는 UI를 제공합니다.
Registry : ImagePullSecrets를 통해 Kubernetes 클러스터 내에서 레지스트리 자격 증명을 새로 고칠 수 있습니다.
CoreDNS : 표준 Kube-DNS 대신 CoreDNS를 실행할 수 있습니다.
Ingress : Kubernetes Ingress 리소스를 기반으로 구축 된 NGINX 컨트롤러입니다.
freshpod : 이미지가 업데이트 될 때 컨테이너를 자동으로 다시 시작하도록 도와줍니다.
아래 명령어로 필요한 addon은 enable 해서 사용할 수 있습니다.
$ minikube addons enable [addon-name]
여기까지 하면 Kubernetes 클러스터 구성이 완료됩니다. :)
Node.js 서버 어플리케이션
hellonode라는 디렉토리를 만들어주시고, 그 안에 아래와 같이 server.js 라는 파일을 만들어주세요.
hellonode/server.js
var http = require(‘http’);var handleRequest = function(request, response) {console.log(‘Received request for URL: ‘ + request.url);response.writeHead(200);response.end(‘Hello World!’);};var www = http.createServer(handleRequest);www.listen(8080);
http://localhost:8080 포트로 접속하면 간단하게 Hello world! 를 찍어주는 서버 어플리케이션입니다.
서버 실행
$ node server.js
서버 종료
Ctlr + c
도커컨테이너 이미지 생성
위에서 만든 node.js 어플리케이션을 배포할 도커 컨테이너 이미지를 만들어줍니다. server.js 파일이 있는 디렉토리에 Dockerfile 이라는 이름의 파일을 만들어줍니다.
hellonode/Dockerfile
FROM node:6.9.2EXPOSE 8080COPY server.js .CMD node server.js
위 Dockerfile은 node 6.9.2 버젼을 사용하고, server.js 파일을 도커 컨테이너로 복사해준뒤 서버를 실행시키는 명령을 담고 있는 파일입니다.
우리는 도커 이미지를 레지스트리에 pushing하는 대신에 minikube VM 같은 도커 호스트를 간단하게 빌드할 수 있습니다. 그래서 이미지는 자동적으로 보여집니다.
$ eval $(minikube docker-env)
나중에 사용하지 않을 때는
$ eval $(minikube docker-env -u).
hello-node 도커이미지를 빌드해줍니다. 버전은 1로 해주었습니다.
$ docker build -t hello-node:v1 .
드디어! kubernetes로 도커이미지를 run 해줍니다.
$ kubectl run hello-node --image=hello-node:v1 --port=8080 --image-pull-policy=Never
정상적으로 배포가 되었는지 확인합니다.
$ kubectl get deployments
아래명령으로 pods를 볼 수 있는데, STATUS에 에러가 보입니다.
pod는 kubernetes에서 관리되는 가장 작은 단위 입니다. pod 안에는 여러개의 컨테이너가 들어갈 수 있습니다.
$ kubectl get pods
확인결과 도커이미지를 빌드하지 않아서 생긴 오류였습니다. 이 경우 별도의 작업(ex. down/up) 없이 도커 이미지만 빌드해주면 상태가 정상적으로 돌아옵니다.
kubernetes가 자동으로 복구하는 것을 확인 할 수 있습니다.(self-healing)
이 밖에 아래와 같이 이벤트와 설정을 볼 수 있습니다.
$ kubectl get events$ kubectl config view
더 많은 정보는 아래에 이곳(kubectl overview)을 참고해주세요.
기본적으로 pod는 Kubernetes 클러스터 내의 내부 ip 주소로만 엑세스할 수 있기 때문에 외부에서 엑세스 가능하게 만들려면 아래 명령어를 통해 외부로 노출시켜야합니다.
$ kubectl expose deployment hello-node --type=LoadBalancer
Minikube에서 LoadBalancer 유형을 사용하면 minikube 서비스 명령을 통해 서비스에 액세스 할 수 있습니다.
$ minikube service hello-node
위 명령어는 자동으로 브라우저를 열고 Hello World! 를 띄워줍니다.
어플리케이션 업데이트
hellonode/server.js의 아래 라인을 변경해봅니다.
response.end(‘Hello World! Again’);
버전을 올려서(v1->v2) 빌드 후 이미지를 다시 set 해줍니다.
$ docker build -t hello-node:v2 .
$ kubectl set image deployment/hello-node hello-node=hello-node:v2
다시 실행을 하면 업데이트 된 결과를 확인할 수 있습니다.
$ minikube service hello-node
글을 마치며 세팅 환경을 정리하려면 다음과 같이 해주시면됩니다.
우선 클러스터 안에 hello-node service와 deployment 를 제거합니다.
$ kubectl delete serveci hello-node$ kubectl delete deployment hello-node
그리고 선택적으로 도커 이미지를 삭제, Minikube VM 정지, 그리고 삭제까지 해주시면 됩니다.
$ docker rmi hello-node:v1 hello-node:v2 -f$ minikube stop$ eval $(minikube docker-env -u)$ minikube delete
다음 포스팅은 Kubernetes를 이용해 실제 개발환경을 구축해보겠습니다.
감사합니다.
Get to know us better!
Join our official channels below.
Telegram(EN) : t.me/Humanscape
KakaoTalk(KR) : open.kakao.com/o/gqbUQEM
Website : humanscape.io
Medium : medium.com/humanscape-ico
Facebook : www.facebook.com/humanscape
Twitter : twitter.com/Humanscape_io
Reddit : https://www.reddit.com/r/Humanscape_official
Bitcointalk announcement : https://bit.ly/2rVsP4T
Email : support@humanscape.io