lunes, 30 de abril de 2018

Kubernetes [Best Practices] Organización con Namespaces

Hoy en google cloud español hablamos sobre la segunda entrega de una serie de videos y blogs en siete partes de Google Developer Advocate Sandeep Dinesh y sobre cómo aprovechar al máximo el entorno de Kubernetes.

A medida que comienzas a construir más y más servicios encima de Kubernetes, las tareas simples se vuelven más complicadas. Por ejemplo, los equipos no pueden crear Servicios de Kubernetes o Implementaciones con el mismo nombre.
Si tienes muchísimos pods, serviciosdeployments , solo listarlos tiene un coste alto de tiempo y de gestión, ¡y mucho menos administrarlos! Y estos son solo la punta del iceberg.

Veamos cómo Kubernetes Namespaces puede facilitar la gestión de los recursos de Kubernetes.



¿Qué es Namespace?

El mejor acercamiento como concepto al Namespace es  como un clúster virtual dentro de su clúster de Kubernetes. Puede tener múltiples namespaces dentro de un único clúster de Kubernetes, y todos están lógicamente aislados el uno del otro. ¡Te ayudara  en la gestión de  equipos con organización, seguridad e incluso rendimiento!

El "default" Namespace 

En la mayoría de las distribuciones de Kubernetes, el clúster de inicio por defecto esta dentro del Namespace "default". De hecho, hay tres namespaces con los que Kubernetes se crea: default, kube-system (utilizado para componentes de Kubernetes) y kube-public ( usado para recursos públicos). kube-public no se usa mucho actualmente, y generalmente es una buena idea dejar solo el kube-system, especialmente en un sistema administrado como Google Kubernetes Engine. Esto deja el namespace default como el lugar donde se crean sus servicios y aplicaciones por defecto.

No hay absolutamente nada de especial en este Espacio de nombres, excepto que las herramientas de Kubernetes están configuradas de serie para usar este espacio de nombres y no puede eliminarlo. Si bien es bueno para comenzar y para sistemas de producción más pequeños, recomendaría no usarlo en sistemas de producción grandes. Esto se debe a que es muy fácil para un equipo sobrescribir accidentalmente o interrumpir otro servicio sin siquiera darse cuenta. En su lugar, cree múltiples namespaces y úselos para segmentar sus servicios en zonas mas manejables.

Creando Namespaces

No tengas miedo de crear namespaces. No penalizan el  rendimiento, y en muchos casos pueden mejorar el rendimiento, ya que la API de Kubernetes tendrá un conjunto de objetos más pequeño para trabajar.

Crear un espacio de nombres se puede hacer con un solo comando. Si quisiera crear un espacio de nombres llamado 'test',  tendrías que ejecutar:


kubectl create namespace test

O puede crear un archivo YAML y aplicarlo como cualquier otro recurso de Kubernetes.
test.yaml:
kind: Namespace
apiVersion: v1
metadata:
  name: test
  labels:
    name: test
kubectl apply -f test.yaml

Visualización de Namespaces

Puede ver todos los namespaces con el siguiente comando:

kubectl get namespace


$kubectl get namespace
NAME         STATUS      AGE
default      Active      5d
kube-public  Active      5d
kube-sistem  Active      5d
test         Active      3m

Puede ver los tres namespaces basicos, así como el nuevo espacio de nombres llamado 'test'.

Crear recursos en el namespace

Echemos un vistazo a un simple YAML para crear un Pod:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
  labels:
    name: mypod
spec:
  containers:
  - name: mypod
    image: nginx

Normalmente en los ejemplos no se indica el namespace en ningún lado. Si ejecuta una aplicación `kubectl` en este archivo, creará el Pod en el espacio de nombres activo actual. Este será el espacio de nombres "default" a menos que lo cambie.

Hay dos formas de decirle explícitamente a Kubernetes en qué Namespace desea crear sus recursos.
Una forma es establecer el indicador de "namespace" al crear el recurso:

kubectl apply -f pod.yaml --namespace=test

También puede especificar un espacio de nombres en la declaración YAML.

apiVersion: v1
kind: Pod
metadata:
  name: mypod
  namespace: test
  labels:
    name: mypod
spec:
  containers:
  - name: mypod
    image: nginx

Si especifica un espacio de nombre en la declaración YAML, el recurso siempre se creará en ese espacio de nombres. Si intenta utilizar el indicador "namespace" para establecer otro espacio de nombres, el comando fallará.

Visualización de recursos en el Namespace

Si intentas encontrar tus Pod, ¡es posible que notes que no los ves!

$ kubectl get pods
No resources found.

No se encontraron recursos. Esto se debe a que todos los comandos se ejecutan contra el namespace actualmente activo. Para encontrar su Pod, debe usar el indicador "namespace".

$ kubectl get pods --namespace=test
NAME      READY     STATUS    RESTARTS   AGE
mypod     1/1       Running   0          10s

Esto puede ser incomdo, especialmente si es un desarrollador que trabaja en un equipo que usa su propio Espacio de nombres para todo y no desea usar el indicador de "espacio de nombre" para cada comando. Veamos un ejemplo de cómo podemos facilitar este caso.

Administrar tu namespace activo

Por defecto al iniciar el namespace es "default". A menos que especifique un Namespace en el YAML, todos los comandos de Kubernetes usarán el Namespace activo.

Desafortunadamente, tratar de administrar tu espacio de nombre activo con kubectl puede ser una incomodo. Afortunadamente, hay una herramienta realmente buena llamada kubens (creada por  Ahmet Alp Balkan) que hace que sea muy fácil.

Cuando ejecuta el comando 'kubens', debería ver todos los namespaces, con el espacio de nombres activo resaltado:

$ kubens
default
kube-public
kube-system
test


Para cambiar su espacio de nombres activo al espacio de nombres 'test', ejecuta:

kubens test

Ahora puede ver que el espacio de nombres de 'prueba' está activo:

$ kubens
default
kube-public
kube-system
test

Ahora, si ejecuta los comandos kubectl, namespace será 'test' en lugar de 'default'. Esto significa que no necesita el indicador de espacio de nombres para ver el pod en el namespace de test.

$ kubectl get pods
NAME      READY     STATUS    RESTARTS   AGE
mypod     1/1       Running   0          10m

Comunicación entre distintos Namespaces

Los namespaces están "ocultos" entre sí, pero no están completamente aislados por defecto. Un servicio en un namespaces puede hablar con un servicio en otro namespaces. Esto a menudo puede ser muy útil, por ejemplo para que el servicio de su equipo en su namespaces se comunique con el servicio de otro equipo en otro namespaces.

Cuando su aplicación quiere acceder a los servicios de Kubernetes, puede usar el descubrimiento del servicio DNS integrado y simplemente apuntar su aplicación a nombre del Servicio. Sin embargo, puede crear un servicio con el mismo nombre en múltiples namespaces. Afortunadamente, es fácil evitar esto al usar la forma expandida de la dirección DNS.

Los servicios en Kubernetes exponen su punto final utilizando un patrón DNS común. Se parece a esto:

<Service Aame>.<Namespace Name>.svc.cluster.local

Normalmente, solo necesita el nombre del Servicio y el DNS se resolverá automáticamente en la dirección completa. Sin embargo, si necesita acceder a un Servicio en otro Espacio de nombre simplemente use el Nombre del servicio más el nombre del namespaces.

Por ejemplo, si desea conectarse al servicio de "base de datos" en el espacio de nombres de "test", puede usar la siguiente dirección:

database.test

Si desea conectarse al servicio de "base de datos" en el espacio de nombres de "production", puede usar la siguiente dirección:

database.production

Advertencia: si crea un espacio de nombres que se asigna a un TLD como "com" u "org", y luego crea un servicio que tiene el mismo nombre que un sitio web, como "google" o "reddit", Kubernetes interceptará las solicitudes a " google.com "o" reddit.com "y envíelos a su Servicio. Esto a menudo puede ser muy útil para probar, ¡pero también puede liar las cosas fácilmente en su clúster!

Nota: Si desea aislar los namespaces, debe usar las políticas de red para lograr esto. Estén atentos para más sobre esto en un episodio futuro!

Granularidad del Namespaces

Una pregunta común que recibo es cuántos namespaces crear y con qué propósito. ¿Cuantos son necesarios para ser manejable? Si se crean demasiados namespaces  se interpongan en su camino, pero haga muy pocos y se pierden  los beneficios.
Creo que la respuesta radica en en qué etapa se encuentra su proyecto o compañía: desde un equipo pequeño hasta una gran empresa, cada uno tiene su propia estructura organizativa. Dependiendo de su situación, puede adoptar la estrategia concrete en su namespaces.

En una empresa pequeña

En este escenario, usted es parte de un pequeño equipo que está trabajando en 5-10 microservicios y puede reunir fácilmente a todos al rededor de unas pizzas. En esta situación, tiene sentido lanzar todos los servicios de producción en el espacio de nombres "default". Es posible que desee tener un espacio de nombres de "producción" y "desarrollo" si quiere gestionar mas fino, pero probablemente esté probando su entorno de desarrollo en su máquina local usando algo como Minikube.

En una empresa que se expande

En este escenario, tiene un equipo en rápido crecimiento que está trabajando en más de 10 microservicios. Está empezando a dividir el equipo en múltiples sub-equipos que cada uno posee sus propios microservicios. Si bien todos pueden saber cómo funciona el sistema completo, cada vez es más difícil coordinar cada cambio con los demás. Tratar de hacer girar la pila completa en su máquina local se vuelve más complicado cada día.

En este punto, es necesario usar múltiples clusters o namespaces para producción y desarrollo. Cada equipo puede elegir tener su propio espacio de nombre para una administración más fácil.

Empresa que crece

En una gran empresa, no todos conocen a los demás. Los equipos están trabajando en funciones que otros equipos podrían no conocer. Los equipos están utilizando contratos de servicios para comunicarse con otros microservicios (por ejemplo, gRPC) y mallas de servicio para coordinar la comunicación (por ejemplo, istio). Tratar de ejecutar toda la pila localmente es imposible. Se recomienda encarecidamente utilizar un sistema de CD compatible con Kubernetes (p. Ej., Spinnaker).

En este punto, cada equipo definitivamente necesita su propio namespaces. Cada equipo incluso puede optar por múltiples namespaces para ejecutar sus entornos de desarrollo y producción. Configurar RBAC y ResourceQuotas es una buena idea también. Múltiples clusters comienzan a tener mucho sentido, pero pueden no ser necesarios.

Gran empresa

En esta escala, hay grupos que ni siquiera conocen la existencia de otros grupos. Los grupos también pueden ser compañías externas, y los servicios se consumen a través de API bien documentadas. Cada grupo tiene múltiples equipos que tienen múltiples microservicios. Usar todas las herramientas que mencioné anteriormente son necesarias; las personas no deberían desplegar servicios a mano y deberían estar bloqueados fuera de los namespaces que no les pertenecen.
En este punto, probablemente tenga sentido tener múltiples clusters para reducir el radio de infestación de aplicaciones mal configuradas y facilitar la administración de recursos y facturación.

Conclusión

Los namespaces pueden ayudar significativamente a organizar sus recursos de Kubernetes y pueden aumentar la velocidad de sus equipos. Estén atentos para futuros episodios de Kubernetes Best Practices donde les mostraré cómo pueden bloquear recursos en un Namespace e introducir más seguridad y aislamiento en su clúster.

domingo, 29 de abril de 2018

Evento divulgativo Google Cloud Español en Lleida el 22 de junio

Los creadores de la comunidad entorno a la plataforma Google Cloud Español, Mario Ezquerro y Marcos Manuel Ortega, expertos en las tecnologías cloud de Google, nos formarán el próximo día 22 de junio en las instalaciones del Parque Científico de Lleida, donde el GDG Lleida tiene su base, con un día completo de charlas y actividades en el que también nos acompañará Laura Morillo-Valverde, Google Developer Expert en Cloud y Andrés Leonardo Martínez, almo, Google Developer Program Manager en Google Spain.

Será una jornada muy completa en que los diferentes ponentes irán desarrollando aspectos desde los muy generales a los muy concretos de la plataforma Cloud de Google, teniendo también momentos de manos a la obra por la tarde y networking en las diferentes sesiones para poder interactuar con ellos más individualmente.

La agenda del evento se desarrollará en 2 sesiones, una matinal con 3 charlas de 45 minutos más preguntas, y otra de tarde con 2 workshops de 1 hora.

AGENDA

Sesión matinal en la sala Joan Oró del Cedico, primera planta del edificio central del Parc Científic de Lleida (habrá carteles indicadores)

- 9:30 Bienvenida, a cargo de Andrés Leonardo Martinez, Google Developer Program Manager en Google Spain, Sisco Giné, Director de la Escuela Politécnica de la Universidad de Lleida, y Andreu Ibáñez, organizador del Google Developer Group Lleida y Coordinador de los Laboratorios TIC del Parque Científico.




-9:45 Introducción y creación de instancias en la plataforma Google Cloud, donde Mario Ezquerro nos irá desgranando con una especial lingüistica los entresijos de la amplia plataforma de servicios que Google ofrece a desarrolladores y empresas.




- 10:45 Pausa café - networking, Sala Martina Castells (anexa a la sala Joan Oró)


- 11:15 Big data, ML e IA en Google Cloud Platform, donde Marcos Manuel Ortega nos mostrará como interconectar servicios de procesado, almacenamiento, análisis y visualización de datos, modelos de machine learning y deep learning e incluso servicios de IA ya preentrenados y listos para usar.



- 12:15 Desarrollo y despliegue contínuo con microservicios, donde Laura Morillo-Valverde nos dará una charla que mezcla docker, docker compose y kubernetes.




- 13:30 final sesión matinal



Sesión de tarde en la sala Martina Castells del Cedico, primera planta del edificio central del Parc Científic de Lleida (habrá carteles indicadores)

Se recomienda pero no es necesario traer el portátil propio con la cuenta de Google Cloud activada para seguir el workshop, aunque el ponente desarrollará todo el contenido en el proyector.

- 16:30 Taller Plataforma Google Cloud, por Mario Ezquerro

- 17:30 Taller Big Data en Google Cloud, por Marcos Manuel Ortega

- 18:30 - 19:30 networking, habrá cervezas y algo para picar.




Inscripción al evento
Entrada gratuita, pero se requiere registro en la plataforma de Meetup para logística.
Link al Meetup del evento.



Ubicación:
Edificio CEDICO, Parc Científic de Lleida, 1a planta. Auditorio Joan Oró y Sala Martina Castells. 



Con la  colaboración de:





Además los ponentes asistirán al Meetup mensual del GDG Lleida en el Parc Científic el dia anterior, donde comentarán sus experiencias en la sesión doble de 18:00 a 20:00 horas que podéis ver en el Meetup: Experiencias Personales, Local Guides Lleida.


Cartel promocional: en PDF









sábado, 28 de abril de 2018

HELM en GKE cluster



Hoy en google cloud español, en esta guía rápida ayuda con algunos aspectos prácticos sobre cómo ejecutar el HELM en el clúster Google Kubernetes Engine (GKE).

Para poder entender y aprovechar esta entrada tienes que tener conocimientos previos sobre:

Las herramientas HELM , Kubernetes y GKE.
Tener  una instalación local de kubectl y HELM también un clúster GKE con al menos 3 nodos.
Y ademas esto esta probad en estas versiones:  cliente kubectl 1.9.3, cliente helm 2.8.2 GKE v1.9.6-gke.1

Crear cuenta de servicio para HELM

Primero crea una cuenta de servicio para HELM y adjunta una función de administrador de clúster. Hay razones por las que deberías hacer esto. Esto se puede hacer con kubectl apply -f <file>

# This is an extract from here: http://jayunit100.blogspot.fi/2017/07/helm-on.htmlapiVersion: v1kind: ServiceAccountmetadata: name: helm namespace: kube-system---apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRoleBindingmetadata: name: helmroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-adminsubjects: - kind: ServiceAccount name: helm namespace: kube-system


Crea estes fichero con nombre crear-account-helm.yaml y crear cuenta de servicio para HELM y clusterrolebinding.

$ kubectl apply -f crear-account-helm.yaml


Elevar privilegios para crear ClusterRoleBindings

Omita esta sección si el comando anterior no prensento errores. A veces, terminará con errores prohibidos en GKE. Una forma más simple de resolver esto es ejecutando ClusterRoleBinding como usuario privilegiado esto se hace: Obtenga su contraseña de administrador con gcloud describe

$ gcloud container clusters describe my_k8s --zone europe-west2-a --proyect kubernetes-helm | grep -i password
Use esas credenciales y cree la cuenta de servicio y el enlace de rol de clúster de la sección anterior. Una forma sería modificar su $HOME/ .kube/config para agregar una nueva entrada de usuario y proporcionarla a su contexto y luego volver atrás después de inicializar HELM.

- context:      cluster: gke_kubernetes-helm_europe-west2-a_my_k82      namespace: jx      user: cluster-admin   name: gke_kubernetes-helm_europe-west2-a_my_k82users:- name: cluster-admin  user:     password: <la password que hemos localizado>     username: admin

Inicializamos HELM

Ahora ejecute $ helm init  pasando la cuenta de servicio.

$ helm init --service-account helm
-----<Salida de comando>
$helm version
-----<Tienes que ver la vesiones del Cliente y del Server de helm>

Verificar HELM

Para empezar, debe haber al menos una implementación y un servicio con el nombre:
 tiller-deploy in kube-system namespace.

$ kubectl get deploy,svc tiller-deploy -n kube-system

Crea un samplechart e instálalo con el nombre helm-test. Esto va a instalar un simple pod nginx. Establezca el tipo de servicio como LoadBalancer.

$ helm create samplechart
Puedes ver la ip externa asignada después de no menos de 5 minutos con:
 $ helm get svc
Y podrás aceder a esa web pero lo mas rapido es un: curl <ip.ip.ip.ip>

Con todo esto obtendrás en marcha y funcionado  HELM, el error mas común es  encontrarse con un "Authorization error" un Error sobre clusterrrolebindings.rback.authorization.k8s.io donde el usuario  no pude crear el clusterrolebindngs, el problema es que el usuario carece de permisos pero para eso tienes en este blog la sección "Elevar privilegios para ClusterRoleBindings", no copies y peges lee las instrucciones. ;-)

miércoles, 25 de abril de 2018

Kubernetes [Best Practices] Crear imágenes de Docker "pequeñas"


Sandeep Dinesh nos ha anunciado que esta realizando una serie de videos y blogs en siete partes de Google  sobre cómo aprovechar al máximo su entorno de Kubernetes.



El primero aborda la teoría y los aspectos prácticos de mantener las imágenes de sus contenedores lo más pequeñas posible,  coincidimos con el. Docker hace que construir contenedores sea muy fácil.

Simplemente ponga un archivo Docker estándar en su carpeta, ejecute el comando 'build' de la línea de comandos y ¡Buala! ¡Tu imagen de docker está construida!.

La desventaja de esta simplicidad es que es fácil construir enormes contenedores llenos de cosas que no necesitas, incluidos posibles agujeros de seguridad.

Vamos a seguir  las  "Buenas prácticas de Kubernetes", explicaremos  cómo crear imágenes de contenedores listas para producción utilizando Alpine Linux y el patrón de generador Docker, y luego ejecutamos algunos puntos de referencia que pueden determinar cómo funcionan estos contenedores dentro de su clúster de Kubernetes.

El proceso para crear imágenes de contenedores es diferente dependiendo de si está utilizando un lenguaje interpretado o un lenguaje compilado. ¡Vamos a empezar!

Containerizing interpreted languages

Los lenguajes interpretados, como Ruby, Python, Node.js, PHP y otros envían el código fuente a través de un intérprete que ejecuta el código. Esto le da la ventaja de omitir el paso de compilación, pero tiene el inconveniente de que debe enviar el intérprete junto con el código. Afortunadamente, la mayoría de estos idiomas ofrecen contenedores Docker preconstruidos que incluyen un entorno ligero que le permite utilizar contenedores mucho más pequeños. Tomemos una aplicación Node.js y dockerizemosla.



Primero, utilicemos la imagen Docker "node: onbuild" como base. La versión "onbuild" de un contenedor Docker pre-paquetes todo lo que necesita para ejecutar, por lo que no necesita realizar una gran cantidad de configuración para que las cosas funcionen. Esto significa que Dockerfile es muy simple (¡solo dos líneas!). Pero sufriras con  el precio en términos de tamaño del disco:

FROM node: onbuild
EXPOSE 8080


Al utilizar una imagen base más pequeña como Alpine, podemos reducir significativamente el tamaño de su contenedor. Alpine Linux es una distribución de Linux pequeña y liviana que es muy popular entre los usuarios de Docker porque es compatible con muchas aplicaciones y al mismo tiempo mantiene los contenedores pequeños.

Afortunadamente, hay una imagen oficial de Alpine para Node.js (así como otros lenguajes populares) que tiene todo lo que necesita. A diferencia de la imagen predeterminada de Docker "nodo", "node: alpine" elimina muchos archivos y programas, dejando solo lo suficiente para ejecutar su aplicación. El Dockerfile basado en Alpine Linux es un poco más complicado de crear ya que tiene que ejecutar algunos comandos que la imagen de construcción.


FROM node:alpine
WORKDIR /app
COPY package.json /app/package.json
RUN npm install --production
COPY server.js /app/server.js
EXPOSE 8080
CMD npm start


Pero, vale la pena, porque la imagen resultante es mucho más pequeña con solo 65 MB

Containerizing compiled languages

Los lenguajes compilados como Go, C, C ++, Rust, Haskell y otros crean binarios que pueden ejecutarse sin muchas dependencias externas. Esto significa que puede construir el binario por adelantado y enviarlo a producción sin tener que enviar las herramientas para crear el binario, como el compilador.

Con el soporte de Docker para construcciones de varios pasos, puede crear fácilmente solo el binario y una cantidad mínima de recursos. Vamos a ver cómo.

Tomemos una aplicación Go y conterizemosla usando este patrón. Primero, utilicemos la imagen Docker "golang: onbuild" como base. Como antes, el Dockerfile es solo dos líneas, pero una vez más, pagas el precio en términos de tamaño del disco: ¡más de 700 MB!

  
FROM goland:onbuild
EXPOSE 8080



El siguiente paso es utilizar una imagen base más pequeña posible, en este caso, la imagen "golang: alpine". Hasta ahora, este es el mismo proceso que seguimos para un lenguaje interpretado.

De nuevo, crear Dockerfile con una imagen base Alpine es un poco más complicado ya que tiene que ejecutar algunos comandos que debe realizar par construir la imagen.


FROM golang:alpine
WORKDIR /app
ADD . /app
RUN cd /app && go build -o goapp
EXPOSE 8080
ENTRYPOINT ./goapp


La imagen resultante es mucho más pequeña, ¡con un peso de solo 256 MB!

Sin embargo, podemos hacer que la imagen sea aún más pequeña: no necesita ninguno de los compiladores u otras herramientas de compilación y depuración con las que viene Go, que pueden ser eliminarlas del contenedor final.

Usemos una compilación de varios pasos para tomar el binario creado por el contenedor golang: alpine y empaquetarlo por sí mismo.


FROM golang:alpine AS build-env
WORKDIR /app
ADD . /app
RUN cd /app && go build -o goapp

FROM alpine
RUN apk update && \
   apk add ca-certificates && \
   update-ca-certificates && \
   rm -rf /var/cache/apk/*
WORKDIR /app
COPY --from=build-env /app/goapp /app
EXPOSE 8080
ENTRYPOINT ./goapp

¡Mira eso! ¡Este contenedor tiene solo 12 MB de tamaño!

Al compilar este contenedor, es posible que observe que Dockerfile hace cosas extrañas, como la instalación manual de certificados HTTPS en el contenedor. Esto se debe a que la base Alpine Linux se envía con casi nada preinstalado. ¡Así que, aunque necesita instalar manualmente todas y cada una de las dependencias, el resultado final es contenedores súper pequeños!


Nota: Si desea ahorrar aún más espacio, puede compilar estadísticamente su aplicación y usar el contenedor "cero". Usar "scratch" como contenedor base significa que estás literalmente comenzando desde cero sin ninguna capa base. Sin embargo, recomiendo usar Alpine como su imagen base en lugar de "scratch" porque los pocos MB adicionales en la imagen Alpine hacen que sea mucho más fácil usar herramientas estándar e instalar dependencias.



Pulling en  Kubernetes

Si bien es posible que no le importe el tiempo que lleva construir y empujar el contenedor, realmente debería preocuparse por el tiempo que lleva hacer el PULL el contenedor. Cuando se trata de Kubernetes, esta es probablemente la métrica más importante para su clúster de producción. 

Por ejemplo, supongamos que tiene un clúster de tres nodos y uno de los nodos esta roto. Si está utilizando un sistema administrado como Kubernetes Engine, el sistema automáticamente activa un nuevo nodo para tomar su lugar. Sin embargo, este nuevo nodo será completamente nuevo y deberá extraer todos sus contenedores antes de que pueda comenzar a funcionar. ¡Cuanto más tiempo lleve hacer pull de los contenedores, más tiempo su clúster no funcionará tan bien como debería! 

Esto puede ocurrir cuando aumenta el tamaño de su clúster (por ejemplo, usando el ajuste automático del motor de Kubernetes) o actualiza sus nodos a una nueva versión de Kubernetes (estad atentos para un episodio futuro sobre esto). Podemos ver que el rendimiento de extracción de múltiples contenedores de múltiples implementaciones realmente puede sumar aquí, y el uso de contenedores pequeños puede reducir los minutos de los tiempos de implementación.



Seguridad y vulnerabilidades

Además del rendimiento, existen importantes ventajas de seguridad al usar contenedores más pequeños. Los contenedores pequeños generalmente tienen una superficie de ataque más pequeña en comparación con los contenedores que usan imágenes de base grandes. 

Construí los contenedores Go "onbuild" y "multi-etapa" hace unos meses, por lo que probablemente contengan algunas vulnerabilidades que se han descubierto desde entonces. Usando el Escaneo de Vulnerabilidades integrado de Container Registry, es fácil escanear sus contenedores en busca de vulnerabilidades conocidas. Veamos lo que encontramos



¡Guau, esa es una gran diferencia entre los dos! Solo tres vulnerabilidades "medianas" en el contenedor más pequeño, en comparación con 16 vulnerabilidades críticas y más de 300 en el contenedor más grande. 
Vamos a profundizar y ver qué problemas tiene el contenedor más grande.
¡Puedes ver que la mayoría de los problemas no tienen nada que ver con nuestra aplicación, sino con programas que ni siquiera estamos usando! Debido a que la imagen de varias etapas usa una imagen base mucho más pequeña, hay menos cosas que pueden verse comprometidas.

viernes, 20 de abril de 2018

Serverless functions en Kubernetes con fission.io


Que los servicios serverless están de moda no es algo nuevo, además es una forma de disponer de infraestructura sin necesidad de tener los conocimientos para su mantenimiento y operativa diaria, es por ello que está ganando aceptación este tipo de servicio que permite a desarrolladores individuales o equipos pequeños desarrollar sus aplicaciones o parte de ellas usando servicios serverless.

La cuestión es que este tipo de servicios parece excluyente del uso de kuberntes, o por lo menos a mi me lo parecía, puedes tener un clúster con Kuberntes que tenga parte de tu infraestructura y por otro lado puedes tener serverless functions que hagan parte de los procesos que necesitas para tu aplicación, sobre todo en aplicaciones que ya están en producción esto supone un doble control de costes, ya que el servicio serverless se va a facturar en base a unas  tarifas mientras que el clúster de Kubernetes se va a facturar en base a otras tarifas, claro ejemplo de ello lo tenemos en Google Cloud Platform.

En el articulo "Serverless functions con Kubernetes" podemos ver como con unos simples pasos tener listo para desarrollo o incluso producción un clúster con Kubernetes y fission.io, éste último es un framework que nos va a permitir tener serverless funciotions dentro de nuestro clúster en varios lenguajes de programación.

Tal como se recomienda en el articulo es bueno repasar el articulo "Herramientas básicas para administrar Kubernetes desde el terminal" donde repasamos la herramientas necesarias para operar un clúster de Kubernetes.


jueves, 19 de abril de 2018

Defensa en Google Cloud "Coud Armour"



Hoy en google cloud en español hablamos de un nuevo servicio de seguridad de google Cloud: hablamos de  Cloud Armour, un nuevo servicio de seguridad DDoS y aplicaciones. Se basa en las mismas tecnologías y la misma infraestructura global que utiliza para proteger los servicios de Google, como Search, Gmail y YouTube.

Expuestos a toda la net.

Los expertos en seguridad dentro de google están todo el día para defender los servicios principales de Google de una amplia variedad de ataques maliciosos. Las métricas de los ataques DDoS dirigidos a los servicios de Google en la última década revelan que los volúmenes de ataque han aumentado exponencialmente en varios ejes: bits por segundo (bps), paquetes por segundo (pps) y HTTP (S) por segundo (qps).

"Absorber los ataques más grandes requiere el ancho de banda necesario para ver medio millón de videos de YouTube al mismo tiempo ... en HD".
- Dr. Damian Menscher, Defensa DDoS, Google

Para defenderse de esta amenaza, en google esta implementada una infraestructura y sistemas de seguridad para mitigar los ataques dirigidos a sus  servicios, y esta misma infraestructura respalda a Google Cloud.
Con global HTTP load balancing, el primer servicio de Google Cloud Platform (GCP) compatible con Cloud Armor, obtiene una defensa integrada contra los ataques DDoS contra la infraestructura. No se requiere ninguna configuración adicional, aparte de configurar el equilibrio de carga.

La defensa es un esfuerzo de colaboración.
"Trabajamos en estrecha colaboración con varios grupos de la industria para rastrear las amenazas emergentes, lo que nos permite protegernos a nosotros mismos y a los demás. Además, recibimos krebsonsecurity.com y otros objetivos frecuentes para asegurar que estamos entre los primeros en ver nuevos métodos de ataque. Esto nos permite diseñar defensas y desmantelar botnets antes de que tengan la oportunidad de crecer ".
- Dr. Damian Menscher, Defensa DDoS, Google

Compartir recursos entre Google y Google Cloud Services permite absorber fácilmente los ataques más grandes y también garantizar que un ataque a un cliente no afecte a otros.

Cloud Armor

Cloud Armour funciona en conjunto con el Load balancing HTTP (S) global y le permite desplegar y personalizar defensas para sus aplicaciones orientadas a Internet. De forma similar al equilibrio de carga HTTP (S) global, Cloud Armor se entrega al borde de la red de Google, lo que ayuda a bloquear ataques cerca de su origen. Se basa en tres pilares: un marco de políticas, un lenguaje de reglas completo y una infraestructura gestionada de forma global.

"Cloud Armor es un gran ejemplo de cómo Google continúa innovando en su estrategia de seguridad generalizada de defensa en profundidad, brindando una capa de control de seguridad que se puede gestionar desde el punto de vista de la red".
- Matt Hite, Ingeniero de redes, Evernote

Funciones y funcionalidad de Cloud Armor

Con Cloud Armor, puedes:


  • Defiende tus servicios contra los ataques DDoS de infraestructura a través del Load-Balancing HTTP (S)
  • Configurar políticas de seguridad, especificar reglas y orden de evaluación para estas reglas
  • Permitir, bloquear, previsualizar y registrar el tráfico
  • Implementar listas blancas y listas negras de IP para tráfico IPv4 e IPv6
  • Crea reglas personalizadas utilizando un lenguaje de reglas enriquecido para hacer coincidir el tráfico en función de cualquier combinación de parámetros de solicitud de capa 3 y HTTP (S) y permita o bloquee este tráfico (en alfa)
  • Permite el control basado en la geolocalización y la defensa basada en aplicaciones para SQL Injection (SQLi) y cross-site Scripting (XSS) ataques (en alfa)

Con la base anterior en su lugar, esperamos ampliar las capacidades de Cloud Armor en los próximos meses.

Framework de seguridad de Cloud Armor

La configuración de Cloud Armor está gestionada por políticas de seguridad. Para implementar Cloud Armor, debe crear una política de seguridad, agregar reglas y luego adjuntar esta política a uno o más servicios backend de equilibrio de carga HTTP (S).

Una política de seguridad de Cloud Armor se compone de una o más reglas, donde cada regla
 especifica los parámetros a buscar en el tráfico, la acción a seguir si el tráfico coincide con estos parámetros y un valor de prioridad que determina la posición de esta regla en el jerarquía política


Cloud Armor le permite crear múltiples políticas por proyecto. Puede personalizar la defensa de un subconjunto de servicios de back-end creando una política específica para estos servicios.


A continuación, mostramos cómo configurar listas negras de IP y listas blancas usando Cloud Armor:


Cloud Armor Rules Language (en alfa)

El lenguaje de reglas de Cloud Armor le permite personalizar las defensas para sus requisitos concretos. A menudo, los atacantes usan múltiples patrones conocidos y personalizados para intentar tirar el servicio. Las reglas personalizadas le permiten configurar patrones de ataque específicos para buscar en el tráfico y luego bloquear este tráfico a escala.

A continuación, se incluye un ejemplo de una regla personalizada para defenderse de un ataque que se considera que proviene de EE. UU. Y que contiene una cookie y un agente de usuario específicos.
Configuración usando gCloud CLI:



Configuración usando consola:


Para los ataques más comunes que reconocen la aplicación, Cloud Armor proporciona dos reglas preconfiguradas: defensas entre sitios ('xss-canary') y SQL Injection ('sqli-canary'). En el siguiente ejemplo, configuramos una regla de defensa de inyección SQL en la política "sql-injection-dev" utilizando gCloud CLI:


A continuación, puede ver la regla de defensa SQLi, junto con otras reglas, en la política:


Puede solicitar el acceso alfa a estas características registrándose mediante este formulario.

Visibilidad en el tráfico bloqueado y permitido

Puede ver el tráfico permitido y bloqueado en Stackdriver como se muestra a continuación:


Ecosistema Partner

En google cuenta con una cantidad de contactos de proveedores de seguridad que ofrecen soluciones que complementan las capacidades de Cloud Armor. Puede usarlos junto con el loadbalancing HTTP (S) global y Cloud Armor para crear una solución de seguridad integral. Tienes mas información aqui.

Empiece hoy

Cloud Armor es para todos los que implementan servicios orientados a Internet en Google Cloud. Puedes obtener más información visitando el sitio web Cloud Armor. Ademas ¡Esperam sus comentarios!

martes, 17 de abril de 2018

Istio ¿Que es? ¿Por que lo necesitas?


En google cloud español hablamos de Istio usando este articulo  creado por @grapesfrog
¿Qué es Istio? esto es lo que nos dice la web de Istio:

Istio proporciona:
  • Equilibrio de carga automático para tráfico HTTP, gRPC, WebSocket y TCP.
  • Control detallado del comportamiento del tráfico con reglas de enrutamiento, reintentos, failovers e inyección de fallas.
  • Una capa de política conectable y una API de configuración que admite controles de acceso, límites de velocidad y cuotas.
  • Métricas, registros y rastreos automáticos para todo el tráfico dentro de un clúster, incluido el ingress y la salida del clúster.
  • Asegura la autenticación de servicio a servicio con la gestion de identidad entre servicios en un clúster.
Para agreguar soporte de Istio a los servicios mediante la implementación de un "proxy sidecar" especial (un contenedor de ayuda) en su entorno.

Una vez que el "proxy sidecar "está instalado, toda la comunicación de red entre los (micro) servicios se realiza a través de este proxy. Además, toda la comunicación de red se configura y gestiona utilizando la funcionalidad de control de Istio.

Istio es una malla de servicio. La definición que uso cuando pienso en malla de servicio es esta: "Una capa de infraestructura dedicada para hacer que la comunicación de servicio a servicio sea segura, eficiente y confiable"

Sin embargo, si, como yo, comenzaste en los documentos de concepto tienen esto: "El término malla de servicio se usa a menudo para describir la red de microservicios que conforman dichas aplicaciones y las interacciones entre ellas.

Como una malla de servicio crece en tamaño y complejidad, puede ser más difícil de entender y administrar. Sus requisitos pueden incluir descubrimiento, balanceo de carga, recuperación de fallas, métricas y monitoreo, y con frecuencia requisitos operativos más complejos como pruebas A / B, lanzamientos "canarios",  limitación de velocidad, control de acceso y autenticación de extremo a extremo. Istio proporciona una solución completa para satisfacer los diversos requisitos de las aplicaciones de microservicio al proporcionar información de comportamiento y control operacional sobre la malla de servicio en general. "

¡Puede que te hayas confundido como yo después de leer eso! Terminé desviandome y exploré los "interwebs" en lo que era el consenso general con respecto a qué diablos es realmente una malla de servicio. Parece que la definición que uso es, por uso general de mi muestra no representativa, una elección razonable. Pero lo que faltaba era el detalle para separarlo de una herramienta de orquestación como k8s.

Istio se usa junto con K8 y no sería una cosa sin k8s u otras herramientas de orquestación de contenedores. NO hace orquestación y, en realidad, parece estar diseñado para abordar la complejidad operativa y de red de la gestión de grandes soluciones basadas en microservicios. ¡Entonces es una superposición que se añade  a algo así como k8s!.

Entonces sé lo que es Istio y lo que te ofrece, pero ¿a qué desafíos operacionales se está enfrentando en realidad?

Desde el por qué utilizar la página de Istio en sus estados, proporciona una cantidad de capacidades clave uniformemente en una red de servicios:
  • La gestión del tráfico
  • Observabilidad
  • Policy enforcement
  • Servicio de identidad y seguridad

Para que yo realmente entienda el valor de Istio, me pase por este tutorial,  así que usé este gran codelab

El codelab de Istio me presentó los cuatro componentes principales  de control de Istio:
  • Pilot: maneja la configuración y programación de los "sidecares proxy."
  • Mixer: maneja las decisiones de política para su tráfico y reúne telemetría.
  • Ingress: maneja las solicitudes entrantes desde fuera de su clúster.
  • CA: la autoridad de certificación.

Eche un vistazo a la página de conceptos de arquitectura de Istio para entender cómo estos componentes se juntan

El codelab me mostro las router-rules: la parte de traffic mgt

También probé algunas de las diversas tareas de Istio.io, ya que necesitaba entender cómo se trataba con las otras áreas para las que se diseñó.

Sugerencia: mantenga su clúster con la aplicación en funcionamiento si también decide probar mas conceptos fuera del codelab cuando haya terminado. Lo terminarás usándolo de todos modos.

Así que tenía una comprensión rudimentaria de cómo se dirigía a esas áreas, pero si uso un k8 administrado configurado como GKE (bueno, sabías que elegiría eso, ¿verdad?) ¿Cómo encaja Istio en todo caso?

Nota: Sí, hay más detalles de los que cubro aquí, pero me concentro en los aspectos que sentí que me ayudaron a decidir por qué necesitaría usar Istio.

Acceso del desarrollador / usuario final del clúster

GKE usa una combinación de IAM y RBAC, y sí, hay mucho para entender.

Para otorgar más permisos granulados a los usuarios de su clúster que los otorgados por Cloud IAM, usa espacios de nombre y RBAC, por ejemplo, para restringir el acceso a grupos específicos o para excluir el acceso a secretos.

Istio RBAC introduce dos roles centrados en los servicios
  • ServiceRole define un rol para el acceso a servicios en la malla.
  • ServiceRoleBinding otorga un rol a los sujetos (por ejemplo, un usuario, un grupo, un servicio).

Son objetos K8s CustomResourceDefinition (CRD). Y IAM sigue siendo una cosa que debes entender.

Identidad del servicio

GKE puede usar cuentas de servicio para administrar qué servicios de GCP pueden usar las aplicaciones que se ejecutan en GKE. Las claves para estas cuentas de servicio se almacenan como secretos.

La identidad de los procesos que se ejecutan en un pod son las cuentas de servicio de k8  junto con RBAC. Istio usa istio-auth, que proporciona una fuerte autenticación de servicio a servicio y usuario final mediante el uso de TLS mutuo, con una función de administración de identidades y credenciales integrada. Istio-auth usa cuentas de servicio k8s
En la web de Istio hacen un buen trabajo al explicar cómo funciona, así que voy a copiar una pequeña imagen del diagrama de arquitectura aquí.

Imagen de la arquitectura istio-auth

Itsio no proporciona nada para ayudar con el uso de cuentas de servicio GCP. Es muy temprano pero está en la hoja de ruta de los planes para el desarrollo futuro.

Istio-auth es agradable y las mejoras planeadas van a valer la pena esperar. Me inquieta la complejidad de la seguridad, ya que inevitablemente conduce a errores en la configuración, así que espero una alineación más perfecta entre los tipos de cuentas de servicio.

Controles de red

GKE (para k8s versión 1.7.6 +) usa las políticas de red de k8s para administrar qué pods y servicios pueden comunicarse. Esto es relativamente sencillo de configurar. Istio también tiene políticas de red, pero no son las políticas de k8 que usted conoce y usa, ¿cuál es la diferencia y por qué ambas? Esta publicación lo explica bien, así que no repetiré el razonamiento aquí, pero esta tabla resume las diferencias y por qué necesita ambas



Istio usa "envoys" como un "proxy sidecar". Envoy opera en la capa de aplicación del modelo OSI así que en la capa 7 ... Estoy parafraseando que el blog lo explica en detalle.
Necesita ambos tipos de políticas.

Varios clusters

Lo que Istio sí tiene y lo que no está de más es mezclar los adaptadores de red En pocas palabras, se abstraen del backend subyacente para ofrecer funcionalidad básica, como registro, supervisión, cuotas, verificación de ACL y más. Expone una sola API consistente, independiente de los backends en uso. ¡Así como GCS expone una única API independientemente de la clase de almacenamiento que use!

Creo que esta imagen de la publicación del blog sobre el modelo del adaptador mezclador captura en una imagen y explica  el punto de los adaptadores del mezclador




Hay una primera demostración de lo que creo que es una de las características más útiles del potencial de istio que realmente utiliza una máquina virtual para alojar una base de datos MySQL para la base de datos utilizada en el codelab e incorporar eso como parte de la malla que el clúster GKE es miembro de. Una malla para gobernarlos a todos (¡sé que no puedo evitarlo!)

La gestión del tráfico

Si hiciste el codelab habrás visto lo fácil que era usar istio para dirigir el tráfico usando reglas de ruta. Con K8 también puede gestionar el tráfico mediante implementaciones "canarias" y dirigir una parte del tráfico a una versión de su aplicación de manera similar a istio, pero Istio es mucho más flexible en este caso al permitirle establecer porcentajes de tráfico detallados y controlar el tráfico. usando otros criterios como en el laboratorio de códigos.

Descubrimiento de servicio

El registro del servicio se realiza en k8s. Istio abstrae los mecanismos subyacentes de descubrimiento de servicios y los conforma en un formato de consumibles estándar por parte de los sidecars enviados.

Audit Logging y monitoreo

Más allá del registro estándar que proporciona GKE, GKE puede integrarse con StackDriver Logging para recopilar, procesar y almacenar de forma persistente registros de contenedores, registros del sistema y eventos sobre la actividad en el clúster, como la programación de Pods. También puede integrarse con StackDriver Monitoring para recopilar las métricas del sistema (mediciones de la infraestructura del clúster, como el uso de la CPU o de la memoria) y las métricas personalizadas (métricas específicas de la aplicación).

Istio hace uso de prometheus para registrar y monitorear junto con grafana como front-end de presentación de datos. Me encanta la configuración del gráfico de servicio que le da una representación gráfica de su malla de servicio. También puede usar Elasticsearch con kibana y fluentd

Entonces, ¿necesito Istio?

Istio's traffic mgt es realmente agradable y el modelo de adaptador que mezcla y facilita la gestión de una malla que cubre múltiples clústeres y máquinas virtuales. Me gusta que Istio haga que pienses en los servicios y no tanto en pods y nodos, sin decir que no tienes que preocuparte por ellos, ¡pero hablar de servicios parece correcto!

Si necesita administrar un clúster distribuido, entonces Istio debe estar en su lista de compras. Si necesita más flexibilidad con traffic mgt de lo que los k8s pueden ofrecer nuevamente, Istio valdría la pena examinarlo.

Si tiene los recursos para jugar con algo que se encuentra en un estado de inicio de desarrollo, entonces vale la pena comprender el Istio. La curva de aprendizaje es baja si ya usa k8s.

Recuerde que es una superposición, por lo que aún necesita hacer cosas en la capa de k8, como configurar las políticas de red de k8 para complementar las políticas de red de istio.

Es pronto, así que no hace todas las cosas que esperarías / espero que lo haga aún. No puede evitar intercambiar las API de proveedor e Istio para realizar un trabajo completo.

¡Un dashboar sería bueno para visualizar la configuración de malla ya que del YAML se cansará uno rápidamente! Sí, puede configurar cuadros de mando para visualizar las métricas con la aplicación de dashboar que prefiera, pero me gustaría verla integrada con StackDriver

Conclusion , después de aprender un poco sobre Istio en general, me gusta lo que promete.