Cómo instalar y utilizar Linkerd con Kubernetes

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 timeout
políticas retry
para 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
kubectl
herramienta 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ónkubectl
en 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:
- curl https://run.linkerd.io/emojivoto.yml --output manifest.yaml
Estás usando curl
para obtener el archivo y luego pasas la --output
opció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 cat
o ábralo con su editor favorito:
- cat manifest.yaml | less
Presione SPACE
para recorrer las directivas. Verá que manifest.yaml
se está creando un espacio de nombres de Kubernetes llamado emojivoto
donde se ejecutará todo lo relacionado con esta aplicación, y un par de Kubernetes Deployments
y Services
.
A continuación, aplique este manifiesto en su clúster de Kubernetes:
- kubectl apply -f manifest.yaml
Nuevamente, estás usando kubectl apply
la -f
bandera 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:
- kubectl -n emojivoto get pods
Lo usas kubectl
para enumerar todo lo que pods
tienes en ejecución en tu clúster y luego pasas el -n
indicador para indicar qué espacios de nombres quieres usar. Pasas el emojivoto
espacio de nombres porque ahí es donde se ejecutan todos estos servicios.
Cuando veas todo pods
en el Running
estado, 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 kubectl
función incorporada de reenviar solicitudes locales a su clúster remoto:
- 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.0
bandera para escuchar en todas las direcciones y no solo en localhost
.
Aquí, nuevamente, se está utilizando kubectl
en los emojivoto
espacios de nombres, pero ahora se llama al port-forward
subcomando y se le indica que reenvíe todas las solicitudes locales en el puerto 8080
al 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:8080
y verás la aplicación emojivoto.
Presione CTRL + C
en 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:
- curl https://run.linkerd.io/install | sh
Aquí se utiliza curl
para 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:
- ~/.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
:
- export PATH=$PATH:$HOME/.linkerd2/bin
Ahora puedes ejecutar los comandos de forma más directa, como el anterior:
- linkerd version
Por último, instalemos Linkerd en su clúster de Kubernetes. El linkerd install
comando se utiliza para generar todos los yaml
manifiestos necesarios para ejecutar Linkerd, pero no los aplicará a su clúster. Ejecute este comando para inspeccionar su resultado:
- 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:
- linkerd install | kubectl apply -f -
Al ejecutar linkerd install
se 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 apply
aparecerá una lista de todos los recursos que se crearon.
Para confirmar que todo se está ejecutando en su clúster, ejecute linkerd check
:
- 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.0
indicador si no lo está ejecutando desde su máquina local):
- 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:
- linkerd stat deployments -n linkerd
Aquí dices que quieres las estadísticas de las implementaciones que se ejecutan en el linkerd
espacio 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 Meshed
columna que indica cuántas pods
ha 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 emojivoto
espacio de nombres:
- 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 emojivoto
aplicación.
Linkerd funciona ejecutando un contenedor sidecar en su Kubernetes pods
. Es decir, inyectará un contenedor proxy de Linkerd en cada pod
instancia que esté en ejecución. Cada solicitud que pods
enví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:
- kubectl get deployments -n emojivoto -o yaml | linkerd inject - | kubectl apply -f -
En este comando, primero se usa kubectl get
para obtener todos los Kubernetes deployment
que se están ejecutando en el emojivoto
espacio de nombres y luego se especifica que se desea la salida en el yaml
formato. Luego se envía esa salida al linkerd inject
comando. Este comando leerá el yaml
archivo 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 emojivoto
servicios ( emoji
, vote-bot
, voting
y web
) se inyectaron correctamente.
Si ahora recuperas stats
for emojivoto
, verás que todos tus deployment
s ahora están en malla, y después de unos segundos comenzarás a ver las mismas estadísticas que viste para el linkerd
espacio de nombres:
- linkerd stat deployments -n emojivoto
Aquí puedes ver las estadísticas de los cuatro servicios que componen la emojivoto
aplicació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-bot
servicio 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 condition
se comportarán las solicitudes que coincidan con las especificadas. En este ejemplo, se indica que todas GET
las solicitudes enviadas a /my/route/path
se 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-svc
como ejemplo el siguiente ejemplo: primero, utilice la CLI de Linkerd para verificar las rutas que ha definido para este servicio:
- linkerd routes svc/voting-svc -n emojivoto
Aquí estás usando el linkerd routes
comando para enumerar todas las rutas para el servicio voting-svc
, en el emojiovoto
espacio 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.yaml
archivo:
- 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-svc
servicio, en el emojivoto
espacio de nombres. Ha definido una ruta, denominada VoteDoughnut
, que hará coincidir cualquier POST
solicitud con la /emojivoto.v1.VotingService/VoteDoughnut
ruta. Si una solicitud que coincide con estos criterios demora más de 100 ms, Linkerd la cancelará y el cliente recibirá una 504
respuesta. 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:
- kubectl apply -f service-profile.yaml
Después de unos segundos, vuelva a verificar las rutas para este servicio:
- linkerd routes svc/voting-svc -n emojivoto
Ahora verás la VoteDoughnut
ruta 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 VoteDoughnut
punto 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 emojivoto
aplicació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.
Deja una respuesta