티스토리 뷰

Kubernetes

03 Hello Minikube

zerobig-k8s 2018. 8. 16. 00:58

<출처> 

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


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/01   »
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
글 보관함