MKIt - Micro Kubernetes on Ruby
This is micro kubernetes(tm) on Ruby(tm), a simple tool to deploy containers to mimic a (very) minimalistic k8 cluster with a nice REST API.
It contains a internal DNS and uses HAProxy for routing/balancing/fail-over for Pods access. The database is a simple sqlite3 db and the server is a Sinatra based application.
The client is not done yet, only includes a simple wrapper to curl
The daemon is responsible for HAProxy pods routing configuration. It also provides the cluster DNS and manages the internal host interface.
Requirements
- Ruby
- HAProxy
- Docker
- Linux (iproute2 package)
Install
This is a simple ruby gem, so to install run
# gem install mkit
Running
The daemon requires root user (due to ip and haproxy), you can run it directly on the repository root...
# ./mkitd --help
Usage: mkitd []
-c config-dir set the config dir (default is /etc/mkit)
-p port set the port (default is 4567)
-b bind specify bind address (e.g. /tmp/app.sock)
-s server specify rack server/handler
-q turn on quiet mode (default is off)
-x turn on the mutex lock (default is off)
-e env set the environment (default is development)
-o addr set the host (default is (env == 'development' ? 'localhost' : '0.0.0.0'))
or after the gem install mkit-<version>.gem. The server and client will be installed on host.
# mkitd
...
0.65s info: MKIt is up and running! [ec=0xbe0] [pid=45804] [2023-12-29 15:46:04 +0000]
There's also samples on the samples dir, for daemontools and systemd.
Accessing the API
- Create new service
mkitc create samples/apps/rabbitmq.yml
- Update service
mkitc update samples/apps/rabbitmq.yml
- Get service
mkitc ps {id|service_name}
- Delete service
mkitc rm {id|service_name}
- List services
mkitc ps [-v (verbose)]
- Control service
mkitc start {id|service_name}mkitc stop {id|service_name}
Example:
$ mkitc ps postgres
id name addr ports status
4 postgres 10.210.198.10 tcp/5432 RUNNING
pods
id pod_id pod_name pod_ip status
19 4ce31a007211 5d148a16f3aa 172.17.0.2 RUNNING
The service postgres is available on IP 10.210.198.10:5432
Configuration
On startup, configuration files on config directory will be copied to /etc/mkit. HAProxy config dir and control commands are defined on mkit_config.yml
You must configure haproxy to use config directory. e.g. on Ubuntu
# /etc/default/haproxy
# Defaults file for HAProxy
#
# This is sourced by both, the initscript and the systemd unit file, so do not
# treat it as a shell script fragment.
# Change the config file location if needed
CONFIG="/etc/haproxy/haproxy.d"
# Add extra flags here, see haproxy(1) for a few options
#EXTRAOPTS="-de -m 16"
Service
service:
name: rabbitmq # unique
image: rabbitmq:3-management-alpine # image
network: bridge # docker network - it will be created if it does not exists
ports: # haproxy port mapping: <external_port>|<internal_port>|<tcp|http>|round_robin
- 5672:5672:tcp:round_robin
- 80:15672:http:round_robin
resources:
max_replicas: 1
min_replicas: 1
volumes:
- docker://mkit_rabbitmq_data:/var/lib/rabbitmq # a docker volume - it will be created if it does not exists
- /var/log/rabbitmq/logs:/var/log/rabbitmq # a local volume
environment:
RABBITMQ_DEFAULT_USER: admin
RABBITMQ_DEFAULT_PASS: admin
RABBITMQ_DEFAULT_VHOST: mkit
Development
- build the gem
rake package
- console
rake console
Thanks
For my kids. :)