Într-un articol anterior am instalat local un întreg cluster Kubernetes: un master și cel puțin 2 noduri. Această configurație presupune existența a cel puțin 3 mașini virtuale care să funcționeze simultan, adică destul de multe resurse alocate (minim 3 core-uri și 4 GB RAM). Dar sunt utilizatori care vor să învețe sau să testeze Kubernetes și nu dispun de suficiente resurse - sau, pur și simplu, nu vor să-și bată capul prea mult cu infrastructura K8s ci doar să testeze aplicații sau anumite opțiuni. Pentru aceștia există Minikube, un instrument care face extrem de simplă utilizarea locală a unui cluster Kubernetes.
Minikube rulează un cluster Kubernetes cu un singur nod, în interiorul unei mașini virtuale pe calculatorul personal. De aceea, este obligatorie existența pe mașina personală a virtualizării cu un hypervisor KVM sau VirtualBox - instalarea acestora nu face obiectul articolului de față. Tutorialul de mai jos este făcut pe un sistem cu Fedora și KVM.
De asemenea, înainte de a instala Minikube trebuie să instalăm kubectl, unul dintre cele mai folosite instrumente kubernetes.
Instalarea kubectl
Kubectl este utilitarul pentru accesarea Kubernetes din linia de comandă, cu ajutorul căruia putem lansa sau gestiona aplicații într-un cluster k8s. Cu ajutorul kubectl putem inspecta resursele clusterului ori putem crea, șterge sau actualiza componente.
Instalare kubectl în CentOS, Red Hat, Fedora
În primul rând, trebuie să adăugăm repo-ul pentru Kubernetes:
$ sudo vi /etc/yum.repos.d/kubernetes.repo
În interiorul fișierului se adaugă:
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
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
$ sudo dnf upgrade && sudo dnf install kubectl -y
Instalare kubectl în Debian, Ubuntu și derivate
Se rulează liniile de mai jos:
$ sudo apt-get update && sudo apt-get install -y apt-transport-https
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
$ sudo touch /etc/apt/sources.list.d/kubernetes.list
$ echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
$ sudo apt-get update
$ sudo apt-get install -y kubectl
Pentru mai multe variante de instalare a kubectl consultați secțiunea dedicată acestui instrument pe pagina kubernetes.io.
Instalare Minikube
Vom instala ultima versiune minikube - 0.28 în momentul scrierii acestui tutorial.
În Linux se rulează comanda de mai jos:
$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
Pornire Minikube
Acum putem lansa primul nostru cluster K8s cu 1 singur nod gestionat de Minikube. Dacă lucrăm cu VirtualBox, nu mai trebuie să facem nimic special - Minikube pornește în mod prestabilit folosind driverul VirtulBox:
$ minikube start
În cazul în care am ales ca variantă de virtualizare hypervisorul KVM, trebuie să instalăm driverul aferent (presupunem că avem deja configurat QEMU și KVM):
$ curl -LO https://storage.googleapis.com/minikube/releases/latest/docker-machine-driver-kvm2 && chmod +x docker-machine-driver-kvm2 && sudo mv docker-machine-driver-kvm2 /usr/local/bin/
Pentru a porni Minikube cu KVM se rulează comanda:
$ minikube start --vm-driver kvm2
La lansările ulterioare ale clusterului este suficientă comanda minikube start
, fără indicarea driverului kvm.
Vom primi un răspuns asemănător cu cel de mai jos:
Starting local Kubernetes v1.10.0 cluster...
Starting VM...
Downloading Minikube ISO
153.08 MB / 153.08 MB [============================================] 100.00% 0s
Getting VM IP address...
Moving files into cluster...
Downloading kubelet v1.10.0
Downloading kubeadm v1.10.0
Finished Downloading kubelet v1.10.0
Finished Downloading kubeadm v1.10.0
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.
Asta e tot! Dacă deschideți Virtual Machine Manager sau VirtualBox, veți vedea noua mașină virtuală creată:
Putem începe să vizualizăm clusterul, să lansăm aplicații și așa mai departe. Mai jos sunt câteva exemple care vă vor ajuta să începeți.
Vizualizare noduri cluster K8s
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready master 1h v1.10.0
$ kubectl get nodes -owide
NAME STATUS ROLES AGE VERSION EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
minikube Ready master 1h v1.10.0 <none> Buildroot 2018.05 4.16.14 docker://17.12.1-ce
Instalarea primului deployment
$ kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.10 --port=8080
deployment.apps/hello-minikube created
Crearea unui serviciu de tip NodePort pentru acest prim deployment
$ kubectl expose deployment hello-minikube --type=NodePort
service/hello-minikube exposed
Vizualizare poduri
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-minikube-7c77b68cff-n7lg4 1/1 Running 0 3m
$ kubectl get pods -owide
NAME READY STATUS RESTARTS AGE IP NODE
hello-minikube-7c77b68cff-n7lg4 1/1 Running 0 3m 172.17.0.4 minikube
Vizualizare descriere pod
$ kubectl describe pod hello-minikube-7c77b68cff-n7lg4
Name: hello-minikube-7c77b68cff-n7lg4
Namespace: default
Node: minikube/192.168.122.151
Start Time: Sat, 30 Jun 2018 11:47:04 +0300
Labels: pod-template-hash=3733624799
run=hello-minikube
[...]
Putem folosi comanda curl pe podul hello-minikube (dacă luăm adresa indicată mai jos și portul respectiv - 192.168.39.151:31043 - și o lipim în browser, vom vedea aceleași informații):
$ curl $(minikube service hello-minikube --url)
Hostname: hello-minikube-7c77b68cff-n7lg4
Pod Information:
-no pod information available-Server values:
server_version=nginx: 1.13.3 - lua: 10008Request Information:
client_address=172.17.0.1
method=GET
real path=/
query=
request_version=1.1
request_scheme=http
request_uri=http://192.168.39.151:8080/Request Headers:
accept=*/*
host=192.168.39.151:31043
user-agent=curl/7.59.0
Vizualizare servicii
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-minikube NodePort 10.105.93.178 <none> 8080:31043/TCP 2m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1h
Vizualizare namespace-uri
$ kubectl get ns
NAME STATUS AGE
default Active 1h
kube-public Active 1h
kube-system Active 1h
Vizualizare IP cluster si informații despre cluster
$ minikube ip
192.168.39.151
$ kubectl cluster-info
Kubernetes master is running at https://192.168.39.151:8443
KubeDNS is running at https://192.168.39.151:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Pentru a opri clusterul K8s:
$ minikube stop
Stopping local Kubernetes cluster...
Machine stopped.
Resurse consumate de Minikube
Prestabilit, Minikube pornește cu 2 cores și 2 GB RAM. Dacă doriți să alocați mai multe resurse clusterului vostru k8s, rulați comanda de pornire cu flag-urile --memory
și --cpus
(dacă ați pornit deja un cluster minikube, acesta trebuie șters înainte de alocarea mai multor procesoare și a unei cantități mai mari de memorie):
$ minikube delete
$ minikube start --memory 4096 --cpus 4
Helm și Minikube
Așa cum am mai spus într-un alt articol, Helm este un fel de manager de pachete pentru Kubernetes.
Instalați Helm așa cum am descris aici. Dacă aveți probleme la funcționarea cu Minikube, este posibil să trebuiască să instalați și pachetul socat (sudo yum install socat
sau sudo apt-get install socat
).
Cu comanda de mai jos vizualizați podul tiller-ului:
$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
default hello-minikube-7c77b68cff-n7lg4 1/1 Running 1 2h
kube-system etcd-minikube 1/1 Running 0 2h
kube-system kube-addon-manager-minikube 1/1 Running 2 3h
kube-system kube-apiserver-minikube 1/1 Running 0 2h
kube-system kube-controller-manager-minikube 1/1 Running 0 2h
kube-system kube-dns-86f4d74b45-624tj 3/3 Running 6 4h
kube-system kube-proxy-kbgpm 1/1 Running 0 2h
kube-system kube-scheduler-minikube 1/1 Running 0 2h
kube-system kubernetes-dashboard-5498ccf677-8xqbr 1/1 Running 4 3h
kube-system storage-provisioner 1/1 Running 4 3h
kube-system tiller-deploy-f9b8476d-xh7f4 1/1 Running 1 2h
Versiunea aplicației Helm:
$ helm version
Client: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}
Personal, prefer un cluster cu 3 mașini virtuale (1 master și 2 noduri) - există mai multe opțiuni disponibile pe un astfel de cluster decât pe Minikube. Alegerea tipului de cluster aparține fiecăruia - importantă este doar utilizarea Kubernetes și mai puțin numărul de noduri. 🙂
[…] Normal, avem de nevoie, în primul rând , de un cluster Kubernetes :). Acesta poate fi configurat în cloud folosind diverse servicii (AWS, GCE) sau local, folosind fie mașini virtuale, fie minikube. […]