mkit 0.6.1 → 0.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +18 -11
- data/bin/{mkitc → mkit} +4 -4
- data/lib/mkit/app/model/pod.rb +15 -21
- data/lib/mkit/docker_listener.rb +51 -16
- data/lib/mkit/version.rb +1 -1
- data/mkit +10 -0
- data/mkit.gemspec +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5ce73321371e8f675a5c28106e9287762ed5cf8b39ecfc8c97b35f62806a45c1
|
4
|
+
data.tar.gz: 21189b10e952913a03d50498201869010fef447f4b621a5f3e2f39a1ab12c94c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e38e72898702d11bf928534444a63fe1744b3af47494c4da7789ece5c01cb611b824e716cc7cc39454c738d730da5533393aefea8801da236ecce97d9b291f3e
|
7
|
+
data.tar.gz: 2e2d930ef466b48fbb75b07dbf12586cb41e0324a043eed2f334b9d4a638ba9369f6d65f85ca6c24d4573d8076dacfb26d43bc166de465212df8dbda3ee4edae
|
data/README.md
CHANGED
@@ -7,7 +7,7 @@ It's also a frontend for `docker`, providing an easier way for your services to
|
|
7
7
|
It contains an internal DNS and uses HAProxy as ingress for Pod access.
|
8
8
|
The database is a simple sqlite3 db and the server is a Sinatra based application.
|
9
9
|
|
10
|
-
A client is also included to access the API, e.g. `
|
10
|
+
A client is also included to access the API, e.g. `mkit ps`.
|
11
11
|
|
12
12
|
The daemon is responsible for HAProxy pods routing configuration. It also provides the cluster DNS and manages the internal host interface and the docker instances.
|
13
13
|
|
@@ -102,22 +102,22 @@ mkit:
|
|
102
102
|
|
103
103
|
### Client configuration
|
104
104
|
|
105
|
-
On `
|
105
|
+
On `mkit` first call, default configuration will be copied to `$HOME/.mkit` with `local`default profile set.
|
106
106
|
|
107
|
-
You must call `
|
107
|
+
You must call `mkit init` to initialize client configuration.
|
108
108
|
|
109
109
|
Client identification key (`my_id`) will be generated, printed out to console and saved to the client's configuration file.
|
110
110
|
|
111
|
-
You may edit the local configuration file to add more servers and change active profile with `$
|
111
|
+
You may edit the local configuration file to add more servers and change active profile with `$mkit profile set <profile_name>`, e.g. `$mkit profile set server_2`
|
112
112
|
|
113
113
|
```
|
114
114
|
# ~/.mkit/mkitc_config.yml
|
115
115
|
mkit:
|
116
116
|
local:
|
117
117
|
server.uri: https://localhost:4567
|
118
|
-
server_2: # you can add more servers. change the client active profile with
|
118
|
+
server_2: # you can add more servers. change the client active profile with mkit profile command
|
119
119
|
server.uri: https://192.168.29.232:4567
|
120
|
-
my_id: unique_id # this id is generated running
|
120
|
+
my_id: unique_id # this id is generated running mkit init
|
121
121
|
```
|
122
122
|
|
123
123
|
### Service
|
@@ -174,10 +174,10 @@ There's also samples for [systemd](samples/systemd) and [daemontools](samples/da
|
|
174
174
|
|
175
175
|
A client is provided to interact with MKIt server.
|
176
176
|
|
177
|
-
Run `
|
177
|
+
Run `mkit help` for a list of current supported commands.
|
178
178
|
|
179
179
|
```
|
180
|
-
Usage:
|
180
|
+
Usage: mkit <command> [options]
|
181
181
|
|
182
182
|
Micro k8s on Ruby - a simple tool to mimic a (very) minimalistic k8 cluster
|
183
183
|
|
@@ -197,13 +197,13 @@ version prints mkit server version
|
|
197
197
|
proxy haproxy status and control
|
198
198
|
profile mkit client configuration profile
|
199
199
|
|
200
|
-
Run '
|
200
|
+
Run 'mkit help <command>' for specific command information.
|
201
201
|
```
|
202
202
|
|
203
203
|
Example:
|
204
204
|
|
205
205
|
```
|
206
|
-
$
|
206
|
+
$ mkit ps
|
207
207
|
+----+-------+---------------+-------------------+--------------+---------+
|
208
208
|
| id | name | addr | ports | pods | status |
|
209
209
|
+----+-------+---------------+-------------------+--------------+---------+
|
@@ -214,7 +214,7 @@ $ mkitc ps
|
|
214
214
|
The service `mongo` is available on IP `10.210.198.10:27017`
|
215
215
|
The service `nexus` is available on IP `10.210.198.11:80` and on port `443` with ssl.
|
216
216
|
|
217
|
-
**Note:** Don't forget to call `
|
217
|
+
**Note:** Don't forget to call `mkit init` to initialize client configuration and to add the `client-id`
|
218
218
|
to the server authorized clients list.
|
219
219
|
|
220
220
|
## Development
|
@@ -224,6 +224,13 @@ to the server authorized clients list.
|
|
224
224
|
* console
|
225
225
|
* `rake console`
|
226
226
|
|
227
|
+
# Contributing
|
228
|
+
* Fork it
|
229
|
+
* Create your feature branch (git checkout -b my-new-feature)
|
230
|
+
* Commit your changes (git commit -am 'Add some feature')
|
231
|
+
* Push to the branch (git push origin my-new-feature)
|
232
|
+
* Create new Pull Request
|
233
|
+
|
227
234
|
# Thanks
|
228
235
|
|
229
236
|
For my kids. :)
|
data/bin/{mkitc → mkit}
RENAMED
@@ -203,7 +203,7 @@ class MKItClient
|
|
203
203
|
|
204
204
|
@configuration = cfg['mkit'][current_profile.lstrip]
|
205
205
|
if !init_call && cfg['my_id'].nil?
|
206
|
-
raise InvalidParametersException.new("Please run '
|
206
|
+
raise InvalidParametersException.new("Please run ' mkit init' to initialize mkit client.", find_command('init'))
|
207
207
|
end
|
208
208
|
@my_id = cfg['my_id']
|
209
209
|
cfg
|
@@ -360,16 +360,16 @@ class MKItClient
|
|
360
360
|
my_cmd = cause.command
|
361
361
|
end
|
362
362
|
if my_cmd.nil?
|
363
|
-
msg += "\nUsage:
|
363
|
+
msg += "\nUsage: mkit <command> [options]\n\n"
|
364
364
|
msg += "Micro k8s on Ruby - a simple tool to mimic a (very) minimalistic k8 cluster\n\n"
|
365
365
|
msg += "Commands:\n\n"
|
366
366
|
dict.each do |c|
|
367
367
|
msg += format("%-10s %s\n", c[:cmd], c[:help])
|
368
368
|
end
|
369
369
|
msg += "\n"
|
370
|
-
msg += "Run '
|
370
|
+
msg += "Run ' mkit help <command>' for specific command information.\n\n"
|
371
371
|
else
|
372
|
-
msg += format("\nUsage:
|
372
|
+
msg += format("\nUsage: mkit %s %s\n\n", my_cmd[:cmd], my_cmd[:usage].nil? ? '' : my_cmd[:usage].join(' '))
|
373
373
|
msg += format("%s\n", my_cmd[:help])
|
374
374
|
unless my_cmd[:options].nil?
|
375
375
|
msg += "\nOptions:\n"
|
data/lib/mkit/app/model/pod.rb
CHANGED
@@ -16,10 +16,9 @@ class Pod < ActiveRecord::Base
|
|
16
16
|
new_ip = nil
|
17
17
|
tries = 5
|
18
18
|
while (new_ip.nil? && tries > 0) do
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
tries = tries - 1
|
19
|
+
new_ip = self.instance.NetworkSettings.Networks[self.service.pods_network].IPAddress
|
20
|
+
sleep(1) if new_ip.nil?
|
21
|
+
tries = tries - 1
|
23
22
|
end
|
24
23
|
if self.ip != new_ip
|
25
24
|
self.ip = new_ip
|
@@ -40,14 +39,8 @@ class Pod < ActiveRecord::Base
|
|
40
39
|
self.dns_host.save
|
41
40
|
end
|
42
41
|
|
43
|
-
def properties
|
44
|
-
inspect_instance(self.name)
|
45
|
-
end
|
46
|
-
|
47
42
|
def set_status_from_docker
|
48
|
-
|
49
|
-
if self.properties
|
50
|
-
instance = instance.to_o
|
43
|
+
if self.instance
|
51
44
|
if instance.State.Running
|
52
45
|
self.status = MKIt::Status::RUNNING
|
53
46
|
else
|
@@ -65,30 +58,31 @@ class Pod < ActiveRecord::Base
|
|
65
58
|
end
|
66
59
|
|
67
60
|
def start
|
68
|
-
if self.
|
61
|
+
if self.instance.nil?
|
69
62
|
docker_run = parse
|
70
63
|
MKItLogger.info("deploying docker pod, cmd [#{docker_run}]")
|
71
64
|
create_instance(docker_run)
|
72
65
|
else
|
73
|
-
pre_check
|
74
|
-
|
75
|
-
instance = self.properties.to_o
|
76
66
|
start_instance(self.name) unless instance.State.Running
|
77
67
|
end
|
78
68
|
end
|
79
69
|
|
80
70
|
def stop
|
81
|
-
|
82
|
-
stop_instance(self.name)
|
71
|
+
stop_instance(self.name) unless self.instance.nil? || !self.instance.State.Running
|
83
72
|
end
|
84
73
|
|
85
|
-
def
|
86
|
-
|
87
|
-
|
74
|
+
def instance
|
75
|
+
properties = inspect_instance(self.name)
|
76
|
+
return properties.to_o unless properties.nil?
|
77
|
+
nil
|
88
78
|
end
|
89
79
|
|
90
80
|
def clean_up
|
91
|
-
|
81
|
+
begin
|
82
|
+
remove_instance(self.name) unless self.instance.nil?
|
83
|
+
rescue => e
|
84
|
+
MKItLogger.warn(e)
|
85
|
+
end
|
92
86
|
MkitJob.publish(topic: :pod_destroyed, service_id: self.service.id, data: {pod_id: self.id})
|
93
87
|
end
|
94
88
|
end
|
data/lib/mkit/docker_listener.rb
CHANGED
@@ -5,16 +5,32 @@ require 'mkit/status'
|
|
5
5
|
# https://docs.docker.com/engine/reference/commandline/events
|
6
6
|
require 'mkit/app/helpers/docker_helper'
|
7
7
|
module MKIt
|
8
|
+
class StopThread < RuntimeError; end
|
9
|
+
|
8
10
|
class DockerListener
|
9
11
|
include MKIt::DockerHelper
|
10
12
|
|
11
13
|
def initialize
|
12
|
-
@
|
14
|
+
@queue = Queue.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def enqueue(msg)
|
18
|
+
@queue << msg
|
19
|
+
end
|
20
|
+
|
21
|
+
def start
|
22
|
+
@consumer.run if register_consumer
|
23
|
+
@listener.run if register_listener
|
13
24
|
end
|
14
25
|
|
15
|
-
def
|
26
|
+
def stop
|
27
|
+
@listener.exit if @listener
|
28
|
+
@consumer.raise StopThread.new
|
29
|
+
MKItLogger.info("docker listener stopped")
|
16
30
|
end
|
17
31
|
|
32
|
+
private
|
33
|
+
|
18
34
|
def parse_message(msg)
|
19
35
|
action = msg['Action'].to_sym
|
20
36
|
type = msg['Type'].to_sym
|
@@ -36,24 +52,26 @@ module MKIt
|
|
36
52
|
pod.save
|
37
53
|
pod.service.update_status!
|
38
54
|
when :kill
|
39
|
-
|
55
|
+
pod.service.update_status!
|
40
56
|
when :die
|
41
|
-
|
57
|
+
pod.service.update_status!
|
42
58
|
when :stop
|
43
59
|
pod.service.update_status!
|
44
60
|
else
|
45
61
|
MKItLogger.debug(" #{type} #{action} <<TODO>>")
|
46
62
|
end
|
47
63
|
else
|
48
|
-
MKItLogger.warn("docker <<#{type}>> <#{action}> received: #{msg}. But I don't know anything about pod #{pod_id}")
|
64
|
+
MKItLogger.warn("docker <<#{type}>> <#{action}> received: #{msg}. But I don't know anything about pod #{pod_id}/#{pod_name}")
|
49
65
|
end
|
50
66
|
when :network
|
51
67
|
pod_id = msg.Actor.Attributes.container
|
52
|
-
|
68
|
+
inspect = inspect_instance(pod_id).to_o
|
69
|
+
pod_name = inspect.Name[1..]
|
70
|
+
pod = Pod.find_by(name: pod_name)
|
53
71
|
unless pod.nil?
|
54
72
|
case action
|
55
73
|
when :connect
|
56
|
-
MKItLogger.info("docker network #{action} received: #{msg}")
|
74
|
+
MKItLogger.info("docker network #{action} received: #{msg} for pod #{pod_name}")
|
57
75
|
pod.update_ip
|
58
76
|
pod.save
|
59
77
|
when :disconnect
|
@@ -62,20 +80,41 @@ module MKIt
|
|
62
80
|
MKItLogger.debug(" #{type} #{action} <<TODO>>")
|
63
81
|
end
|
64
82
|
else
|
65
|
-
MKItLogger.warn("docker <<#{type}>> <#{action}> received: #{msg}. But I don't know anything about pod #{pod_id}")
|
83
|
+
MKItLogger.warn("docker <<#{type}>> <#{action}> received: #{msg}. But I don't know anything about pod #{pod_id}/#{pod_name}")
|
66
84
|
end
|
67
85
|
else
|
68
86
|
MKItLogger.info("\t#{type} #{action} <<unknown>>")
|
69
87
|
end
|
70
88
|
end
|
71
89
|
|
72
|
-
def
|
73
|
-
|
90
|
+
def register_consumer
|
91
|
+
return false unless @consumer.nil?
|
92
|
+
|
93
|
+
@consumer = Thread.new do
|
94
|
+
running = true
|
95
|
+
while running
|
96
|
+
begin
|
97
|
+
parse_message(@queue.pop)
|
98
|
+
rescue StopThread
|
99
|
+
running = false
|
100
|
+
MKItLogger.info("docker consumer ended")
|
101
|
+
rescue => e
|
102
|
+
MKItLogger.error("error while consuming docker notification: #{e}", e.message, e.backtrace.join("\n"))
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
true
|
107
|
+
end
|
108
|
+
|
109
|
+
def register_listener
|
110
|
+
return false unless @listener.nil?
|
111
|
+
|
112
|
+
@listener = Thread.new {
|
74
113
|
cmd = "docker events --format '{{json .}}'"
|
75
114
|
begin
|
76
115
|
PTY.spawn( cmd ) do |stdout, stdin, pid|
|
77
116
|
begin
|
78
|
-
stdout.each { |line|
|
117
|
+
stdout.each { |line| enqueue JSON.parse(line).to_o }
|
79
118
|
rescue Errno::EIO
|
80
119
|
MKItLogger.warn("Errno:EIO error, but this probably just means " +
|
81
120
|
"that the process has finished giving output")
|
@@ -85,12 +124,8 @@ module MKIt
|
|
85
124
|
MKItLogger.warn("docker event listener process exited!")
|
86
125
|
end
|
87
126
|
}
|
88
|
-
@thread.run
|
89
127
|
MKItLogger.info("docker listener started")
|
90
|
-
|
91
|
-
def stop
|
92
|
-
@thread.exit if @thread
|
93
|
-
MKItLogger.info("docker listener stopped")
|
128
|
+
true
|
94
129
|
end
|
95
130
|
end
|
96
131
|
end
|
data/lib/mkit/version.rb
CHANGED
data/mkit
ADDED
data/mkit.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
|
|
20
20
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|TODO|db/development.sqlite)}) }
|
21
21
|
end
|
22
22
|
s.executables << 'mkitd'
|
23
|
-
s.executables << '
|
23
|
+
s.executables << 'mkit'
|
24
24
|
s.add_runtime_dependency 'async-dns', '~> 1.3', '>= 1.3.0'
|
25
25
|
s.add_runtime_dependency 'dry-container', '~> 0.9', '>= 0.9.0'
|
26
26
|
s.add_runtime_dependency 'net_http_unix', '~> 0.2', '>= 0.2.2'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mkit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vasco Santos
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-04-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: async-dns
|
@@ -316,7 +316,7 @@ email:
|
|
316
316
|
- valexsantos@gmail.com
|
317
317
|
executables:
|
318
318
|
- mkitd
|
319
|
-
-
|
319
|
+
- mkit
|
320
320
|
extensions: []
|
321
321
|
extra_rdoc_files: []
|
322
322
|
files:
|
@@ -327,7 +327,7 @@ files:
|
|
327
327
|
- LICENSE
|
328
328
|
- README.md
|
329
329
|
- Rakefile
|
330
|
-
- bin/
|
330
|
+
- bin/mkit
|
331
331
|
- bin/mkitd
|
332
332
|
- config/database.yml
|
333
333
|
- config/mkit_config.yml
|
@@ -386,6 +386,7 @@ files:
|
|
386
386
|
- lib/mkit/workers/pod_worker.rb
|
387
387
|
- lib/mkit/workers/service_worker.rb
|
388
388
|
- lib/mkit/workers/worker_manager.rb
|
389
|
+
- mkit
|
389
390
|
- mkit.gemspec
|
390
391
|
- mkitd
|
391
392
|
- samples/apps/kafka-cluster.yml
|