Operador de Kubernetes que observa recursos Rollout de Argo Rollouts. Cuando detecta que un rollout paso a estado Healthy, retaguea la imagen en ECR con:
<ambiente>-<última-parte-del-tag>: identifica el despliegue con el ambiente y la última parte del tag original (separado por-).active-<ambiente>: puntero mutable a la imagen activa del ambiente.
- Observa objetos
argoproj.io/v1alpha1de tipoRollout. - Verifica que
status.phaseseaHealthyy que elobservedGenerationeste actualizado. - Lee la imagen del primer contenedor en
spec.template.spec.containers[0].image. - Usa
BatchGetImageyPutImageen ECR para crear los tags objetivo. - Escribe anotaciones para no retaguear la misma imagen/generacion repetidamente.
ecr-tagger.io/environment(opcional): nombre del ambiente. Si no existe, usa el namespace.ecr-tagger.io/repository(opcional): repositorio ECR destino para el retag.
Anotaciones internas usadas por el operador:
ecr-tagger.io/last-tagged-imageecr-tagger.io/last-tagged-generation
- CRD de Argo Rollouts instalado en el cluster.
- Permisos AWS para
ecr:BatchGetImageyecr:PutImage. - Las imagenes de Rollout deben apuntar a ECR (
*.dkr.ecr.<region>.amazonaws.com/repo:tag).
go mod tidy
go test ./...
go run ./cmd/main.go --leader-elect=falsemake build
make docker-build IMAGE=henda24/rollout-ecr-tagger:0.1.0
make docker-push IMAGE=henda24/rollout-ecr-tagger:0.1.0- Actualiza la imagen en
config/operator.yaml(o dejahenda24/rollout-ecr-tagger:latest). - Aplica el manifiesto:
kubectl apply -f config/operator.yamlapiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: payment-api
namespace: prod
annotations:
ecr-tagger.io/environment: prod
spec:
replicas: 3
selector:
matchLabels:
app: payment-api
template:
metadata:
labels:
app: payment-api
spec:
containers:
- name: payment-api
image: 123456789012.dkr.ecr.us-east-1.amazonaws.com/payment-api:v1.8.4Con el Rollout anterior, si la imagen es payment-api:v1.8.4:
- Tag generado:
prod-v1.8.4(ambienteprod+ última parte del tagv1.8.4) - Tag activo:
active-prod(siempre apunta a la versión activa en prod)
Si el tag fuera v1.8.4-alpha:
- Tag generado:
prod-alpha(se tomaalphaque es la última parte después del split por-)