• Stars
    star
    128
  • Rank 281,044 (Top 6 %)
  • Language
    Go
  • Created almost 8 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Fast Distribution of Docker Images on Clusters

ImageWolf - Fast Distribution of Docker Images on Clusters

ImageWolf is a PoC that provides a blazingly fast way to get Docker images loaded onto your cluster, allowing updates to be pushed out quicker.

ImageWolf works alongside existing registries such as the Docker Hub, Quay.io as well as self-hosted registries.

The PoC for ImageWolf uses the BitTorrent protocol spread images around the cluster as they are pushed.

Video

Docker Swarm

asciicast

Kubernetes

asciicast

Getting Started

ImageWolf is currently alpha software and intended as a PoC - please don't run it in production!

Docker Swarm Mode

To start ImageWolf, run the following on your Swarm master:

docker network create -d overlay --attachable wolf
docker service create --network wolf --name imagewolf --mode global \
       --mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
       containersol/imagewolf

The ImageWolf service is now running on all nodes in our cluster.

The next step is to link ImageWolf with a registry. Whenever an image is pushed to the registry, ImageWolf will immediately pull it and distribute across all the nodes. To set up a private registry linked to ImageWolf:

# First find the id of the ImageWolf task running on this node
# This should work, but is a bit of a hack
TASK=$(docker ps -f name="imagewolf." --format {{.ID}})

# Configuration for the notification endpoint

export REGISTRY_NOTIFICATIONS_ENDPOINTS=$(cat <<EOF
    - name: imagewolf
      disabled: false
      url: http://${TASK}:8000/registryNotifications
EOF
)

# Start up a single instance of the registry
docker run -d --name registry-wolf --network wolf -p 5000:5000 -p 5001:5001 \
           -e REGISTRY_NOTIFICATIONS_ENDPOINTS \
           containersol/registry-wolf

You can then push an image to the registry running on the local node:

docker tag redis localhost:5000/myimage
docker push localhost:5000/myimage

ImageWolf should immediately see the push and distribute the image to the other nodes. You can see what's going on by running docker service logs imagewolf.

We can now start another global service using this image:

# Use the digest of the image to avoid problems with repo lookups
IMAGE_HASH=$(docker inspect --format {{.Id}} localhost:5000/myimage)
docker service create --name test-service --mode global $IMAGE_HASH

In order to monitor progress, you can either pass -d=false when starting the service or run docker service ps test-service. Note that nodes will reject jobs until ImageWolf completes loading the image onto the node.

Kubernetes

In Kubernetes, there is the DaemonSet concept which ensures that all (or some) nodes run a copy of a pod. As nodes are added to the cluster, pods are added to them. As nodes are removed from the cluster, those pods are garbage collected.

Then a headless Service is created allowing ImageWolf to discover all the peers.

To start ImageWolf, deploy the DaemonSet and its associated headless Service using the following command:

kubectl apply -f kubernetes.yaml

Testing:

# You may need to wait few minutes before Kubernetes display the service public IP
export IMAGEWOLF_IP=$(kubectl get svc imagewolf --no-headers | awk '{print $3}')

# Simulate a Docker Hub webhook
curl "${IMAGEWOLF_IP}/hubNotifications" \
   -H 'Content-Type: application/json' \
   -d '{
      "push_data": {
         "tag": "latest"
      },
      "repository": {
         "repo_name": "redis"
      }
   }'

# Inspect the logs
kubectl logs -l app=imagewolf

# Check the stats
curl "${IMAGEWOLF_IP}/stats"

Integration with Docker Hub

The Docker Hub has a web hooks feature which can be used to call a remote service when an image is pushed. When ImageWolf receives the callback, it will pull the image and distribute to the cluster, which is significantly faster than all nodes pulling individually from the Docker Hub.

To use this feature, you will need to expose the ImageWolf service so that it is accessible to the Hub. This can be done by adding the flag -p 8000:8000 to the service create command. You can then add the URL or IP address of your server as a webhook, specifying hubNotifications as the path e.g: http://mycluster.com/hubNotifications. If your cluster runs on a internal network you can use a service such as ngrok to forward calls.

Stats

There are no hard numbers yet.

The real improvements are expected on large clusters, where multiple Docker engines pull images simultaneously. Also whilst a ramped deployment may avoid the "stampeding herd" problem swamping the registry, deployment times will still be longer as whenever a container is deployed to a node without the image a new pull will take place - with ImageWolf the image will already be on the node and the container will start immediately.

Other Approaches

Using a global or distributed file system to back a Docker registry can also achieve many of the benefits of ImageWolf.

Multiarch

ImageWolf was tested on a Raspberry PI cluster as well as in the Google cloud. You should find that the above instructions work identically on 32-bit ARM (armv7l) as well as x86_64 through the magic of multi-arch images.

Bugs & Improvements

ImageWolf is a PoC currently and there are a lot of rough edges:

  • Services have to be started using the Image ID to avoid repo pinning problems
  • No optimisations have been carried out
  • The internal use of the Docker CLI and sock is a bit hacky
  • If ImageWolf is still distributing the image when a service is created, nodes will attempt to pull from the registry simultaneous with ImageWolf pushing the image
  • Allow Google Cloud Platform container registry webhook using Pub/Sub

Assuming there is interest in ImageWolf, the next step will be to change the hacked together code into a coherent solution.

Feedback

This is a PoC. If it is useful or interesting to you, please get in touch and let us know.

More Repositories

1

k8s-deployment-strategies

Kubernetes deployment strategies explained
Go
3,504
star
2

kubernetes-examples

Minimal self-contained examples of standard Kubernetes features and patterns in YAML
Shell
1,394
star
3

trow

Container Registry and Image Management for Kubernetes Clusters
Rust
808
star
4

minimesos

The experimentation and testing tool for Apache Mesos - NO LONGER MAINTANED!
Java
431
star
5

helm-monitor

Monitor K8S Helm release, rollback on metrics behavior (Prometheus, Elasticsearch, Sentry)
Go
409
star
6

helm-convert

Convert Helm charts into Kustomize compatible package
Go
215
star
7

externalsecret-operator

An operator to fetch secrets from cloud services and inject them in Kubernetes
Go
189
star
8

terraform-examples

Simple and idiomatic examples of various Terraform functions and features.
HCL
160
star
9

runbooks

A collection of step by step guides for fixing common tech problems.
HTML
129
star
10

locust_exporter

A Locust metrics exporter for Prometheus
Go
108
star
11

terraform-mesos

Stuff for programming a Mesos cluster on the Google Cloud
Shell
98
star
12

prometheus-swarm-discovery

This is a POC for Prometheus service discovery on Docker Swarm
Go
76
star
13

registry-tooling

Install a secure Docker registry on any Kubernetes cluster with a single command
Shell
70
star
14

cd_demo

Demo for a full (almost) CD pipeline with git, jenkins, docker, mesos
Shell
65
star
15

prom-metrics-check

Python
64
star
16

tinkerbell-rpi4-workflow

Instructions and configuration files to create tinkerbell workflow for raspberry pi 4
Shell
50
star
17

cd-with-docker-tutorial

Continuous Integration and Delivery with Docker
Go
50
star
18

docker-cobbler

Cobbler in a Docker container
Makefile
49
star
19

mesos-starter

Java
46
star
20

docker-registry-proxy

Docker Registry 2.0 proxy with SSL and authentication
Shell
31
star
21

stackdriver-gke-custom-metrics

Example python code sending custom container metrics to Stackdriver Monitoring
Python
23
star
22

dcos-in-triton

Infrastructure setup for running DCOS in Joyent's Triton
Python
21
star
23

terraform-provider-cobbler

Terraform provider for Cobbler
Go
18
star
24

capabilities-blog

Code supporting capabilities blog
C
18
star
25

terraform-nomad

Terraform scripts for creating a Nomad cluster on Google Cloud.
HCL
16
star
26

zookeeper

Zookeeper with dynamic host reconfiguration
Shell
16
star
27

cloud-native-patterns

Cloud Native Patterns
HTML
14
star
28

learning-mesos-with-minimesos-workshop

13
star
29

mesos-hello-world

Very simple hello world mesos framework to demonstrate mini-mesos
Java
12
star
30

construct

Mesos framework for deploying a single task on all agents of the cluster
Python
11
star
31

mesosframework

Create a mesos framework with just an application.properties file!
Java
11
star
32

unifi-fargate

Deploy a Unifi Controller on AWS ECS Fargate using Terraform
HCL
11
star
33

pactbroker_exporter

A Pact Broker metrics exporter for Prometheus
Go
10
star
34

php-k8s

PHP on Kubernetes
PHP
9
star
35

delayed-jobs-operator

Go
9
star
36

terraform-provider-template

Skeleton for building a Terraform provider
Go
8
star
37

kubernetes-federation-demo

Demo setup for Kubernetes Cluster Federation
Go
8
star
38

redis-cluster-operator

A Kubernetes Operator for running Production Redis Clusters
Go
7
star
39

mesos-local

Mesos cluster in a container. Used by Mini-Mesos https://github.com/ContainerSolutions/mini-mesos
Groovy
7
star
40

k8shserver

Shell
7
star
41

cobblerclient

Cobbler Client written in Go
Go
7
star
42

kubadm-ansible

Ansible scripts to create & destroy a Kubernetes cluster using kubeadm
7
star
43

gitops-training-lab

Shell
7
star
44

timber

Timber - The Training Companion App
Python
7
star
45

dockerfiles

Dockerfile
6
star
46

kubernetes-demo

Go
6
star
47

minimesos-docker

minimesos Docker images
Shell
6
star
48

keda-kafka

This repo contains everything to create a demo where you can scale Kafka consumers depending on the queue size on a Kafka Topic from scratch.
Shell
6
star
49

k8sbhw

Kubernetes beyond hello world
Go
5
star
50

reveal-md

A CS themed version of Reveal-MD running on Alpine in a Docker Container
CSS
5
star
51

bootstrap-habitat-supervisors-on-k8s

Bootstrap habitat supervisors on top of kubernetes
Ruby
5
star
52

argus-gephi-connector

Argus with Gephi integrated together to get real-time visualisation of infrastructure
Python
5
star
53

helm-charts

A barebone Helm Chart repository
Smarty
5
star
54

habitat-redis-ha-cluster-on-k8s

Run a self organizing HA redis cluster on top of k8s.
Shell
5
star
55

go-validation-admission-controller

Demo implemention of a validation admission controller webhook
Go
5
star
56

dcos-ansible-packet

Ansible playbook for installing DC/OS on Packet cloud
Python
4
star
57

node-hack

A vulnerable nodejs application for hollywood-style hacking demos
JavaScript
4
star
58

bookinfo

Go
4
star
59

go-example-webserver

Example Go Webserver for training purposes
Groovy
4
star
60

ws-production-grade-kubernetes

Materials for the Production Grade Kubernetes workshop
Go
4
star
61

goto-prometheus

HTML
4
star
62

lean-go-containers

Example code for the blog post on building lean go containers using Docker multi-stage builds, which went stable in docker 17.06.
Go
4
star
63

kong-demo

A repo that will demonstrate some of the functionality of the kong ingress
Makefile
4
star
64

ha-redis-kubernetes

Manual Redis HA in Kubernetes with Zero Downtime updates and upgrades
Python
4
star
65

ws-kubernetes-essentials-app

HTML
3
star
66

saferun

run binaries with encrypted environment variables
Go
3
star
67

minimesos.org

minimesos.org
HTML
3
star
68

operator-workshop

Go
3
star
69

minimesos-mdns

Service for publishing minimesos containers via mdns
JavaScript
3
star
70

nixpkgs-overlay

Overlay for fun and profit
Nix
3
star
71

minimesos-maven-plugin

A Maven plugin for minimesos. Control your minimesos cluster from Maven
Java
3
star
72

k8s-federation-demo

demo app to demonstrate Kubernetes cluster federation
JavaScript
3
star
73

loki-grafana-promtail-k8s

3
star
74

codeship-docker-compose-examples

HTML
2
star
75

pres-prereq-to-docker

JavaScript
2
star
76

API-Excercise

The Container Solutions API Exercise Version 2.0
Python
2
star
77

jMeter-docker

dockerised jMeter
Shell
2
star
78

distributed-secrets

Go
2
star
79

kubernetes-cheatsheet

Cheatsheet with useful Kubernetes commands or tools
2
star
80

marathon-haproxy-subdomain-bridge

Go
2
star
81

kubernetes-deployment-tools

Docker image with a series of tools intended at Kubernetes deployments
Dockerfile
2
star
82

warsaw-workshop

repository to share with workshop participants
2
star
83

maturity-matrix

Maturity Matrix
JavaScript
2
star
84

template-spring-boot

Template for a Spring boot project
Java
2
star
85

space-oddity

Drone project
JavaScript
2
star
86

avazacli

Generated avaza API client
Python
2
star
87

external-secrets-charm

Python
2
star
88

ws-k8s-foundation-sample-app

HTML
2
star
89

gcp-billing-csv

DB to store billing csv data from GCP in Postgres so it can be queried using SQL
Shell
2
star
90

toolset

CSS
1
star
91

google-cloud-cli

Container image with tools for interacting with the Google Cloud and Kubernetes
Makefile
1
star
92

kuberviz

Semantically visualize your Kubernetes cluster
JavaScript
1
star
93

geoserver

HTML
1
star
94

python-application-operator

Python
1
star
95

sandbox-weave-net-minimesos

Experiment to run Weave Net inside minimesos
Shell
1
star
96

libmesos

1
star
97

node-openshift-sample

JavaScript
1
star
98

WheelOfFortune

Python
1
star
99

techterrarium

A controlled environment for nurturing and observing tech experiments.
1
star
100

go-utils

Utils library for Go
Go
1
star