[![logo](https://www.hongsnet.net/images/logo.gif)](https://www.hongsnet.net)

# minicube로 k8s Concept 잡기

**minikube**는 로컬이나 단일 환경에 손쉽게 Kubernetes를 구성하기 위한 방식으로 아래와 같은 **몇가지 스텝만으로도** 쿠버네티스를 구축하고 컨테이너 환경을 사용할 수 있다.


```plaintext
!참고
minikube는 multinode 환경에서 제공하는 기능은 지원하지 않는다.
단순히 쿠버네티스 환경을 체험하고 학습하는 용도로 사용하는 것이 적합하다.
 
일반적으로 minikube는 VM(하이퍼바이저)으로 구성되는데, KVM, VirtualBox, VMware Fusion, HyperKit 등을 지원한다. 
```

여기서는 **kvm 하이퍼바이저**를 이용하여 구성하고, OS는 `CentOS 7` 환경이다.


- **minikube가 지원하는 가상화 드라이버 목록**
  - virtualbox
  - vmwarefusion
  - kvm2 (드라이버 설치)
  - hyperkit (드라이버 설치)
  - hyperv (드라이버 설치)
  - vmware (드라이버 설치) (VMware unified driver)
  - none (쿠버네티스 컴포넌트를 가상 머신이 아닌 호스트 상에서 구동한다. 리눅스 환경이어야 하고, 도커(Docker)가 설치되어야 한다)



# minikube 구성


- **KVM Hypervisor 구성**

```bash
# yum -y install qemu-kvm libvirt libvirt-daemon-kvm
# systemctl start libvirtd
# systemctl enable libvirtd
```

완료되었으면, 다음과 같이 **libvirtd Hypervisor 상태**를 검증하자.

```bash
# virt-host-validate
  QEMU: Checking for hardware virtualization                                 : 통과
  QEMU: Checking if device /dev/kvm exists                                   : 통과
  QEMU: Checking if device /dev/kvm is accessible                            : 통과
  QEMU: Checking if device /dev/vhost-net exists                             : 통과
  QEMU: Checking if device /dev/net/tun exists                               : 통과
  QEMU: Checking for cgroup 'cpu' controller support                         : 통과
  QEMU: Checking for cgroup 'cpuacct' controller support                     : 통과
  QEMU: Checking for cgroup 'cpuset' controller support                      : 통과
  QEMU: Checking for cgroup 'memory' controller support                      : 통과
  QEMU: Checking for cgroup 'devices' controller support                     : 통과
  QEMU: Checking for cgroup 'blkio' controller support                       : 통과
  QEMU: Checking for device assignment IOMMU support                         : 통과
  QEMU: Checking if IOMMU is enabled by kernel                               : 통과
   LXC: Checking Linux 경우 >= 2.6.26                                      : 통과
   LXC: Checking for namespace ipc                                           : 통과
   LXC: Checking for namespace mnt                                           : 통과
   LXC: Checking for namespace pid                                           : 통과
   LXC: Checking for namespace uts                                           : 통과
   LXC: Checking for namespace net                                           : 통과
   LXC: Checking for namespace user                                          : 통과
   LXC: Checking for cgroup 'cpu' controller support                         : 통과
   LXC: Checking for cgroup 'cpuacct' controller support                     : 통과
   LXC: Checking for cgroup 'cpuset' controller support                      : 통과
   LXC: Checking for cgroup 'memory' controller support                      : 통과
   LXC: Checking for cgroup 'devices' controller support                     : 통과
   LXC: Checking for cgroup 'freezer' controller support                     : 통과
   LXC: Checking for cgroup 'blkio' controller support                       : 통과
   LXC: Checking if device /sys/fs/fuse/connections exists                   : 통과
```


- **k8s YUM Repository 설정**

k8s는 CentOS Base Repository에서 지원되므로, 다음과 같이 별도의 Repository를 구성해야 한다.

```bash
# cat /etc/yum.respo.d/kube.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
```

**- kubectl 패키지 및 kvm2 Driver 설치**

k8s에서 **KVM Hypervisor는 Driver가 기본적으로 지원되지 않으므로**, 다음과 같이 드라이버를 별도로 설치해야 한다.

```bash
# yum -y install kubectl

# wget https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 -O minikube
# wget https://storage.googleapis.com/minikube/releases/latest/docker-machine-driver-kvm2
# chmod 755 minikube docker-machine-driver-kvm2
# mv minikube docker-machine-driver-kvm2 /usr/local/bin/
```

설치 후 버전정보는 다음과 같다.

```bash
# minikube version
minikube version: v1.17.1
commit: 043bdca07e54ab6e4fc0457e3064048f34133d7e
```

또한 상태는 다음과 같다.

```bash
# minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
timeToStop: Nonexistent
```


# minikube 시작

다음과 같이 minikube를 시작한다.

```bash
# minikube start --vm-driver kvm2
* Centos 7.9.2009 위의 minikube v1.17.1
* 유저 환경 설정 정보에 기반하여 kvm2 드라이버를 사용하는 중
* "kvm2" 드라이버는 root 권한으로 실행되면 안 됩니다
* If you are running minikube within a VM, consider using --driver=none:
*   https://minikube.sigs.k8s.io/docs/reference/drivers/none/

X Exiting due to DRV_AS_ROOT: "kvm2" 드라이버는 root 권한으로 실행되면 안 됩니다
```

그런데, **kvm2 드라이버는 root 권한으로 실행하면 안된다는 에러**("kvm2" driver should not be used with root privileges.)와 함께 abort된다. 여기서는 CentOS 7 환경이며, sudo를 사용하지 않기 때문에 다음과 같이 `--force 옵션`을 사용하면, 강제로 root 권한으로 사용할 수 있다.

```bash
# minikube start --vm-driver kvm2 --force
* Centos 7.9.2009 위의 minikube v1.17.1
! minikube skips various validations when --force is supplied; this may lead to unexpected behavior
! Both driver=kvm2 and vm-driver=kvm2 have been set.

    Since vm-driver is deprecated, minikube will default to driver=kvm2.

    If vm-driver is set in the global config, please run "minikube config unset vm-driver" to resolve this warning.

* 유저 환경 설정 정보에 기반하여 kvm2 드라이버를 사용하는 중
* "kvm2" 드라이버는 root 권한으로 실행되면 안 됩니다
* If you are running minikube within a VM, consider using --driver=none:
*   https://minikube.sigs.k8s.io/docs/reference/drivers/none/
* minikube 클러스터의 minikube 컨트롤 플레인 노드를 시작하는 중
* kvm2 VM (CPUs=2, Memory=6000MB, Disk=20000MB) 를 생성하는 중 ...
* 쿠버네티스 v1.20.2 을 Docker 20.10.2 런타임으로 설치하는 중
  - Generating certificates and keys ...
  - Booting up control plane ...
  - Configuring RBAC rules ...
* Verifying Kubernetes components...
* Enabled addons: storage-provisioner, default-storageclass
* Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
```

그럼, libvirtd에 minikube VM과 minikube-net 이라는 네트워크가 생성된다.

```bash
# virsh list
 Id   이름                          상태
--------------------------------------------
 6    minikube                      실행중

# virsh net-list --all
 이름           상태     자동 시작   Persistent
-------------------------------------------------
 default        활성화   예          예
 minikube-net   활성화   예          예
```


# minicube의 각종상태 확인

서비스리스트와 Docker의 환경정보는 다음과 같다.

```bash
# minikube service list
|-------------|------------|--------------|-----|
|  NAMESPACE  |    NAME    | TARGET PORT  | URL |
|-------------|------------|--------------|-----|
| default     | kubernetes | No node port |
| kube-system | kube-dns   | No node port |
|-------------|------------|--------------|-----|
```

```bash
# minikube docker-env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.39.190:2376"
export DOCKER_CERT_PATH="/root/.minikube/certs"
export MINIKUBE_ACTIVE_DOCKERD="minikube"

# To point your shell to minikube's docker-daemon, run:
# eval $(minikube -p minikube docker-env)
```

또한 클러스터 및 NODE의 상태는 다음과 같다.

```bash
# kubectl cluster-info
Kubernetes control plane is running at https://192.168.39.190:8443
KubeDNS is running at https://192.168.39.190:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

# kubectl get nodes
NAME       STATUS   ROLES                  AGE     VERSION
minikube   Ready    control-plane,master   8m32s   v1.20.2
```

# minicube 제어

다음과 같이 minikube에 SSH로 접속하여, 직접 확인이 가능하다.

```bash
# minikube ssh
                         _             _
            _         _ ( )           ( )
  ___ ___  (_)  ___  (_)| |/')  _   _ | |_      __
/' _ ` _ `\| |/' _ `\| || , <  ( ) ( )| '_`\  /'__`\
| ( ) ( ) || || ( ) || || |\`\ | (_) || |_) )(  ___/
(_) (_) (_)(_)(_) (_)(_)(_) (_)`\___/'(_,__/'`\____)

$ hostname
minikube

$ docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS          PORTS     NAMES
400a6e4984d8   85069258b98a           "/storage-provisioner"   8 minutes ago    Up 8 minutes              k8s_storage-provisioner_storage-provisioner_kube-system_5a49ae65-7b4b-4e5d-a6fe-ef1414d870d3_1
b2829a1cff97   bfe3a36ebd25           "/coredns -conf /etc…"   9 minutes ago    Up 9 minutes              k8s_coredns_coredns-74ff55c5b-fpwdd_kube-system_d2b19da7-5f60-4250-8df4-fdcbaffa3731_0
9b5a710ba071   43154ddb57a8           "/usr/local/bin/kube…"   9 minutes ago    Up 9 minutes              k8s_kube-proxy_kube-proxy-2k2dz_kube-system_af77fb75-2e00-466a-ada6-1f91d55cfc0f_0
25c0fe091f2f   k8s.gcr.io/pause:3.2   "/pause"                 9 minutes ago    Up 9 minutes              k8s_POD_coredns-74ff55c5b-fpwdd_kube-system_d2b19da7-5f60-4250-8df4-fdcbaffa3731_0
1232aa91a457   k8s.gcr.io/pause:3.2   "/pause"                 9 minutes ago    Up 9 minutes              k8s_POD_storage-provisioner_kube-system_5a49ae65-7b4b-4e5d-a6fe-ef1414d870d3_0
a7f42e3e227a   k8s.gcr.io/pause:3.2   "/pause"                 9 minutes ago    Up 9 minutes              k8s_POD_kube-proxy-2k2dz_kube-system_af77fb75-2e00-466a-ada6-1f91d55cfc0f_0
fa8787ce1497   ed2c44fbdd78           "kube-scheduler --au…"   10 minutes ago   Up 10 minutes             k8s_kube-scheduler_kube-scheduler-minikube_kube-system_6b4a0ee8b3d15a1c2e47c15d32e6eb0d_0
3d28da20305b   a8c2fdb8bf76           "kube-apiserver --ad…"   10 minutes ago   Up 10 minutes             k8s_kube-apiserver_kube-apiserver-minikube_kube-system_59e2c1b9dc84c2441455bb8352bcfe7e_0
fdbf4eec2f17   a27166429d98           "kube-controller-man…"   10 minutes ago   Up 10 minutes             k8s_kube-controller-manager_kube-controller-manager-minikube_kube-system_474c55dfb64741cc485e46b6bb9f2dc0_0
b83576a09ee1   0369cf4303ff           "etcd --advertise-cl…"   10 minutes ago   Up 10 minutes             k8s_etcd_etcd-minikube_kube-system_ce23c3bc1ca24c43c9498df3d110c78f_0
9073be6f0db7   k8s.gcr.io/pause:3.2   "/pause"                 10 minutes ago   Up 10 minutes             k8s_POD_kube-scheduler-minikube_kube-system_6b4a0ee8b3d15a1c2e47c15d32e6eb0d_0
ccf01f49a212   k8s.gcr.io/pause:3.2   "/pause"                 10 minutes ago   Up 10 minutes             k8s_POD_kube-controller-manager-minikube_kube-system_474c55dfb64741cc485e46b6bb9f2dc0_0
e5f6c12ad215   k8s.gcr.io/pause:3.2   "/pause"                 10 minutes ago   Up 10 minutes             k8s_POD_kube-apiserver-minikube_kube-system_59e2c1b9dc84c2441455bb8352bcfe7e_0
ea61137d9979   k8s.gcr.io/pause:3.2   "/pause"                 10 minutes ago   Up 10 minutes             k8s_POD_etcd-minikube_kube-system_ce23c3bc1ca24c43c9498df3d110c78f_0
```

그리고, 네트워크 정보는 HOST의 환경을 사용할 수 있다.

```bash
$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.122.1   0.0.0.0         UG    1024   0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.39.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.122.1   0.0.0.0         255.255.255.255 UH    1024   0        0 eth0

$ ping 168.126.63.2
PING 168.126.63.2 (168.126.63.2): 56 data bytes
64 bytes from 168.126.63.2: seq=0 ttl=54 time=1.548 ms
64 bytes from 168.126.63.2: seq=1 ttl=54 time=1.579 ms
^C
--- 168.126.63.2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 1.548/1.563/1.579 ms

$
```

또한 DISK의 경우 위에서 20GB를 할당(kvm2 VM...Disk=20000MB)했기 때문에 제대로 할당된 것을 볼 수 있다.

```bash
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           5.2G  592M  4.6G  12% /
devtmpfs        2.8G     0  2.8G   0% /dev
tmpfs           2.9G     0  2.9G   0% /dev/shm
tmpfs           2.9G  9.4M  2.9G   1% /run
tmpfs           2.9G     0  2.9G   0% /sys/fs/cgroup
tmpfs           2.9G  8.0K  2.9G   1% /tmp
/dev/vda1        17G  1.3G   15G   9% /mnt/vda1
```

- **minicube의 중지 및 삭제**

중지는 stop 인자를 주고 실행하면 된다.

```bash
# minikube stop
* Stopping node "minikube"  ...
* 1개의 노드가 중지되었습니다.
```

그럼 상태는 다음과 같이 **Stopped**가 될 것이다.

```bash
# minikube status
minikube
type: Control Plane
host: Stopped
kubelet: Stopped
apiserver: Stopped
kubeconfig: Stopped
timeToStop: Nonexistent
```

제거는 **delete 인자**를 주고 실행하면되는데, 당연히 중지(stop) 후 수행해야 한다.

```bash
# minikube delete
* kvm2 의 "minikube" 를 삭제하는 중 ...
* "minikube" 클러스터 관련 정보가 모두 삭제되었습니다
```

그럼, libvirtd에서도 해당 VM이 제거된것을 볼 수 있다.

```bash
# virsh list
 Id   이름                          상태
--------------------------------------------
```
