Featured image of post 쿠버네티스 튜토리얼 - 1. Hello Minikube

쿠버네티스 튜토리얼 - 1. Hello Minikube

쿠버네티스 문서 읽어보기

Minikube는 로컬 환경에서 쿠버네티스 클러스터를 간편하게 구축하고 실행하기 위한 도구입니다.

단일 머신 위에서 쿠버네티스 클러스터를 실행하므로 개발, 테스트 및 학습을 위한 로컬 환경에서 매우 유용합니다.

minikube는 컨테이너, 가상머신 환경에서 동작하므로 이와 같은 환경을 먼저 구성해야하며, 저는 사전에 docker를 설치, 실행했습니다.

minikube 클러스터 만들기

Homebrew를 사용하여 minikube를 간단하게 설치할 수 있습니다.

1
brew install minikube

설치가 완료되었다면 클러스터를 시작해줍니다.

1
minikube start

명령이 정상적으로 수행되었다면 쿠버네티스 대시보드를 열어보겠습니다.

1
minikube dashboard

대시보드 애드온과 프록시가 활성화되고 해당 프록시로 접속하는 기본 웹 브라우저 창이 열립니다.

대시보드에서 디플로이먼트나 서비스와 같은 쿠버네티스 자원을 생성할 수 있습니다.


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
kubectl get pods
1
2
NAME                         READY   STATUS    RESTARTS   AGE
hello-node-67949d9db-7xxk9   1/1     Running   0          5m50s

클러스터 이벤트 보기

1
kubectl get events
 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 환경설정 보기

1
kubectl config view

해당 명령으로 환경설정을 볼 수 있는데, 다른 클러스터를 사용했다면 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
kubectl get services
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 가상 머신을 정지하거나 살제할 수 있습니다.

1
minikube stop
1
minikube delete