Cómo instalar y utilizar Linkerd con Kubernetes

Índice
  1. Introducción
  • Prerrequisitos
  • Paso 1: Implementación de la aplicación
  • Paso 2: Instalación de Linkerd
  • Paso 3: Inyección de Linkerd en su aplicación
  • Paso 4: Definición de un perfil de servicio
  • Conclusión
  • El autor seleccionó el Tech Education Fund para recibir una donación como parte del programa Write for DOnations.

    Introducción

    Una malla de servicios es una capa de infraestructura dedicada que ayuda a los administradores a gestionar la comunicación entre servicios. Estas mallas de servicios ofrecen muchas herramientas poderosas y pueden hacer que su sistema sea más seguro, más confiable y también más visible.

    Una malla de servicios como Linkerd, por ejemplo, puede cifrar automáticamente las conexiones, gestionar reintentos de solicitudes y tiempos de espera, proporcionar información de telemetría como tasas de éxito y latencias, y más.

    En este tutorial, instalará la malla de servicios de Linkerd en su clúster de Kubernetes, implementará una aplicación de ejemplo y, luego, explorará el panel de Linkerd. Después de familiarizarse con parte de la información de este panel, configurará Linkerd para aplicar timeoutpolíticas retrypara un pod de Kubernetes en particular.

    Alternativamente, considere explorar la opción de instalación de Linkerd/Kubernetes con un solo clic de DigitalOcean.

    Prerrequisitos

    • Un clúster de Kubernetes 1.12+. En este tutorial, la configuración utilizará un clúster de Kubernetes de DigitalOcean con tres nodos, pero usted puede crear un clúster con otro método.

    • La kubectlherramienta de línea de comandos instalada en un servidor de desarrollo y configurada para conectarse a su clúster. Puede leer más sobre la instalación kubectlen su documentación oficial.

    Paso 1: Implementación de la aplicación

    Para ver Linkerd en acción, debe tener una aplicación ejecutándose en su clúster. En este paso, implementará una aplicación llamada emojivoto, que el equipo de Linkerd creó para este propósito.

    En este repositorio, puedes ver el código de los cuatro servicios que componen la aplicación, así como el archivo de manifiesto que utilizarás para implementar estos servicios en tu clúster de Kubernetes.

    Primero, guarde este archivo de manifiesto localmente:

    1. curl https://run.linkerd.io/emojivoto.yml --output manifest.yaml

    Estás usando curlpara obtener el archivo y luego pasas la --outputopción para indicarle dónde quieres que se guarde el archivo. En este caso, estás creando un archivo llamado manifest.yaml.

    Para comprender mejor lo que logrará este archivo, inspeccione su contenido cato ábralo con su editor favorito:

    1. cat manifest.yaml | less

    Presione SPACEpara recorrer las directivas. Verá que manifest.yamlse está creando un espacio de nombres de Kubernetes llamado emojivotodonde se ejecutará todo lo relacionado con esta aplicación, y un par de Kubernetes Deploymentsy Services.

    A continuación, aplique este manifiesto en su clúster de Kubernetes:

    1. kubectl apply -f manifest.yaml

    Nuevamente, estás usando kubectl applyla -fbandera para asignar un archivo que deseas aplicar.

    Este comando generará una lista de todos los recursos que se crearon:

    Outputnamespace/emojivoto createdserviceaccount/emoji createdserviceaccount/voting createdserviceaccount/web createdservice/emoji-svc createdservice/voting-svc createdservice/web-svc createddeployment.apps/emoji createddeployment.apps/vote-bot createddeployment.apps/voting createddeployment.apps/web created

    Ahora verifique que los servicios estén ejecutándose:

    1. kubectl -n emojivoto get pods

    Lo usas kubectlpara enumerar todo lo que podstienes en ejecución en tu clúster y luego pasas el -nindicador para indicar qué espacios de nombres quieres usar. Pasas el emojivotoespacio de nombres porque ahí es donde se ejecutan todos estos servicios.

    Cuando veas todo podsen el Runningestado, estarás listo para comenzar:

    OutputNAME                        READY   STATUS    RESTARTS   AGEemoji-566954596f-cw75b      1/1     Running   0          24svote-bot-85c5f5699f-7dw5c   1/1     Running   0          24svoting-756995b6fc-czf8z     1/1     Running   0          24sweb-7f7b69d467-2546n        1/1     Running   0          23s

    Finalmente, para ver la aplicación ejecutándose en su navegador, utilizará la kubectlfunción incorporada de reenviar solicitudes locales a su clúster remoto:

    1. kubectl -n emojivoto port-forward svc/web-svc 8080:80

    Nota: Si no está ejecutando esto desde su máquina local, necesitará agregar la --address 0.0.0.0bandera para escuchar en todas las direcciones y no solo en localhost.

    Aquí, nuevamente, se está utilizando kubectlen los emojivotoespacios de nombres, pero ahora se llama al port-forwardsubcomando y se le indica que reenvíe todas las solicitudes locales en el puerto 8080al servicio de Kubernetes web-svc, en el puerto 80. Esta es solo una forma conveniente de acceder a su aplicación sin necesidad de tener un balanceador de carga adecuado.

    Ahora visita http://localhost:8080y verás la aplicación emojivoto.

    Presione CTRL + Cen su terminal. Con una aplicación ejecutándose en su clúster, ahora está listo para instalar Linkerd y ver cómo funciona.

    Paso 2: Instalación de Linkerd

    Ahora que tiene una aplicación ejecutándose, instalemos Linkerd. Para instalarlo en su clúster de Kubernetes, primero necesita la CLI de Linkerd. Utilizará esta interfaz de línea de comandos para interactuar con Linkerd desde su máquina local. Después de eso, puede instalar Linkerd en su clúster.

    Primero, instalemos la CLI con el script proporcionado por el equipo de Linkerd:

    1. curl https://run.linkerd.io/install | sh

    Aquí se utiliza curlpara descargar el script de instalación y luego se envía la salida a sh, que ejecuta automáticamente el script. Como alternativa, se puede descargar la CLI directamente desde la página de lanzamiento de Linkerd.

    Si utiliza el script, se instalará Linkerd en ~/.linkerd2/bin. Ahora confirme que la CLI funciona correctamente:

    1. ~/.linkerd2/bin/linkerd version

    El comando generará algo como esto:

    OutputClient version: stable-2.7.1Server version: unavailable

    Luego, para facilitar la ejecución de la CLI, agregue este directorio a su $PATH:

    1. export PATH=$PATH:$HOME/.linkerd2/bin

    Ahora puedes ejecutar los comandos de forma más directa, como el anterior:

    1. linkerd version

    Por último, instalemos Linkerd en su clúster de Kubernetes. El linkerd installcomando se utiliza para generar todos los yamlmanifiestos necesarios para ejecutar Linkerd, pero no los aplicará a su clúster. Ejecute este comando para inspeccionar su resultado:

    1. linkerd install

    Verá un resultado extenso que enumera todos los manifiestos yaml de los recursos que Linkerd necesita para ejecutarse. Para aplicar estos manifiestos a su clúster, ejecute:

    1. linkerd install | kubectl apply -f -

    Al ejecutar linkerd installse mostrarán todos los manifiestos que vio anteriormente. |Luego, canalizará esta salida directamente a kubectl apply, que los aplicará.

    Después de ejecutar este comando, kubectl applyaparecerá una lista de todos los recursos que se crearon.

    Para confirmar que todo se está ejecutando en su clúster, ejecute linkerd check:

    1. linkerd check

    Esto ejecutará varias comprobaciones en su clúster para confirmar que todos los componentes necesarios se estén ejecutando:

    Outputkubernetes-api--------------√ can initialize the client√ can query the Kubernetes API[...]control-plane-version---------------------√ control plane is up-to-date√ control plane and cli versions matchStatus check results are √

    Por último, ejecute este comando para abrir el panel de control integrado de Linkerd en su navegador (recuerde que deberá proporcionar el --address 0.0.0.0indicador si no lo está ejecutando desde su máquina local):

    1. linkerd dashboard

    La mayor parte de la información que se ve en el panel se puede obtener mediante la CLI de Linkerd. Por ejemplo, ejecute este comando para ver estadísticas de alto nivel sobre las implementaciones:

    1. linkerd stat deployments -n linkerd

    Aquí dices que quieres las estadísticas de las implementaciones que se ejecutan en el linkerdespacio de nombres. Estos son los componentes propios de Linkerd y, curiosamente, puedes usar Linkerd para monitorearlos. Puedes ver estadísticas como solicitudes por segundo (RPS), tasa de éxito, latencia y más. También puedes ver una Meshedcolumna que indica cuántas podsha inyectado Linkerd:

    OutputNAME                     MESHED   SUCCESS      RPS   LATENCY_P50   LATENCY_P95   LATENCY_P99   TCP_CONNlinkerd-controller          1/1   100.00%   0.4rps           1ms          87ms          98ms          5linkerd-destination         1/1   100.00%   0.3rps           1ms           2ms           2ms         13linkerd-grafana             1/1   100.00%   0.3rps           2ms           3ms           3ms          2linkerd-identity            1/1   100.00%   0.3rps           1ms           2ms           2ms         10linkerd-prometheus          1/1   100.00%   0.7rps          35ms         155ms         191ms          9linkerd-proxy-injector      1/1   100.00%   0.3rps           2ms           3ms           3ms          2linkerd-sp-validator        1/1   100.00%   0.3rps           1ms           5ms           5ms          2linkerd-tap                 1/1   100.00%   0.3rps           1ms           4ms           4ms          6linkerd-web                 1/1   100.00%   0.3rps           1ms           2ms           2ms          2

    Ahora prueba este comando en tu emojivotoespacio de nombres:

    1. linkerd stat deployments -n emojivoto

    Aunque puedes ver tus cuatro servicios, ninguna de las estadísticas que viste antes está disponible para estas implementaciones, y en la columna “Malla” puedes ver que dice 0/1:

    OutputNAME       MESHED   SUCCESS   RPS   LATENCY_P50   LATENCY_P95   LATENCY_P99   TCP_CONNemoji         0/1         -     -             -             -             -          -vote-bot      0/1         -     -             -             -             -          -voting        0/1         -     -             -             -             -          -web           0/1         -     -             -             -             -          -

    El resultado que aparece aquí significa que aún no has inyectado Linkerd en la aplicación. Este será el siguiente paso.

    Paso 3: Inyección de Linkerd en su aplicación

    Ahora que tiene Linkerd ejecutándose en su clúster, está listo para inyectarlo en su emojivotoaplicación.

    Linkerd funciona ejecutando un contenedor sidecar en su Kubernetes pods. Es decir, inyectará un contenedor proxy de Linkerd en cada podinstancia que esté en ejecución. Cada solicitud que podsenvíe o reciba pasará por este proxy muy liviano que puede recopilar métricas (como tasa de éxito, solicitudes por segundo y latencia) y aplicar políticas (como tiempos de espera y reintentos).

    Puedes inyectar manualmente el proxy de Linkerd con este comando:

    1. kubectl get deployments -n emojivoto -o yaml | linkerd inject - | kubectl apply -f -

    En este comando, primero se usa kubectl getpara obtener todos los Kubernetes deploymentque se están ejecutando en el emojivotoespacio de nombres y luego se especifica que se desea la salida en el yamlformato. Luego se envía esa salida al linkerd injectcomando. Este comando leerá el yamlarchivo con los manifiestos actuales que se están ejecutando y lo modificará para incluir el proxy linkerd junto con cada deployment.

    Por último, recibes este manifiesto modificado y lo aplicas a tu clúster con kubectl apply.

    Después de ejecutar este comando, verá un mensaje que indica que los cuatro emojivotoservicios ( emoji, vote-bot, votingy web) se inyectaron correctamente.

    Si ahora recuperas statsfor emojivoto, verás que todos tus deployments ahora están en malla, y después de unos segundos comenzarás a ver las mismas estadísticas que viste para el linkerdespacio de nombres:

    1. linkerd stat deployments -n emojivoto

    Aquí puedes ver las estadísticas de los cuatro servicios que componen la emojivotoaplicación, con su respectiva tasa de éxito, solicitudes por segundo y latencia, sin tener que escribir o cambiar ningún código de la aplicación.

    OutputNAME       MESHED   SUCCESS      RPS   LATENCY_P50   LATENCY_P95   LATENCY_P99   TCP_CONNemoji         1/1   100.00%   1.9rps           1ms           2ms           2ms          2vote-bot      1/1         -        -             -             -             -          -voting        1/1    85.96%   0.9rps           1ms           1ms           1ms          2web           1/1    93.04%   1.9rps           8ms          27ms          29ms          2

    El vote-botservicio no muestra ninguna estadística porque es solo un bot que envía solicitudes a otros servicios y, por lo tanto, no recibe tráfico, lo que en sí mismo es información valiosa.

    Ahora veamos cómo puedes proporcionar información adicional a Linkerd sobre tus servicios para personalizar su comportamiento.

    Paso 4: Definición de un perfil de servicio

    Ahora que ha inyectado Linkerd en su aplicación, puede comenzar a recuperar información valiosa sobre el comportamiento de cada uno de sus servicios. Además, ha logrado esto sin necesidad de escribir ninguna configuración personalizada ni cambiar el código de su aplicación. Sin embargo, si proporciona a Linkerd información adicional, este podrá aplicar numerosas políticas, como tiempos de espera y reintentos. También puede proporcionar métricas por ruta.

    Esta información se proporciona a través de un Perfil de Servicio, que es un recurso personalizado de Linkerd donde puedes describir las rutas en tus aplicaciones y cómo se comportará cada una.

    A continuación se muestra un ejemplo de cómo se ve un manifiesto de perfil de servicio:

    ejemplo-perfil-de-servicio.yaml

    apiVersion: linkerd.io/v1alpha2kind: ServiceProfilemetadata:  name: my-service.my-namespace.svc.cluster.localspec:  routes:  - name: My Route Name    isRetryable: true # Define it's safe to retry this route    timeout: 100ms # Define a timeout for this route    condition:      method: GET      pathRegex: /my/route/path

    El perfil de servicio describe una lista de rutas y, a continuación, define cómo conditionse comportarán las solicitudes que coincidan con las especificadas. En este ejemplo, se indica que todas GETlas solicitudes enviadas a /my/route/pathse agotarán después de 100 ms y, si fallan, se pueden volver a intentar.

    Ahora, creemos un perfil de servicio para uno de sus servicios. Tomemos voting-svccomo ejemplo el siguiente ejemplo: primero, utilice la CLI de Linkerd para verificar las rutas que ha definido para este servicio:

    1. linkerd routes svc/voting-svc -n emojivoto

    Aquí estás usando el linkerd routescomando para enumerar todas las rutas para el servicio voting-svc, en el emojiovotoespacio de nombres:

    OutputROUTE          SERVICE   SUCCESS      RPS   LATENCY_P50   LATENCY_P95   LATENCY_P99[DEFAULT]   voting-svc    83.05%   1.0rps           1ms           1ms           2ms

    Encontrarás una única ruta, [DEFAULT]. Aquí se agrupan todas las solicitudes hasta que definas tu Perfil de Servicio.

    Ahora abre nano o tu editor favorito para crear un service-profile.yamlarchivo:

    1. nano service-profile.yaml

    Agregue la siguiente definición de perfil de servicio en este archivo:

    perfil de servicio.yaml

    apiVersion: linkerd.io/v1alpha2kind: ServiceProfilemetadata:  name: voting-svc.emojivoto.svc.cluster.local  namespace: emojivotospec:  routes:  - name: VoteDoughnut    isRetryable: true    timeout: 100ms    condition:      method: POST      pathRegex: /emojivoto.v1.VotingService/VoteDoughnut

    Ahora guarde el archivo y cierre su editor.

    Aquí está declarando un perfil de servicio para el voting-svcservicio, en el emojivotoespacio de nombres. Ha definido una ruta, denominada VoteDoughnut, que hará coincidir cualquier POSTsolicitud con la /emojivoto.v1.VotingService/VoteDoughnutruta. Si una solicitud que coincide con estos criterios demora más de 100 ms, Linkerd la cancelará y el cliente recibirá una 504respuesta. También le está indicando a Linkerd que, si esta solicitud falla, se puede volver a intentar.

    Ahora aplique este archivo a su clúster:

    1. kubectl apply -f service-profile.yaml

    Después de unos segundos, vuelva a verificar las rutas para este servicio:

    1. linkerd routes svc/voting-svc -n emojivoto

    Ahora verás la VoteDoughnutruta recién definida:

    OutputROUTE             SERVICE   SUCCESS      RPS   LATENCY_P50   LATENCY_P95   LATENCY_P99VoteDoughnut   voting-svc     0.00%   0.2rps           1ms           1ms           1ms[DEFAULT]      voting-svc   100.00%   0.8rps           1ms           4ms           4ms

    Puede ver varias métricas personalizadas, como la tasa de éxito, las solicitudes por segundo y la latencia para esta ruta específica. Tenga en cuenta que el VoteDoughnutpunto de conexión está configurado intencionalmente para devolver siempre un error y que genera una tasa de éxito del 0 %, mientras que la [DEFAULT]ruta genera un 100 %.

    Ahora, después de brindarle a Linkerd un poco de información sobre su servicio, tiene métricas personalizadas por ruta, así como dos políticas aplicadas: tiempos de espera y reintentos.

    Conclusión

    En este artículo, instaló Linkerd en su clúster de Kubernetes y lo utilizó para supervisar una aplicación de muestra. Extrajo información de telemetría útil, como la tasa de éxito, el rendimiento y la latencia. También configuró un perfil de servicio de Linkerd para recopilar métricas por ruta y aplicar dos políticas en la emojivotoaplicación.

    Si está interesado en obtener más información sobre Linkerd, puede explorar su excelente página de documentación, donde muestran cómo proteger sus servicios, configurar el seguimiento distribuido, automatizar las versiones canarias y mucho más.

    Desde aquí también puedes considerar revisar Istio, que es otro Service Mesh con un conjunto diferente de características y ventajas y desventajas.

    SUSCRÍBETE A NUESTRO BOLETÍN 
    No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir

    Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. Este sitio web utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando, aceptas su uso. Mas informacion