'Tool/Kubernetes'에 해당하는 글 13건

Minikube Addons

Tool/Kubernetes 2019. 3. 28. 21:40

minikube 에는 쿠버네이트 환경에서 사용할 수 있는 애드온들이 내장되어 있으며, 활성화(enabled), 비활성화(disabled), 열기(open) 등의 명령으로 제어할 수 있다.


- 내장 애드온 목록과 상태 보기

> minikube addons list

- addon-manager: enabled

- dashboard: disabled

- default-storageclass: enabled

- efk: disabled

- freshpod: disabled

- gvisor: disabled

- heapster: disabled

- ingress: disabled

- logviewer: disabled

- metrics-server: disabled

- nvidia-driver-installer: disabled

- nvidia-gpu-device-plugin: disabled

- registry: disabled

- registry-creds: disabled

- storage-provisioner: enabled

- storage-provisioner-gluster: disabled


  • dashboard : 클러스터의 웹 UI 툴
  • efk : 로그분석 툴(Elasticsearch, Fluentd 및 Kibana)
  • freshpod : 이미지 리빌드시 pod 재시작
  • gvisor : 컨테이너 런타임을 대체하여 안전하게 pod 실행
  • heapster : 컴퓨터 리소스 분석 및 클러스터 모니터링
  • ingress : 쿠버네티스 Ingress 리소스를 기반으로 구축된 NGINX 컨트롤러
  • logviewer : 경량 로그 툴
  • metrics-server : 클러스터 자원 사용률 및 활용도를 수집



1. heapster addon


꽤 많은 애드온이 있지만 어떤게 유용할지는 모르겠고, 모니터링에 관련된 heapster 와 dashboard 를 한 번 사용해 보기로 했다. 애드온을 활성화 시켜 사용하는 방법은 아래와 같다. 


> minikube addons enable heapster

-   dashboard was successfully heapster


이렇게 애드온을 활성화 시키면 kube-system 이라는 가상 클러스터(namespace) 에 아래와 같이 pod 와 service 가 생성된다.


> kubectl get pod,svc -n kube-system

NAME                                       READY     STATUS    RESTARTS   AGE

pod/coredns-86c58d9df4-krzfn               1/1       Running   1          1d

pod/coredns-86c58d9df4-zs6wk               1/1       Running   1          1d

pod/etcd-minikube                          1/1       Running   1          1d

pod/heapster-xtm6r                         1/1       Running   0          2m

pod/influxdb-grafana-lt6zz                 2/2       Running   0          2m

pod/kube-addon-manager-minikube            1/1       Running   1          1d

pod/kube-apiserver-minikube                1/1       Running   1          1d

pod/kube-controller-manager-minikube       1/1       Running   1          1d

pod/kube-proxy-88cvs                       1/1       Running   0          2h

pod/kube-scheduler-minikube                1/1       Running   1          1d

pod/storage-provisioner                    1/1       Running   4          1d


NAME                           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE

service/heapster               ClusterIP   10.107.156.3     <none>        80/TCP              2m

service/kube-dns               ClusterIP   10.96.0.10       <none>        53/UDP,53/TCP       1d

service/monitoring-grafana     NodePort    10.108.87.143    <none>        80:30002/TCP        2m

service/monitoring-influxdb    ClusterIP   10.110.101.236   <none>        8083/TCP,8086/TCP   2m


아래와 같이 애드온을 open 시키면 해당 애드온이 브라우저에 출력된다.


> minikube addons open heapster

-   Opening kubernetes service kube-system/monitoring-grafana in default browser...


여기서는 Service 타입으로 NodePort 를 사용했는데, 외부에서 포트를 통해 해당 service 로 접근할 수 있다. http://192.168.10.183:30002/ (node ip : node port)





2. dashboard addon


dashboard 애드온은 minikube 명령으로 즉시 사용할 수 있다.


> minikube dashboard

-   Enabling dashboard ...

-   Verifying dashboard health ...

-   Launching proxy ...

-   Verifying proxy health ...

-   Opening http://127.0.0.1:12255/api/v1/namespaces/kube-system/services/http:kubernetes-dashboard:/proxy/ in your default browser...


dashboard 애드온을 enable 하고 proxy 를 사용하여 주소를 생성해 주는 일을 한번에 해결해 주었다. 이 Dashboard 는 쿠버네티스 클러스터의 웹 기반 UI 로써, 클러스터 및 실행중인 어플리케이션 관리 등을 할 수 있다.






WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

Hello minikube

Tool/Kubernetes 2019. 3. 27. 21:43

여차저차해서 Minikube start 명령으로 VM 노드에 클러스터를 생성했다. 이 모든건 삽질이었다. katacoda 란 사이트에서는 minikube 가 설치된 서버에서 브라우저 환경을 제공하여 무료로 minikube 테스트를 할 수 있다.ㅠ 그래도 클러스터 생성하기까지 많은 것들을 얻을 수 있었다! 제일 처음 사용해 본 minikube 명령은 클러스터 생성/중지/삭제 등의 기본적인 구동관련 위주로 쓰이므로 앞으로 자주 사용하게 될 kubectl 명령에 익숙해져야 한다. 이제 쿠버네티스를 맛볼 수 있는 최고의 프로그램 Hello world 어플리케이션 테스트할 수 있다. 단순히 어플리케이션의 구동 테스트이므로 심플하게 과정만 보자. (no VM 환경이라면 클러스터에 명령을 내릴 kubectl 도구를 수동으로 설치해야 한다.)


특정 어플리케이션 컨테이너화(이미지로 빌드) 및 저장소에 푸시하기.

어플리케이션 배포하기.

어플리케이션 구동 확인하기.



1. Deployment 생성


# kubectl create deployment hello-node --image=gcr.io/hello-minikube-zero-install/hello-node

deployment.extensions "hello-node" created


kubectl 은 클러스터(엄밀히 말하면 클러스터의 Master, 더 엄밀히 말하면 Master 의 apiserver) 에 명령할 때 필요한 클라이언트 도구이며, 위와 같이 kubectl create 명령으로 클러스터에 무엇인가를 생성하도록 명령할 수 있다. ( kubectl create deployment  kubectl run  명령과 같다.) 빠른 진행을 위해 배포할 어플리케이션(hello-minikube) 의 컨테이너화, 저장소 푸시 과정이 생략되었으며, 그러한 컨테이너 이미지만 있으면 클러스터에서 배포가 가능하다는 것을 보여준다. 쿠버네티스에서 배포(deployment) 란 특정 노드에 어플리케이션 컨테이너를 담은 pod 를 생성하는 것을 말한다. pod 는 그 안의 어플리케이션 컨테이너와 그 각종 정보(name, port, ...)들을 담고 있다.



2. Deployment 확인


# kubectl get deployments

NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE

hello-node   1         1         1            1           43s


# kubectl get pods

NAME                          READY     STATUS    RESTARTS   AGE

hello-node-64c578bdf8-wgxl5   1/1       Running   0          1h


kubectl get 명령은 클러스터(Master) 에 정보를 요청하는 것이다. 위 명령으로 현재 deployment 와 pod 의 정보 및 상태를 확인할 수 있다. deployment 와 pod 가 뭐가 다른건지 궁금할 수도 있다. pod 는 기본 오브젝트이고 deployment 는 컨트롤러로서(나중 설명), deployment 가 pod 를 컨트롤한다. deployment 가 배포를 위한 전략 정보를 담고 있다면, pod 는 그 전략대로 실행된 결과물로 볼 수 있다. 이렇게 생성된 pod 는 기본적으로 클러스터 내부에서만 접근할 수 있다. 외부에서 접근이 가능하려면 로드밸런스 같은 역할을 하는 Service 를 생성해야 한다.



3. Service 생성


# kubectl expose deployment hello-node --type=LoadBalancer --port=8080

service "hello-node" exposed


외부 네트워크에서 특정 리소스에 접근하려면, kubectl expose 명령을 사용하여 LoadBalancer 타입의 Service 가 생성되며 이를 통해 외부에서 Service 로 접근이 가능하게 할 수 있다.



4. Service 확인


# kubectl get services

NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE

hello-node   LoadBalancer   10.108.144.78   <pending>     8080:30369/TCP   21s

kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP          23m


외부 네트워크에서 접근할 수 있는 Service 리스트이다. 이제 hello world 어플리케이션을 구경할 수 있는 엔드포인트는 어떻게 될까. minikube 에서는 LoadBalancer 타입의 service 라도 외부ip 로 접근이 불가능하나(pending상태), minikube ip 명령으로 cluster 생성시 발급된 VM IP 와 위 service 의 우측 포트 30369 를 통해 접속하거나, minikube service hello-node 명령을 사용하여 즉시 브라우저를 띄워 어플리케이션을 확인할 수 있다. no VM 환경에서는 로컬에서 Service 로 접근이 가능하다. (ex. 10.108.144.78:8080)



5. 어플리케이션 확인


# curl $(minikube service hello-node --url)

Hello World!




6. 리소스 삭제


더이상 클러스터와 생성한 작성들을 사용하지 않는다면 아래와 같이 삭제할 수 있다.


# kubectl delete service hello-node

# kubectl delete deployment hello-node



7. 클러스터 중지/삭제


중지(stop) 는 클러스터 내부의 리소스들이 삭제되지 않지만, 삭제(delete) 는 클러스터 및 내부 리소스들이 모두 삭제된다.


# minikube stop

# minikube delete




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

minikube start

Tool/Kubernetes 2019. 3. 26. 00:20

빠르게(?) 쿠버네티스를 접해 볼 수 있는 minikube 를 간단(?)하게 설치하고 시작해 봤다. minikube 의 시작은 minikube start 였다. 이 minikube start 명령이 한 일은 바로 쿠버네티스 클러스터 생성과 마스터 구성 인데, 그 과정에서 얼마나 많은 일들을 사용자 대신 해줬는지 로그를 보며 살펴보자. 


# minikube start --vm-driver=none

o   minikube v0.35.0 on linux (amd64)

>   Configuring local host environment ...


           ... 생략 ...


i   This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true

>   Creating none VM (CPUs=2, Memory=2048MB, Disk=20000MB) ...

-   "minikube" IP address is 10.0.1.111

-   Configuring Docker as the container runtime ...

-   Preparing Kubernetes environment ...

@   Downloading kubeadm v1.13.4

@   Downloading kubelet v1.13.4

-   Pulling images required by Kubernetes v1.13.4 ...

-   Launching Kubernetes v1.13.4 using kubeadm ...

:   Waiting for pods: apiserver proxy etcd scheduler controller addon-manager dns

-   Configuring cluster permissions ...

-   Verifying component health .....

+   kubectl is now configured to use "minikube"

i   For best results, install kubectl: https://kubernetes.io/docs/tasks/tools/install-kubectl/

=   Done! Thank you for using minikube!



  1. VM 이든 none VM 이든 2CPU, 2GB 메모리, 20GB 디스크의 가상 node 생성.
  2. 컨텍스트(minikube) 를 생성하여 ip 를 할당하고, 컨테이너 런타임으로 docker 구성.
  3. docker 에서 쿠버네티스 이미지를 받고, Master node 측 도구인 kubeadm, kubelet 을 다운받아 kubeadm 으로 클러스터를 생성.
  4. Master 및 각종 pod 컨테이너 구성 : apiserver, proxy, etcd, scheduler, controller, addon-manager, dns
  5. 컴포넌트 상태 체크.
  6. 클러스터과 사용자가 통신할 수 있도록 kubectl 를 구성. (no VM 환경에서는 직접 다운로드)





클러스터를 하나 생성하는데 이렇게 많은 작업들이 필요하다. minikube 로 인해 대부분 자동으로 세팅이 되었지만 나중에 쿠버네티스를 사용할 때는 노드스펙, 네트워크, 디스크, 각종도구 설치, 클러스터 생성 등을 모두 직접 설정해야 한다. 이제 정말 서론은 끝났다. 다음은 진짜 쿠버네티스를 경험할 차례!




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,



Linux 상에서의 Minikube 도 설치 방법이 여러가지이다. 우선 하이퍼바이저 상에서 Minikube 를 구동할 것인지, 호스트에서 직접 구동할 것인지를 선택해야 한다. 하이퍼바이저를 이용한다면 리소스를 더 알뜰히 사용할 수 있겠지만, 모든 리눅스에서 하이퍼바이저를 사용할 수는 없다. Widnows 편에서 말했듯이 CPU 의 가상화(VT-x/AMD-v) 지원과 Bios 에서 가상화 활성화 상태를 확인해야 하는데, 요즘 많이들 사용하는 클라우드 컴퓨팅 서비스(EC2, GCE) 등에서는 대부분 HVM 가상화를 사용하고 있고, 그 자체가 이미 VM 이므로 그들은 Bios 에 접근을 할 수 없다. 결국 클라우드 컴퓨팅에서는 하이퍼바이저를 사용할 수 없으므로 과감히 VM 사용을 포기한다.ㅠ 현재 상황이 Linux 에서 VM 을 돌리기 위해 멀쩡한 PC 들에 Linux 를 까기는 좀;; 아무튼 현재 상황에서는 Linux 에서 VM 없이 호스트에서 Minikube 를 직접 구동시켜는 방법을 사용해야 하며, VM 없이 Minikube 를 시작하는 명령은...


 # minikube start --vm-driver=none 


하지만 EC2 Linux 에서도 minikube 를 정상적으로 구동하기 위해 체크해야 할 것들이 있다.



Minikube 구동시 체크사항


  1. 2cpu, 2GB 메모리, 20GB 디스크 이상의 사양.
    EC2 에서 free-tier 인 t2.micro 는 1cpu, 1G 메모리로, minikube 를 구동할 수 없다. 최소 t2.medium 사양(2cpu, 4GB mem)이 필요하다.

  2. docker 설치(Container Runtime)와 cgroup driver 매칭
    docker 가 반드시 필요하며(docker.io 나 docker-ce), 설치 후 docker info | grep -i cgroup 명령으로 cgroup driver 가 cgroupfs 인지 systemd 인지 확인해야 한다. minikube 구동 후에 kubelet 의 cgroup driver 와 일치하지 않는 다면 관련을 참고하여 일치시킨다. VM 에서 구동시에는 docker 가 자동 설치되며 자동 매칭을 해준 부분이다.

  3. 구동 실패시 클러스터 삭제
    minikube start 로 클러스터가 생성되다가 에러가 발생하면 캐싱으로 인해 에러가 반복될 수 있다. 다시 구동하기 전에는 minikube delete 명령으로 생성된 클러스터를 제거해 준다.



EC2 에서 발생할 수 있는 에러 메시지


- virtualbox 미설치 메시지

# minikube start

o   minikube v0.35.0 on linux (amd64)

>   Creating virtualbox VM (CPUs=2, Memory=2048MB, Disk=20000MB) ...

@   Downloading Minikube ISO ...

 184.42 MB / 184.42 MB [============================================] 100.00% 0s

!   Unable to start VM: create: precreate: VBoxManage not found. Make sure VirtualBox is installed and VBoxManage is in the path


- 가상화 비활성화 메시지

# minikube start

o   minikube v0.35.0 on linux (amd64)

>   Creating virtualbox VM (CPUs=2, Memory=2048MB, Disk=20000MB) ...

!   Unable to start VM: create: precreate: This computer doesn't have VT-X/AMD-v enabled. Enabling it in the BIOS is mandatory


- docker 미설치 메시지

# minikube start --vm-driver=none

i   This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true

>   Creating none VM (CPUs=2, Memory=2048MB, Disk=20000MB) ...

!   Unable to start VM: create: precreate: exec: "docker": executable file not found in $PATH


- cgroup driver 불일치 메시지

# minikube start --vm-driver=none

This error is likely caused by:

- The kubelet is not running

- The kubelet is unhealthy due to a misconfiguration of the node in some way (required cgroups disabled)



EC2 (ubuntu) 에서 minikube 구동 성공


# minikube start --vm-driver=none

o   minikube v0.35.0 on linux (amd64)

>   Configuring local host environment ...


!   The 'none' driver provides limited isolation and may reduce system security and reliability.

!   For more information, see:

-   https://github.com/kubernetes/minikube/blob/master/docs/vmdriver-none.md


!   kubectl and minikube configuration will be stored in /root

!   To use kubectl or minikube commands as your own user, you may

!   need to relocate them. For example, to overwrite your own settings:


    - sudo mv /root/.kube /root/.minikube $HOME

    - sudo chown -R $USER $HOME/.kube $HOME/.minikube


i   This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true

>   Creating none VM (CPUs=2, Memory=2048MB, Disk=20000MB) ...

-   "minikube" IP address is 10.0.1.121

-   Configuring Docker as the container runtime ...

-   Preparing Kubernetes environment ...

-   Pulling images required by Kubernetes v1.13.4 ...

-   Launching Kubernetes v1.13.4 using kubeadm ...

:   Waiting for pods: apiserver proxy etcd scheduler controller addon-manager dns

-   Configuring cluster permissions ...

-   Verifying component health .....

+   kubectl is now configured to use "minikube"

=   Done! Thank you for using minikube!

root@ip-10-0-1-121:~# minikube status

host: Running

kubelet: Running

apiserver: Running

kubectl: Correctly Configured: pointing to minikube-vm at 10.0.1.121




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

Minikube 설치를 마친 후 실행만 해주면 쿠버네티스를 맛볼 수 있다. 실행 명령어는!


 > minikube start 



타 프로그램들은 어떻게든 설치를 하고 나면 실행 과정에서 오류가 나는 일은 거의 없다. 하지만 Minikube 는 설치가 잘되더라도(바이너리 파일을 갖다 쓰는 정도이니 설치랄 것도 없지만) 이 Minikube 가 실행되기 까지 많은 설정들이 필요할 수도 있다. 시스템마다 조금씩 다르겠지만 Minikube 를 VM 에서 실행하려면 하이퍼바이저가 필요하며, VM 에서 실행하지 않으려면 Linux 시스템과 docker 가 필요하다. 하이퍼바이저(Hyperviser) 란 VirtualBox 나 VMware, Hyper-V 같이 물리적인 호스트에서 다수의 가상머신(VM) 을 실행할 수 있도록 하여, CPU, 메모리, 네트워크 대역폭 등의 컴퓨팅 자원을 더 효과적으로 사용할 수 있게 하는 도구이다. Windows 에서 Minikube 를 실행하려면 리눅스 환경이 필요하므로 하이퍼바이저가 반드시 필요하다. 하이퍼바이저의 구동 환경 역시 까다롭다. 대부분의 하이퍼바이저는 CPU 가 가상화(indel: VT-x / amd: AMD-v) 를 지원해야 하고 컴퓨터의 Bios 에서 가상화(Virtualization) 같은 가상화 관련 항목이 활성화 되어 있어야 한다. 참고로 지금 내가 사용중인 Windows 10 에서, Home 에디션을 제외하고는 hyper-v 가 설치되어 있으며, Docker Desktop 을 설치하여 hyper-v 를 활성화 시키거나 수동으로 Powershell 에서 활성화를 시켜 따로 하이퍼바이저를 설치하지 않고 진행하였다.



Minikube 실행 전 준비사항

1. CPU 가상화 지원 (체크: SecurAble) 및 Bios 가상화 활성화 확인

2. 하이퍼바이저 설치 (VirtualBox, hyper-V, KVM 등)

3. Minikube 실행시 해당 하이퍼바이저 명시 (default: virtualbox)



오류 메시지


만약 가상화가 활성화 되어 있지 않은 경우 해당하는 오류 메시지를 나타내며 실행을 중지한다. 아래는 하이퍼바이저를 설치했지만 명시하지 않아 default 하이퍼바이저인 virtualbox 가 없다는 오류 메시지이다.


C:\Windows\system32> minikube start

o   minikube v0.35.0 on windows (amd64)

>   Creating virtualbox VM (CPUs=2, Memory=2048MB, Disk=20000MB) ...

@   Downloading Minikube ISO ...

 184.42 MB / 184.42 MB [============================================] 100.00% 0s

!   Unable to start VM: create: precreate: VBoxManage not found. Make sure VirtualBox is installed and VBoxManage is in the path


아래는 로컬에 활성화 되어 있는 Hyper-V 를 명시했지만 외부 가상 스위치가 없다는 오류 메시지이다.


C:\Windows\system32> minikube start --vm-driver=hyperv

o   minikube v0.35.0 on windows (amd64)

>   Creating hyperv VM (CPUs=2, Memory=2048MB, Disk=20000MB) ...

!   Unable to start VM: create: precreate: no External vswitch found. A valid vswitch must be available for this command to run. Check https://docs.docker.com/machine/drivers/hyper-v/


Hyper-V 관리자에서 [가상 스위치 관리자...] 를 클릭하여 Minikube 에 사용할 외부 네티워크 스위치를 생성한다.



다른 하이퍼바이저를 사용할 때도 오류 메시지가 나타난다면 위처럼 메시지를 보고 해결하면 될 것이다. 



정상 동작


C:\Windows\system32>minikube start --vm-driver=hyperv

o   minikube v0.35.0 on windows (amd64)

>   Creating hyperv VM (CPUs=2, Memory=2048MB, Disk=20000MB) ...

-   "minikube" IP address is 192.168.10.163

-   Configuring Docker as the container runtime ...

-   Preparing Kubernetes environment ...

@   Downloading kubelet v1.13.4

@   Downloading kubeadm v1.13.4

-   Pulling images required by Kubernetes v1.13.4 ...

-   Launching Kubernetes v1.13.4 using kubeadm ...

:   Waiting for pods: apiserver proxy etcd scheduler controller addon-manager dns

-   Configuring cluster permissions ...

-   Verifying component health .....

+   kubectl is now configured to use "minikube"

=   Done! Thank you for using minikube!


C:\Windows\system32>minikube status

host: Running

kubelet: Running

apiserver: Running

kubectl: Correctly Configured: pointing to minikube-vm at 192.168.10.163


정상적으로 시작이 되었다면 VM 에 minikube 가 구동되고 있을 것이다. ㅊㅋㅊㅋ!




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,