'minikube'에 해당하는 글 7건

hello minikube 글에서 어플리케이션 배포부터 노출까지 알아봤었는데 그 때의 배포 명령이 기억 나는가?


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

deployment.extensions "hello-node" created


위와 같이 kubectl create deployment 명령 다음에 배포에 관련된 정보나 상태 등의 spec 을 inline 으로 나열하였었다. 명령의 이러한 파라미터들은 JSON 형식으로 변환되어 쿠버네티스 API 로 전달된 후 처리된다. 이렇게 kubectl 명령에 inline 으로 파라미터나 플러그 등을 나열하는 것을 명령형(Imperative) 커맨드라고 하며, 주로 일회성 작업을 할 때 사용한다. 나열될 파라미터 수가 적을 때 사용하면 유용하다.


또 한가지 배포에 관련된 정보나 상태 등의 spec 을 상세하게 나열하는 대신 파일(.yaml) 안에 정의하는 방법을 사용할 수도 있는데, 이것을 명령형 오브젝트 구성(Imperative object configuration) 이라고 한다. 다음과 같이 로컬 파일이나 url 상의 파일을 지정하여 사용할 수 있다.


$ kubectl create -f deployment.yaml

$ kubectl create -f https://k8s.io/examples/application/deployment.yaml


위 yaml 예제 파일에는 다음과 같이 3개의 nginx 파드를 생성하는 내용이 담겨 있다.


apiVersion: apps/v1

kind: Deployment

metadata:

  name: nginx-deployment

  labels:

    app: nginx

spec:

  replicas: 3

  selector:

    matchLabels:

      app: nginx

  template:

    metadata:

      labels:

        app: nginx

    spec:

      containers:

      - name: nginx

        image: nginx:1.7.9

        ports:

        - containerPort: 80


.yaml(야믈) 파일은 위처럼 공백 문자를 이용한 들여쓰기로 구조체를 구분하며, 리스트, 해시, 스칼라 데이터의 조합을 모두 표현할 수 있다. 각 항목들을 살펴보면 통신할 api 버전, 생성할 오브젝트 종류, 이름, 식별자, 파드 수, 어플리케이션 이름, 컨테이너 이미지 정보, 연결포트 등이 정의되어 있으며, 쿠버네티스 API 는 이 정의대로 Deployment 를 생성하게 된다. 운영시에는 inline 방식의 명령형 커맨드 보다는 .yaml 파일에 오브젝트를 정의하는 명령형 오브젝트 구성을 주로 사용하게 되며, 위처럼 아주 깔끔하고, 명확하게 오브젝트의 의도를 한눈에 파악할 수 있다. 물론 .yaml 파일을 작성하는 방법이나 오브젝트 정의 방법을 숙지해야 하는 것은 함정!



오브젝트 정의 방법을 간단하게 살펴보자.


쿠버네티스에서 가장 중요한 것은 무엇일까. 아마도 위에 정의한 것 처럼 사용자가 원하는 리소스 및 스펙이 계속해서 유지되는 것이 가장 중요할 것이다. 즉, 사용자가 바라는 상태(desired state) 를 계속해서 유지해야 한다. 배포될 어플리케이션(pod)의 워크로드 정보를 나타내는 클러스터 정보(namespace), 네트워크(service), 디스크 리소스(volume) 를 쿠버네티스의 기본 오브젝트라고 한다. 또한 기본 오브젝트들을 편리하게 관리하기 위한 컨트롤러들이 있다. 파드 복제 수(ReplicaSet), 배포(Deployment), 상태관리API(StatefulSet), 파드를 모든 노드에 복제(DaemonSet), 단일실행(Job) 들이 그것이다. 이러한 오브젝트들은 위와 같이 .yaml 파일에 정의하여 생성/업데이트/삭제 등의 관리를 할 수 있다.


아래는 오브젝트 정의에 필요한 필수 요소이다.

  • apiVersion - 이 오브젝트를 생성하는데 사용할 API 버전
  • kind - 생성할 오브젝트 종류
  • metadata - 오브젝트를 식별할 수 있는 고유 이름
  • spec - 오브젝트 특유의 중첩된 필드를 포함하며, 오브젝트마다 정확한 포맷이 다르므로 관리할 오브젝트의 spec 포맷을 확인한다.


$ kubectl create -f deployment.yaml


위의 deployment 오브젝트 정보를 담은 .yaml 파일을 실행하면 아래와 같이 nginx 를 구동하는 3개의 파드가 생성된 것을 확인할 수 있다.


$ kubectl get pods -o wide

NAME                                READY     STATUS    RESTARTS   AGE       IP            NODE

nginx-deployment-76bf4969df-4tvtv   1/1       Running   0          30m       172.17.0.10   minikube

nginx-deployment-76bf4969df-8d5sk   1/1       Running   0          30m       172.17.0.9    minikube

nginx-deployment-76bf4969df-g6v79   1/1       Running   0          30m       172.17.0.8    minikube





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

,

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

,