mkit 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +21 -0
- data/Gemfile.lock +137 -0
- data/LICENSE +21 -0
- data/README.md +126 -0
- data/Rakefile +54 -0
- data/bin/mkitc +31 -0
- data/bin/mkitd +55 -0
- data/config/database.yml +5 -0
- data/config/mkit_config.yml +15 -0
- data/config/mkitd_config.sh +5 -0
- data/db/migrate/001_setup.rb +105 -0
- data/db/migrate/002_mkit_jobs.rb +17 -0
- data/db/schema.rb +108 -0
- data/lib/mkit/app/controllers/mkitjobs_controller.rb +37 -0
- data/lib/mkit/app/controllers/pods_controller.rb +30 -0
- data/lib/mkit/app/controllers/services_controller.rb +87 -0
- data/lib/mkit/app/helpers/docker_helper.rb +75 -0
- data/lib/mkit/app/helpers/erb_helper.rb +18 -0
- data/lib/mkit/app/helpers/haproxy.rb +41 -0
- data/lib/mkit/app/helpers/interface_helper.rb +17 -0
- data/lib/mkit/app/helpers/services_helper.rb +54 -0
- data/lib/mkit/app/mkit_server.rb +8 -0
- data/lib/mkit/app/model/dns_host.rb +11 -0
- data/lib/mkit/app/model/lease.rb +26 -0
- data/lib/mkit/app/model/mkit_job.rb +48 -0
- data/lib/mkit/app/model/pod.rb +95 -0
- data/lib/mkit/app/model/pool.rb +60 -0
- data/lib/mkit/app/model/service.rb +266 -0
- data/lib/mkit/app/model/service_config.rb +16 -0
- data/lib/mkit/app/model/service_port.rb +30 -0
- data/lib/mkit/app/model/setting.rb +1 -0
- data/lib/mkit/app/model/volume.rb +53 -0
- data/lib/mkit/app/templates/docker/docker_run.sh.erb +1 -0
- data/lib/mkit/app/templates/haproxy/0000_defaults.cfg +23 -0
- data/lib/mkit/app/templates/haproxy/xapp_haproxy.cfg.erb +30 -0
- data/lib/mkit/cmd_runner.rb +27 -0
- data/lib/mkit/config/config.rb +18 -0
- data/lib/mkit/config/environment.rb +26 -0
- data/lib/mkit/config/initializers/001_hash.rb +11 -0
- data/lib/mkit/config/initializers/002_openstruct.rb +7 -0
- data/lib/mkit/config/load_default_configs.rb +29 -0
- data/lib/mkit/config/the_config.yml +3 -0
- data/lib/mkit/ctypes.rb +31 -0
- data/lib/mkit/docker_listener.rb +97 -0
- data/lib/mkit/exceptions.rb +30 -0
- data/lib/mkit/haproxy.rb +48 -0
- data/lib/mkit/job_manager.rb +53 -0
- data/lib/mkit/mkit_dns.rb +54 -0
- data/lib/mkit/mkit_interface.rb +31 -0
- data/lib/mkit/sagas/asaga.rb +11 -0
- data/lib/mkit/sagas/create_pod_saga.rb +28 -0
- data/lib/mkit/sagas/saga_manager.rb +10 -0
- data/lib/mkit/status.rb +47 -0
- data/lib/mkit/utils.rb +51 -0
- data/lib/mkit/version.rb +4 -0
- data/lib/mkit/workers/aworker.rb +11 -0
- data/lib/mkit/workers/haproxy_worker.rb +35 -0
- data/lib/mkit/workers/pod_worker.rb +39 -0
- data/lib/mkit/workers/service_worker.rb +27 -0
- data/lib/mkit/workers/worker_manager.rb +14 -0
- data/lib/mkit.rb +158 -0
- data/mkit.gemspec +40 -0
- data/mkitd +10 -0
- data/samples/apps/postgres.yml +22 -0
- data/samples/apps/rabbitmq.yml +19 -0
- data/samples/daemontools/log/run +44 -0
- data/samples/daemontools/run +42 -0
- data/samples/systemd/mkitd.service +12 -0
- metadata +393 -0
data/lib/mkit.rb
ADDED
@@ -0,0 +1,158 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
require 'json'
|
4
|
+
require 'yaml'
|
5
|
+
require 'optparse'
|
6
|
+
require 'ostruct'
|
7
|
+
require 'timeout'
|
8
|
+
require 'net/http'
|
9
|
+
require 'sinatra/base'
|
10
|
+
require 'mkit/config/environment'
|
11
|
+
require 'mkit/app/mkit_server'
|
12
|
+
require 'mkit/config/load_default_configs'
|
13
|
+
require_relative "mkit/version"
|
14
|
+
require_relative 'mkit/mkit_interface'
|
15
|
+
require_relative 'mkit/mkit_dns'
|
16
|
+
require_relative 'mkit/docker_listener'
|
17
|
+
require 'mkit/app/helpers/haproxy'
|
18
|
+
require 'mkit/app/controllers/services_controller'
|
19
|
+
require 'mkit/app/controllers/mkitjobs_controller'
|
20
|
+
require 'mkit/mkit_interface'
|
21
|
+
require 'mkit/mkit_dns'
|
22
|
+
require 'mkit/job_manager'
|
23
|
+
require 'mkit/workers/worker_manager'
|
24
|
+
require 'mkit/sagas/saga_manager'
|
25
|
+
require 'mkit/docker_listener'
|
26
|
+
require 'mkit/app/helpers/haproxy'
|
27
|
+
require 'active_record/tasks/database_tasks'
|
28
|
+
require 'mkit/utils'
|
29
|
+
|
30
|
+
MKItLogger = Console.logger
|
31
|
+
|
32
|
+
module MKIt
|
33
|
+
class Error < StandardError; end
|
34
|
+
include ActiveRecord::Tasks
|
35
|
+
|
36
|
+
System = Dry::Container.new
|
37
|
+
|
38
|
+
def self.configure(options:)
|
39
|
+
@root = MKIt::Utils.root
|
40
|
+
MKItLogger.debug!
|
41
|
+
#
|
42
|
+
# config dir
|
43
|
+
if ENV["RACK_ENV"] != "development"
|
44
|
+
@config_dir = options[:config_dir].nil? ? '/etc/mkit' : options[:config_dir]
|
45
|
+
else
|
46
|
+
@config_dir = options[:config_dir].nil? ? "#{@root}/config" : options[:config_dir]
|
47
|
+
end
|
48
|
+
MKIt::Utils.set_config_dir(@config_dir)
|
49
|
+
# create dirs
|
50
|
+
if ENV["RACK_ENV"] != "development" || !options[:config_dir].nil?
|
51
|
+
check_config_files = false
|
52
|
+
if ! File.exists?(@config_dir)
|
53
|
+
FileUtils.mkdir_p(@config_dir)
|
54
|
+
check_config_files = true
|
55
|
+
end
|
56
|
+
FileUtils.mkdir_p('/var/lib/mkitd') unless File.exists?('/var/lib/mkitd')
|
57
|
+
FileUtils.cp( "#{@root}/config/mkit_config.yml", @config_dir) unless File.exists?("#{@config_dir}/mkit_config.yml")
|
58
|
+
FileUtils.cp( "#{@root}/config/database.yml", @config_dir) unless File.exists?("#{@config_dir}/database.yml")
|
59
|
+
FileUtils.cp( "#{@root}/config/mkitd_config.sh", @config_dir) unless File.exists?("#{@config_dir}/mkitd_config.sh")
|
60
|
+
if check_config_files
|
61
|
+
MKItLogger.info "Configuration files copied to #{@config_dir}. Please check it and restart."
|
62
|
+
exit
|
63
|
+
end
|
64
|
+
end
|
65
|
+
#
|
66
|
+
# load configuration
|
67
|
+
MKIt::Initializers.load_my_configuration
|
68
|
+
#
|
69
|
+
# run config based tasks
|
70
|
+
FileUtils.mkdir_p(MKIt::Config.mkit.haproxy.config_dir)
|
71
|
+
# ...haproxy defaults file
|
72
|
+
FileUtils.cp(
|
73
|
+
"#{MKIt::Utils.root}/lib/mkit/app/templates/haproxy/0000_defaults.cfg",
|
74
|
+
MKIt::Config.mkit.haproxy.config_dir
|
75
|
+
) unless File.exists?("#{MKIt::Config.mkit.haproxy.config_dir}/0000_defaults.cfg")
|
76
|
+
#
|
77
|
+
# conn = { adapter: "sqlite3", database: ":memory:" }
|
78
|
+
# ActiveRecord::Base.establish_connection(conn)
|
79
|
+
# include ActiveRecord::Tasks
|
80
|
+
# DatabaseTasks.database_configuration = YAML.load_file('my_database_config.yml')
|
81
|
+
# DatabaseTasks.db_dir = 'db'
|
82
|
+
#
|
83
|
+
DatabaseTasks.database_configuration = MKIt::Utils.load_db_config
|
84
|
+
DatabaseTasks.env=MKIt::Config.mkit.database.env
|
85
|
+
DatabaseTasks.migrations_paths=[ "#{@root}/db/migrate" ]
|
86
|
+
DatabaseTasks.db_dir="db"
|
87
|
+
DatabaseTasks.root=@root
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.establish_db_connection
|
91
|
+
#
|
92
|
+
ActiveRecord::Base.establish_connection(DatabaseTasks.database_configuration[DatabaseTasks.env])
|
93
|
+
ActiveRecord::Base.connection.migration_context.migrations_paths.clear
|
94
|
+
ActiveRecord::Base.connection.migration_context.migrations_paths << "#{@root}/db/migrate"
|
95
|
+
#
|
96
|
+
MKItLogger.debug "database_tasks migration paths #{DatabaseTasks.migrations_paths}"
|
97
|
+
MKItLogger.debug "active_record_base migration_paths #{ActiveRecord::Base.connection.migration_context.migrations_paths.inspect}"
|
98
|
+
MKItLogger.debug "active_record_base configurations #{ActiveRecord::Base.configurations.inspect}"
|
99
|
+
MKItLogger.debug "active_record_base conn_db_config #{ActiveRecord::Base.connection_db_config.inspect}"
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.migrate
|
103
|
+
ActiveRecord::Base.connection.migration_context.migrate if ActiveRecord::Base.connection.migration_context.needs_migration?
|
104
|
+
end
|
105
|
+
|
106
|
+
def self.restore_operation
|
107
|
+
MKItLogger.info "restoring operations..."
|
108
|
+
# create interfaces of deployed apps otherwise haproxy won't start
|
109
|
+
Service.all.each { | srv |
|
110
|
+
srv.deploy_network
|
111
|
+
srv.update_status!
|
112
|
+
}
|
113
|
+
end
|
114
|
+
|
115
|
+
def self.startup(options: {})
|
116
|
+
self.configure(options: options)
|
117
|
+
self.establish_db_connection
|
118
|
+
self.migrate
|
119
|
+
|
120
|
+
MKIt::Initializers.load_default_configs
|
121
|
+
MKIt::Interface.up
|
122
|
+
|
123
|
+
System.register(:job_manager, memoize: true) {
|
124
|
+
MKIt::JobManager.new
|
125
|
+
}
|
126
|
+
System.register(:mkit_dns, memoize: true) {
|
127
|
+
Thread.new {
|
128
|
+
dns = MKIt::DNS.new
|
129
|
+
dns.run
|
130
|
+
}
|
131
|
+
}
|
132
|
+
System.register(:docker_listener, memoize: true) {
|
133
|
+
MKIt::DockerListener.new
|
134
|
+
}
|
135
|
+
# watchdog feature is to be re-evaluated
|
136
|
+
# System.register(:watchdog, memoize: true) {
|
137
|
+
# MKIt::WatchdogManager.new
|
138
|
+
# }
|
139
|
+
|
140
|
+
# register workers
|
141
|
+
WorkerManager.register_workers
|
142
|
+
SagaManager.register_workers
|
143
|
+
#
|
144
|
+
System[:job_manager].start
|
145
|
+
System[:docker_listener].start
|
146
|
+
# watchdog feature is to be re-evaluated
|
147
|
+
# System[:watchdog].start
|
148
|
+
System[:mkit_dns].run
|
149
|
+
#
|
150
|
+
self.restore_operation
|
151
|
+
#
|
152
|
+
MKItLogger.debug "restarting proxy..."
|
153
|
+
MKIt::HAProxy.restart
|
154
|
+
MKItLogger.info "MKIt is up and running!"
|
155
|
+
end
|
156
|
+
|
157
|
+
end
|
158
|
+
|
data/mkit.gemspec
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
lib = File.expand_path("../lib", __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require "mkit/version"
|
6
|
+
|
7
|
+
Gem::Specification.new do |s|
|
8
|
+
s.name = 'mkit'
|
9
|
+
s.summary = 'micro kubernets'
|
10
|
+
s.bindir = 'bin'
|
11
|
+
s.homepage = 'http://vars.pt'
|
12
|
+
s.license = 'Apache-2.0'
|
13
|
+
s.rubyforge_project = ''
|
14
|
+
s.description = 'micro kubernets impl'
|
15
|
+
# s.require_paths = ["."]
|
16
|
+
s.author = 'Vasco Santos'
|
17
|
+
s.email = ['valexsantos@gmail.com']
|
18
|
+
s.version = MKIt::VERSION
|
19
|
+
s.platform = Gem::Platform::RUBY
|
20
|
+
s.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
21
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|TODO|db/development.sqlite)}) }
|
22
|
+
end
|
23
|
+
s.executables << 'mkitd'
|
24
|
+
s.executables << 'mkitc'
|
25
|
+
s.add_runtime_dependency 'net-ping', '~> 2.0', '>= 2.0.8'
|
26
|
+
s.add_runtime_dependency 'dry-container', '~> 0.9', '>= 0.9.0'
|
27
|
+
s.add_runtime_dependency 'sqlite3', '~> 1.5', '>= 1.5.4'
|
28
|
+
s.add_runtime_dependency 'standalone_migrations', '~> 7.1', '>= 7.1.0'
|
29
|
+
s.add_runtime_dependency 'sinatra-activerecord', '~> 2.0', '>= 2.0.26'
|
30
|
+
s.add_runtime_dependency 'rack', '~> 2.2', '>= 2.2.5'
|
31
|
+
s.add_runtime_dependency 'rack-protection', '~> 3.0', '>= 3.0.5'
|
32
|
+
s.add_runtime_dependency 'rack-test', '~> 2.0', '>= 2.0.2'
|
33
|
+
s.add_runtime_dependency 'pry', '~> 0.14', '>= 0.14.2'
|
34
|
+
s.add_runtime_dependency 'rubydns', '~> 2.0', '>= 2.0.2'
|
35
|
+
s.add_runtime_dependency 'async-dns', '~> 1.3', '>= 1.3.0'
|
36
|
+
s.add_runtime_dependency 'sinatra', '~> 3.0', '>= 3.0.5'
|
37
|
+
s.add_runtime_dependency 'thin', '~> 1.8', '>= 1.8.1'
|
38
|
+
s.add_runtime_dependency 'net_http_unix', '~> 0.2', '>= 0.2.2'
|
39
|
+
end
|
40
|
+
|
data/mkitd
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
#
|
2
|
+
service:
|
3
|
+
name: postgres
|
4
|
+
network: bridge
|
5
|
+
image: "postgres:14"
|
6
|
+
ports:
|
7
|
+
- 5432:5432:tcp:round_robin
|
8
|
+
environment:
|
9
|
+
POSTGRES_USER: postgres
|
10
|
+
POSTGRES_PASSWORD: postgres
|
11
|
+
POSTGRES_DB: postgres
|
12
|
+
volumes:
|
13
|
+
- docker://postgresql_14_data:/var/lib/postgresql/data
|
14
|
+
restart: always
|
15
|
+
resources:
|
16
|
+
max_replicas: 1
|
17
|
+
min_replicas: 1
|
18
|
+
limits:
|
19
|
+
cpu: 1000m
|
20
|
+
ram: 1Gi
|
21
|
+
|
22
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#
|
2
|
+
service:
|
3
|
+
name: rabbitmq
|
4
|
+
image: rabbitmq:3-management-alpine
|
5
|
+
network: bridge # docker network
|
6
|
+
ports:
|
7
|
+
- 5672:5672:tcp:round_robin
|
8
|
+
- 80:15672:http:round_robin
|
9
|
+
resources:
|
10
|
+
max_replicas: 1
|
11
|
+
min_replicas: 1
|
12
|
+
volumes:
|
13
|
+
- docker://mkit_rabbitmq_data:/var/lib/rabbitmq
|
14
|
+
- docker://mkit_rabbitmq_logs:/var/log/rabbitmq
|
15
|
+
environment:
|
16
|
+
RABBITMQ_DEFAULT_USER: admin
|
17
|
+
RABBITMQ_DEFAULT_PASS: admin
|
18
|
+
RABBITMQ_DEFAULT_VHOST: mkit
|
19
|
+
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
# generic daemontools log run script
|
4
|
+
|
5
|
+
# Copyright 2017-2018 Vasco Santos <valexsantos[at]gmail[dot]com>
|
6
|
+
# All rights reserved.
|
7
|
+
#
|
8
|
+
# Redistribution and use of this script, with or without modification, is
|
9
|
+
# permitted provided that the following conditions are met:
|
10
|
+
#
|
11
|
+
# 1. Redistributions of this script must retain the above copyright
|
12
|
+
# notice, this list of conditions and the following disclaimer.
|
13
|
+
#
|
14
|
+
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED
|
15
|
+
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
16
|
+
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
17
|
+
# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
18
|
+
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
19
|
+
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
20
|
+
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
21
|
+
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
22
|
+
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
23
|
+
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
24
|
+
|
25
|
+
#
|
26
|
+
# cfgs
|
27
|
+
#
|
28
|
+
LOGUSER=nobody
|
29
|
+
APP=mkitd
|
30
|
+
LOGDIR=/var/log/$APP
|
31
|
+
LOG_FILE_HISTORY=20
|
32
|
+
LOG_FILE_SIZE=100000
|
33
|
+
##
|
34
|
+
# doit
|
35
|
+
##
|
36
|
+
PATH=/opt/daemontools/bin:/usr/local/bin:/usr/bin:/bin
|
37
|
+
export PATH
|
38
|
+
# create log dir
|
39
|
+
[ -d $LOGDIR ] || mkdir $LOGDIR
|
40
|
+
# set owner
|
41
|
+
chown -R $LOGUSER $LOGDIR
|
42
|
+
# go
|
43
|
+
exec 2>&1
|
44
|
+
exec setuidgid $LOGUSER multilog t s$LOG_FILE_SIZE n$LOG_FILE_HISTORY $LOGDIR
|
@@ -0,0 +1,42 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
# mkitd daemontools run script
|
4
|
+
|
5
|
+
# Copyright 2017-2018 Vasco Santos <valexsantos[at]gmail[dot]com>
|
6
|
+
# All rights reserved.
|
7
|
+
#
|
8
|
+
# Redistribution and use of this script, with or without modification, is
|
9
|
+
# permitted provided that the following conditions are met:
|
10
|
+
#
|
11
|
+
# 1. Redistributions of this script must retain the above copyright
|
12
|
+
# notice, this list of conditions and the following disclaimer.
|
13
|
+
#
|
14
|
+
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED
|
15
|
+
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
16
|
+
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
17
|
+
# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
18
|
+
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
19
|
+
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
20
|
+
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
21
|
+
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
22
|
+
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
23
|
+
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
24
|
+
|
25
|
+
exec 2>&1
|
26
|
+
|
27
|
+
source /etc/mkit/mkitd_config.sh
|
28
|
+
|
29
|
+
CMD="mkitd $OPTIONS"
|
30
|
+
echo "command-line $CMD"
|
31
|
+
|
32
|
+
##
|
33
|
+
# Doit
|
34
|
+
##
|
35
|
+
|
36
|
+
exec $CMD
|
37
|
+
|
38
|
+
##
|
39
|
+
# err
|
40
|
+
echo ERROR: command did not run correctly
|
41
|
+
sleep 5
|
42
|
+
exit 1
|