
안녕하세요, 일루넥스 개발팀 최수만입니다.
1. 배포하기
이번엔 minikube에 간단하게 만든 서버를 배포해 보겠다.
# simple-node라는 폴더를 만들고 이동 후 server.js를 생성하자
$ mkdir simple-node
$ cd simple-node
$ touch server.js
IDE를 이용해서 다음의 내용을 작성한다
// localhost:3000을 호출하면 Hello World를 출력한다.
var http = require('http');
var handleRequest = function(req, res) {
res.writeHead(200);
res.end('Hello world');
};
var www = http.createServer(handleRequest);
www.listen(3000);
터미널에서 node server.js를 실행 후 브라우져에서 localhost:3000을 실행하면 Hello world를 출력하는 걸 볼 수 있다. 이제 이걸 쿠버네티스에서 사용할 수 있게 도커파일로 만들어 줘야 한다.
IDE에서 새파일을 생성후 파일명은 Dockerfile로 하고 다음의 내용을 작성해 준다.
FROM node:12 # node version 12를 사용합니다.
COPY . . # 작업 디렉토리의 모든 파일을 컨테이너로 복사합니다.
EXPOSE 3000 # 3000 포트로 외부와 연결합니다.
CMD node server.js # server.js를 실행하라
그 다음 부분에서 약간의 햇갈림이 있었다. 뜬금없이 eval~ 명령을 쓰라는 거다.
# 사용할 때
$ eval $(minikube docker-env)
$ docker build -t sample:v1 .
# 위의 명령을 실행한 폴더에서 docker images 실행
$ docker images
sample v1 f84d6e8ea36e 2 hours ago 918MB
node 12 28faf336034d 7 days ago 918MB
gcr.io/k8s-minikube/storage-provisioner v3 bad58561c4be 3 weeks ago 29.7MB
k8s.gcr.io/kube-proxy v1.16.13 547ceac00533 2 months ago 116MB
k8s.gcr.io/kube-controller-manager v1.16.13 805157ef634b 2 months ago 162MB
k8s.gcr.io/kube-apiserver v1.16.13 5e09a312716d 2 months ago 170MB
k8s.gcr.io/kube-scheduler v1.16.13 9832c7ec57b8 2 months ago 93.6MB
kubernetesui/dashboard v2.0.3 503bc4b7440b 3 months ago 225MB
kubernetesui/metrics-scraper v1.0.4 86262685d9ab 6 months ago 36.9MB
k8s.gcr.io/etcd 3.3.15-0 b2756210eeab 12 months ago 247MB
k8s.gcr.io/coredns 1.6.2 bf261d157914 13 months ago 44.1MB
k8s.gcr.io/pause 3.1 da86e6ba6ca1 2 years ago 742kB
# 실행하기
# 사용하지 않을 때
$ eval $(minikube docker-env -u).
위와 같이 메인 도커와는 다른 minikube용 클러스터가 있고 그곳에 저장됨을 알수 있다. 다른 터미널 창을 열어서 docker images를 해보면 다른 것을 알 수 있다. 이로 인해 eval 명령어는 컨테이너를 레포지토리로 올려서 그것을 다운받는 방식이 아닌 eval을 이용해 로컬 생성 컨테이너를 바로 minikube의 클러스터에 집어넣는 것만 다르게 작동한다.클러스터에 저장된 이미지를 실행하자.
kubectl run NAME --image=image [--env="key=value"] [--port=port] [--dry-run=server|client|none] [--overrides=inline-json] [flags]
# 명령의 옵션도 한번 찾아봐야 겠다.
$ kubectl run sample --image=sample:v1 --port=3000 --image-pull-policy=Never
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/sample created
# 배포확인
$ kubectl get deployments
# pods 확인 (약간의 시간 필요)
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
sample-775fcc85b4-wk9ks 1/1 Running 0 117s
그런데 처음에 run으로 잘 되었는데 그 다음에 하니 오류가 발생했다. 보니까 run을 하니 pod은 만드는데 deployment, replica set을 생성하지 않았다. 그래서 다음과 같이 진행했다.
위의 문제는 다시 원인을 찾아봐야겠다.
# 변경된 배포 명령
$ kubectl create deployment sample --image=sample
# 변경된 서비스 명령
kubectl expose deployment sample --port=8080 --type=LoadBalancer
외부에 연결을 만들기위해 다음 명령을 실행하자
$ kubectl expose deployment sample --type=LoadBalancer
service/sample exposed
$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d
sample LoadBalancer 10.103.58.154 <pending> 3000:31149/TCP 10m
# 브라우저에 띄우자
$ minikube service sample
2. 새 버전 배포하기
이제 내용을 바꾸고 새 버전을 배포해 보자
# 새버전 배포하기
$ kubectl set image deployment/sample sample=sample:v2
# 확인해보기
$ minikube service sample
이상태로 minikube를 종료했다 다시 시작하면 위의 pod, service 설정은 동일하게 작동한다. 그동안 학습 및 테스트용으로 쿠버네티스를 사용하기 힘든 사람들은 이것을 이용해서 간단하게 학습할 수 있게 만들었다는 것 자체가 마음에 든다.
환경 정리하기 – 이것을 하지 않는 경우는 전의 환경이 연결되어 있으므로 계속해서 사용할 수 있다.
# 이제 서비스와 배포를 종료해보자
$ kubectl delete service sample
$ kubectl delete deploy sample
# minikube 클러스터의 이미지를 삭제하자
$ docker rmi sample:v1 sample:v2
$ minikube stop
$ eval $(minikube docker-env -u)
$ minikube delete
기타 이벤트, 설정 보기
$ kubectl get events
$ kubectl config view
kubectl에 대한 더 많은 명령은 이곳 에서
마치며
지금까지 미니쿠베에서 배포해보기에 대해 알아보았습니다.
읽어주셔서 감사합니다.