Skip to content

Compatibilidad con Kubernetes ​

Dozzle funciona con Kubernetes y te permite ver los logs de tus pods.

Configuración de Kubernetes ​

Para montar Dozzle en Kubernetes puedes usar la siguiente configuración YAML con DOZZLE_MODE=k8s. Incluye un deployment y un service para exponer Dozzle.

yaml
# rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: pod-viewer
---
# clusterrole.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: pod-viewer-role
rules:
  - apiGroups: [""]
    resources: ["pods", "pods/log", "nodes"]
    verbs: ["get", "list", "watch"]
  - apiGroups: ["apps"]
    resources: ["deployments", "replicasets", "daemonsets", "statefulsets"]
    verbs: ["get"]
  - apiGroups: ["batch"]
    resources: ["jobs", "cronjobs"]
    verbs: ["get"]
  - apiGroups: ["metrics.k8s.io"]
    resources: ["pods"]
    verbs: ["get", "list"]
---
# clusterrolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: pod-viewer-binding
subjects:
  - kind: ServiceAccount
    name: pod-viewer
    namespace: default
roleRef:
  kind: ClusterRole
  name: pod-viewer-role
  apiGroup: rbac.authorization.k8s.io
---
# pvc.yaml
# Con ReadWriteOnce y la estrategia Recreate, la configuración de cloud y las
# reglas de notificación dejan de estar disponibles un momento durante los
# despliegues (el pod nuevo no puede montar hasta que el viejo suelta el
# volumen). Para que la configuración persista sin cortes, usa una storage
# class ReadWriteMany (NFS, CephFS, etc.) y cambia la estrategia de abajo a
# RollingUpdate.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: dozzle-data
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dozzle
spec:
  selector:
    matchLabels:
      app: dozzle
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: dozzle
    spec:
      serviceAccountName: pod-viewer
      containers:
        - name: dozzle
          image: amir20/dozzle:latest
          ports:
            - containerPort: 8080
          env:
            - name: DOZZLE_MODE
              value: "k8s"
          volumeMounts:
            - name: data
              mountPath: /data
      volumes:
        - name: data
          persistentVolumeClaim:
            claimName: dozzle-data
---
# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: dozzle-service
spec:
  type: ClusterIP
  selector:
    app: dozzle
  ports:
    - port: 8080
      targetPort: 8080
      protocol: TCP

Esta configuración crea una cuenta de servicio, un cluster role y un cluster role binding para que Dozzle pueda acceder a los recursos de Kubernetes que necesita. También crea un deployment para Dozzle y lo expone mediante un service.

WARNING

Si despliegas esto con una herramienta de GitOps (como Flux CD o Argo CD) en un namespace distinto de default, acuérdate de cambiar el namespace en el Subject del ClusterRoleBinding

El resto de funciones también están disponibles, incluidas la autenticación, los filtros y demás. Puedes usar las mismas variables de entorno que en Docker para configurar Dozzle en Kubernetes.

NOTE

Dozzle en Kubernetes es una función nueva y puede tener algunas limitaciones frente a la versión de Docker. Usa esta discusión para informar de problemas o proponer mejoras.

API de métricas ​

Dozzle se apoya en la API de métricas de Kubernetes para obtener el uso de recursos. La API se instala con este comando:

bash
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

Para comprobar que la API está funcionando, ejecuta:

bash
kubectl top pod

Sin ella, los logs siguen funcionando y la CPU y la memoria quedan vacías.

Acciones sobre contenedores ​

Con DOZZLE_ENABLE_ACTIONS=true, Dozzle puede reiniciar un contenedor. Kubernetes no permite detener ni iniciar un contenedor por separado, así que reiniciar es la única acción. Dozzle reinicia borrando el pod para que su controlador (un Deployment, StatefulSet, DaemonSet o Job) cree uno nuevo, igual que kubectl delete pod. Un pod sin controlador nunca se borra.

Borrar pods requiere un permiso que el rol de solo lectura de arriba no concede. Añade esta regla al ClusterRole:

yaml
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["delete"]

Namespaces y filtros ​

Namespaces ​

Por defecto, Dozzle monitoriza todos los namespaces del clúster. Si quieres limitarlo a uno concreto, define la variable de entorno DOZZLE_NAMESPACE con el nombre del namespace.

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dozzle
spec:
  selector:
    matchLabels:
      app: dozzle
  template:
    metadata:
      labels:
        app: dozzle
    spec:
      serviceAccountName: pod-viewer
      containers:
        - name: dozzle
          image: amir20/dozzle:latest
          ports:
            - containerPort: 8080
          env:
            - name: DOZZLE_MODE
              value: "k8s"
            - name: DOZZLE_NAMESPACE
              value: "default"

NOTE

Dozzle admite varios namespaces: puedes poner en DOZZLE_NAMESPACE una lista separada por comas. Cuando se indican varios, Dozzle monitoriza cada namespace por separado y combina los resultados.

Etiquetas y filtros ​

DOZZLE_FILTER funciona igual que los filtros de Docker. Puedes acotar el alcance de Dozzle con la variable de entorno DOZZLE_FILTER. Por ejemplo, para limitarlo a env=prod:

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dozzle
spec:
  selector:
    matchLabels:
      app: dozzle
  template:
    metadata:
      labels:
        app: dozzle
    spec:
      serviceAccountName: pod-viewer
      containers:
        - name: dozzle
          image: amir20/dozzle:latest
          ports:
            - containerPort: 8080
          env:
            - name: DOZZLE_MODE
              value: "k8s"
            - name: DOZZLE_FILTER
              value: "env=prod"

Publicado bajo la licencia MIT. Código abierto y patrocinado por Docker OSS.