viernes, 8 de marzo de 2019

Go, Docker and Kubernetes on Mac (II)


Elegir versión de Kubernetes


Al momento de intentar usar Kubernetes en nuestro Mac descubrimos que solo corre en Linux, por lo que deberemos usar una máquina virtual.

Dado que mi máquina (Macbook Air de 11") no es una oda a la abundancia de recursos (aunque excelente para quien tiene que viajar frecuentemente y necesita un equipo liviano), debía buscar una opción liviana tanto de VM como de Kubernetes. Luego de leer y buscar por la red, encontré que la combinación "perfecta" (si es que algo así existe) es MicroK8s corriendo sobre Multipass.

Multipass es una versión de Linux virtualizada creada por Canonical que puede ser descargada desde aqui:  https://github.com/CanonicalLtd/multipass/releases

La instalación es simple, solo hay que seguir las instrucciones del pkg.

Una vez instalada, ejecutaremos multipass indicándole que instale MicroK8s.

multipass launch --name microk8s-vm --mem 4G --disk 40G

Luego instalamos microK8s

multipass exec microk8s-vm -- sudo snap install microk8s --classic

Luego definimos un forwarding para poder comunicarnos desde el exterior de la vm con todo lo que haya dentro.

multipass exec microk8s-vm -- sudo iptables -P FORWARD ACCEPT

Luego ejecutamos el comando list para verificar que la vm este corriendo.


Javiers-MacBook-Air:src jleyba$ multipass list
Name                    State             IPv4             Release
microk8s-vm             RUNNING           192.168.64.2     Ubuntu 18.04 LTS
Javiers-MacBook-Air:src jleyba$

En este punto es saludable tomar nota de la ip que aparece en la lista ya que es la que usaremos para nuestras pruebas.

Luego ejecutaremos el siguiente comando para habilitar el servicio de dns, registry y de dashboard.

multipass exec microk8s-vm -- /snap/bin/microk8s.enable dns dashboard registry

Un comando útil es el que nos da las direcciones de los servicios del cluster con sus ip:


Javiers-MacBook-Air:src jleyba$ multipass exec microk8s-vm -- /snap/bin/microk8s.kubectl cluster-info
Kubernetes master is running at http://127.0.0.1:8080
Heapster is running at http://127.0.0.1:8080/api/v1/namespaces/kube-system/services/heapster/proxy
KubeDNS is running at http://127.0.0.1:8080/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Grafana is running at http://127.0.0.1:8080/api/v1/namespaces/kube-system/services/monitoring-grafana/proxy
InfluxDB is running at http://127.0.0.1:8080/api/v1/namespaces/kube-system/services/monitoring-influxdb:http/proxy


En caso de necesidad, podemos abrir un proxy para acceder a nuestra aplicación.

multipass exec microk8s-vm -- /snap/bin/microk8s.kubectl proxy --address='0.0.0.0' --accept-hosts='.*'
Starting to serve on [::]:8001

En nuestro caso no es necesario ya que, para nuestra aplicación, habilitaremos un "service" del tipo load balancer que se encargará de balancear sobre todas las instancias de nuestra aplicación.

Ahora podremos usar el browser para, por ejemplo, acceder a Grafana y asi verificar que nuestra instalación de multipass + MicroK8s esta funcionando y accesible desde macOS. Para ello le pasaré a mi browser la siguiente url: http://192.168.64.2:8080/api/v1/namespaces/kube-system/services/monitoring-grafana/proxy/?orgId=1


Como se puede ver en la imagen, hemos podido acceder a Grafana sin problemas.



Para desplegar y generar el servicio hago:


# gotest.yaml
# gotest.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gotest
  labels:
    app: gotest
spec:
  replicas: 3
  selector:
    matchLabels:
      app: gotest
  template:
    metadata:
      labels:
        app: gotest
    spec:
      containers:
      - name: gotest
        image: antonof/gotest
        ports:
        - containerPort: 8081
        imagePullPolicy: Always
##
---
kind: Service
apiVersion: v1
metadata:
  name: gotest-service
  labels:
    app: gotest
spec:
  selector:
    app: gotest
  ports:
  - name: http
    port: 8081
    protocol: TCP
  type: LoadBalancer


Como se puede ver en ese fichero hay dos partes. La primera se refiere al deployment y la otra al servicio. Es importante destaca los labels ya que Kubernetes los usa para identificar a nuestra aplicación. Si miran bien, nuestra aplicacion tiene el label "gotest" y abajo el servicio tiene un selector con el label "app=gotest" eso quiere decir que el servicio balanceará todas las instancias de los pods que tengan el label "app=gotest".

También hay que destacar que el servicio de tipo "LoadBalancer" utiliza el protocolo SCTP por lo que no funcionará en soluciones Cloud que no soporten a dicho protocolo.

Antes de comenzar con el despliegue, podemos verificar que todo esta funcionando entrando al dashboard de Kubernetes en la url http://ip de la vm/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/



Si queremos ver todos los servicios desplegados y sus urls podemos hacer
multipass exec microk8s-vm -- /snap/bin/microk8s.kubectl get all --all-namespaces


Ahora que ya tenemos todo listo podemos desplegar nuestra aplicación. Se puede hacer de forma manual, con el siguiente comando
multipass exec microk8s-vm -- /snap/bin/microk8s.kubectl run gotest --image=antonof/gotest --replicas=1 --port=8081


Y luego crear el servicio también de forma manual con
multipass exec microk8s-vm -- /snap/bin/microk8s.kubectl expose deployment.apps/gotest -n default --type=LoadBalancer


O también se puede crear todo junto utilizando el fichero yaml que hemos creado. El problema aquí es que kube8s esta dentro de la vm por lo que hay que poner el fichero allí. Para hacer eso podemos abrir una consola dentro de la vm asi:
multipass shell microk8s-vm

Y una vez dentro podemos abrir vim y copiar allí el contenido del yaml salvandolo como gotest.yaml

Luego entonces podemos ejecutar:
multipass exec microk8s-vm -- /snap/bin/microk8s.kubectl create -f gotest.yaml

Para ver si el servicio se esta ejecutando, podemos usar la consola de Kubernetes descripta más arriba o el siguiente comando

multipass exec microk8s-vm -- /snap/bin/microk8s.kubectl get pods

Y para ver el servicio
multipass exec microk8s-vm -- /snap/bin/microk8s.kubectl get svc

NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE

gotest       LoadBalancer   10.152.183.80        8081:30988/TCP   49s

kubernetes   ClusterIP      10.152.183.1            443/TCP          24m

Nuestra aplicación estará disponible en el puerto del servicio que se muestra arriba (y este balanceará entre las instancias). probar en el browser (sin haber creado proxy) .

http://192.168.64.2:30988/


Y para detener tanto servicio como pods
multipass exec microk8s-vm -- /snap/bin/microk8s.kubectl delete -f gotest.yaml


Para escalar los pods usamos el nombre que aparece cuando ejecutamos get all --all-namespaces
multipass exec microk8s-vm -- /snap/bin/microk8s.kubectl scale --replicas=1 deployment.apps/gotest


No hay comentarios:

Publicar un comentario

Go, Docker and Kubernetes on Mac (II)

Elegir versión de Kubernetes Al momento de intentar usar Kubernetes en nuestro Mac descubrimos que solo corre en Linux, por lo que deb...