Minikube는 로컬 환경에서 쿠버네티스 클러스터를 간편하게 구축하고 실행하기 위한 도구입니다.
단일 머신 위에서 쿠버네티스 클러스터를 실행하므로 개발, 테스트 및 학습을 위한 로컬 환경에서 매우 유용합니다.
minikube는 컨테이너, 가상머신 환경에서 동작하므로 이와 같은 환경을 먼저 구성해야하며, 저는 사전에 docker를 설치, 실행했습니다.
minikube 클러스터 만들기
Homebrew를 사용하여 minikube를 간단하게 설치할 수 있습니다.
설치가 완료되었다면 클러스터를 시작해줍니다.
명령이 정상적으로 수행되었다면 쿠버네티스 대시보드를 열어보겠습니다.
대시보드 애드온과 프록시가 활성화되고 해당 프록시로 접속하는 기본 웹 브라우저 창이 열립니다.
대시보드에서 디플로이먼트나 서비스와 같은 쿠버네티스 자원을 생성할 수 있습니다.
1
| minikube addons enable metrics-server
|
대시보드가 열리지 않는다면 애드온을 추가해보세요.
디플로이먼트 만들기
쿠버네티스 디플로이먼트는 헬스 체크를 통해 파드의 컨테이너가 종료되었다면 재시작해줍니다. 공식문서에서는 파드의 생성 및 스케일링을 관리하는 방법으로 디플로이먼트를 권장하고 있습니다.
쿠버네티스 파드는 관리와 네트워킹 목적으로 함께 묶여 있는 하나 이상의 컨테이너 그룹입니다.
kubectl create
명령을 실행하여 파드를 관리할 디플로이먼트를 만듭니다.
1
| kubectl create deployment NAME --image=image -- [COMMAND] [args...] [options]
|
1
| kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.39 -- /agnhost netexec --http-port=8080
|
만들어지는 파드는 공식문서에서 제공된 Docker 이미지를 기반으로 한 컨테이너를 실행합니다.
디플로이먼트 보기
1
| kubectl get deployments
|
1
2
| NAME READY UP-TO-DATE AVAILABLE AGE
hello-node 1/1 1 1 3m38s
|
파드 보기
1
2
| NAME READY STATUS RESTARTS AGE
hello-node-67949d9db-7xxk9 1/1 Running 0 5m50s
|
클러스터 이벤트 보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| LAST SEEN TYPE REASON OBJECT MESSAGE
7m28s Normal Scheduled pod/hello-node-67949d9db-7xxk9 Successfully assigned default/hello-node-67949d9db-7xxk9 to minikube
7m29s Normal Pulling pod/hello-node-67949d9db-7xxk9 Pulling image "registry.k8s.io/e2e-test-images/agnhost:2.39"
7m18s Normal Pulled pod/hello-node-67949d9db-7xxk9 Successfully pulled image "registry.k8s.io/e2e-test-images/agnhost:2.39" in 10.747873713s
7m18s Normal Created pod/hello-node-67949d9db-7xxk9 Created container agnhost
7m18s Normal Started pod/hello-node-67949d9db-7xxk9 Started container agnhost
7m29s Normal SuccessfulCreate replicaset/hello-node-67949d9db Created pod: hello-node-67949d9db-7xxk9
7m29s Normal ScalingReplicaSet deployment/hello-node Scaled up replica set hello-node-67949d9db to 1
57m Normal Starting node/minikube Starting kubelet.
57m Normal NodeHasSufficientMemory node/minikube Node minikube status is now: NodeHasSufficientMemory
57m Normal NodeHasNoDiskPressure node/minikube Node minikube status is now: NodeHasNoDiskPressure
57m Normal NodeHasSufficientPID node/minikube Node minikube status is now: NodeHasSufficientPID
57m Normal NodeAllocatableEnforced node/minikube Updated Node Allocatable limit across pods
57m Normal Starting node/minikube
57m Normal RegisteredNode node/minikube Node minikube event: Registered Node minikube in Controller
|
kubectl 환경설정 보기
해당 명령으로 환경설정을 볼 수 있는데, 다른 클러스터를 사용했다면 minikube 외 다른 설정들도 표시될 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| apiVersion: v1
clusters:
- cluster:
certificate-authority: /Users/mario/.minikube/ca.crt
extensions:
- extension:
last-update: Thu, 24 Aug 2023 14:45:00 KST
provider: minikube.sigs.k8s.io
version: v1.31.2
name: cluster_info
server: https://127.0.0.1:64072
name: minikube
contexts:
- context:
cluster: minikube
extensions:
- extension:
last-update: Thu, 24 Aug 2023 14:45:00 KST
provider: minikube.sigs.k8s.io
version: v1.31.2
name: context_info
namespace: default
user: minikube
name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
user:
client-certificate: /Users/mario/.minikube/profiles/minikube/client.crt
client-key: /Users/mario/.minikube/profiles/minikube/client.key
|
서비스 만들기
기본적으로 파드는 쿠버네티스 클러스터 내부의 IP 주소로만 접근할 수 있기때문에 hello-node
컨테이너를 쿠버네티스 가상 네트워크 외부에서 접근하려면 파드를 쿠버네티스 서비스로 노출해야 합니다.
kubectl expose
명령으로 퍼블릭 인터넷에 파드를 노출할 수 있습니다.
1
2
| kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP|SCTP] [--target-port=number-or-name]
[--name=name] [--external-ip=external-ip-of-service] [--type=type] [options]
|
여러 옵션을 사용할 수 있으며, 공식 문서에서 제공하는 명령어를 실행해봅시다.
1
| kubectl expose deployment hello-node --type=LoadBalancer --port=8080
|
--type=LoadBalancer
: 클러스터 밖의 서비스로 노출하기 원한다는 뜻 입니다.- 이미지 내 애플리케이션 코드는 TCP 포트 8080에서만 수신합니다.
kubectl expose
를 사용하여 다른 포트를 노출한 경우, 클라이언트는 다른 포트에 연결할 수 없습니다.
1
2
3
| NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-node LoadBalancer 10.97.121.119 <pending> 8080:30180/TCP 4m44s
...
|
로드 밸런서를 지원하는 클라우드 공급자의 경우에는 서비스에 접근할 수 있도록 외부 IP 주소가 프로비저닝 하지만, minikube에서 LoadBalancer
타입은 minikube service
명령어를 통해서 해당 서비스를 접근할 수 있게합니다.
1
| minikube service hello-node
|
1
2
3
4
5
6
7
8
9
10
11
12
13
| |-----------|------------|-------------|---------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|------------|-------------|---------------------------|
| default | hello-node | 8080 | http://192.168.49.2:30180 |
|-----------|------------|-------------|---------------------------|
🏃 hello-node 서비스의 터널을 시작하는 중
|-----------|------------|-------------|------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|------------|-------------|------------------------|
| default | hello-node | | http://127.0.0.1:64781 |
|-----------|------------|-------------|------------------------|
🎉 Opening service default/hello-node in default browser...
❗ Because you are using a Docker driver on darwin, the terminal needs to be open to run it.
|
제거하기
클러스터에서 만들어진 리소스를 제거할 수 있습니다.
1
2
| kubectl delete service hello-node
kubectl delete deployment hello-node
|
필요시 minikube 가상 머신을 정지하거나 살제할 수 있습니다.