The main purpose of Edge Orchestration is to implement distributed computing between Docker Container enabled devices.
The Workflow is as follows:
- Run Edge Orchestration container at a host machine. Then the host machine becomes an Edge Orchestration device.
- The device receives Service Execution request from host via REST API.
- The device gets and compares the scores from the other Edge Orchestration Devices.
- The device requests Service Execution to the device that has the highest score.
- If the device itself has the highest score, the service is executed on itself.
This section provides how to download and run pre-built Docker image without building the project.
- docker-ce
- Version: 17.09 (or above)
- How to install
Please download edge-orchestration
$ docker load -i edge-orchestration.tar
If it succeeds, you can see the Docker image as follows:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
edge-orchestration baobab 502e3c07b01f 3 minutes ago 132MB
To let the Edge Orchestration devices communicate with each other, each devices should have same authentication key in:
/var/edge-orchestration/data/cert/edge-orchestration.key
$ sudo cp {SampleKey.key} /var/edge-orchestration/data/cert/edge-orchestration.key
*Any cert file can be authentication key
You can execute Edge Orchestration with a Docker image as follows:
$ docker run -it -d \
--privileged \
--network="host" \
--name edge-orchestration \
-v /var/edge-orchestration/:/var/edge-orchestration/:rw \
-v /var/run/docker.sock:/var/run/docker.sock:rw \
-v /proc/:/process/:ro \
edge-orchestration:baobab
- docker-ce
- Version: 17.06 (or above)
- How to install
For execution of docker commands with non-root privileges you need to add
$USER
to docker group.
$ sudo usermod -aG docker $USER
- go compiler
- Version: 1.10 (or above)
- How to install
To build Edge Orchestrator from Go sources, you need to set GOPATH environment variable:
$ export GOPATH=$HOME/go
$ export PATH=$PATH:$GOPATH/bin
- glide
To install glide
, you need to add appropriate repository to apt list. To do that, execute following shell commands:
sudo add-apt-repository -y ppa:masterminds/glide && sudo apt-get update
sudo apt-get install -y glide
This project offers Docker image build as a default build option.
$ ./build.sh
This build script will build Edge Orchestration in Docker Container environment.
If it succeeds, you can see the container runs as follows:
**********************************
Run Docker container
**********************************
5d2efd81057fe56236602acfece0e8f11d447b54627f4f3669b18c85a95b8687
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5d2efd81057f edge-orchestration:baobab "sh run.sh" Less than a second ago Up Less than a second edge-orchestration
and the built image as follows:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
edge-orchestration baobab 502e3c07b01f 3 seconds ago 132MB
- All Build Options
build script
Usage:
----------------------------------------------------------------------------------------------
./build.sh : build edge-orchestration by default container
./build.sh secure : build edge-orchestration by default container with secure option
./build.sh container : build Docker container as build system environmet
./build.sh container secure : build Docker container as build system environmet with secure option
./build.sh object : build object (c-object, java-object)
./build.sh object secure : build object (c-object, java-object) with secure option
./build.sh clean : build clean
./build.sh test [PKG_NAME] : run unittests (optional for PKG_NAME)
----------------------------------------------------------------------------------------------
Edge Orchestration provides only one REST API for its operation. Description for the APIs are stored in /doc folder.
Note that you can visit Swagger Editor to graphically investigate the REST API in YAML.
- 2 or more devices with Ubuntu 14.04 (or above) and Docker 17.09 (or above)
- Same WIFI network connected among the devices.
- Same Authentication key in /var/edge-orchestration/user/orchestration_userID.txt
- Please see the above 4. Add User ID to know how to add authentication key
- Edge Orchestration Docker image
- Please see the above How to build to know how to build Edge Orchestration Docker image
$ docker run -it -d \
--privileged \
--network="host" \
--name edge-orchestration \
-v /var/edge-orchestration/:/var/edge-orchestration/:rw \
-v /var/run/docker.sock:/var/run/docker.sock:rw \
-v /proc/:/process/:ro \
edge-orchestration:baobab
- Result
$ docker logs -f edge-orchestration
2019/10/16 07:35:45 main_secured.go:89: [interface] OrchestrationInit
2019/10/16 07:35:45 main_secured.go:90: >>> commitID : c3041ae
2019/10/16 07:35:45 main_secured.go:91: >>> version :
2019/10/16 07:35:45 main_secured.go:92: >>> buildTime : {build time}
2019/10/16 07:35:45 main_secured.go:93: >>> buildTags : secure
2019/10/16 07:35:45 discovery.go:256: [discoverymgr] UUID : {$UUID}
2019/10/16 07:35:45 discovery.go:338: [discoverymgr] [{$discovery_ip_list}]
2019/10/16 07:35:45 discovery.go:369: [deviceDetectionRoutine] edge-orchestration-{$UUID}
2019/10/16 07:35:45 discovery.go:370: [deviceDetectionRoutine] confInfo : ExecType(container), Platform(docker)
2019/10/16 07:35:45 discovery.go:371: [deviceDetectionRoutine] netInfo : IPv4({$discovery_ip_list})
2019/10/16 07:35:45 discovery.go:372: [deviceDetectionRoutine] serviceInfo : Services([])
2019/10/16 07:35:45 discovery.go:373:
2019/10/16 07:35:45 tls.go:40: SetCertFilePath: /var/edge-orchestration/data/cert
2019/10/16 07:35:45 tls.go:40: SetCertFilePath: /var/edge-orchestration/data/cert
2019/10/16 07:35:45 route.go:76: {APIV1Ping GET /api/v1/ping 0x8090f0}
2019/10/16 07:35:45 route.go:76: {APIV1ServicemgrServicesPost POST /api/v1/servicemgr/services 0x809160}
2019/10/16 07:35:45 route.go:76: {APIV1ServicemgrServicesNotificationServiceIDPost POST /api/v1/servicemgr/services/notification/{serviceid} 0x8091c0}
2019/10/16 07:35:45 route.go:76: {APIV1ScoringmgrScoreLibnameGet GET /api/v1/scoringmgr/score 0x809220}
2019/10/16 07:35:45 route.go:76: {APIV1RequestServicePost POST /api/v1/orchestration/services 0x806cb0}
2019/10/16 07:35:45 route.go:104: ListenAndServeTLS_For_Inter
2019/10/16 07:35:45 route.go:111: ListenAndServe
2019/10/16 07:35:45 main_secured.go:141: interface orchestration init done
RESTAPI
-
POST
-
IP:56001/api/v1/orchestration/services
-
BODY :
{ "ServiceName": "hello-world", "ServiceInfo": [ { "ExecutionType": "container", "ExecCmd": [ "docker", "run", "-v", "/var/run:/var/run:rw", "hello-world" ] }], "StatusCallbackURI": "http://localhost:8888/api/v1/services/notification" }
-
Curl Example:
- curl -X POST "IP:56001/api/v1/orchestration/services" -H "accept: application/json" -H "Content-Type: application/json" -d "{ \"ServiceName\": \"hello-world\", \"ServiceInfo\": [{ \"ExecutionType\": \"container\", \"ExecCmd\": [ \"docker\", \"run\", \"-v\", \"/var/run:/var/run:rw\", \"hello-world\"]}], \"StatusCallbackURI\": \"http://localhost:8888/api/v1/services/notification\"}"
-
Result(Execution on itself)
$ docker logs -f edge-orchestration 2019/06/07 05:41:03 externalhandler.go:75: [RestExternalInterface] APIV1RequestServicePost 2019/06/07 05:41:03 orchestration_api.go:70: [RequestService] container_service: [docker run -v /var/run:/var/run:rw hello-world] 2019/06/07 05:41:03 scoringmgr.go:131: [IN] getScoreLocalEnv 2019/06/07 05:41:03 scoringmgr.go:139: scoringmgr scoreValue : 7.481732534124991 2019/06/07 05:41:03 orchestration_api.go:90: [orchestrationapi] [{192.168.1.37 7.481732534124991}] 2019/06/07 05:41:03 route.go:87: POST /api/v1/orchestration/services APIV1RequestServicePost 272.182µs 2019/06/07 05:41:03 containerexecutor.go:75: [containerexecutor] container_service [docker run -v /var/run:/var/run:rw hello-world] 2019/06/07 05:41:03 containerexecutor.go:76: [containerexecutor] parameter length : 5 2019/06/07 06:46:12 route.go:87: POST /api/v1/orchestration/services APIV1RequestServicePost 396.063µs {"status":"Pulling from library/hello-world","id":"latest"} {"status":"Digest: sha256:0e11c388b664df8a27a901dce21eb89f11d8292f7fca1b3e3c4321bf7897bffe"} {"status":"Status: Image is up to date for hello-world:latest"} 2019/06/07 05:41:21 containerexecutor.go:90: [containerexecutor] create container : bb8c3425ec 2019/06/07 05:41:22 containerexecutor.go:108: [containerexecutor] container execution status : 0 2019-06-07T05:41:22.144893108Z 2019-06-07T05:45:35.717107646Z Hello from Docker! 2019-06-07T05:45:35.717110637Z This message shows that your installation appears to be working correctly. 2019-06-07T05:45:35.717112612Z 2019-06-07T05:45:35.717114418Z To generate this message, Docker took the following steps: 2019-06-07T05:45:35.717116284Z 1. The Docker client contacted the Docker daemon. 2019-06-07T05:45:35.717118076Z 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. 2019-06-07T05:45:35.717120060Z (amd64) 2019-06-07T05:45:35.717121906Z 3. The Docker daemon created a new container from that image which runs the 2019-06-07T05:45:35.717123788Z executable that produces the output you are currently reading. 2019-06-07T05:45:35.717125570Z 4. The Docker daemon streamed that output to the Docker client, which sent it 2019-06-07T05:45:35.717127407Z to your terminal. 2019-06-07T05:45:35.717129190Z 2019-06-07T05:45:35.717130971Z To try something more ambitious, you can run an Ubuntu container with: 2019-06-07T05:45:35.717132780Z $ docker run -it ubuntu bash 2019-06-07T05:45:35.717134548Z 2019-06-07T05:45:35.717136249Z Share images, automate workflows, and more with a free Docker ID: 2019-06-07T05:45:35.717138053Z https://hub.docker.com/ 2019-06-07T05:45:35.717139826Z 2019-06-07T05:45:35.717141538Z For more examples and ideas, visit: 2019-06-07T05:45:35.717143307Z https://docs.docker.com/get-started/ 2019-06-07T05:45:35.717145081Z 2019/06/07 05:41:22 orchestration_api.go:163: [orchestrationapi] service status changed [appNames:container_service][status:Finished]
-
Not supported docker run option [Args in Body]
--detach-keys --disable-content-trust --sig-proxy --name --platform --help --cpu-percent (Windows only option) --cpu-count (Windows only option) --io-maxbandwidth (Windows only option) --io-maxiops (Windows only option)