Name
Last commit
Last update
..
README.md k8s, minicube, concept

logo

minicube로 k8s Concept 잡기

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

!참고
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 구성
# yum -y install qemu-kvm libvirt libvirt-daemon-kvm
# systemctl start libvirtd
# systemctl enable libvirtd

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

# 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를 구성해야 한다.

# 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가 기본적으로 지원되지 않으므로, 다음과 같이 드라이버를 별도로 설치해야 한다.

# 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/

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

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

또한 상태는 다음과 같다.

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

minikube 시작

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

# 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 권한으로 사용할 수 있다.

# 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 이라는 네트워크가 생성된다.

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

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

minicube의 각종상태 확인

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

# minikube service list
|-------------|------------|--------------|-----|
|  NAMESPACE  |    NAME    | TARGET PORT  | URL |
|-------------|------------|--------------|-----|
| default     | kubernetes | No node port |
| kube-system | kube-dns   | No node port |
|-------------|------------|--------------|-----|
# 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의 상태는 다음과 같다.

# 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로 접속하여, 직접 확인이 가능하다.

# 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의 환경을 사용할 수 있다.

$ 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)했기 때문에 제대로 할당된 것을 볼 수 있다.

$ 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 인자를 주고 실행하면 된다.

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

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

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

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

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

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

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