클라우드/쿠버네티스

[Kubernetes] 4. 쿠버네티스 Minikube 설치 및 간단한 배포

윤창이 2021. 4. 29. 15:05
728x90

[주의] 개인 공부를 위해 쓴 글이기 때문에 주관적인 내용은 물론, 쓰여진 정보가 틀린 것일 수도 있습니다!

피드백 부탁드립니다. (- -)(_ _) 꾸벅

 


[ Minikube ]

 Minikube는 쿠버네티스를 로컬에서 쉽게 실행하는 도구이다. Minikube는 매일 쿠버네티스를 사용하거나 개발하려는 사용자들을 위해 가상 머신(VM) 이나 노트북에서 단일 노드 쿠버네티스 클러스터를 실행한다.

 

사실 쿠버네티스를 구축하는 방법은 다양하지만, kubeadm으로 구축하는게 가장 기본인듯 하다. kubernetes에서 제공하는 기본적인 도구이며, kubernetes 클러스터를 가장 빨리 구축하기 위한 다양한 기능을 제공한다.

 

나는 로컬에서 학습용으로 사용하기에 Minikube를 설치했다. 이 글은 minikube 설치와 간단한 배포에 대한 내용을 포함한다.

단일 노드 쿠버네티스 클러스터를 실행하므로 쿠버네티스를 시험해 보거나 일상적인 개발 작업에 사용할 수 있다.

 


[ Minikube 설치하기 ] 

 

시작하기 전에 다음 명령어로 리눅스의 가상화 여부를 확인해본다. 터미널에 쳤는데 아무것도 나오지 않는다면 설치불가. (가상화가 필요없는 docker를 이용하면 사용 가능해보인다. 추측)

$ grep -E --color 'vmx|svm' /proc/cpuinfo

 

minikube를 데비안, RPM 패키지로 설치할 수도 있고, 바이너리 파일 자체를 다운로드하여 설치할 수도 있다.

모두 Github에 각 버전을 릴리즈 해놓았으니 입맛에 맞게 다운받을 수 있다. (github.com/kubernetes/minikube)

 

가장 최신의 설치 방법은 오른쪽의 가이드를 따르자 ( minikube.sigs.k8s.io/docs/start/ )

 

나는 아래 명령을 따랐다. (amd64 아키텍쳐 버전)

$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 \ && chmod +x minikube
$ sudo mkdir -p /usr/local/bin/
$ sudo install minikube /usr/local/bin/

 


[ Minikube 실행하기 ] 

 

나는 docker 환경을 이용하여 minikube를 실행하였다. 이를 위해서면 docker가 이미 설치되어 있어야 한다.

$ minikube start --driver=docker

permission denied 에러 발생.. docker를 일반 유저도 쓸 수 있도록 usermod 명령어를 통해 추가해주자.

 

$ sudo usermod -aG docker $USER && newgrp docker

 

minikube를 docker 환경에서 실행이 완료되었다. (이모티콘들 너무 귀엽다)

 

docker ps 명령 실행 시, 현재 돌아가고 있는 컨테이너 목록을 볼 수 있다.

CONTAINER ID        IMAGE                                 COMMAND                  CREATED             STATUS              PORTS                                                                                                                                  NAMES
7f30ecd9bb8e        gcr.io/k8s-minikube/kicbase:v0.0.20   "/usr/local/bin/entr…"   2 minutes ago       Up 2 minutes        127.0.0.1:32772->22/tcp, 127.0.0.1:32771->2376/tcp, 127.0.0.1:32770->5000/tcp, 127.0.0.1:32769->8443/tcp, 127.0.0.1:32768->32443/tcp   minikube

 

사실 쿠버네티스는 모든 컴포넌트가 여러 컨테이너 형태로 돌아가는데 docker ps 명령 시 minikube 하나 밖에 돌아가지 않는다. 이제 minikube에 접속하여 docker ps를 실행해보자.

 

$ minikube ssh

minikube ssh 실행 시 minikube 노드의 shell이 하나 실행된다. 거기서 docker ps 실행하면

 

CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS          PORTS     NAMES
d0c8d55bc74e   6e38f40d628d           "/storage-provisioner"   12 minutes ago   Up 12 minutes             k8s_storage-provisioner_storage-provisioner_kube-system_372e9030-eb95-4fcb-9527-b396fadb570c_0
c010f5bedb72   k8s.gcr.io/pause:3.2   "/pause"                 12 minutes ago   Up 12 minutes             k8s_POD_storage-provisioner_kube-system_372e9030-eb95-4fcb-9527-b396fadb570c_0
e3ca7c598aeb   bfe3a36ebd25           "/coredns -conf /etc…"   12 minutes ago   Up 12 minutes             k8s_coredns_coredns-74ff55c5b-p6jq2_kube-system_d88a9d7a-7b44-4140-9d89-8f23b79408ae_0
90c5c4659124   k8s.gcr.io/pause:3.2   "/pause"                 12 minutes ago   Up 12 minutes             k8s_POD_coredns-74ff55c5b-p6jq2_kube-system_d88a9d7a-7b44-4140-9d89-8f23b79408ae_0
36e3c078f13e   43154ddb57a8           "/usr/local/bin/kube…"   12 minutes ago   Up 12 minutes             k8s_kube-proxy_kube-proxy-65s88_kube-system_c71c51f8-a765-41fc-8a1d-22a2e68b6eba_0
5e5981df9d2f   k8s.gcr.io/pause:3.2   "/pause"                 12 minutes ago   Up 12 minutes             k8s_POD_kube-proxy-65s88_kube-system_c71c51f8-a765-41fc-8a1d-22a2e68b6eba_0
9540c60ce4bf   0369cf4303ff           "etcd --advertise-cl…"   12 minutes ago   Up 12 minutes             k8s_etcd_etcd-minikube_kube-system_c31fe6a5afdd142cf3450ac972274b36_0
a247188260c0   a27166429d98           "kube-controller-man…"   12 minutes ago   Up 12 minutes             k8s_kube-controller-manager_kube-controller-manager-minikube_kube-system_57b8c22dbe6410e4bd36cf14b0f8bdc7_0
30d0e3a49f05   ed2c44fbdd78           "kube-scheduler --au…"   12 minutes ago   Up 12 minutes             k8s_kube-scheduler_kube-scheduler-minikube_kube-system_6b4a0ee8b3d15a1c2e47c15d32e6eb0d_0
6afcade9b6f3   a8c2fdb8bf76           "kube-apiserver --ad…"   12 minutes ago   Up 12 minutes             k8s_kube-apiserver_kube-apiserver-minikube_kube-system_c767dbeb9ddd2d01964c2fc02c621c4e_0
4a6b28d097c9   k8s.gcr.io/pause:3.2   "/pause"                 12 minutes ago   Up 12 minutes             k8s_POD_kube-scheduler-minikube_kube-system_6b4a0ee8b3d15a1c2e47c15d32e6eb0d_0
483a384470b0   k8s.gcr.io/pause:3.2   "/pause"                 12 minutes ago   Up 12 minutes             k8s_POD_kube-controller-manager-minikube_kube-system_57b8c22dbe6410e4bd36cf14b0f8bdc7_0
e9451e4a9230   k8s.gcr.io/pause:3.2   "/pause"                 12 minutes ago   Up 12 minutes             k8s_POD_kube-apiserver-minikube_kube-system_c767dbeb9ddd2d01964c2fc02c621c4e_0
164976912a63   k8s.gcr.io/pause:3.2   "/pause"                 12 minutes ago   Up 12 minutes             k8s_POD_etcd-minikube_kube-system_c31fe6a5afdd142cf3450ac972274b36_0

 

쿠버네티스 컴포넌트들이 다수의 컨테이너들로 가동중인 것을 볼 수 있었다.

친숙한 k8s_etcd, apiserver, scheduler, controller, POD 등이 보인다.

 

  minikube status로 상태를 확인해볼 수도 있다.

 


[ Minikube로 애플리케이션 배포해보기 ]

kubectl 명령을 이용해서 명령을 내리도록 한다. (그렇다면 kubectl이 설치돼있어야 한다. v1-18.docs.kubernetes.io/ko/docs/tasks/tools/install-kubectl/#%EB%A6%AC%EB%88%85%EC%8A%A4%EC%97%90-kubectl-%EC%84%A4%EC%B9%98)

 

참고로 kubectl과 minikube가 상호작용하기 위해 따로 해줄 설정은 없다.

minikube start 명령어는 Minikube로 부르는 kubectl 콘텍스트를 생성한다. 이 콘텍스트는 Minikube 클러스터와 통신하는 설정을 포함하기 때문이다.

 

Minikube는 이 콘텍스트를 자동적으로 기본으로 설정한다. 만약 미래에 이것을 바꾸고 싶다면 다음을 실행하자.

$ kubectl config use-context minikube

혹은 다음과 같이 커맨드를 실행할 때마다 매번 콘텍스트를 전달한다.

$ kubectl get pods --context=minikube

 

서두가 길었는데 이제 애플리케이션을 배포해보자.

 

$ kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.10
$ kubectl expose deployment hello-minikube --type=NodePort --port=8080

 

create deploymoent로 "hello-minikube"라는 디플로이먼트를 생성한다. image는 쿠버네티스에서 제공하는 매우 간단한 예제를 쓰기로 한다. 그리고 expose를 통해 port를 개방해야하는데, 노드의 포트를 열어야 객체 외부로 서비스를 할 수 있다.

 

$ minikuba dashboard

 

대쉬보드 상에서 확인 가능하다. 한번 만든 디플로이먼트를 대쉬보드로 확인해보자.

 

로컬호스트 상에 열린 대쉬보드를 통해 hello-minikube 디플로이먼트가 생성된 것을 볼 수 있다. 

 

$ kubectl get all
NAME                                  READY   STATUS    RESTARTS   AGE
pod/hello-minikube-5d9b964bfb-qhlkm   1/1     Running   0          19m

NAME                     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
service/hello-minikube   NodePort    10.110.226.7   <none>        8080:30276/TCP   4m13s
service/kubernetes       ClusterIP   10.96.0.1      <none>        443/TCP          97m

NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/hello-minikube   1/1     1            1           19m

NAME                                        DESIRED   CURRENT   READY   AGE
replicaset.apps/hello-minikube-5d9b964bfb   1         1         1       19m

 

kubectl get all 명령으로 현재 실행중인 포드, 서비스, 디플로이먼트, 레플리카셋을 출력한다.

  • 디플로이먼트 : 레플리카셋의 상위 개념으로 애플리케이션 배포의 기본 단위
  • 레플리카셋 : Pod를 정의한 매니페스트 파일로는 Pod 1개밖에 생성할 수 없지만 레플리카세트를 통해 동일한 Pod 여러개 관리 가능
  • Pod : 쿠버네티스 컴퓨팅 리소스의 가장 작은 단위. 컨테이너가 여기에 들어있다.
  • Service : 해당 pod는 외부로 서비스하기 위해 서비스를 갖고 있으며 여기선 8080:30276으로 포트포워딩 되어 있다.

 

$ minikube service hello-minikube --url
  http://192.168.49.2:30276

service의 --url 옵션으로 해당 주소를 얻어올 수 있다.

이제 해당 주소를 열어보자

잘 되는군ㅎㅎ

 


[ Minikube 삭제 ] 

1. service 삭제

$ kubectl delete services hello-minikube

 

2. deployment 삭제

$ kubectl delete deployment hello-minikube

 

3. minikube stpo 및 delete

$ minikube stop
$ minikube delete

 

728x90