Ir al contenido

Almacenamiento y ajustes del contenedor

install pone el tar de la imagen, la raíz del contenedor y el manifiesto de la instalación en un mismo disco, y crea el contenedor con los ajustes de abajo. Ejecuta mikroscope plan con tus opciones para ver cada valor antes de que se escriba nada.

Objeto Por defecto Opción
veth + /30 veth-mikroscope, 172.30.10.0/30 (router .1, agente .2) --veth, --subnet
dirección del router 172.30.10.1/30 en la veth derivada de --subnet
manifiesto de la instalación mikroscope/<name>.manifest.txt en la flash interna --disk, --ephemeral
tar de la imagen <name>.tar, subido con scp y borrado en cuanto se extrae la imagen; ninguno con --remote-image --disk, --ephemeral, --remote-image
raíz del contenedor mikroscope/<name> en la flash interna --disk, --ephemeral
contenedor sin name=: RouterOS le pone nombre --container-name
envlist <name>-env --rate, --buffer, --port, --token, …
etiqueta mikroscope:<name> (managed by mikroscope) en cada objeto que admite comentario; como MIKROSCOPE_TAG en la envlist --name, por defecto mikroscope
  • --subnet es una /30 IPv4 dada en su dirección de red; el router toma la .1 y el agente la .2. Si 172.30.10.0/30 está en uso en tu router, elige otra: doctor nombra la ruta que se solapa con ella.
  • --name y --container-name admiten hasta 32 caracteres y --veth hasta 64: letras, dígitos, _, . y -, empezando por letra o dígito.
  • --disk es un slot de disco de RouterOS: vacío para la flash interna, tmpfs, disk1, usb1 y así sucesivamente. Con --disk, el manifiesto, el tar y la raíz se mueven juntos: <disk>/<name>.tar y <disk>/mikroscope/<name>.
  • Todo borrado selecciona el contenedor por su etiqueta, no por su nombre.

doctor comprueba el espacio y el disco antes de que install escriba:

Las comprobaciones que ejecuta doctor
Comprobación, tal como se imprimePasa cuandoLa solución que nombra
free flash ≥ <size> (image tar + extracted root)sin --disk ni --ephemeral: free-hdd-space es al menos el doble de la imagen más 4 MiB. Con --remote-image no se sube nada y el nombre acaba en (extracted root): la raíz en la que se extrae la imagen descargada, 7 MiB, más 4 MiBlibera flash, o instala con --disk tmpfs o --ephemeral donde exista un disco tmpfs
disk <disk> existscon --disk o --ephemeral: existe un disco con ese slot/disk/add type=tmpfs tmpfs-max-size=64M slot=tmpfs para un disco en RAM, o nombra un disco existente con --disk
disk <disk> has ≥ <size> free (image tar + extracted root)con --disk o --ephemeral, cuando el disco existe: su espacio libre es al menos el doble de la imagen más 4 MiB; con --remote-image, la raíz de 7 MiB más 4 MiB, como en la comprobación de la flashlibera espacio en ese disco, o da a un disco tmpfs un tmpfs-max-size mayor
disk tmpfs is RAMcon --ephemeral: el disco del slot tmpfs es de tipo tmpfslibera el slot para un disco tmpfs, o instala con --disk <slot> sin --ephemeral
start-on-boot suits a root in RAMun aviso, cuando el disco es tmpfs: start-on-boot queda en no, porque un reinicio vacía el disco y un contenedor que arranca con el equipo no tiene raízpasa --start-on-boot no, o --ephemeral
Por defecto --disk tmpfs --ephemeral
Manifiesto, tar y raíz flash interna el disco tmpfs el disco tmpfs
start-on-boot yes yes; doctor avisa no
Escrituras en flash el tar y la raíz ninguna para el tar y la raíz ninguna
Tras un reinicio el agente vuelve a arrancar la raíz desaparece, y un contenedor que arranca con el equipo no tiene ninguna el contenedor está parado, sin raíz, imagen ni manifiesto
  • Persistente es lo predeterminado: la raíz en la flash interna, start-on-boot=yes y restart-policy=on-failure limitado a cinco reinicios separados diez segundos, para que una imagen rota no entre en bucle al arrancar.

  • --ephemeral pone el manifiesto, el tar y la raíz en el disco del slot tmpfs, que tiene que ser un disco en RAM, y fija start-on-boot=no. No se escribe nada en la flash (medido), y nada sobrevive a un reinicio. Un router sin ese disco no pasa doctor, cuya solución añade uno:

    /disk/add type=tmpfs tmpfs-max-size=64M slot=tmpfs
  • --disk tmpfs sin --ephemeral pone los mismos ficheros en el disco tmpfs y mantiene start-on-boot=yes, de lo que doctor avisa. Añade --start-on-boot no, o usa --ephemeral.

Tras un reinicio, el contenedor de una instalación --ephemeral sigue configurado y parado, y su manifiesto se fue con el disco (probado). uninstall --ephemeral quita el resto por su etiqueta.

Ajuste Valor Opción
name= no se escribe, así que RouterOS le pone nombre al contenedor --container-name
file= o remote-image= el tar subido, o la referencia entera, con el host del registro incluido --agent-tar, --remote-image
interface= la veth --veth
root-dir= mikroscope/<name> en el disco --disk, --ephemeral, --name
envlist= <name>-env --name
logging= yes, para que lo que imprime el agente llegue al log del router ninguna
start-on-boot= yes; no con --ephemeral --start-on-boot: auto, yes o no
restart-policy= on-failure ninguna
restart-max-count= 5 --restart-max-count, 0–100
restart-interval= 10s --restart-interval, ^\d{1,4}[smh]$
memory-max= 64M, aplicado como límite del cgroup del contenedor --memory-max
privileged= yes --privileged=false
ignore-remote-image-change= yes ninguna
comment= la etiqueta --name
  • --start-on-boot auto es no con --ephemeral y yes en otro caso.
  • privileged=yes quita el espacio de nombres de usuario del contenedor, para que el log del kernel, /proc/slabinfo y los contadores ECC de la MTD se puedan leer. No amplía el espacio de nombres de red ni el de PID; Modo privilegiado tiene el detalle.
  • El agente captura SIGTERM; RouterOS mata al instante un contenedor que no lo hace. El agente se detiene dentro del tiempo de parada por defecto de RouterOS, 10 s.

RouterOS extrae la imagen cuando se añade el contenedor, y después el tar ya no sirve para nada. En la vía del tar, install:

  1. añade el contenedor;
  2. espera a que RouterOS lo marque stopped, que es cuando termina la extracción, hasta --extract-timeout (por defecto 120s, de 10 a 600 s);
  3. borra el tar;
  4. arranca el contenedor.

Si se agota el tiempo, se detiene con mikroscope: the image was not extracted within 120 s; mikroscope.tar stays. El tar se queda con el contenedor, y uninstall quita los dos juntos. Un tar olvidado sería lo que uninstall tendría que encontrar después, en un índice de /file que puede ir minutos por detrás del borrado de un contenedor.

El contenedor se crea con ignore-remote-image-change=yes. Con no, RouterOS vigila la imagen, y quitar el tar hace que pare, quite y vuelva a extraer el contenedor minutos después (verificado).

Hasta que se borra el tar, este y la raíz extraída de él comparten disco, así que doctor pide el doble de la imagen más 4 MiB. Con --remote-image no se sube nada: RouterOS se baja las capas, no hay tar al que esperar ni que borrar, y doctor pide la raíz extraída, 7 MiB, más 4 MiB. La raíz sigue yendo donde digan --disk y --ephemeral.

install escribe primero el manifiesto de la instalación, mikroscope/<name>.manifest.txt junto a la raíz del contenedor, y uninstall lo borra al final. Recoge cómo se hizo la instalación y cada objeto que creó:

mikroscope-manifest=1
name=mikroscope
tag=mikroscope:mikroscope (managed by mikroscope)
disk=
veth=veth-mikroscope
subnet=172.30.10.0/30
port=9123
iface-list=LAN
addr-list=LANs
expose=
container-name=
remote-image=registry-1.docker.io/jmrplens/mikroscope-agent:1.6.1
token=no
dir=mikroscope
file=mikroscope/mikroscope.manifest.txt
object=/interface/veth name=veth-mikroscope
object=/ip/address interface=veth-mikroscope
object=/interface/list/member interface=veth-mikroscope list=LAN
object=/ip/firewall/address-list list=LANs address=172.30.10.0/30
object=/container/envs list=mikroscope-env
object=/container interface=veth-mikroscope
dir=mikroscope/mikroscope
  • Las líneas de cabecera son la forma de la instalación, con los nombres de las opciones de la CLI. status, upgrade y uninstall las leen, así que no necesitan ninguna opción de forma, y rechazan la que las contradiga.
  • token= dice solo si se puso un token, nunca su valor. El manifiesto no guarda ningún secreto.
  • dir=, file= y object= enumeran lo que creó la instalación, en orden de creación: una ruta, o un menú y un selector que, con la etiqueta, selecciona el objeto.
  • Lo escriben todas las vías de instalación: install y upgrade de la CLI, y el script de plan --rsc.
  • Una instalación sin manifiesto, hecha por una CLI anterior o una --ephemeral tras un reinicio, se lee de sus objetos etiquetados.

La envlist guarda la configuración del agente y la marca de propiedad, y nada más:

Las entradas que install escribe en la envlist del agente
ClaveSe escribeViene deContiene
MIKROSCOPE_TAGsiempre--namela marca de propiedad mikroscope:<name> (managed by mikroscope), que se escribe la primera y se borra la última; el agente la ignora
RATE_HZsiempre--rate, por defecto 10, 1–100la cadencia del muestreador, en Hz
BUFFER_Ssiempre--buffer, por defecto 60, 10–3600la longitud del anillo, en segundos
PORTsiempre--port, por defecto 9123, 1–65535el puerto HTTP del agente
ADDRsiempre--subnetla dirección del agente, la .2 de la /30; el agente solo escucha ahí
MEM_LIMIT_MBsiempre--mem-limit-mb, 8–1024el límite blando de memoria de Go del agente, en MiB; se deriva del anillo (cadencia × búfer × línea, × 2,5, con un mínimo de 16 MiB y un máximo de tres cuartos de --memory-max mientras en él aún quepa el anillo) salvo que lo fije --mem-limit-mb
FLOOR_HZsolo cuando es mayor que 0--floor-hz, por defecto 0, 0–1000una sola cadencia para todas las fuentes de nivel, en Hz
CAPTURE_MBsiempre--capture-mb, por defecto 4, 0–256el presupuesto de capturas por disparo, en MiB; 0 las desactiva
TRIGGERSsolo cuando se da--triggerslas condiciones de disparo; sin ella, el agente usa su conjunto por defecto
TOKENsolo cuando se da--tokenel token bearer que exige el agente, de --token o MIKROSCOPE_TOKEN, con o sin --expose

No va en ella ninguna dirección de destino, ningún token de destino ni ninguna credencial de la API. Trata todo lo que contiene, el token incluido, como legible por cualquier usuario de RouterOS con read: un usuario así puede listar la envlist de cualquier contenedor por la API (verificado). El plan imprime el token enmascarado como (token). Modelo de seguridad dice qué credencial vive dónde, y Variables de entorno enumera las variables que lee el agente además de estas.

Mueve --memory-max y --mem-limit-mb con --rate y --buffer:

  • El anillo guarda rate × buffer líneas de unos 3,5 kB cada una.
  • El límite blando de Go quiere más o menos el doble del anillo y tiene que quedar holgadamente por debajo de memory-max. --mem-limit-mb 0, el valor por defecto, lo deriva: 16 MiB para 10 Hz y un anillo de 60 s bajo 64M.
  • La comprobación de arranque del agente cuenta 3 456 B por línea más --capture-mb. Por encima de memory-max se niega a arrancar; por encima de la mitad de --mem-limit-mb avisa.

Los valores por defecto aguantaron a 10, 50 y 100 Hz: --buffer 60, el --mem-limit-mb derivado y --memory-max 64M (medido). Lo que cuesta un límite ajustado está en Coste del agente, y cada cadencia en Techo de muestreo.