Este repo crea un Docker de un server apache de test, donde el objetivo es poder cambiar el index.php y un archivo de texto, para probar funcionalidades de actualización automática de pods sin necesidad de hacer alguna acción manual en un cluster de k8s, para esto el cluster de k8s debe tener un cronjob ref https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/ que reinicia el deployment que hace referencia a la imagen de Docker del apache-test cada minuto . El cronjob necesita unos permisos específicos para poder ejecutar los comandos de "kubectl" , por esto se crea un ServiceAccount y se le dan los accesos necesarios por RBAC para que pueda reiniciar un deployment. El deployment tiene la propiedad imagePullPolicy: Always ref: https://kubernetes.io/docs/concepts/containers/images/ , de esta forma siempre buscará descargar la última versión de la imagen de Docker y no se tendrá que manejar un versionamiento en el deployment , ya que siempre se usa el tag de:latest
-
Sí falla el cronjob o falla la actualización del deployment no hay forma de devolverse (claro que haciendo intervención manual sí podría actuar) , toca esperar hasta x tiempo que se actualice de nuevo la imagen de Docker y tenga una versión corregida.
-
Los permisos del cronJob, se pueden ver como una "brecha de seguridad" por lo que toca ser muy cuidadoso
-
No hay forma de visualizar cómo se está comportando cada cluster , es decir no hay forma de tener control de los despliegues (se podría crear algún script o algo que reporte en algún lado qué la actualización automática fué un éxito)
-
En teoría nada debería fallar sí ya se probó en un ambiente controlado , pero una configuración adicional no prevista en un cluster, puede afectar el CronJob o el despliegue automatico del pod
docker build -t ajmezav/webserver:latest .
docker push ajmezav/webserver:latest
docker container run -d -p 80:80 ajmezav/webserver:latest
docker exec -it CONTAINER_ID /bin/bash
docker container rm CONTAINER_ID -f
docker rmi -f ajmezav/webserver:latest
kubectl apply -f deployment_apache.yaml
kubectl apply -f cronjob.yaml
kubectl port-forward svc/webserver 8080:80 (puerto del localhost: puerto origen del docker)
kubectl exec --stdin --tty POD_NAME -- /bin/bash
kubectl get cronjob
kubectl describe cronjob NAME_CRONJOB