/ HOWTO

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: kube1

GRAFICO2: kube2

# 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: kube3

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.

Subscríbete y recibirás los últimos artículos semanalmente en tu email.