Apache Mesos Container ohne Docker

11. February 2019 Andreas Peters

Container zu nutzen hat einige Vorteile gegenüber den herkömmlichen Betrieb von Server Diensten. Mesos bietet einem jedoch die Möglichkeit, die Vorteile von Container und dessen Isolierung mit den Vorteilen einer direkten Installation zu verbinden. So können wir Shellscripte, Einfache Programme (z.B. eine Rest API) oder komplexe Anwendungen betreiben, ohne jeweils das Image eines ganzen Containers zu verwenden. Die Frage ist relativ einfach. Wieso müssen wir für z.B. ein 5MB grosses GO Programm noch einen 20MB grossen Container mitschleppen?

Starten wir also einmal ein shell Script über Mesos und vergeben diesem eine IP Adresse:

{
  "id": "/test",
  "cmd": "ip addr; sleep 10000",
  "cpus": 0.1,
  "mem": 32,
  "disk": 0,
  "instances": 1,
  "acceptedResourceRoles": [
    "*"
  ],
  "container": {
    "type": "MESOS",
    "volumes": [],
    "portMappings": [
      {
        "containerPort": 0,
        "labels": {},
        "name": "default",
        "protocol": "tcp"
      }
    ]
  },
  "networks": [
    {
      "name": "weave",
      "mode": "container"
    }
  ],
  "portDefinitions": [],
  "maxLaunchDelaySeconds": 300
}

Oder wir laden “on the fly” z.B. ein GO Programm und starten dies:

{
  "id": "/test",
  "cmd": "cd $MESOS_SANDBOX; ./goapo",
  "cpus": 0.1,
  "mem": 32,
  "disk": 0,
  "instances": 1,
  "acceptedResourceRoles": [
    "*"
  ],
  "container": {
    "type": "MESOS",
    "volumes": [],
    "portMappings": [
      {
        "containerPort": 0,
        "labels": {},
        "name": "default",
        "protocol": "tcp"
      }
    ]
  },
  "fetch": [
    {
      "uri": "https://<SERVER>/goapi",
      "extract": false,
      "executable": true,
      "cache": false
    }
  ],    
  "networks": [
    {
      "name": "weave",
      "mode": "container"
    }
  ],
  "portDefinitions": [],
  "maxLaunchDelaySeconds": 300
}

Technisch gesehen starten wir das Shell Script aus dem ersten sowie das GO Programm aus dem zweiten Beispiel, als Isolierten Container. Jedoch ohne ein Docker Image zu benötigen. Auf diese weise können wir noch effizientere Services zur Verfügung stellen ohne auf die Vorteile der Isolierung eines Container zu verzichten. Der Fetch Befehl bietet und darüber hinaus noch die Möglichkeit, Dateien “on the fly” zu laden und zur Laufzeit auszuführen.