Cómo implementar en Kubernetes usando Argo CD y GitOps

Introducción
El uso de Kubernetes para implementar su aplicación puede brindar importantes ventajas de infraestructura, como escalabilidad flexible, administración de componentes distribuidos y control sobre diferentes versiones de su aplicación. Sin embargo, con ese mayor control viene una mayor complejidad. Los sistemas de integración continua e implementación continua ( CI/CD ) generalmente funcionan en un alto nivel de abstracción para proporcionar control de versiones, registro de cambios y funcionalidad de reversión. Un enfoque popular para esta capa de abstracción se llama GitOps .
GitOps, como lo propuso originalmente Weaveworks en una publicación de blog de 2017 , utiliza Git como una “única fuente de verdad” para los procesos de CI/CD, integrando cambios de código en un único repositorio compartido por proyecto y utilizando solicitudes de extracción para administrar la infraestructura y la implementación.
Existen varias herramientas que utilizan Git como punto focal para los procesos de DevOps en Kubernetes. En este tutorial, aprenderá a utilizar Argo CD , una herramienta declarativa de entrega continua. Argo CD proporciona herramientas de entrega continua que sincronizan e implementan automáticamente su aplicación cada vez que se realiza un cambio en su repositorio de GitHub. Al administrar la implementación y el ciclo de vida de una aplicación, proporciona soluciones para el control de versiones, las configuraciones y las definiciones de aplicaciones en entornos de Kubernetes, organizando datos complejos con una interfaz de usuario fácil de entender. Puede manejar varios tipos de manifiestos de Kubernetes, incluidos Jsonnet, aplicaciones Kustomize , gráficos de Helm y archivos YAML/json, y admite notificaciones de webhook de GitHub, GitLab y Bitbucket.
En este artículo, utilizará Argo CD para sincronizar e implementar una aplicación desde un repositorio de GitHub.
Si está buscando un servicio de alojamiento de Kubernetes administrado, consulte nuestro servicio de Kubernetes simple y administrado diseñado para el crecimiento .
Prerrequisitos
Para seguir este tutorial, necesitarás:
-
Un par de claves SSH en su máquina Linux/MacOS/BSD local. Si no ha utilizado claves SSH antes, puede aprender a configurarlas siguiendo esta explicación sobre cómo configurar claves SSH en su máquina local . Si utiliza Windows, debería trabajar en el entorno del Subsistema de Windows para Linux .
-
Un clúster de Kubernetes existente que comprenda al menos un nodo de trabajo. kubectl debe estar instalado en su entorno de trabajo y debe poder conectarse a su clúster. Managed Kubernetes de DigitalOcean le proporcionará una configuración como esta de forma predeterminada. Si está utilizando Managed Kubernetes de DigitalOcean, debe revisar Cómo conectarse al clúster .
-
Familiaridad con los conceptos de Kubernetes. Consulte el artículo Introducción a Kubernetes para obtener más detalles.
Paso 1: Instalación de Argo CD en su clúster
Para instalar Argo CD, primero debe tener una configuración válida de Kubernetes configurada con kubectl
, desde la cual puede hacer ping a sus nodos de trabajo. Puede probar esto ejecutando kubectl get nodes
:
- kubectl get nodes
Este comando debería devolver una lista de nodos con el Ready
estado:
OutputNAME STATUS ROLES AGE VERSIONpool-uqv8a47h0-ul5a7 Ready none 22m v1.21.5pool-uqv8a47h0-ul5am Ready none 21m v1.21.5pool-uqv8a47h0-ul5aq Ready none 21m v1.21.5
Si kubectl
no devuelve un conjunto de nodos con el Ready
estado, debe revisar la configuración del clúster y la documentación de Kubernetes .
A continuación, cree el argocd
espacio de nombres en su clúster, que contendrá Argo CD y sus servicios asociados:
- kubectl create namespace argocd
Después de eso, puedes ejecutar el script de instalación de CD de Argo proporcionado por los mantenedores del proyecto.
- kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
Una vez que la instalación se complete correctamente, puede usar el watch
comando para verificar el estado de sus pods de Kubernetes:
- watch kubectl get pods -n argocd
De forma predeterminada, debería haber cinco pods que eventualmente recibirán el Running
estado como parte de una instalación estándar de CD de Argo.
OutputNAME READY STATUS RESTARTS AGEargocd-application-controller-0 1/1 Running 0 2m28sargocd-dex-server-66f865ffb4-chwwg 1/1 Running 0 2m30sargocd-redis-5b6967fdfc-q4klp 1/1 Running 0 2m30sargocd-repo-server-656c76778f-vsn7l 1/1 Running 0 2m29sargocd-server-cd68f46f8-zg7hq 1/1 Running 0 2m28s
Puede presionar Ctrl+C
para salir de la watch
interfaz. ¡Ahora tiene Argo CD ejecutándose en su clúster de Kubernetes! Sin embargo, debido a la forma en que Kubernetes crea abstracciones en torno a sus interfaces de red, no podrá acceder a él directamente sin reenviar puertos desde dentro de su clúster. Aprenderá cómo manejar eso en el siguiente paso.
Paso 2: Reenvío de puertos para acceder a Argo CD
Debido a que Kubernetes implementa servicios en direcciones de red arbitrarias dentro de su clúster, deberá reenviar los puertos correspondientes para poder acceder a ellos desde su máquina local. Argo CD configura un servicio denominado argocd-server
en el puerto 443 internamente. Debido a que el puerto 443 es el puerto HTTPS predeterminado y es posible que esté ejecutando otros servicios HTTP/HTTPS, es una práctica común reenviarlos a otros puertos elegidos arbitrariamente, como 8080
, de la siguiente manera:
- kubectl port-forward svc/argocd-server -n argocd 8080:443
El reenvío de puertos bloqueará la terminal en la que se esté ejecutando mientras esté activo, por lo que probablemente querrás ejecutarlo en una nueva ventana de terminal mientras continúas trabajando. Puedes presionar Ctrl+C
para salir sin problemas de un proceso de bloqueo como este cuando quieras detener el reenvío del puerto.
Mientras tanto, deberías poder acceder a Argo CD en un navegador web accediendo a localhost:8080
. Sin embargo, se te solicitará una contraseña de inicio de sesión que deberás recuperar mediante la línea de comandos en el siguiente paso. Probablemente tendrás que hacer clic en una advertencia de seguridad porque Argo CD aún no se ha configurado con un certificado SSL válido.
Nota: El mejor uso de certificados HTTPS LetsEncrypt con Kubernetes se logra con el uso de herramientas adicionales como Cert-Manager .
Paso 3: Cómo trabajar con Argo CD desde la línea de comandos
Para los siguientes pasos, deberá tener el argocd
comando instalado localmente para interactuar con su instancia de Argo CD y cambiar la configuración en ella. La documentación oficial de Argo CD recomienda que lo instale a través del administrador de paquetes Homebrew . Homebrew es muy popular para administrar herramientas de línea de comandos en MacOS y, más recientemente, se ha adaptado a Linux para facilitar el mantenimiento de herramientas como esta.
Si aún no tienes instalado Homebrew, puedes recuperarlo e instalarlo con un comando de una línea:
- /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Es posible que se le solicite su contraseña durante el proceso de instalación. Luego, debería tener el brew
comando disponible en su terminal. Puede usarlo para instalar Argo CD:
- brew install argocd
Esto, a su vez, proporciona el argocd
comando. Antes de usarlo, deberá kubectl
volver a usarlo para recuperar la contraseña de administrador que se generó automáticamente durante la instalación, de modo que pueda usarla para iniciar sesión. Le pasará una ruta a un archivo JSON particular que se almacena con secretos de Kubernetes y extraerá el valor relevante:
- kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
OutputfbP20pvw-o-D5uxH
Luego, puede iniciar sesión en su panel de control de Argo CD volviendo a localhost:8080
un navegador e iniciando sesión como admin
usuario con su propia contraseña:
Una vez que todo esté funcionando, puede usar las mismas credenciales para iniciar sesión en Argo CD a través de la línea de comandos, ejecutando argocd login
. Esto será necesario para realizar la implementación desde la línea de comandos más adelante:
- argocd login localhost:8080
Recibirá nuevamente la advertencia de certificado equivalente en la línea de comandos y deberá ingresar y
para continuar cuando se le solicite. Si lo desea, puede cambiar su contraseña a algo más seguro o más fácil de recordar ejecutando argocd account update-password
. Después de eso, tendrá una configuración de CD de Argo completamente funcional. En los pasos finales de este tutorial, aprenderá a usarlo para implementar algunas aplicaciones de ejemplo.
Paso 4: Manejo de múltiples clústeres (opcional)
Antes de implementar una aplicación, debe revisar dónde desea implementarla realmente. De manera predeterminada, Argo CD implementará aplicaciones en el mismo clúster en el que se ejecuta Argo CD, lo cual está bien para una demostración, pero probablemente no sea lo que desee en producción. Para enumerar todos los clústeres conocidos en su máquina actual, puede usar kubectl config
:
- kubectl config get-contexts -o name
Outputtest-deploy-clustertest-target-cluster
Suponiendo que ha instalado Argo CD en test-deploy-cluster
, y desea usarlo para implementar aplicaciones en test-target-cluster
, puede registrarse test-target-cluster
en Argo CD ejecutando argocd cluster add
:
- argocd cluster add target-k8s
Esto agregará los detalles de inicio de sesión del clúster adicional a Argo CD y permitirá que Argo CD implemente servicios en el clúster.
Paso 5: Implementación de una aplicación de ejemplo (opcional)
Ahora que tiene Argo CD en ejecución y comprende cómo implementar aplicaciones en diferentes clústeres de Kubernetes, es hora de ponerlo en práctica. El proyecto Argo CD mantiene un repositorio de aplicaciones de ejemplo que se diseñaron para mostrar los fundamentos de GitOps. Muchos de estos ejemplos son puertos de la misma guestbook
aplicación de demostración a diferentes tipos de manifiestos de Kubernetes, como Jsonnet . En este caso, implementará el helm-guestbook
ejemplo, que utiliza un gráfico de Helm , una de las soluciones de administración de Kubernetes más duraderas.
Para ello, utilizará el argocd app create
comando, proporcionando la ruta al repositorio Git, el helm-guestbook
ejemplo específico y pasando su destino y espacio de nombres predeterminados:
- argocd app create helm-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path helm-guestbook --dest-server https://kubernetes.default.svc --dest-namespace default
Después de “crear” la aplicación dentro de Argo CD, puedes verificar su estado con argocd app get
:
- argocd app get helm-guestbook
OutputName: helm-guestbookProject: defaultServer: https://kubernetes.default.svcNamespace: defaultURL: https://localhost:8080/applications/helm-guestbookRepo: https://github.com/argoproj/argocd-example-apps.gitTarget:Path: helm-guestbookSyncWindow: Sync AllowedSync Policy: noneSync Status: OutOfSync from (53e28ff)Health Status: MissingGROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE Service default helm-guestbook OutOfSync Missingapps Deployment default helm-guestbook OutOfSync Missing
El OutOfSync
estado de la aplicación es normal. Recuperaste el gráfico de Helm de la aplicación desde Github y creaste una entrada para él en Argo CD, pero aún no creaste ningún recurso de Kubernetes para él. Para implementar la aplicación, ejecutarás argocd app sync
:
- argocd app sync helm-guestbook
sync
es sinónimo de implementación aquí de acuerdo con los principios de GitOps: el objetivo al usar Argo CD es que su aplicación siempre realice un seguimiento 1:1 con su configuración ascendente.
OutputTIMESTAMP GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE2022-01-19T11:01:48-08:00 Service default helm-guestbook OutOfSync Missing2022-01-19T11:01:48-08:00 apps Deployment default helm-guestbook OutOfSync Missing2022-01-19T11:01:48-08:00 Service default helm-guestbook Synced Healthy2022-01-19T11:01:48-08:00 Service default helm-guestbook Synced Healthy service/helm-guestbook created2022-01-19T11:01:48-08:00 apps Deployment default helm-guestbook OutOfSync Missing deployment.apps/helm-guestbook created2022-01-19T11:01:49-08:00 apps Deployment default helm-guestbook Synced Progressing deployment.apps/helm-guestbook createdName: helm-guestbookProject: defaultServer: https://kubernetes.default.svcNamespace: defaultURL: https://localhost:8080/applications/helm-guestbookRepo: https://github.com/argoproj/argocd-example-apps.gitTarget:Path: helm-guestbookSyncWindow: Sync AllowedSync Policy: noneSync Status: Synced to (53e28ff)Health Status: ProgressingOperation: SyncSync Revision: 53e28ff20cc530b9ada2173fbbd64d48338583baPhase: SucceededStart: 2022-01-19 11:01:49 -0800 PSTFinished: 2022-01-19 11:01:50 -0800 PSTDuration: 1sMessage: successfully synced (all tasks run)GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE Service default helm-guestbook Synced Healthy service/helm-guestbook createdapps Deployment default helm-guestbook Synced Progressing deployment.apps/helm-guestbook created
¡Ya ha implementado correctamente una aplicación con Argo CD! Es posible hacer lo mismo desde la interfaz web de Argo CD, pero normalmente es más rápido y reproducible implementarla mediante la línea de comandos. Sin embargo, es muy útil verificar el panel web de Argo CD después de la implementación para verificar que sus aplicaciones se estén ejecutando correctamente. Puede comprobarlo abriendo localhost:8080
en un navegador:
En este punto, lo último que debe hacer es asegurarse de poder acceder a su nueva implementación en un navegador. Para ello, deberá reenviar otro puerto, como lo hizo para Argo CD. Internamente, la helm-guestbook
aplicación se ejecuta en el puerto HTTP normal 80
y, para evitar conflictos con cualquier cosa que pueda estar ejecutándose en su propio puerto 80
o en el puerto 8080
que está usando para Argo CD, puede reenviarla al puerto 9090
:
- kubectl port-forward svc/helm-guestbook 9090:80
Como antes, probablemente querrás hacer esto en otra terminal, porque bloqueará esa terminal hasta que presiones Ctrl+C
para detener el reenvío del puerto. Luego puedes abrir localhost:9090
en una ventana del navegador para ver tu aplicación de libro de visitas de ejemplo:
Cualquier envío posterior a este repositorio de Github se reflejará automáticamente en ArgoCD, que volverá a sincronizar su implementación y proporcionará disponibilidad continua.
Conclusión
Ya ha visto los aspectos básicos de la instalación y la implementación de aplicaciones con Argo CD. Debido a que Kubernetes requiere tantas capas de abstracción, es importante asegurarse de que sus implementaciones sean lo más fáciles de mantener posible, y la filosofía de GitOps es una buena solución.
A continuación, es posible que desee obtener más información sobre la implementación de TOBS, The Observability Stack , para monitorear el tiempo de actividad, el estado y el registro de su clúster de Kubernetes.
Deja una respuesta