Commit 968a4351 authored by JooHan Hong's avatar JooHan Hong

k8s, minicube, concept

parent 86caac8f
Pipeline #5199 passed with stages
in 44 seconds
[![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 이름 상태
--------------------------------------------
```
......@@ -23,6 +23,7 @@ Prometheus을 이용한 www.hongsnet.net Container를 모니터링 한다.
> 현재 진행중
<br>
- **Swarm**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment