개발강의정리/DevOps

[데브옵스를 위한 쿠버네티스 마스터] minikube 소개 및 활용

nineDeveloper 2020. 9. 13.
728x90

이번 시간은 빠르게 설치할 수 있는 경량화된 쿠버네티스인 Minikube를 설치하고 사용하는 방법에 대해 다루겠다
우분투 18.04 환경에서 도커를 사용해서 구축한다

MiniKube를 설치하기 전에

Minikube는 가상환경을 사용해 쿠버네티스 클러스터를 가상으로 구현한다
다음 사이트를 확인하면 각각에서 제공되는 정보를 확인할 수 있다

미니큐브 공식 사이트: 설치하기

https://minikube.sigs.k8s.io/docs/start

쿠버네티스 공식 사이트: Minikube로 쿠버네티스 설치

https://kubernetes.io/ko/docs/setup/learning-environment/minikube

미니큐브리눅스, macOS, 윈도우 환경을 모두 제공하는데 일반적으로 가상환경을 제공하는 애플리케이션을 사용하여 구축한다
도커, KVM, VirtualBox, Bare-metal, Podman 환경에서 각 설치 방법이 모두 다르다
여기서는 앞서 설명한 것처럼 우분투 18.04 환경에 도커를 설치하고 미니큐브 설치를 진행한다

도커 설치하기

우분투 환경에서 도커를 설치하는 방법은 무척 간단하다
다음 명령을 사용해 도커를 설치하도록 한다

sudo apt install docker.io -y

설치가 완료되면 도커를 일반 유저도 사용할 수 있도록 docker의 권한을 수정해주자

sudo usermod -aG docker $USER && newgrp docker

다음 명령이 오류 없이 실행되면 잘 설치된 것이다
도커에서 모든 컨테이너를 조회하는 명령어다

docker ps -a

minikube 다운로드 및 설치하기

우분투 환경에서 minikube를 설치하는 명령어다
다른 환경에서 설치하는 명령은 https://minikube.sigs.k8s.io/docs/start 를 참고하기 바란다

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb
sudo dpkg -i minikube_latest_amd64.deb

minikube 실행하기

우리는 도커 환경을 사용할 예정이기 때문에 --driverdocker를 전달하도록 한다
참고로 root 권한으로 실행할 때는 정상적으로 실행되지 않으니 참고하기 바란다
minikube start 명령은 쿠버네티스 실행을 진행한다
컨테이너 이미지를 받는데 시간이 꽤 걸린다

minikube start --driver=docker
server1@server1-VirtualBox:~$ minikube start --driver=docker
😄  Ubuntu 18.04 (vbox/amd64) 위의 minikube v1.13.0
✨  유저 환경 설정 정보에 기반하여 docker 드라이버를 사용하는 중
👍  Starting control plane node minikube in cluster minikube
🚜  Pulling base image ...
💾  Downloading Kubernetes v1.19.0 preload ...
    > preloaded-images-k8s-v6-v1.19.0-docker-overlay2-amd64.tar.lz4: 486.28 MiB
🔥  Creating docker container (CPUs=2, Memory=2200MB) ...
🐳  쿠버네티스 v1.19.0 을 Docker 19.03.8 런타임으로 설치하는 중
🔎  Verifying Kubernetes components...
🌟  Enabled addons: default-storageclass, storage-provisioner
💡  kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'
🏄  Done! kubectl is now configured to use "minikube" by default

minikube 접속하기

minikube에 클라이언트로 접속하는 가장 간단한 방법은 kubectl을 사용하는 것이다
이때 kubectl을 별도로 설치해주어야 하는데 snap을 통해 다운로드 받을 수 있다
만약 오류와 함께 --classic 옵션을 붙여달라는 문구가 나오면 함께 실행한다

sudo snap install kubectl --classic(필요한 경우에만 붙임)

그리고 쿠버네티스의 노드를 조회하는 명령을 수행

$ kubectl get nodes
NAME       STATUS   ROLES    AGE   VERSION
minikube   Ready    master   18d   v1.19.0

minikube에 SSH로 접속하기

minikube는 가상의 노드를 하나 만들고 그 안에 쿠버네티스 시스템을 구축하는 형태로 돌아간다
도커를 조회하는 명령을 내리면 하나의 도커가 도는 모습이 보인다
사실 쿠버네티스 클러스터는 모든 컴포넌트가 컨테이너 형태로 돌아가기 때문에 원래는 다수의 컨테이너가 보여야 한다

$ docker ps
CONTAINER ID        IMAGE                                COMMAND                  CREATED             STATUS              PORTS                                                                           NAMES
d3f33f316474        gcr.io/k8s-minikube/kicbase:v0.0.8   "/usr/local/bin/entr…"   2 weeks ago         Up 2 hours          127.0.0.1:32770->22/tcp, 127.0.0.1:32769->2376/tcp, 127.0.0.1:32768->8443/tcp   minikube

이 도커 컨테이너가 가상으로 떠있는 노드다
접속해서 내용을 확인하자
노드에 접속하는 방법은 minikube 명령을 사용하기 바란다
minikube ssh 명령을 실행하면 minikube 셸이 떨어진다

$ minikube ssh
docker@minikube:~$

여기서 다시 docker ps 명령을 수행한다
드디어 쿠버네티스 클러스터가 돌아가는데 필요한 다양한 컴포넌트가 보인다

docker@minikube:~$ docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS               NAMES
b8318032a58c        k8s.gcr.io/echoserver   "/usr/local/bin/run.…"   2 hours ago         Up 2 hours                              k8s_echoserver_hello-minikube-64b64df8c9-4rpfp_default_05661a11-4590-4405-bef0-d1f2ace16fbd_0
3b82e3b702b8        k8s.gcr.io/pause:3.2    "/pause"                 2 hours ago         Up 2 hours                              k8s_POD_hello-minikube-64b64df8c9-4rpfp_default_05661a11-4590-4405-bef0-d1f2ace16fbd_0
9aa4865d3d22        4689081edb10            "/storage-provisioner"   2 hours ago         Up 2 hours                              k8s_storage-provisioner_storage-provisioner_kube-system_01d6ac4b-baea-4c20-b3f5-9aced5804ce9_2
17a112f90895        67da37a9a360            "/coredns -conf /etc…"   2 hours ago         Up 2 hours                              k8s_coredns_coredns-66bff467f8-qtwf6_kube-system_26a7b1fe-3301-408a-b3e2-66a6ba026120_1
c926fef99a06        67da37a9a360            "/coredns -conf /etc…"   2 hours ago         Up 2 hours                              k8s_coredns_coredns-66bff467f8-2gg5s_kube-system_63df2597-d262-4496-90ff-dd1f3f0e8254_1
a622f3138180        aa67fec7d7ef            "/bin/kindnetd"          2 hours ago         Up 2 hours                              k8s_kindnet-cni_kindnet-fvfvr_kube-system_56e799ba-d07d-4868-986f-949e15a16903_1
52e5c03a92b6        43940c34f24f            "/usr/local/bin/kube…"   2 hours ago         Up 2 hours                              k8s_kube-proxy_kube-proxy-kf9bf_kube-system_34716ed5-8e81-4649-b362-2c5c853db155_1
de36219a8447        k8s.gcr.io/pause:3.2    "/pause"                 2 hours ago         Up 2 hours                              k8s_POD_coredns-66bff467f8-qtwf6_kube-system_26a7b1fe-3301-408a-b3e2-66a6ba026120_1
4f124a7f7397        k8s.gcr.io/pause:3.2    "/pause"                 2 hours ago         Up 2 hours                              k8s_POD_kindnet-fvfvr_kube-system_56e799ba-d07d-4868-986f-949e15a16903_1
4d0244bb2160        k8s.gcr.io/pause:3.2    "/pause"                 2 hours ago         Up 2 hours                              k8s_POD_kube-proxy-kf9bf_kube-system_34716ed5-8e81-4649-b362-2c5c853db155_1
308155eb6781        k8s.gcr.io/pause:3.2    "/pause"                 2 hours ago         Up 2 hours                              k8s_POD_coredns-66bff467f8-2gg5s_kube-system_63df2597-d262-4496-90ff-dd1f3f0e8254_1
df000c120a86        k8s.gcr.io/pause:3.2    "/pause"                 2 hours ago         Up 2 hours                              k8s_POD_storage-provisioner_kube-system_01d6ac4b-baea-4c20-b3f5-9aced5804ce9_1
fd94a321e4d5        303ce5db0e90            "etcd --advertise-cl…"   2 hours ago         Up 2 hours                              k8s_etcd_etcd-minikube_kube-system_ca02679f24a416493e1c288b16539a55_1
dde622e15e71        74060cea7f70            "kube-apiserver --ad…"   2 hours ago         Up 2 hours                              k8s_kube-apiserver_kube-apiserver-minikube_kube-system_45e2432c538c36239dfecde67cb91065_1
e1e59acc77c2        a31f78c7c8ce            "kube-scheduler --au…"   2 hours ago         Up 2 hours                              k8s_kube-scheduler_kube-scheduler-minikube_kube-system_5795d0c442cb997ff93c49feeb9f6386_1
2062444f0c40        d3e55153f52f            "kube-controller-man…"   2 hours ago         Up 2 hours                              k8s_kube-controller-manager_kube-controller-manager-minikube_kube-system_c92479a2ea69d7c331c16a5105dd1b8c_1
602950e6c7a9        k8s.gcr.io/pause:3.2    "/pause"                 2 hours ago         Up 2 hours                              k8s_POD_kube-scheduler-minikube_kube-system_5795d0c442cb997ff93c49feeb9f6386_1
c9f90063a499        k8s.gcr.io/pause:3.2    "/pause"                 2 hours ago         Up 2 hours                              k8s_POD_kube-controller-manager-minikube_kube-system_c92479a2ea69d7c331c16a5105dd1b8c_1
84a4ac68241d        k8s.gcr.io/pause:3.2    "/pause"                 2 hours ago         Up 2 hours                              k8s_POD_kube-apiserver-minikube_kube-system_45e2432c538c36239dfecde67cb91065_1
24fc87e8a673        k8s.gcr.io/pause:3.2    "/pause"                 2 hours ago  

접속을 종료하고자 할 때는 exit 명령을 수행한다

다음은 minikube가 갖는 아키텍처의 모습을 그림으로 표현한 것이다

VM안에 노드가 떠있는 모습이다

https://blog.codonomics.com/2019/02/loadbalancer-support-with-minikube-for-k8s.html

docker@minikube:~$ exit

minikube에 애플리케이션 배포하기

kubectlminikube에 애플리케이션을 배포해보도록 하자
이 애플리케이션은 쿠버네티스 공식사이트에서 제공하는 매우 간단한 echoserver이다
그리고 외부에서 접근이 가능하도록 expose 명령으로 노드포트를 열도록 한다
쿠버네티스 클러스터의 컨테이너는 서비스라는 객체 없이 외부로 서비스가 불가능하다
때문에 반드시 expose 명령이 필요하다

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

명령이 성공적으로 잘 실행됐다면 쿠버네티스에 배포된 애플리케이션과 서비스를 확인해보도록 하자

$ kubectl get all
NAME                                  READY   STATUS    RESTARTS   AGE
pod/hello-minikube-64b64df8c9-4rpfp   1/1     Running   0          114m

NAME                     TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
service/hello-minikube   NodePort    10.107.241.245   <none>        8080:30017/TCP   113m
service/kubernetes       ClusterIP   10.96.0.1        <none>        443/TCP          18d

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

NAME                                        DESIRED   CURRENT   READY   AGE
replicaset.apps/hello-minikube-64b64df8c9   1         1         1       114m

위에서부터 차례대로 포드, 서비스, 디플로이먼트, 레플리카셋이 보인다
디플로이먼트는 레플리카셋을 관리하고, 다시 레플리카셋은 포드를 관리하는 구조다
그리고 포드가 실질적으로 컨테이너를 포함한다
이 포드는 외부로 서비스하기 위해 서비스를 갖고 여기서 30017이라는 노드 포트로 외부에 열려있다

$ kubectl get svc
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
hello-minikube   NodePort    10.107.241.245   <none>        8080:30017/TCP   118m
kubernetes       ClusterIP   10.96.0.1        <none>        443/TCP          18d

또 다른 확인 방법으로 --url 옵션을 주어도 좋다

$ minikube service hello-minikube --url
http://172.17.0.2:30017

직접 브라우저를 통해 접속해보자
노드는 docker 인터페이스를 사용하고 있으므로 172.17.0.2:30017로 접속해야 한다
실제로 외부에서 접속하려면 docker의 프록시 기능을 사용해야 한다

여기서는 간단히 kubectlport-forward 기능을 사용해본다
포드에 직접 접근해 8080 포트로 접근할 수 있도록 했다

$ kubectl port-forward hello-minikube-64b64df8c9-4rpfp 8080:8080
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080

마찬가지로 잘 접속되는 모습을 확인할 수 있다
이 포트는 외부에서도 접속이 가능하다

728x90

댓글

💲 추천 글