Este es un demo sencillo que pretende ilustrar una estrategia de usar Crossplane para poder implementar las practicas GitOps en ArgoCD, permitiendo manejar recursos externos a objetos de kubernetes, en este caso especifico, un Droplet (Linux VM) de Digitalocean.
Durante el demo, usaremos un entorno local para comunicarnos con infraestructura remota. Es necesario contar con:
- Algun Kubernetes local como kind (yo estoy usando Rancher Desktop)
- Helm
- Una cuenta de DigitalOcean
helm repo add crossplane-stable https://charts.crossplane.io/stable
helm repo update
helm upgrade --install \
crossplane crossplane-stable/crossplane \
--namespace crossplane-system \
--create-namespace \
--wait
Para instalar el plugin de DigitalOcean provider en Crossplane
kubectl apply -f crossplane/provider-config.yml
Este paso, nos permitira conectar Crossplane con nuestra cuenta personal de DigitalOcean para habilitar el flujo de GitOps que viene en los proximos pasos:
kubectl create secret generic digitalocean-creds --from-literal=access-token=[API-TOKEN] -n crossplane-systems
helm upgrade --install ingress-nginx ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx --create-namespace
kubectl kustomize argo-deployment/ | kubectl apply -f -
Obtenemos el password temporal de argo para poder accederlo desde La Linea De Comandos.
export PASS=$(kubectl \
--namespace argocd \
get secret argocd-initial-admin-secret \
--output jsonpath="{.data.password}" \
| base64 --decode)
En el repo, cuento con un app.yaml y un project.yaml custom, donde le indico a Argo en que repositorio observar mis cambios. Despues de inspeccionar estos archivos yaml, hagamos kubectl apply para crear la app y el proyecto.
kubectl apply -f app.yaml
kubectl apply -f project.yaml
helm uninstall crossplane -n crossplane-system
kubectl kustomize argo-deployment/ | kubectl delete -f -
kubectl delete namespace argocd
Es posible que el namespace se quede en "terminating", en dado caso, se puede aplicar este finalizador directamente en la API de argocd
kubectl get namespace argocd -o json | jq 'del(.spec.finalizers[])' | curl -k -H "Content-Type: application/json" -X PUT --data-binary @- http://127.0.0.1:8001/api/v1/namespaces/argocd/finalize
kubectl delete crd applications.argoproj.io applicationsets.argoproj.io appprojects.argoproj.io
en caso de que se queden atorados, usar
kubectl get crd appprojects.argoproj.io -o json | jq '.metadata.finalizers=null' | kubectl apply -f -
y
kubectl get crd applications.argoproj.io -o json | jq '.metadata.finalizers=null' | kubectl apply -f -
respectivamente.