Cloud/Cloud Native

application deploy using minikube

Jacob_baek 2017. 9. 4. 15:27

minikube는 all-in-one kubernetes 이다.
kubernetes가 설치된 하나의 VM을 생성하고 해당 VM을 통해 kubernetes를 연결할 수 있도록 도와주는 도구라 생각하면 좋다.

설치방법은 다음과 같다.

Windows

간단히 아래 command를 통해 설치가 가능하다.

choco install minikube

이후 powershell command line으로 연결해서 kubectl 명령을 수행해보면 정상적으로 명령이 실행됨을 확인할 수 있다.

이후 아래와 같은 명령을 통해 minikube VM을 실행한다. windows의 경우 hyperV (windows 내장 hypervisor)혹은 virtualbox를 사용할 수 있다. 기본은 virtualbox임으로 아래와 같이 수행한다.

minikube start

CentOS / RHEL

CentOS 7 기반 설치 방법

현재 시점(2017.6)에는 docker machine kvm driver는 v0.10.0이 테스트 되어 해당 버전으로 설치를 진행

curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube
chmod +x minikube
sudo mv minikube /usr/local/bin/
curl -L https://github.com/dhiltgen/docker-machine-kvm/releases/download/v0.10.0/docker-machine-drvier-kvm-centos7 > /usr/local/bin/docker-machine-driver-kvm
chmod +x /usr/local/bin/docker-machine-driver-kvm
minikube start --vm-driver=kvm

Ubuntu

만약 kubectl 실행시 command not found로 출력된다면 minikube kubectl 명령을 사용하던지 직접 kubectl을 설치하여 사용할 수 있다. (snap install kubectl --classic)

minikube 사용법

minikube는 지정한 hypervisor를 사용하여 VM 형태로 생성이 된다.
참고로 minikube VM의 spec을 변경하고자 한다면 아래 명령을 참고하여 VM spec을 지정해줄수 있다.

# 기본으로 생성되는 VM의 size가 2G임으로 위와 같이 spec을 지정해주는것이 좀더 편리하게 사용할 수 있다.
minikube start --memory=8192 --cpus=4 --disk-size=50g

minikube start 이후 kubectl을 통해 서비스의 상태를 확인한다.

https://darkowlzz.github.io/post/minikube-config/

우선

모두 가동된 후에는 아래와 같이 service를 확인하고 dashboard에 접속할 수 있다.

PS C:\Users\jacob> minikube service list
|----------------------|---------------------------|--------------|-----|
|      NAMESPACE       |           NAME            | TARGET PORT  | URL |
|----------------------|---------------------------|--------------|-----|
| default              | kubernetes                | No node port |
| kube-system          | kube-dns                  | No node port |
| kubernetes-dashboard | dashboard-metrics-scraper | No node port |
| kubernetes-dashboard | kubernetes-dashboard      | No node port |
|----------------------|---------------------------|--------------|-----|`

nginx-deployment 배포 및 확인

jacob@jacob-laptop:~/workspaces/hellonode$ kubectl apply -f https://k8s.io/examples/application/deployment.yaml
deployment.apps/nginx-deployment created
jacob@jacob-laptop:~/workspaces/hellonode$ kubectl describe deployment nginx-deployment
Name:                   nginx-deployment
Namespace:              default
CreationTimestamp:      Sat, 28 Sep 2019 22:11:32 +0900
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 1
                        kubectl.kubernetes.io/last-applied-configuration:
                          {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},"spec":{"replica...
Selector:               app=nginx
Replicas:               2 desired | 2 updated | 2 total | 1 available | 1 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:        nginx:1.7.9
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      False   MinimumReplicasUnavailable
  Progressing    True    ReplicaSetUpdated
OldReplicaSets:  <none>
NewReplicaSet:   nginx-deployment-54f57cf6bf (2/2 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  18s   deployment-controller  Scaled up replica set nginx-deployment-54f57cf6bf to 2
jacob@jacob-laptop:~/workspaces/hellonode$ kubectl expose deployment nginx-deployment --type=LoadBalancer
service/nginx-deployment exposed

혹은 더 간단하게

PS C:\Users\82103> minikube addons enable ingress
* ingress was successfully enabled
PS C:\Users\82103> kubectl.exe get po -n kube-system
NAME                                        READY   STATUS    RESTARTS   AGE
coredns-5644d7b6d9-9xx4s                    1/1     Running   0          9m31s
coredns-5644d7b6d9-q5gw5                    1/1     Running   0          9m31s
etcd-minikube                               1/1     Running   0          8m23s
kube-addon-manager-minikube                 1/1     Running   0          9m41s
kube-apiserver-minikube                     1/1     Running   0          8m35s
kube-controller-manager-minikube            1/1     Running   0          8m41s
kube-proxy-hfblg                            1/1     Running   0          9m31s
kube-scheduler-minikube                     1/1     Running   0          8m34s
nginx-ingress-controller-6fc5bcc8c9-cfh5z   1/1     Running   0          9m28s
storage-provisioner                         1/1     Running   0          9m28s

hello-node deployment 생성 및 확인

local에 이미지를 생성하고 이를 사용할 예정이기에 imagePullPolicy: Never로 설정하여 사용한다.

jacob@jacob-laptop:~/workspaces/hellonode$ kubectl run node-hello --image=node-hello:v1 --port=8080 --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/node-hello created


jacob@jacob-laptop:~/workspaces/hellonode$ docker build -t node-hello:v1 .
Sending build context to Docker daemon  3.072kB
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 
...

jacob@jacob-laptop:~/workspaces/hellonode$ kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
node-hello-7485d74cdc-jv8pz   1/1     Running   0          35s

jacob@jacob-laptop:~/workspaces/hellonode$ kubectl expose deployment node-hello --type=LoadBalancer
service/node-hello exposed
jacob@jacob-laptop:~/workspaces/hellonode$ kubectl get svc
NAME          TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes    ClusterIP      10.96.0.1      <none>        443/TCP          37m
nginxtestlb   LoadBalancer   10.106.79.54   <pending>     8080:30007/TCP   112s
jacob@jacob-laptop:~/workspaces/hellonode$ kubectl get deployment
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
node-hello   1/1     1            1           92s

실제 확인은 minikube ip와 port의 조합으로 접속해보면 다음과 같은 화면이 출력되는것을 확인할 수 있다.

hello-py deployment 생성 및 확인

https://www.jacobbaek.com/829 참고

참고

아래 링크를 참고하여 container runtime을 다르게 설정할수도 있다.
[https://v1-13.docs.kubernetes.io/ko/docs/setup/minikube/#cri-o]

아래 링크는 지원되는 hypervisor list이다.
[https://minikube.sigs.k8s.io/docs/reference/drivers/]