이번 시간은 빠르게 설치할 수 있는 경량화된 쿠버네티스인 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 실행하기
우리는 도커 환경을 사용할 예정이기 때문에 --driver
에 docker를 전달하도록 한다
참고로 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에 애플리케이션 배포하기
kubectl
로 minikube에 애플리케이션을 배포해보도록 하자
이 애플리케이션은 쿠버네티스 공식사이트에서 제공하는 매우 간단한 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의 프록시 기능을 사용해야 한다
여기서는 간단히 kubectl
의 port-forward
기능을 사용해본다
포드에 직접 접근해 8080 포트로 접근할 수 있도록 했다
$ kubectl port-forward hello-minikube-64b64df8c9-4rpfp 8080:8080
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080
마찬가지로 잘 접속되는 모습을 확인할 수 있다
이 포트는 외부에서도 접속이 가능하다
'개발강의정리 > DevOps' 카테고리의 다른 글
[데브옵스를 위한 쿠버네티스 마스터] 쿠버네티스 핵심 개념-etcd 데이터베이스 살펴보기 (0) | 2020.09.20 |
---|---|
[데브옵스를 위한 쿠버네티스 마스터] 쿠버네티스 핵심 개념-Kube 시스템 컴포넌트 (0) | 2020.09.20 |
[데브옵스를 위한 쿠버네티스 마스터] 연습문제: GKE에서 인그레스를 활용한 로드밸런싱 프로세스 확인 (0) | 2020.08.22 |
[데브옵스를 위한 쿠버네티스 마스터] 4. 쿠버네티스 핵심 개념 (0) | 2020.08.22 |
[데브옵스를 위한 쿠버네티스 마스터] 3. 쿠버네티스 들어가기 (0) | 2020.08.22 |
댓글