Mesos-Compose Framework für Apache Mesos



Mit Mesos-Compose biete ich eine Alternative zu Mesosphere Marathon an. Hierbei ist das Ziel, docker-compose files in MesosTasks zu übersetzten.

Ziel ist es die Arbeitsweise mit Mesos näher an den Workflow der Entwickler anzupassen. Es ist unstrittig, dass der Großteil der Entwickler im Microservice Umfeld sich mit der docker-compose Syntax auskennen und den Workload ggfs in einer lokalen Docker Umgebung testen. Die gleiche docker-compose.yaml kann mit Hilfe der Mesos CLI an das mesos-compose Framework geschickt werden. Das Framework scheduled daraufhin die entsprechenden Container in Apache Mesos.

Features

Folgende features stellt das mesos-compose framework zur Verfügung

  • Long und Shortrunning Jobs
  • Constraints um zu kontrollieren, auf welchem node der Job laufen soll
  • Unterstützung der Container Engine Docker als auch Mesos UCR
  • Bridge, Host und User Network
  • Capabilities
  • CPU und Memory resource Limits
  • Hashicorb Vault um Passwörter und Zertifikate aus dem Secretstore zu entnehmen

Compose File

Als Docker-Compose Syntax wird die Version 3.9 unterstützt. Dabei sind bislang folgende Parameter umgesetzt:

version: '3.9'

services:
  app:
    image: alpine:latest
    command: "sleep"
    arguments: ["1000"]        
    restart: always
    volumes:
      - "12345test:/tmp"
    environment:
      MYSQL_HOST: test
    hostname: test
    container_name: test
    container_type: docker
    shell: true
    mesos:
      task_name: "mc:test:app1" # an alternative taskname      
      executer:
        command: "/mnt/mesos/sandbox/my-custom-executor"
      fetch:
        - value: http://localhost/my-custom-executor
          executable: true
          extract:  false
          cache: false
    labels:
      traefik.enable: "true"
      traefik.http.routers.test.entrypoints: "web"
      traefik.http.routers.test.service: "mc_test_app1_80" # if an alternative taskname is set, we have to use it here to
      traefik.http.routers.test.rule: "HostRegexp(`example.com`, `{subdomain:[a-z]+}.example.com`)"
    network_mode: "BRIDGE"
    ports:
      - "8080:80"
      - "9090"
      - "8081:81/tcp"
      - "8082:82/udp"
      - "8082:82/http"
      - "8082:82/https"  
      - "8082:82/h2c"
      - "8082:82/wss"       
    network: default
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536 
        hard: 65536
    deploy:
      placement:
        constraints:
          - "node.hostname==localhost"
          - "node.platform.os==linux"
          - "node.platform.arch==arm"
          - "unique"
      replicas: 1
      resources:
        limits:
          cpus: 0.01
          memory: 50

networks:
  default:
    external: true
    name: weave
    driver: bridge

volumes:
  12345test:
    driver: local

Die Docker Labels nutzen wir sowohl für die Konfiguration von traefik (falls vorhanden), aber auch des mesos-compose Frameworks.