티스토리 뷰
<출처>
https://kubernetes.io/docs/tutorials/hello-minikube/
<참고사항>
1. 모바일 화면에서 코드가 깨지고 가독성이 안좋아 코드삽입에 대해 검토하다가 Color Sripter (https://colorscripter.com/) 라는 것을 알게되어 이를 활용하여 코드 블럭을 수정했다.
깔끔하고 좋은데... 우측 하단 끝에 관련 로고가 붙어 나오는 점을 감안하자~^
2. 현재 Kubernetes 한글화팀에서 한글화 번역 작업에 참여하고 있는데, 여기서 결정된 한글화 표기법을 근거로 가급적 최대한 지속적으로 게시물에 업데이트 할 예정이다. 이와 더불어 수시로 오타정정 및 어색한 문구에 대해 바로잡는 업데이트가 이루어 질 수 있음을 참고하자.
테스트 환경 : Ubuntu16.04 on Vmware
Hello Minikube
이 튜토리얼의 목표는 여러분이 하나의 간단한 Hello World Node.js app 을 Kubernetes 상에서 돌아가는 어플리케이션으로 전환해보도록 하는 것이다. 여러분의 머신에서 개발한 것을 어떻게 코드로 취해 이를 도커 컨테이너 이미지로 바꾸고 Minikube 상에서 그 이미지를 동작시키는지를 보여줄 것이다. Minikube 는 무료로 로컬 머신 상에서 간단하게 Kubernetes가 동작하도록 해준다.
Objectives
- Hello World Node.js 어플리케이션을 돌려본다.
- Minikube 에 이 어플리케이션을 배포한다.
- 어플리케이션 로그를 확인해 본다.
- 어플리케이션 이미지를 업데이트 한다.
Create a Minikube cluster
이 강좌에서는 로컬 클러스터를 구성하기 위해 Minikube를 이용하게 된다. (Minikube 에서 실습하기 위해서는), 먼저 Minikube 설치 및 클러스터 구성을 진행한다.
Minikube 가 준비 되었다면 다음과 같이 Minikube 를 구동시키고 확인차원에서 버전 확인을 수행해 본다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | root@zerobig-vm:/home/study/k8s# 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. root@zerobig-vm:/home/study/k8s# minikube version minikube version: v0.28.2 root@zerobig-vm:/home/study/k8s# minikube status minikube: Running cluster: Running kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.100 root@zerobig-vm:/home/study/k8s# | cs |
Create your Node.js application
먼저 server.js 라는 파일명을 갖는 어플리케이션을 작성한 후 node 명령을 수행하여 어플리케이션을 실행 시킨다.
node 가 설치 안되었다면 apt install nodejs-legacy 을 통해 설치 후 수행한다. (CentOS 환경에서는 yum install 을 이용한다.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | root@zerobig-vm:/home/zerobig# mkdir -p /home/study/k8s root@zerobig-vm:/home/zerobig# cd /home/study/k8s/ root@zerobig-vm:/home/study/k8s# vi 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); ~ ~ ~ ~ ~ ~ ~ "server.js" [New File] 9 lines, 263 characters written root@zerobig-vm:/home/study/k8s# node server.js The program 'node' is currently not installed. You can install it by typing: apt install nodejs-legacy root@zerobig-vm:/home/study/k8s# apt install nodejs-legacy Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: libuv1 nodejs The following NEW packages will be installed: libuv1 nodejs nodejs-legacy 0 upgraded, 3 newly installed, 0 to remove and 2 not upgraded. Need to get 3,246 kB of archives. After this operation, 13.5 MB of additional disk space will be used. Do you want to continue? [Y/n] Y Get:1 http://kr.archive.ubuntu.com/ubuntu xenial/universe amd64 libuv1 amd64 1.8.0-1 [57.4 kB] Get:2 http://kr.archive.ubuntu.com/ubuntu xenial-updates/universe amd64 nodejs amd64 4.2.6~dfsg-1ubuntu4.1 [3,161 kB] Get:3 http://kr.archive.ubuntu.com/ubuntu xenial-updates/universe amd64 nodejs-legacy all 4.2.6~dfsg-1ubuntu4.1 [27.7 kB] Fetched 3,246 kB in 35s (90.5 kB/s) Selecting previously unselected package libuv1:amd64. (Reading database ... 217998 files and directories currently installed.) Preparing to unpack .../libuv1_1.8.0-1_amd64.deb ... Unpacking libuv1:amd64 (1.8.0-1) ... Selecting previously unselected package nodejs. Preparing to unpack .../nodejs_4.2.6~dfsg-1ubuntu4.1_amd64.deb ... Unpacking nodejs (4.2.6~dfsg-1ubuntu4.1) ... Selecting previously unselected package nodejs-legacy. Preparing to unpack .../nodejs-legacy_4.2.6~dfsg-1ubuntu4.1_all.deb ... Unpacking nodejs-legacy (4.2.6~dfsg-1ubuntu4.1) ... Processing triggers for libc-bin (2.23-0ubuntu10) ... Processing triggers for doc-base (0.10.7) ... Processing 1 added doc-base file... Processing triggers for man-db (2.7.5-1) ... Setting up libuv1:amd64 (1.8.0-1) ... Setting up nodejs (4.2.6~dfsg-1ubuntu4.1) ... update-alternatives: using /usr/bin/nodejs to provide /usr/bin/js (js) in auto mode Setting up nodejs-legacy (4.2.6~dfsg-1ubuntu4.1) ... Processing triggers for libc-bin (2.23-0ubuntu10) ... root@zerobig-vm:/home/study/k8s# node server.js | cs |
터미널 창 하나를 더 띄어서 curl 명령을 통해 또는 브라우저 상에서 서비스 호출 결과를 검증해 본다.
1 2 | root@ubuntu:~# curl http://localhost:8080 Hello World!root@ubuntu:~# | cs |
Create a Docker container image
이제 Dockerfile 을 만들어 보자.
1 2 3 4 5 | root@zerobig-vm:/home/study/k8s# vi Dockerfile FROM node:6.9.2 EXPOSE 8080 COPY server.js . CMD node server.js | cs |
도커 이미지에 대한 작성법은 도커 레지스트리에서 얻을 수 있는 공식 Node.js LTS 이미지로 시작한다. 8080 으로 노출시키며, 여러분의 server.js 파일에 그 이미지를 복사하고 Node.js 서버를 시작시킨다.
이 강좌에서는 Minikube를 이용하므로 레지스트리에 여러분의 도커 이미지를 push 하는 대신, 이미지가 자동으로 표시되도록 간단하게 Minikube VM과 같은 도커 호스트를 이용하여 이미지를 빌드 해볼 수 있다. 그러기 위해 Minikube 도커 데몬을 이용하고 있음을 분명하게 이해하자.
(특정 도커 데몬, 지금은 Minikube 내 도커 데몬, 에서 도커 명령이 수행되도록 다음 명령을 수행한다.)
1 | root@ubuntu:/home/study# eval $(minikube docker-env) | cs |
Note : 나중에, 더 이상 Minikube 호스트를 사용하고 싶지 않을 경우, eval $(minikube docker-env -u) 을 수행하면 된다.
여러분의 도커 이미지를 빌드하기 위해, Minikube 도커 데몬을 이용한다(맨 뒤에 . 가 있음을 명심하자.) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | root@zerobig-vm:/home/study/k8s# docker build -t hello-node:v1 . Sending build context to Docker daemon 3.072 kB Step 1/4 : FROM node:6.9.2 6.9.2: Pulling from library/node 75a822cd7888: Pull complete 57de64c72267: Pull complete 4306be1e8943: Pull complete 871436ab7225: Pull complete 0110c26a367a: Pull complete 1f04fe713f1b: Pull complete ac7c0b5fb553: Pull complete Digest: sha256:2e95be60faf429d6c97d928c762cb36f1940f4456ce4bd33fbdc34de94a5e043 Status: Downloaded newer image for node:6.9.2 ---> faaadb4aaf9b Step 2/4 : EXPOSE 8080 ---> Running in 84c9af62009c ---> fd6c8ea3209e Removing intermediate container 84c9af62009c Step 3/4 : COPY server.js . ---> f0cd04c7dd38 Removing intermediate container c09ff25e2814 Step 4/4 : CMD node server.js ---> Running in 2d68cc841f27 ---> 4757041590c8 Removing intermediate container 2d68cc841f27 Successfully built 4757041590c8 root@zerobig-vm:/home/study/k8s# docker images | grep hello hello-node v1 4757041590c8 37 seconds ago 655 MB root@zerobig-vm:/home/study/k8s# | cs |
Create a Deployment
K8S 디플로이먼트 는 파드 컨테이너 Health를 체크하고 종료되면 재시작 시킨다. 디플로이먼트는 파드를 생성하고 스케일링하도록 관리하기 위해 권장하는 방식이다.
kubectl run
명령을 통해 파드를 관리해주는 디플로이먼트를 생성한다. 이 파드는 여러분의 "hello-node:v1" 도커 이미지를 토대로 컨테이너를 동작시킨다. "--image-pull-policy "플래그를 "Never" 로 설정하여 도커 레지스트리에서 Pulling 하지 않고 항상 로컬 이미지를 사용하도록 설정한다 (여러분은 아직 도커 레지스트리에 Push 한적이 없으므로)
1 2 3 4 | root@ubuntu:/home/study# docker images | grep hello hello-node v1 a182e81eba7e 2 hours ago 655MB root@ubuntu:/home/study# kubectl run hello-node --image=hello-node:v1 --port 8080 --image-pull-policy=Never deployment.apps/hello-node created | cs |
디플로이먼트, 파드, 이벤트 정보와 Config 확인을 수행해 본다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | root@zerobig-vm:/home/study/k8s# kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE hello-node 1 1 1 1 9s root@zerobig-vm:/home/study/k8s# kubectl get pods NAME READY STATUS RESTARTS AGE hello-node-57c6b66f9c-5hwjw 1/1 Running 0 14s root@zerobig-vm:/home/study/k8s# kubectl get events LAST SEEN FIRST SEEN COUNT NAME KIND SUBOBJECT TYPE REASON SOURCE MESSAGE 24s 24s 1 hello-node.1548dd3391b00eba Deployment Normal ScalingReplicaSet deployment-controller Scaled up replica set hello-node-57c6b66f9c to 1 24s 24s 1 hello-node-57c6b66f9c.1548dd339a3f8867 ReplicaSet Normal SuccessfulCreate replicaset-controller Created pod: hello-node-57c6b66f9c-5hwjw 24s 24s 1 hello-node-57c6b66f9c-5hwjw.1548dd33a400c852 Pod Normal Scheduled default-scheduler Successfully assigned hello-node-57c6b66f9c-5hwjw to minikube 23s 23s 1 hello-node-57c6b66f9c-5hwjw.1548dd33a9b2df0c Pod Normal SuccessfulMountVolume kubelet, minikube MountVolume.SetUp succeeded for volume "default-token-7d4h2" 22s 22s 1 hello-node-57c6b66f9c-5hwjw.1548dd340889c646 Pod spec.containers{hello-node} Normal Started kubelet, minikube Started container 22s 22s 1 hello-node-57c6b66f9c-5hwjw.1548dd33f543c015 Pod spec.containers{hello-node} Normal Created kubelet, minikube Created container 22s 22s 1 hello-node-57c6b66f9c-5hwjw.1548dd33ea1b295f Pod spec.containers{hello-node} Normal Pulled kubelet, minikube Container image "hello-node:v1" already present on machine root@zerobig-vm:/home/study/k8s# root@zerobig-vm:/home/study/k8s# kubectl config view apiVersion: v1 clusters: - cluster: certificate-authority: /root/.minikube/ca.crt server: https://192.168.99.100:8443 name: minikube contexts: - context: cluster: minikube user: minikube name: minikube current-context: minikube kind: Config preferences: {} users: - name: minikube user: client-certificate: /root/.minikube/client.crt client-key: /root/.minikube/client.key root@zerobig-vm:/home/study/k8s# | cs |
Create a Service
기본적으로, 현재 배포한 파드는 K8S 클러스터 내 내부 IP 주소를 통해서만 접속이 가능하다. hello-node 컨테이너가 K8S 가상 네트워크 외부로부터 접근할 수 있도록 하려면, K8S가 이 파드를 K8S 서비스 로 노출 시켜야만 한다.
여러분의 배포 머신으로부터 kubectl expose 명령을 이용하여 퍼블릭 인터넷으로 이 파드를 노출시킬 수 있다.
1 2 | root@zerobig-vm:/home/study/k8s# kubectl expose deployment hello-node --type=LoadBalancer service/hello-node exposed | cs |
방금 생성한 서비스를 확인해 보자.
1 2 3 4 | root@zerobig-vm:/home/study/k8s# kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-node LoadBalancer 10.96.13.214 <pending> 8080:31660/TCP 11s kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1d | cs |
--type=LoadBalancer
플래그는 여러분이 클러스터 외부로 여러분의 서비스를 노출하려 함을 나타내 준다. 클라우드 사업자들이 지원해주는 로드밸런서들을 이용하면, 이 서비스에 접근하기 위한 외부 IP 주소가 provision 될 것이다. Minikube 의 경우, LoadBalancer 타입은 "minikube service" 명령 수행을 통해 서비스에 접근 할 수 있도록 해준다.
이 명령은 자동으로 앱에 할당된 로컬 IP 주소를 이용하여 브라우져 창을 띄우고 "Hello World" 라는 메시지를 출력시켜준다.
1 2 | root@zerobig-vm:/home/study/k8s# minikube service hello-node Opening kubernetes service default/hello-node in default browser... | cs |
브라우저나 curl 을 이용하여 여러분의 새로운 웹 서비스에 요청을 전송하게 되면, 임의의 로그들을 확인할 수 있을 것이다.
1 2 | root@zerobig-vm:/home/study/k8s# curl http://192.168.99.100:31660 Hello World! | cs |
1 2 3 4 5 | root@zerobig-vm:/home/study/k8s# kubectl logs hello-node-57c6b66f9c-5hwjw Received request for URL: / Received request for URL: /favicon.ico Received request for URL: /favicon.ico root@zerobig-vm:/home/study/k8s# | cs |
Update your app
server.js
파일을 열어 새로운 메시지를 리턴하도록("Hello World Again") 수정한다.
1 2 3 4 5 6 7 8 9 10 | root@zerobig-vm:/home/study/k8s# vi 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 Again!\n'); }; var www = http.createServer(handleRequest); www.listen(8080); | cs |
새로운 버전의 이미지를 빌드하자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | root@zerobig-vm:/home/study/k8s# docker build -t hello-node:v2 . Sending build context to Docker daemon 4.096 kB Step 1/4 : FROM node:6.9.2 ---> faaadb4aaf9b Step 2/4 : EXPOSE 8080 ---> Using cache ---> b7a87f63a8ce Step 3/4 : COPY server.js . ---> 6ad75edde0c7 Step 4/4 : CMD node server.js ---> Running in 9d19bd29d093 Removing intermediate container 9d19bd29d093 ---> e92027e702bd Successfully built e92027e702bd Successfully tagged hello-node:v2 root@zerobig-vm:/home/study/k8s# docker images | grep hello hello-node v2 e92027e702bd 9 seconds ago 655 MB hello-node v1 8f2699ee11e5 44 minutes ago 655 MB | cs |
새로운 이미지를 디플로이 하고 다시 앱을 구동시켜 새로운 메시지를 확인해보자.
1 2 | root@zerobig-vm:/home/study/k8s# kubectl set image deployment/hello-node hello-node=hello-node:v2 deployment.extensions/hello-node image updated | cs |
1 2 | root@zerobig-vm:/home/study/k8s# minikube service hello-node Opening kubernetes service default/hello-node in default browser... | cs |
Enable addons
Minikube 는 로컬 Kubernetes 환경 내에 활성, 비활성 그리고 개방 시킬 수 있는 내장 애드 온 세트를 갖고 있다.
먼저 현재 지원되고 있는 애드 온에 대한 리스트이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | root@zerobig-vm:/home/study/k8s# minikube addons list - addon-manager: enabled - coredns: disabled - dashboard: enabled - default-storageclass: enabled - efk: disabled - freshpod: disabled - heapster: disabled - ingress: disabled - kube-dns: enabled - metrics-server: disabled - nvidia-driver-installer: disabled - nvidia-gpu-device-plugin: disabled - registry: disabled - registry-creds: disabled - storage-provisioner: enabled root@zerobig-vm:/home/study/k8s# | cs |
이들 명령어가 효력을 발생 시키려면 Minikube 가 실행 중이어야만 한다. 가령 heapster
애드 온을 활성화 시키려면:
1 2 | root@zerobig-vm:/home/study/k8s# minikube addons enable heapster heapster was successfully enabled | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | root@zerobig-vm:/home/study/k8s# kubectl get po,svc -n kube-system NAME READY STATUS RESTARTS AGE pod/etcd-minikube 1/1 Running 0 11m pod/heapster-jzjh8 1/1 Running 0 58s pod/influxdb-grafana-bmf6t 0/2 ContainerCreating 0 58s pod/kube-addon-manager-minikube 1/1 Running 4 1d pod/kube-apiserver-minikube 1/1 Running 0 11m pod/kube-controller-manager-minikube 1/1 Running 0 11m pod/kube-dns-86f4d74b45-46s6t 3/3 Running 16 1d pod/kube-proxy-wfk6l 1/1 Running 0 11m pod/kube-scheduler-minikube 1/1 Running 1 4h pod/kubernetes-dashboard-5498ccf677-x729q 1/1 Running 15 1d pod/storage-provisioner 1/1 Running 12 1d NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/heapster ClusterIP 10.97.188.236 <none> 80/TCP 58s service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 1d service/kubernetes-dashboard NodePort 10.105.24.211 <none> 80:30000/TCP 1d service/monitoring-grafana NodePort 10.99.10.52 <none> 80:30002/TCP 59s service/monitoring-influxdb ClusterIP 10.100.78.58 <none> 8083/TCP,8086/TCP 58s root@zerobig-vm:/home/study/k8s# root@zerobig-vm:/home/study/k8s# kubectl get po,svc -n kube-system NAME READY STATUS RESTARTS AGE pod/etcd-minikube 1/1 Running 0 12m pod/heapster-jzjh8 1/1 Running 0 1m pod/influxdb-grafana-bmf6t 2/2 Running 0 1m pod/kube-addon-manager-minikube 1/1 Running 4 1d pod/kube-apiserver-minikube 1/1 Running 0 12m pod/kube-controller-manager-minikube 1/1 Running 0 12m pod/kube-dns-86f4d74b45-46s6t 3/3 Running 16 1d pod/kube-proxy-wfk6l 1/1 Running 0 12m pod/kube-scheduler-minikube 1/1 Running 1 4h pod/kubernetes-dashboard-5498ccf677-x729q 1/1 Running 15 1d pod/storage-provisioner 1/1 Running 12 1d NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/heapster ClusterIP 10.97.188.236 <none> 80/TCP 1m service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 1d service/kubernetes-dashboard NodePort 10.105.24.211 <none> 80:30000/TCP 1d service/monitoring-grafana NodePort 10.99.10.52 <none> 80:30002/TCP 1m service/monitoring-influxdb ClusterIP 10.100.78.58 <none> 8083/TCP,8086/TCP 1m root@zerobig-vm:/home/study/k8s# | cs |
브라우저에 heapster 와 함께 상호작용할 수 있는 엔드포인트를 열어보자:
1 2 | root@zerobig-vm:/home/study/k8s# minikube addons open heapster Opening kubernetes service kube-system/monitoring-grafana in default browser... | cs |
Clean up
이제 여러분의 클러스터에 생성했던 리소스를 정리할 수 있다.
옵션으로 생성했던 도커이미지들을 강제로 제거하고, Minikube 를 중지시키자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | root@zerobig-vm:/home/study/k8s# kubectl delete service hello-node service "hello-node" deleted root@zerobig-vm:/home/study/k8s# kubectl delete deployment hello-node deployment.extensions "hello-node" deleted root@zerobig-vm:/home/study/k8s# docker rmi hello-node:v1 hello-node:v2 -f Untagged: hello-node:v1 Deleted: sha256:4757041590c832faf29f747cfa975b28ff97b93e4bec1a77dc7065eb62df6ef0 Deleted: sha256:f0cd04c7dd3806334d9f272aa9ed10b3e86d41c6773ec8ff2036be0792af02f2 Deleted: sha256:b1a9401f3c754cd65e4601bf1c75407b2fa576dbcaffaafefc783217fb9cd850 Deleted: sha256:fd6c8ea3209e362506ce0d3ddbf694a11e3f3ebc5717f18cfbc8ebcb1eef768c Error response from daemon: No such image: hello-node:v2 root@zerobig-vm:/home/study/k8s# minikube stop Stopping local Kubernetes cluster... Machine stopped. root@zerobig-vm:/home/study/k8s# eval $(minikube docker-env -u) root@zerobig-vm:/home/study/k8s# | cs |
'Kubernetes' 카테고리의 다른 글
05 Kubernetes Basics - Using Minikube to Create a Cluster (0) | 2018.08.19 |
---|---|
04 Kubernetes Basics - Overview (0) | 2018.08.19 |
02 Minikube 설치 on Ubuntu16.04 (2) | 2018.08.16 |
01 Minikube 설치 on CentOS7.5 (5) | 2018.08.15 |
00 제로빅의 Kubernetes(쿠버네티스) Tutorial 실습기 (0) | 2018.08.15 |