viernes, 13 de abril de 2018

Kubernetes despliegue de ingress sólo usando "gce"



Cuando en un proyecto, desplegado en google cloud usando GKE, necesitamos presentar  unos POD,s a internet con http,  lo que necesitamos es crear  un ingress que gestione el trafico de http y https, el recurso que nos permite usar google es el crear un ingress del tipo "GCE".

Para poder seguir esta receta usaremos la SHELL que nos presenta la propia plataforama de google Cloud.

Después de seleccionar el proyecto y estar autentificados con nuestra usuario de trabajo habrimos una shell de trabajo. Para poder desplegar dos nodos de trabajo (HOST) donde trabajar con kubernetes.

Seleccionamos la zona de trabajo introducidos estos comando de gcloud:


gcloud config set compute/zone europe-west1-b

Creamos un cluster de kubernetes para nuestro ejemplo:

gcloud container clusters create nginx-tutorial --num-nodes=2

Esperamos a que se arme le sistema con los dos HOST  y podremos desplegamos nuestro pod para la demostración.

kubectl run hello-world --replicas=1 --labels="run=load-balancer-example" -- image=grc.io/google-sapmples/node-hello:1.0 --port=8080


Con esto creamos 1 replicas de los pod hello-world llamado hello-word, que lo podremos ver en la zona de “Workloads” usando las herramientas web de GKE o con el comando:

kubectl get deployments hello-world

A continuación crearemos un servicio interno para conectar con este pod.

kubectl expose deployment hello-world --target-port=8080 --type=NodePort --name=servicio-nodeport


En el menu “Discovery & load Balancing” veremos que se crea un servicio con el nombre antes dado que apunta a el pod configurado y que tenemos en marcha de tipo “NodePort”

Para poder usar el un certificado para el trafico https necesitaremos un certificado en este caso para la práctica sera autofirmado, para el dominio foo.bar.com los pasos en el shell son:


openssl reg -x509 -nodes -day 365 -newkey rsa:2048 -keyout /tmp/tls.key -out /tmp/tls.crt -subj"/CN=foo.bar.com"

Estos certificados se los pasamos a los Secrets de kubernetes para que puedan ser usados con el comando:

kubectl create secret tls foo-secret --key /tmp/tls.key --cert /tmp/tls.crt

Para crear el fichero de configuración del servicio final de tipo ingress crearemos un fichero de configuración ssl.yaml con el siguiente contenido:

kind: Ingress
metadata:
  name: ssl-ingress
  namespace: default
spec:
  tls:
  - hosts:
    - foo.bar.com
    secretName: foo-secret
  rules:
  - host: foo.bar.com
    http:
      paths:
      - backend:
          serviceName: servicio-nodeport
          servicePort: 8080
        path: /hello

Para que este servicio se aplique usamos:

kubectl apply -f ssl.yaml

Esto aplicara en unos 7 o 10 minutos aproximandamente y nos creara en “Discovery & load balancing” un servicio nuevo llamado ssl-ingress y que no esta vinculada a ningún pod ademas en “Network services” tambien crearía un “Load balancing” y  en “VCP network” en “External IP addresses” nos aparece una nueva ip externa marcada para su uso y que podemos ver usando el comando:

$ kubectl get ingress

Podemos listar  la ip del ingress asignada:

C NAME      HOSTS         ADDRESS          PORTS     AGE
ssl       foo.bar.com   35.186.229.127   80, 443   7m

En mi caso tenemos la 35.186.229.127 como el dominio no existe  para probarlo configuramos esta ip en nuestro ordenador local en en /etc/hosts, y cuando nos conectamos aceptamos el uso del certificado autofirmado…  ademas podemos ver como  funciona el servicio ingress en http y https, los  puertos los dos mostrando el programa mas popular "Hola mundo".