es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

skaffold dev: no se muestra la salida en la terminal (o hay una salida demorada)

Contexto

Estoy tratando de aprender skaffold. He instalado skaffold, kubectl y minikube. He creado un script de Python que imprime “¡Hola, Mundo!” en un bucle. He creado un Dockerfile y un manifiesto de Kubernetes simple. He generado un archivo skaffold.yaml utilizando skaffold init.

Problema

Después de iniciar minikube con minikube start y ejecutar skaffold dev, mi aplicación se construyó e implementó en minikube, como se esperaba. Sin embargo, no hubo más salida: “¡Hola, Mundo!” no se imprimió cada segundo en la terminal, como debería haber sido.

Dicho esto, noté que si esperaba 5 minutos, aparecerían de golpe muchos “¡Hola, Mundo!”. Luego, nada nuevamente durante 5 minutos. Luego más “¡Hola, Mundo!”, de golpe. En resumen, parece mostrar los registros cada 5 minutos aproximadamente en lugar de hacerlo en tiempo real.

Pensé que el problema estaba relacionado con mi computadora Linux, pero luego seguí los mismos pasos exactamente en mi Mac, y casi lo mismo sucedió: la única diferencia es que lo muestra cada 4 minutos aproximadamente, en lugar de cada 5.

Pregunta

¿Me puedes ayudar a averiguar qué está sucediendo aquí? He revisado la documentación y, según lo que puedo ver, el comportamiento predeterminado esperado debería ser una salida en tiempo real en la terminal.

Por lo que vale, duplicar la CPU y la RAM de minikube no cambió nada. Pero al probar el inicio rápido de skaffold (que implica una aplicación similar pero escrita en Go), funcionó perfectamente: la salida no se retrasó.

Archivos

Aquí están todos los archivos de la aplicación y configuración para reproducir los pasos anteriores.

app.py

import time

start = time.time()

while True:
    print("¡Hola, Mundo!")
    ahora = time.time()
    print(f"Tiempo transcurrido: {round(ahora - inicio)}")
    time.sleep(1)

<p><strong>Dockerfile</strong></p>

<p><code>
FROM python:3.9-slim
COPY . .
CMD ["python", "app.py"]
</code></p>

<p><strong>k8s.yaml</strong></p>

<p>“`
apiVersion: v1
kind: Pod
metadata:
name: hello
spec:
containers:
– name: hello
image: hello

“`

skaffold.yaml


apiVersion: skaffold/v2beta26
kind: Config
metadata:
name: hello-app
build:
artifacts:
- image: hello
docker:
dockerfile: Dockerfile
deploy:
kubectl:
manifests:
- k8s.yaml

Gracias.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Posible causa de la salida retrasada en Skaffold

    Según el contexto y los archivos proporcionados, la salida retrasada de “Hello, World!” en Skaffold podría deberse a la forma en que Skaffold maneja stdout, que no es en tiempo real de manera predeterminada.

    Según la documentación, Skaffold transmite registros de objetos de Kubernetes, como pods, y de manera predeterminada los almacena en búfer antes de escribirlos en la terminal local. El tamaño de este búfer se puede configurar utilizando las opciones logFormat y sync en el archivo skaffold.yaml.

    Para habilitar la generación de registros en tiempo real en Skaffold, la opción logFormat debe establecerse en logfmt y la opción sync debe establecerse en false. Por ejemplo:

    deploy:
      kubectl:
        manifests:
          - k8s.yaml
      logFormat: logfmt
      sync: false
    

    Después de realizar este cambio y ejecutar skaffold dev nuevamente, la salida de “Hello, World!” en el script de Python debería aparecer en la terminal en tiempo real, sin retrasos significativos.

    También cabe mencionar que la salida retrasada también puede deberse a la forma en que se usa la función time.sleep() en el script de Python. Esta función pausa la ejecución del código durante un número específico de segundos y si el valor es demasiado grande, puede causar un retraso en la salida.

    En el script proporcionado, se utiliza time.sleep(1) para pausar la ejecución durante 1 segundo en cada iteración del bucle. Este valor se puede disminuir para obtener una velocidad de salida más rápida. Por ejemplo, cambiarlo a time.sleep(0.1) hará que el script genere la salida “Hello, World!” diez veces por segundo.

Comments are closed.