Ir a la aplicación con arquitectura sin servidor en Kubernetes con Knative

El autor de nuestro nuevo artículo traducido afirma que Knative es lo mejor que se les ocurrió en el universo. ¿Estás de acuerdo?


Si ya está utilizando Kubernetes, probablemente haya oído hablar de la arquitectura sin servidor. Aunque ambas plataformas, Kubernetes y Knative, son escalables, es la arquitectura sin servidor la que hace todo lo posible para proporcionar a los desarrolladores código de trabajo sin molestarlos con problemas de infraestructura. También reduce los costos de infraestructura al escalar virtualmente las instancias de aplicaciones desde cero.





Por otro lado, puede aprovechar Kubernetes sin limitaciones siguiendo el modelo de alojamiento tradicional y las técnicas avanzadas de gestión del tráfico. Gracias a esto, abrimos varias oportunidades, por ejemplo, implementaciones azul-verde y pruebas A / B.



¡Knative es un esfuerzo por tomar lo mejor de ambos mundos! Como plataforma en la nube de código abierto, Knative le permite ejecutar sus aplicaciones sin servidor en Kubernetes, aprovechando el poder de Kubernetes y asegura la simplicidad y flexibilidad de una arquitectura sin servidor.



Por lo tanto, los desarrolladores pueden centrarse en codificar e implementar un contenedor en Kubernetes con un solo comando, mientras que Knative administra la aplicación mientras se ocupa de los matices de la red, el escalado automático a cero y el seguimiento de versiones.



Además, Knative permite a los desarrolladores escribir código acoplado libremente con su marco de gestión de eventos, que proporciona suscripción universal, entrega y gestión de eventos. Esto significa que puede declarar la conectividad de eventos y sus aplicaciones pueden suscribirse a flujos de datos específicos.



Dirigida por Google, la plataforma de código abierto se ha incluido en la Cloud Native Computing Foundation. Esto implica que no hay dependencia del proveedor, que de lo contrario es una limitación significativa de las soluciones FaaS sin servidor en la nube actuales. Puede ejecutar Knative en cualquier clúster de Kubernetes.



¿Para quién es Knative?



Knative ayuda a una amplia variedad de profesionales, cada uno con sus propios conocimientos, experiencia y responsabilidades.







Los ingenieros pueden concentrarse en administrar el clúster de Kubernetes e instalar y mantener instancias de Knative mediante kubectl, mientras que los desarrolladores crean e implementan aplicaciones mediante la API de Knative.



Esta es una gran ventaja para cualquier organización, ya que ahora diferentes equipos pueden resolver sus tareas sin interferir entre sí.



¿Por qué debería usar Knative?



La mayoría de las organizaciones que utilizan Kubernetes tienen un proceso complejo para administrar la implementación y el mantenimiento de las cargas de trabajo. Esto lleva a los desarrolladores a prestar atención a los detalles de los que no necesitan preocuparse. Los desarrolladores deben centrarse en la codificación en lugar de pensar en ensamblajes e implementaciones.



Kubeless ayuda a los desarrolladores a facilitar la ejecución de su código sin tener que saber demasiado sobre lo que sucede bajo el capó de Kubernetes.



Un clúster de Kubernetes consume recursos de infraestructura porque requiere que todas las aplicaciones tengan al menos un contenedor en ejecución. Knative gestiona este aspecto por usted y se encarga del escalado automático de contenedores en el clúster desde cero. Esto permite a los administradores de Kubernetes empaquetar varias aplicaciones en un solo clúster.



Si tiene varias aplicaciones con diferentes horas pico o tiene un clúster con ajuste de escala automático de los nodos trabajadores, puede beneficiarse enormemente de esto durante el tiempo de inactividad.



Una verdadera mina de oro para las aplicaciones de arquitectura de microservicios que pueden no necesitar microservicios ejecutándose en un momento específico. Esto permite un uso más eficiente de los recursos y puede hacer más con recursos limitados.



Además, se integra bastante bien con el motor Eventing y facilita el diseño de sistemas no relacionados. El código de la aplicación puede permanecer completamente libre de cualquier configuración de punto final, y puede publicar y suscribirse a eventos declarando configuraciones en el nivel de Kubernetes. ¡Esta es una ventaja significativa para aplicaciones de microservicio complejas!



¿Cómo actúa Knative?



Knative proporciona la API kn mediante los operadores Kubernetes y CRD. Utilizándolos, puede implementar aplicaciones usando la línea de comando. En segundo plano, Knative creará todo lo que Kubernetes necesita (implementaciones, servicios, entradas, etc.) para ejecutar aplicaciones sin que usted tenga que preocuparse por ello.



Tenga en cuenta que Knative no crea vainas de inmediato. En cambio, proporciona un punto final virtual para las aplicaciones y las escucha. Si una solicitud llega a estos puntos finales, Knative ejecuta los pods necesarios. Esto permite que las aplicaciones escalen desde cero hasta el número deseado de instancias.







Knative proporciona puntos finales de aplicaciones que utilizan su propio dominio en el formato [nombre de la aplicación]. [espacio de nombres]. [dominio personalizado] .



Esto ayuda a identificar de forma única la aplicación. Esto es similar a cómo Kubernetes maneja los servicios, pero necesita crear sus propios registros de dominio A para apuntar a la puerta de enlace de entrada de Istio. Istio administra todo el tráfico que pasa a través de su clúster en segundo plano.



Knative es una fusión de muchos productos CNCF y de código abierto como Kubernetes, Istio, Prometheus, Grafana y motores de transmisión de eventos como Kafka y Google Pub / Sub.



Instalación de Knative



Knative tiene una estructura modular razonable y solo puede instalar los componentes que necesita. Knative ofrece componentes para eventos, servicio y monitoreo. Puede instalarlos utilizando CRD personalizados.



Knative tiene dependencias y requisitos externos para cada componente. Por ejemplo, si está instalando un componente de servicio, también debe instalar Istio y el complemento DNS.



Instalar Knative es bastante complicado y merece un artículo aparte. Pero en aras de la demostración, comencemos por instalar el componente de servicio.



Para hacer esto, necesita un clúster de Kubernetes que funcione.



Instale el CRD de servicio y los componentes principales de servicio:



kubectl apply -f https://github.com/knative/serving/releases/download/v0.17.0/serving-crds.yaml
kubectl apply -f https://github.com/knative/serving/releases/download/v0.17.0/serving-core.yaml
      
      





Instale Istio para Knative:



curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.7.0 sh - && 

cd istio-1.7.0 && export PATH=$PWD/bin:$PATH

istioctl install --set profile=demo

kubectl label namespace knative-serving istio-injection=enabled
      
      





Espere a que Istio esté listo comprobando si Kubernetes ha asignado una IP externa a la puerta de enlace de entrada de Istio:



kubectl -n istio-system get service istio-ingressgateway
      
      





Defina su propio dominio y configure el DNS para que apunte a la dirección IP de la puerta de enlace de entrada de Istio:



kubectl patch configmap/config-domain --namespace knative-serving --type merge  -p "{\"data\":{\"$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}').xip.io\":\"\"}}"

kubectl apply -f https://github.com/knative/net-istio/releases/download/v0.17.0/release.yaml

kubectl apply -f https://github.com/knative/serving/releases/download/v0.17.0/serving-default-domain.yaml
      
      





Instale el complemento Istio HPA:



kubectl apply -f https://github.com/knative/serving/releases/download/v0.17.0/serving-hpa.yaml
      
      





Instalación de la CLI de Knative



Instalar la CLI de Knative es fácil. Debe descargar la última versión del binario de la CLI de Knative en la carpeta bin o especificar la ruta adecuada.



sudo wget https://storage.googleapis.com/knative-nightly/client/latest/kn-linux-amd64 -O /usr/local/bin/kn

sudo chmod +x /usr/local/bin/kn

kn version
      
      





Inicio de la aplicación Hello, World!



Ahora ejecutemos nuestro primer "¡Hola, mundo!" aplicación para ver lo fácil que es implementar con Knative.



Usemos la aplicación de muestra Hello, World! en Ir para demostración. Esta es una API REST simple que devuelve Hello $ TARGET , donde $ TARGET es una variable de entorno que puede establecer en el contenedor.



Ejecute el siguiente comando para comenzar:



$ kn service create helloworld-go --image gcr.io/knative-samples/helloworld-go --env TARGET="World" --annotation autoscaling.knative.dev/target=10
Creating service 'helloworld-go' in namespace 'default':
0.171s Configuration "helloworld-go" is waiting for a Revision to become ready.
  6.260s ...
  6.324s Ingress has not yet been reconciled.
  6.496s Waiting for load balancer to be ready
  6.637s Ready to serve.
Service 'helloworld-go' created to latest revision 'helloworld-go-zglmv-1' is available at URL:
http://helloworld-go.default.34.71.125.175.xip.io
      
      





kubectl get pod
No resources found in default namespace.
      
      





Iniciemos el servicio helloworld .



$ curl http://helloworld-go.default.34.71.125.175.xip.io
Hello World!
      
      





Y después de un tiempo obtenemos una respuesta. Echemos un vistazo a las vainas.



$ kubectl get pod
NAME                                               READY   STATUS    RESTARTS   AGE
helloworld-go-zglmv-1-deployment-6d4b7fb4f-ctz86   2/2     Running   0          50s
      
      





Entonces, como puede ver, Knative se desenrolló debajo en el fondo en un solo movimiento. Resulta que, literalmente, escalamos desde cero.



Si le damos un poco de tiempo, veremos que la vaina comienza a completarse. Veamos qué está pasando.



$ kubectl get pod -w
NAME                                               READY   STATUS    RESTARTS   AGE
helloworld-go-zglmv-1-deployment-6d4b7fb4f-d9ks6   2/2     Running   0          7s
helloworld-go-zglmv-1-deployment-6d4b7fb4f-d9ks6   2/2     Terminating   0          67s
helloworld-go-zglmv-1-deployment-6d4b7fb4f-d9ks6   1/2     Terminating   0          87s
      
      





El ejemplo anterior muestra que Knative gestiona las vainas de acuerdo con nuestros requisitos. Aunque la primera solicitud es lenta porque Knative crea cargas de trabajo para procesarla, las solicitudes posteriores se ejecutarán más rápido. Puede ajustar el tiempo de desaceleración de los pods según sus requisitos o si tiene un SLA más estricto.



Vayamos un poco más lejos. Si observa las anotaciones, hemos limitado cada una en procesamiento a 10 solicitudes simultáneas. Entonces, ¿qué sucede si cargamos nuestras funciones además de eso? ¡Averigüemos ahora!



Usaremos la utilidad hey para cargar la aplicación. El siguiente comando envía 50 solicitudes simultáneas al punto final en 30 segundos.



$ hey -z 30s -c 50 http://helloworld-go.default.34.121.106.103.xip.io
  Average:      0.1222 secs
  Requests/sec: 408.3187
Total data:   159822 bytes
  Size/request: 13 bytes
Response time histogram:
  0.103 [1]     |
  0.444 [12243] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.785 [0]     |
  1.126 [0]     |
  1.467 [0]     |
  1.807 [0]     |
  2.148 [0]     |
  2.489 [0]     |
  2.830 [0]     |
  3.171 [0]     |
  3.512 [50]    |
Latency distribution:
  10% in 0.1042 secs
  25% in 0.1048 secs
  50% in 0.1057 secs
  75% in 0.1077 secs
  90% in 0.1121 secs
  95% in 0.1192 secs
  99% in 0.1826 secs
Details (average, fastest, slowest):
  DNS+dialup:   0.0010 secs, 0.1034 secs, 3.5115 secs
  DNS-lookup:   0.0006 secs, 0.0000 secs, 0.1365 secs
  req write:    0.0000 secs, 0.0000 secs, 0.0062 secs
  resp wait:    0.1211 secs, 0.1033 secs, 3.2698 secs
  resp read:    0.0001 secs, 0.0000 secs, 0.0032 secs
Status code distribution:
  [200] 12294 responses
      
      





Ahora echemos un vistazo a las vainas.



$ kubectl get pod
NAME                                                READY   STATUS    RESTARTS   AGE
helloworld-go-thmmb-1-deployment-77976785f5-6cthr   2/2     Running   0          59s
helloworld-go-thmmb-1-deployment-77976785f5-7dckg   2/2     Running   0          59s
helloworld-go-thmmb-1-deployment-77976785f5-fdvjn   0/2     Pending   0          57s
helloworld-go-thmmb-1-deployment-77976785f5-gt55v   0/2     Pending   0          58s
helloworld-go-thmmb-1-deployment-77976785f5-rwwcv   2/2     Running   0          59s
helloworld-go-thmmb-1-deployment-77976785f5-tbrr7   2/2     Running   0          58s
helloworld-go-thmmb-1-deployment-77976785f5-vtnz4   0/2     Pending   0          58s
helloworld-go-thmmb-1-deployment-77976785f5-w8pn6   2/2     Running   0          59s
      
      





Como podemos ver, Knative escala las vainas a medida que aumenta la carga de la función y la ralentiza cuando no hay más carga.



Conclusión



Knative combina las mejores características de una arquitectura sin servidor con las capacidades de Kubernetes. Se está moviendo gradualmente hacia una forma estándar de implementar FaaS. Como Knative es parte de CNCF y está ganando cada vez más interés técnico, es posible que pronto descubramos que los proveedores de la nube están implementando Knative en sus productos sin servidor.



¡Gracias por leer mi artículo! Espero que lo hayan disfrutado.



All Articles