DevOps/Kubernetes

[Kubernetes] k8s minikube 설치 및 사용법

nayoungs 2022. 5. 30. 22:12
728x90

minikubelocal 시스템에 쉽게 클러스터를 구축 및 세팅할 수 있게 해주는 도구이다.

 

minikube를 설치하기에 앞서 kubernetes CLI와 docker 명령어가 설치되어있어야 한다. 

 

두가지 모두 chocolatey로 설치가 가능하다.

  • 윈도우에 kubernetes cli 설치하기
$ choco install kubernetes-cli --version=1.22.4
  • 윈도우에 docker 명령어 설치하기
$ choco install docker-cli

 

minikube 설치

minikube 또한 다음과 같이 choco를 사용하여 설치할 수 있다.

$ choco install minikube

 

cluster 생성 및 실행

$ minikube start

처음으로 start 하는 경우에는, k8s가 설치된 Linux 이미지를 자동으로 받고,

minikube라는 이름의 VM을 실행한다.

~/.kube/config 파일 setting까지 완료해주며, 자동으로 kubeadm init을 실행시킨다.

 

minikube start를 하게 되면, 자동으로 minikube라는 이름의 profile이 생성된다.

이 profile에는 CPU, Memory, k8s 버전 등이 저장된다.

$ minikube profile list
|----------|------------|---------|----------------|------|---------|---------|-------|
| Profile  | VM Driver  | Runtime |       IP       | Port | Version | Status  | Nodes |
|----------|------------|---------|----------------|------|---------|---------|-------|
| minikube | virtualbox | docker  | 192.168.59.104 | 8443 | v1.22.9 | Stopped |     1 |
|----------|------------|---------|----------------|------|---------|---------|-------|

 

minikube는 기본적으로 dynaminc provisioning을 위해 standard라는 스토리지 클래스가 존재하며,

$ kubectl get sc
NAME                 PROVISIONER                RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
standard (default)   k8s.io/minikube-hostpath   Delete          Immediate           false                  8h

기본적으로 minikube context, cluster, user가 존재한다.

$ kubectl config get-contexts
CURRENT   NAME                             CLUSTER         AUTHINFO           NAMESPACE
          kubernetes-admin@cluster.local   cluster.local   kubernetes-admin
*         minikube                         minikube        minikube           default
$ kubectl config get-clusters
NAME
cluster.local
minikube
$ kubectl config get-users
NAME
kubernetes-admin
minikube

 

minikube start 에는 --memory, --driver, --nodes다양한 옵션이 존재한다.

$ minikube start --help

단, 옵션은 start 시에만 적용되기 때문에, 변경하려면 삭제 후 다시 start 해야 한다.

 

추가 옵션을 사용한 클러스터 생성/시작

$ minikube start --cpus 4 --memory 4G --disk-size 30G --driver virtualbox --kubernetes-version v1.22.9

 

cluster 중지

$ minikube stop

 

cluster 상태

$ minikube status

 

VM 접속

$ minikube ssh

ssh 접속 후 /etc/os-release 파일을 확인하면,

$ cat /etc/os-release
NAME=Buildroot
VERSION=2021.02.4-dirty
ID=buildroot
VERSION_ID=2021.02.4
PRETTY_NAME="Buildroot 2021.02.4"

minikube는 자체적으로 만든 os를 사용한다.

따라서 별도로 패키지 설치가 불가능하다.

또한 VM 내에 docker는 설치되어있으나, k8s 명령어는 설치되어있지 않다

  • 패키지 관리자 X
  • kubectl 명령 X
  • docker 명령 O

 

VM 내의 Docker Engine 사용

앞서 윈도우에 docker 명령어를 설치했어야 가능하다.

$ choco install docker-cli

docker 서버에 접속하기 위해서는 다음과 같이 환경 변수 설정을 해야 한다.

$ minikube docker-env

$Env:DOCKER_TLS_VERIFY = "1"
$Env:DOCKER_HOST = "tcp://192.168.59.100:2376" #docker host는 원격에 있다
$Env:DOCKER_CERT_PATH = "C:\Users\USER\.minikube\certs"  #인증서
$Env:MINIKUBE_ACTIVE_DOCKERD = "minikube"
# To point your shell to minikube's docker-daemon, run:
# & minikube -p minikube docker-env --shell powershell | Invoke-Expression

아래의 명령어를 실행하면 자동으로 docker-env 환경변수 세팅을 해준다.

$ minikube -p minikube docker-env --shell powershell | Invoke-Expression

단, 변수는 해당되는 터미널에서만 유용하기 때문에, 터미널 창을 닫으면 환경 변수 세팅은 없어진다.

따라서 새로 터미널 창을 실행할 때마다 해당 명령어로 환경 변수 세팅을 진행해야 한다.

 

환경 변수 설정 후 docker 명령어를 원격에서 실행이 가능해진다.

docker 명령어가 앞서 설정한 환경 변수를 참조해서 실행하게 되는 것이다.

$ docker ps

 

cluster 삭제

$ minikube delete

VM 또한 삭제된다.

 

node 추가

$ minikube node list
$ minikube node add

VM을 추가로 생성하고, kubeadm join을 자동으로 진행해준다.

 

service 목록 확인

$ minikube service list

 

addon

minikube 중 가장 좋은 기능은 addon으로, 손쉽게 addon을 추가할 수 있다.

다음 명령을 통해 minikube에서 추가할 수 있는 addon의 목록을 확인할 수 있다.

$ minikube addons list

disabled이 설치가 되지 않은 것이고, enabled가 설치된 것이다.

, addon에 따라 configure, 즉 세팅해줘야 하는 경우가 있으므로 유의해서 사용해야 한다.

참고로 default-storeageclass와 storage-provisioner는 기본적으로 활성화되는 애드온이다.

 

addon 설치/활성화하기

$ minikube addons enable [addon]

addon configuration

$ minikube addons configure [addon]

 

클러스터 기본 옵션 지정

start 할 때마다 적용하고 싶은 옵션이 있다면, 다음과 같이 미리 세팅해둘 수 있다.

$ minikube config set cpus 2
$ minikube config set memory 4G
$ minikube config set driver virtualbox
$ minikube config set kubernetes-version v1.22.9
$ minikube config view

start할 때 기본적으로 설정이 적용되며, delete시 config 설정은 삭제된다.

config 설정 확인

$ minikube config view

 

ControlPlane의 IP 확인하기

$ minikube ip

 

.minikube

~/.minikube 디렉토리에 minikube에 관련된 정보들이 저장된다.

실제로 디렉토리를 들어가서 확인할 일은 잘 없고, 수정은 하지 않는 것을 권장한다.

 

단, minikube를 여러 번 사용하다 보면, 다양한 버전의 k8s이 설치되고,

많은 tar파일들이 설치되기 때문에, 주기적으로 디렉토리를 삭제하는 것을 권장한다.



 

 

💻 실습 1 : nginx deployment

 

테스트를 위한 간단한 cluster를 실행하고,

$ minikube start --cpus 2 --memory 4G --kubernetes-version v1.22.9

deployment를 배포한 뒤, 테스트를 위해 pod를 외부로 노출(expose)시킨다.

$ kubectl create deployment myapp --image nginx --replicas 3
deployment.apps/myapp created
$ kubectl expose deployment myapp --name mysvc --port 80 --target-port 80
$ kubectl get po
NAME                     READY   STATUS    RESTARTS   AGE
myapp-6d8d776547-dfh72   1/1     Running   0          74s
myapp-6d8d776547-j889x   1/1     Running   0          74s
myapp-6d8d776547-qqsgs   1/1     Running   0          74s

svc의 type을 NodePort로 수정한다.

$ kubectl edit svc mysvc
$ kubectl get svc
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1     <none>        443/TCP        8h
mysvc        NodePort    10.98.63.98   <none>        80:32723/TCP   4m5s

minikube ip 명령을 통해 ControlPlane의 IP를 확인하거나,

$ minikube ip
192.168.59.104

minikube service list로 URL을 확인할 수 있다.

$ minikube service list
|-------------|------------|--------------|-----------------------------|
|  NAMESPACE  |    NAME    | TARGET PORT  |             URL             |
|-------------|------------|--------------|-----------------------------|
| default     | kubernetes | No node port |
| default     | mysvc      |           80 | http://192.168.59.104:32723 |
| kube-system | kube-dns   | No node port |
|-------------|------------|--------------|-----------------------------|

 

접속 확인

 

 



 

 

💻 실습 2 : minikube로 metrics-server 설치하기

 

metrics-server를 활성화한다.

$ minikube addons enable metrics-server
    ▪ Using image k8s.gcr.io/metrics-server/metrics-server:v0.4.2
🌟  'metrics-server' 애드온이 활성화되었습니다

metrics-server가 enable 된 것을 확인할 수 있다.

$ minikube addons list
...
| metrics-server              | minikube | enabled ✅   | kubernetes
...

metrics-server가 설치된 것을 확인할 수 있다.

$ kubectl get po -n kube-system
NAME                               READY   STATUS    RESTARTS      AGE
coredns-78fcd69978-n49hg           1/1     Running   0             16m
etcd-minikube                      1/1     Running   0             16m
kindnet-d6lrx                      1/1     Running   0             7m51s
kindnet-vv67r                      1/1     Running   0             7m51s
kube-apiserver-minikube            1/1     Running   0             16m
kube-controller-manager-minikube   1/1     Running   0             16m
kube-proxy-57jpm                   1/1     Running   0             7m56s
kube-proxy-jlf4m                   1/1     Running   0             16m
kube-scheduler-minikube            1/1     Running   0             16m
metrics-server-77c99ccb96-m44cj    1/1     Running   0             67s
storage-provisioner                1/1     Running   1 (16m ago)   16m

metrics서버가 설치되고, CPU 사용량이 측정되는 것을 확인할 수 있다.

$ kubectl top nodes
NAME       CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
minikube   136m         6%     1279Mi          32%



💻 실습 3 : minikube로 metallb 설치하기

 

실습 1에 이어서 서비스의 type을 LoadBalancer로 수정한다.

$ kubectl edit svc mysvc
service/mysvc edited

다음으로 metallb를 활성화한다.

$ minikube addons enable metallb
    ▪ Using image metallb/controller:v0.9.6
    ▪ Using image metallb/speaker:v0.9.6
🌟  'metallb' 애드온이 활성화되었습니다
$ kubectl get all -n metallb-system
NAME                              READY   STATUS    RESTARTS   AGE
pod/controller-66bc445b99-nkldf   1/1     Running   0          2m24s
pod/speaker-xcrzl                 1/1     Running   0          2m24s

NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                 AGE
daemonset.apps/speaker   1         1         1       1            1           beta.kubernetes.io/os=linux   2m24s

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/controller   1/1     1            1           2m24s

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/controller-66bc445b99   1         1         1       2m24s

그러나 시간이 지나도 EXTERNAL-IP가 계속 pending 상태이다.

즉, metallb가 제대로 작동하지 않는다는 뜻이다.

$ kubectl get svc
NAME         TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1     <none>        443/TCP        9h
mysvc        LoadBalancer   10.98.63.98   <pending>     80:32723/TCP   30m

앞서 설명했듯이 addon은 enable 된다고 해서 모두 작동되는 것은 아니다.

addon에 따라 configure, 즉 세팅해줘야 하는 경우가 있는데, 그중에 하나로 바로 metallb이다.

여기에서도 확인할 수 있듯이 metallb에 사용할 네트워크 대역을 configure로 세팅해줘야 제대로 작동한다.

 

따라서 metallb configuration을 진행한다.

$ minikube addons configure metallb

여기서 중요한 것은, 아무 IP나 선택하면 안 되고,

$ minikube ip
192.168.59.105

minikube ip 로 확인한 ip 주소를 참고하여 네트워크 대역을 설정해주어야 한다.

$ minikube addons configure metallb
-- Enter Load Balancer Start IP: 192.168.59.200
-- Enter Load Balancer End IP: 192.168.59.209
    ▪ Using image metallb/speaker:v0.9.6
    ▪ Using image metallb/controller:v0.9.6
✅  metallb 이 성공적으로 설정되었습니다

configuration 완료 후, 실제로 metallb에는 이 설정이 configMap으로 저장된다.

컨피그맵 config가 생성된 것을 확인할 수 있고,

$ kubectl get cm -n metallb-system
NAME               DATA   AGE
config             1      64s
kube-root-ca.crt   1      64s

describe 명령어로 확인해보면, 세팅한 네트워크 대역으로 설정된 것을 확인할 수 있다.

$ kubectl describe cm -n metallb-system config
Name:         config
Namespace:    metallb-system
Labels:       <none>
Annotations:  <none>

Data
====
config:
----
address-pools:
- name: default
  protocol: layer2
  addresses:
  - 192.168.59.200-192.168.59.209


BinaryData
====

Events:  <none>

mysvc를 확인하면 EXTERNAL-IP가 설정된 것을 확인할 수 있다.

$ kubectl get svc
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1       <none>           443/TCP        5m10s
mysvc        LoadBalancer   10.96.203.220   192.168.59.200   80:30257/TCP   4m54s

 

EXTERNAL-IP로 접속 확인

 

 

meteallb가 정상적으로 작동하는 것을 확인할 수 있다.

 

 

728x90