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

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
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

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
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret



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
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

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
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

Minikube 설치

Tool/Kubernetes 2019. 3. 21. 21:07

로컬 머신 솔루션


쿠버네티스의 많은 설치 솔루션 중 가장 접근성이 편한 것이 로컬 머신 솔루션이다. 무료인데다가 PC 나 노트북 등에서 리눅스가 아닌 OS 환경에서도 쉽게(?) 이용할 수 있다. 아무래도 로컬 머신 솔루션은 개발 및 테스트가 목적이라 빠르고 간편한(?) 설치 등의 장점이 있는 반면에 약간의 제약들도 있을 것이다. 어짜피 이것들로 운영은 어려우며 초반에만 가지고 놀 것들이니 대충 써보고 정 붙이지는 말자. 쿠버네티스를 사용하려면 리눅스 환경이 필요한데, Windows 에서 virtualbox 같은 하이퍼바이저를 사용하여 쿠버네티스를 이용할 수 있게 해놓은 솔루션도 있다. 아래는 쿠버네티스의 로컬 머신 솔루션의 일부이다. 


  1. Minikube
    쿠버네티스 공식사이트에서 추천하는 로컬 머신 솔루션이며 Windows/Mac/Linux 에서 사용 가능하고 많은 애드온을 추가할 수 있다. 단일 노드만 지원하므로 다중 노드를 위한 기능은 동작하지 않을 것이다.

  2. Docker Desctop
    Windows/Mac 에서만 사용 가능하며 Docker 설치 후 설정에서 kubernetes 만 체크하면 수 분 내에 설치가 완료된다. 마찬가지로 단일 노드만 지원한다.

  3. Minishift
    Redhat 쿠버네티스 지원 플랫폼인 openshift 를 테스트할 수 있는 도구로, Windows/Mac/Linux 에서 사용 가능하며, 역시 단일 노드.

  4. Microk8s
    리눅스에서만 사용 가능하며 VM 은 필요없다, 마찬가지 단일 노드.

  5. Kubeadm-dind
    dind (Docker IN Docker) 기술로 멀티 노드를 지원하는 솔루션이다. 리눅스에서만 사용 가능,  그냥 배포판을 사용하는 것이...


Windows 사용자라면 고민할 필요없이 Minikube 이다. 다른 솔루션에 비해 모든 OS 와 많은 VM / Addon 을 지원한다. 나 역시 Minikube 를 사용하여 단일 노드로 할 수 있는 거의 모든 것들을 테스트 해 보기로 결정했다. 다음은 리눅스 서버로 클러스트 생성과 멀티 노드 등 나머지 테스트. 마지막에는 호스티드 솔루션(gke, eks)에서 최종 서비스를 하는 걸로.




Minikube 설치


준비할 거 없음. 바로 설치 고고~



1. macOS


- Homebrew 로 설치

$ brew cask install minikube


- 바이너리로 설치

$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64 \

  && chmod +x minikube

$ sudo mv minikube /usr/local/bin


* curl -o(output) 옵션은 stdout 출력을 파일에 작성한다. 여러 URL 이나 바이너리 등에 사용한다.



2. Linux


- 바이너리로 설치

$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 \

  && chmod +x minikube

$ sudo cp minikube /usr/local/bin && rm minikube



3. Windows


- 윈도우즈 패키지 매니저인 Chocolatey 로 설치 (관리자권한 cmd)

> choco install minikube kubernetes-cli


- 바이너리로 설치

minikube-windows-amd64 다운로드 후 minikube.exe 로 이름 변경하고 path 에 추가


- 인스톨러로 설치

minikube-installer.exe 다운로드 후 실행




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

트랙백  0 , 댓글  0개가 달렸습니다.
secret