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 이름 상태
--------------------------------------------