Kubernetes (Minukube y Kubectl) y Clusters.
El concepto de Kubernetes es montar un cluster donde puedan correr contenedores, existe un Nodo “Manager” el que puede enviar tareas/contenedores a otros nodos “Workers” para que las ejecuten. Cada nodo es un equipo virtual o físico donde correrán Contenedores/PODs.
Luego veremos que un POD es un grupo de “IP”, una o mas APPs y uno o mas volúmenes, representa una unidad que puede realizar una tarea/servicio.
Usaremos Minikube, una implementacion liviana de Kubernetes que usa un equipo virtualizado corriendo en mi equipo real y que crea un cluster de un solo nodo. Es simple y usa un entorno virtual para montarse (MiniKube).
También usaremos Kubectl, un programa tipo línea de comando que interactúa con MiniKube (API).
Instalamos MiniKube y kubectl.
# curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.9.0/bin/linux/amd64/kubectl
# chmod +x kubectl
# mv ./kubectl /usr/local/bin/kubectl
# curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.24.1/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
# minikube version
minikube version: v0.24.1
# minikube start
Starting local Kubernetes v1.8.0 cluster...
Starting VM...
Downloading Minikube ISO
140.01 MB / 140.01 MB [============================================] 100.00% 0s
Getting VM IP address...
Moving files into cluster...
Downloading localkube binary
148.25 MB / 148.25 MB [============================================] 100.00% 0s
0 B / 65 B [----------------------------------------------------------] 0.00%
65 B / 65 B [======================================================] 100.00% 0sSetting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.
Loading cached images from config file.
Verificamos que esté corriendo correctamente, servidor y cliente.
# kubectl version
Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2017-12-15T21:07:38Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"8", GitVersion:"v1.8.0", GitCommit:"0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4", GitTreeState:"clean", BuildDate:"2017-11-29T22:43:34Z", GoVersion:"go1.9.1", Compiler:"gc", Platform:"linux/amd64"}
Esto genera un equipo en Virtualbox ( en mi caso ) llamado MiniKube, 2 gb ram , 1 cpu, 3 mb de disco usado, una placa de red NAT y otra HOSTONLY. La carpeta /home de mi equipo real compartida en el servidor virtual.
# kubectl cluster-info
Kubernetes master is running at https://192.168.99.100:8443
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready <none> 4m v1.8.0
Desde un navegador
* https://192.168.99.100:8443/
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "Unauthorized",
"reason": "Unauthorized",
"code": 401
}
# minikube status
minikube: Running
cluster: Running
kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.100
Corremos una imágen demo llamada “kubernetes-bootcamp:v1”, bajada de internet.
# kubectl run kubernetes-bootcamp --image=docker.io/jocatalin/kubernetes-bootcamp:v1 --port=8080
# kubectl top pod
W1220 17:02:55.484279 6962 top_pod.go:192] Metrics not available for pod default/kubernetes-bootcamp-6db74b9f76-6jkwt, age: 9m50.484266813s
error: Metrics not available for pod default/kubernetes-bootcamp-6db74b9f76-6jkwt, age: 9m50.484266813s
Vemos el IP asignado
# minikube ip
192.168.99.100
Al pedir un “Dashboard”, minikube dashboard, nos envia a esta página.
* http://192.168.99.100:30000/
GRAFICO1:
GRAFICO2:
# kubectl proxy
Starting to serve on 127.0.0.1:8001
# curl http://localhost:8001/version
{
"major": "1",
"minor": "8",
"gitVersion": "v1.8.0",
"gitCommit": "0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4",
"gitTreeState": "clean",
"buildDate": "2017-11-29T22:43:34Z",
"goVersion": "go1.9.1",
"compiler": "gc",
"platform": "linux/amd64"
# export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
# echo Name of the Pod: $POD_NAME
Name of the Pod: kubernetes-bootcamp-6db74b9f76-6jkwt
Invocamos al API, puerto 8001.
# curl http://localhost:8001/api/v1/proxy/namespaces/default/pods/$POD_NAME/
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-6db74b9f76-6jkwt | v=1
GRAFICO3:
Podemos verificar mediante una peticion web al puerto 8001
* http://127.0.0.1:8001/
{
"paths": [
"/api",
"/api/v1",
"/apis",
"/apis/",
.........
"/logs",
"/metrics",
"/swagger-2.0.0.json",
"/swagger-2.0.0.pb-v1",
"/swagger-2.0.0.pb-v1.gz",
"/swagger.json",
"/swaggerapi",
"/ui",
"/ui/",
"/version"
]
}
En el próximo post, haremos un ejemplo sencillo usando NodeJs y un servidor web.