참고자료 및 출처
•
하나 더 만들기
•
MiniKube를 설치하기 전에
•
Minikube는 가상환경을 사용해 쿠버네티스 클러스터를 가상으로 구현한다. 다음 사이트를 확인하면 각각에서 제공되는 정보를 확인할 수 있다.
미니큐브 공식 사이트: 설치하기
쿠버네티스 공식 사이트: Minikube로 쿠버네티스 설치
•
미니큐브는 리눅스, macOS, 윈도우 환경을 모두 제공하는데 일반적으로 가상환경을 제공하는 애플리케이션을 사용하여 구축한다.
•
도커, KVM, VirtualBox, Bare-metal, Podman 환경에서 각 설치 방법이 모두 다르다. 여기서는 앞서 설명한 것처럼 우분투 18.04 환경에 도커를 설치하고 미니큐브 설치를 진행한다.
도커부터 일단 설치하자
•
패키지 업데이트
sudo apt-get update
Go
복사
•
docker 설치
sudo apt install docker.io -y
Go
복사
•
docker를 일반유저가 사용하도록 권한을 주자
sudo usermod -aG docker $USER && newgrp docker
Go
복사
•
도커의 모든 컨테이너를 조회하여 문제사항 있는제 check하자
docker ps -a
Go
복사
•
minikube 사이트
•
일단 아래의 명령어를 입력해서 curl를 설치부터 하자
sudo apt install curl
Go
복사
•
상기의 사이트에서 linux 버전으로 설치 명령어를 입력하자
•
아래는 명령어
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb
sudo dpkg -i minikube_latest_amd64.deb
Go
복사
•
minikube 실행하기
minikube start --driver=docker
Go
복사
•
도커 환경을 사용하기 위해서 driver 옵션에 docker를 넣는다.
•
root 권한으로 설치를 하면 안된다.
•
시간이 꽤 걸린다.
Minikube 접속하기
•
minikube에 클라이언트로 접속하는 가장 간단한 방법은 kubectl
•
이때 kubectl을 별도로 설치해주어야 하는데 snap을 통해 다운로드 받을 수 있다.
•
만약 오류와 함께 --classic 옵션을 붙여달라는 문구가 나오면 "sudo snap install kubectl --classic" 를 실행하고 안나오면 --classic을 지운다.
sudo snap install kubectl --classic
Go
복사
•
쿠버네티스의 노드를 조회하는 명령을 수행한다.
erver1@server1-VirtualBox:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane,master 4m22s v1.21.2
server1@server1-VirtualBox:~$
Go
복사
minikube에 SSH로 접속하기
•
minikube는 가상의 노드를 하나 만들고 그 안에 쿠버네티스 시스템을 구축하는 형태로 돌아간다. 도커를 조회하는 명령을 내리면 하나의 도커가 도는 모습이 보인다. 사실 쿠버네티스 클러스터는 모든 컴포넌트가 컨테이너 형태로 돌아가기 때문에 원래는 다수의 컨테이너가 보여야 한다.
server1@server1-VirtualBox:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
db71a94bd4e4 gcr.io/k8s-minikube/kicbase:v0.0.25 "/usr/local/bin/entr…" 12 minutes ago Up 12 minutes 127.0.0.1:49157->22/tcp, 127.0.0.1:49156->2376/tcp, 127.0.0.1:49155->5000/tcp, 127.0.0.1:49154->8443/tcp, 127.0.0.1:49153->32443/tcp minikube
server1@server1-VirtualBox:~$
Go
복사
•
이 도커 컨테이너가 가상으로 떠있는 노드다.
•
접속해서 내용을 확인하자. 노드에 접속하는 방법은 minikube 명령을 사용하기 바란다.
•
minikube ssh 명령을 실행하면 minikube 셸이 떨어진다.
server1@server1-VirtualBox:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
db71a94bd4e4 gcr.io/k8s-minikube/kicbase:v0.0.25 "/usr/local/bin/entr…" 12 minutes ago Up 12 minutes 127.0.0.1:49157->22/tcp, 127.0.0.1:49156->2376/tcp, 127.0.0.1:49155->5000/tcp, 127.0.0.1:49154->8443/tcp, 127.0.0.1:49153->32443/tcp minikube
server1@server1-VirtualBox:~$
Go
복사
•
여기서 다시 docker ps 명령을 수행한다. 드디어 쿠버네티스 클러스터가 돌아가는데 필요한 다양한 컴포넌트가 보인다.
server1@server1-VirtualBox:~$ minikube ssh
docker@minikube:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
52c73a47d5c8 6e38f40d628d "/storage-provisioner" 12 minutes ago Up 12 minutes k8s_storage-provisioner_storage-provisioner_kube-system_d0716785-a5d6-4c1e-9931-e701f913804c_0
68a720ddde34 k8s.gcr.io/pause:3.4.1 "/pause" 12 minutes ago Up 12 minutes k8s_POD_storage-provisioner_kube-system_d0716785-a5d6-4c1e-9931-e701f913804c_0
5af4982a2f4b 296a6d5035e2 "/coredns -conf /etc…" 12 minutes ago Up 12 minutes k8s_coredns_coredns-558bd4d5db-42kph_kube-system_755d2b65-8ef2-40d4-9363-ab49da325520_0
9f12d45709c1 a6ebd1c1ad98 "/usr/local/bin/kube…" 12 minutes ago Up 12 minutes k8s_kube-proxy_kube-proxy-cpjxq_kube-system_76135fb6-55c2-41d5-bdd0-75eaaf542371_0
a871ac0b7915 k8s.gcr.io/pause:3.4.1 "/pause" 12 minutes ago Up 12 minutes k8s_POD_kube-proxy-cpjxq_kube-system_76135fb6-55c2-41d5-bdd0-75eaaf542371_0
64bafb9a8c0f k8s.gcr.io/pause:3.4.1 "/pause" 12 minutes ago Up 12 minutes k8s_POD_coredns-558bd4d5db-42kph_kube-system_755d2b65-8ef2-40d4-9363-ab49da325520_0
83613953ee5c 0369cf4303ff "etcd --advertise-cl…" 12 minutes ago Up 12 minutes k8s_etcd_etcd-minikube_kube-system_be5cbc7ffcadbd4ffc776526843ee514_0
6588aca11090 f917b8c8f55b "kube-scheduler --au…" 12 minutes ago Up 12 minutes k8s_kube-scheduler_kube-scheduler-minikube_kube-system_a2acd1bccd50fd7790183537181f658e_0
48863aa114a3 106ff58d4308 "kube-apiserver --ad…" 12 minutes ago Up 12 minutes k8s_kube-apiserver_kube-apiserver-minikube_kube-system_cefbe66f503bf010430ec3521cf31be8_0
72bf6b9ba008 ae24db9aa2cc "kube-controller-man…" 12 minutes ago Up 12 minutes k8s_kube-controller-manager_kube-controller-manager-minikube_kube-system_a5754fbaabd2854e0e0cdce8400679ea_0
0bef8da52358 k8s.gcr.io/pause:3.4.1 "/pause" 12 minutes ago Up 12 minutes k8s_POD_kube-apiserver-minikube_kube-system_cefbe66f503bf010430ec3521cf31be8_0
14cb56c968e2 k8s.gcr.io/pause:3.4.1 "/pause" 12 minutes ago Up 12 minutes k8s_POD_etcd-minikube_kube-system_be5cbc7ffcadbd4ffc776526843ee514_0
d621b5059e5b k8s.gcr.io/pause:3.4.1 "/pause" 12 minutes ago Up 12 minutes k8s_POD_kube-scheduler-minikube_kube-system_a2acd1bccd50fd7790183537181f658e_0
d0b3b3625e54 k8s.gcr.io/pause:3.4.1 "/pause" 12 minutes ago Up 12 minutes k8s_POD_kube-controller-manager-minikube_kube-system_a5754fbaabd2854e0e0cdce8400679ea_0
docker@minikube:~$
Go
복사
•
다음은 minikube가 갖는 아키텍처의 모습을 그림으로 표현한 것이다. VM안에 노드가 떠있는 모습이다.
•
접속을 종료하고자 할 때는 exit 명령을 수행한다.
server1@server1-VirtualBox:~$ minikube ssh
docker@minikube:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
52c73a47d5c8 6e38f40d628d "/storage-provisioner" 12 minutes ago Up 12 minutes k8s_storage-provisioner_storage-provisioner_kube-system_d0716785-a5d6-4c1e-9931-e701f913804c_0
68a720ddde34 k8s.gcr.io/pause:3.4.1 "/pause" 12 minutes ago Up 12 minutes k8s_POD_storage-provisioner_kube-system_d0716785-a5d6-4c1e-9931-e701f913804c_0
5af4982a2f4b 296a6d5035e2 "/coredns -conf /etc…" 12 minutes ago Up 12 minutes k8s_coredns_coredns-558bd4d5db-42kph_kube-system_755d2b65-8ef2-40d4-9363-ab49da325520_0
9f12d45709c1 a6ebd1c1ad98 "/usr/local/bin/kube…" 12 minutes ago Up 12 minutes k8s_kube-proxy_kube-proxy-cpjxq_kube-system_76135fb6-55c2-41d5-bdd0-75eaaf542371_0
a871ac0b7915 k8s.gcr.io/pause:3.4.1 "/pause" 12 minutes ago Up 12 minutes k8s_POD_kube-proxy-cpjxq_kube-system_76135fb6-55c2-41d5-bdd0-75eaaf542371_0
64bafb9a8c0f k8s.gcr.io/pause:3.4.1 "/pause" 12 minutes ago Up 12 minutes k8s_POD_coredns-558bd4d5db-42kph_kube-system_755d2b65-8ef2-40d4-9363-ab49da325520_0
83613953ee5c 0369cf4303ff "etcd --advertise-cl…" 12 minutes ago Up 12 minutes k8s_etcd_etcd-minikube_kube-system_be5cbc7ffcadbd4ffc776526843ee514_0
6588aca11090 f917b8c8f55b "kube-scheduler --au…" 12 minutes ago Up 12 minutes k8s_kube-scheduler_kube-scheduler-minikube_kube-system_a2acd1bccd50fd7790183537181f658e_0
48863aa114a3 106ff58d4308 "kube-apiserver --ad…" 12 minutes ago Up 12 minutes k8s_kube-apiserver_kube-apiserver-minikube_kube-system_cefbe66f503bf010430ec3521cf31be8_0
72bf6b9ba008 ae24db9aa2cc "kube-controller-man…" 12 minutes ago Up 12 minutes k8s_kube-controller-manager_kube-controller-manager-minikube_kube-system_a5754fbaabd2854e0e0cdce8400679ea_0
0bef8da52358 k8s.gcr.io/pause:3.4.1 "/pause" 12 minutes ago Up 12 minutes k8s_POD_kube-apiserver-minikube_kube-system_cefbe66f503bf010430ec3521cf31be8_0
14cb56c968e2 k8s.gcr.io/pause:3.4.1 "/pause" 12 minutes ago Up 12 minutes k8s_POD_etcd-minikube_kube-system_be5cbc7ffcadbd4ffc776526843ee514_0
d621b5059e5b k8s.gcr.io/pause:3.4.1 "/pause" 12 minutes ago Up 12 minutes k8s_POD_kube-scheduler-minikube_kube-system_a2acd1bccd50fd7790183537181f658e_0
d0b3b3625e54 k8s.gcr.io/pause:3.4.1 "/pause" 12 minutes ago Up 12 minutes k8s_POD_kube-controller-manager-minikube_kube-system_a5754fbaabd2854e0e0cdce8400679ea_0
docker@minikube:~$ exit
logout
server1@server1-VirtualBox:~$
Go
복사
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
Go
복사
•
실행 콘솔화면
server1@server1-VirtualBox:~$ kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.10
deployment.apps/hello-minikube created
server1@server1-VirtualBox:~$ kubectl expose deployment hello-minikube --type=NodePort --port=8080
service/hello-minikube exposed
server1@server1-VirtualBox:~$
Go
복사
•
명령이 성공적으로 잘 실행됐다면 쿠버네티스에 배포된 애플리케이션과 서비스를 확인해보도록 하자.
server1@server1-VirtualBox:~$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/hello-minikube-5d9b964bfb-v92lx 1/1 Running 0 60s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/hello-minikube NodePort 10.102.64.199 <none> 8080:32161/TCP 58s
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 19m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/hello-minikube 1/1 1 1 60s
NAME DESIRED CURRENT READY AGE
replicaset.apps/hello-minikube-5d9b964bfb 1 1 1 60s
server1@server1-VirtualBox:~$
Go
복사
•
위에서부터 차례대로 포드, 서비스, 디플로이먼트, 레플리카셋이 보인다. 디플로이먼트는 레플리카셋을 관리하고, 다시 레플리카셋은 포드를 관리하는 구조다.
•
그리고 포드가 실질적으로 컨테이너를 포함한다. 이 포드는 외부로 서비스하기 위해 서비스를 갖고 여기서 30017이라는 노드 포트로 외부에 열려있다.
server1@server1-VirtualBox:~$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-minikube NodePort 10.102.64.199 <none> 8080:32161/TCP 17m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 35m
server1@server1-VirtualBox:~$
Go
복사
•
또 다른 확인 방법으로 --url 옵션을 주어도 좋다.
server1@server1-VirtualBox:~$ minikube service hello-minikube --url
http://192.168.49.2:32161
server1@server1-VirtualBox:~$
Go
복사
•
직접 브라우저를 통해 접속해보자.
•
노드는 docker 인터페이스를 사용하고 있으므로 192.168.49.2:32161로 접속해야 한다.
•
실제로 외부에서 접속하려면 docker의 프록시 기능을 사용해야 한다.
•
아래는 우분투에서 노드 포트에 접속하는 화면
•
여기서는 간단히 kubectl의 port-forward 기능을 사용해본다. 포드에 직접 접근해 8080 포트로 접근할 수 있도록 했다.
kubectl port-forward hello-minikube-5d9b964bfb-v92lx 8080:8080
Go
복사
•
마찬가지로 잘 접속되는 모습을 확인할 수 있다. 이 포트는 외부에서도 접속이 가능하다.