mkit 0.9.1 → 0.10.0

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.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +50 -15
  3. data/db/migrate/004_create_ingress.rb +12 -0
  4. data/db/migrate/005_create_frontend.rb +20 -0
  5. data/db/migrate/006_create_backend.rb +18 -0
  6. data/db/migrate/007_migrate_schema.rb +59 -0
  7. data/lib/mkit/app/controllers/services_controller.rb +12 -0
  8. data/lib/mkit/app/helpers/migrations_helper.rb +62 -0
  9. data/lib/mkit/app/helpers/services_helper.rb +4 -15
  10. data/lib/mkit/app/model/backend.rb +58 -0
  11. data/lib/mkit/app/model/frontend.rb +63 -0
  12. data/lib/mkit/app/model/ingress.rb +98 -0
  13. data/lib/mkit/app/model/pod.rb +7 -13
  14. data/lib/mkit/app/model/service.rb +21 -23
  15. data/lib/mkit/app/model/service_port.rb +0 -1
  16. data/lib/mkit/app/templates/haproxy/0000_defaults.cfg +2 -2
  17. data/lib/mkit/app/templates/haproxy/app_haproxy.cfg.erb +28 -0
  18. data/lib/mkit/client/commands.yaml +13 -0
  19. data/lib/mkit/config/environment.rb +1 -0
  20. data/lib/mkit/config/initializers/001_hash.rb +14 -0
  21. data/lib/mkit/config/initializers/003_custom_exceptions.rb +10 -0
  22. data/lib/mkit/ctypes.rb +1 -1
  23. data/lib/mkit/exceptions.rb +13 -1
  24. data/lib/mkit/pods/docker_listener.rb +19 -14
  25. data/lib/mkit/sagas/create_pod_saga.rb +9 -7
  26. data/lib/mkit/sagas/destroy_pod_saga.rb +32 -0
  27. data/lib/mkit/sagas/saga_manager.rb +2 -0
  28. data/lib/mkit/version.rb +1 -1
  29. data/lib/mkit/workers/pod_worker.rb +3 -1
  30. data/lib/mkit/workers/service_worker.rb +2 -0
  31. data/samples/apps/httpbin.yml +46 -0
  32. data/samples/apps/kafka-cluster.yml +18 -8
  33. data/samples/apps/kafka-magic.yml +27 -10
  34. data/samples/apps/kafka-zookeeper.yml +18 -7
  35. data/samples/apps/minio.yml +33 -7
  36. data/samples/apps/mongo.yml +15 -4
  37. data/samples/apps/nexus.yml +41 -6
  38. data/samples/apps/postgres.yml +17 -7
  39. data/samples/apps/rabbitmq.yml +35 -8
  40. data/samples/apps/redis-sentinel.yml +15 -5
  41. data/samples/apps/redis.yml +15 -5
  42. metadata +14 -2
@@ -1,4 +1,5 @@
1
1
  require 'mkit/app/model/volume'
2
+ require 'mkit/app/model/ingress'
2
3
  require 'mkit/app/model/service_port'
3
4
  require 'mkit/app/model/service_config'
4
5
  require 'mkit/app/model/pod'
@@ -21,6 +22,7 @@ class Service < ActiveRecord::Base
21
22
 
22
23
  has_one :lease, dependent: :destroy
23
24
  has_one :dns_host, dependent: :destroy
25
+ has_one :ingress, dependent: :destroy
24
26
 
25
27
  before_destroy :clean_up
26
28
 
@@ -63,7 +65,9 @@ class Service < ActiveRecord::Base
63
65
  data = { service_id: srv.id, version: srv.version }
64
66
  # create pod
65
67
  (1..srv.min_replicas).each { |i|
66
- MkitJob.publish(topic: :create_pod_saga, service_id: srv.id, data: data)
68
+ pd = Pod.new( status: MKIt::Status::CREATED, name: SecureRandom.uuid.gsub('-','')[0..11])
69
+ srv.pod << pd
70
+ MkitJob.publish(topic: :create_pod_saga, data: {pod_name: pd.name})
67
71
  }
68
72
  srv
69
73
  end
@@ -90,12 +94,8 @@ class Service < ActiveRecord::Base
90
94
  end
91
95
  self.create_pods_network
92
96
 
93
- # haproxy ports
94
- self.service_port = []
95
- config.ports&.each do |p|
96
- port = ServicePort.create(service: self, config: p)
97
- self.service_port << port
98
- end
97
+ # haproxy config
98
+ self.ingress = Ingress.create(config.ingress)
99
99
 
100
100
  # volumes
101
101
  self.volume = []
@@ -119,12 +119,14 @@ class Service < ActiveRecord::Base
119
119
  self.version+=1
120
120
  self.configure(config)
121
121
 
122
- # start new pod, destroy old pod...
123
- self.pod.each { |pod| MkitJob.publish(topic: :destroy_pod, pod_id: pod.id, data: {}) }
122
+ # destroy old pods...
123
+ self.pod.destroy_all
124
124
  # create pod
125
125
  data = { service_id: self.id, version: self.version }
126
126
  (1..self.min_replicas).each { |i|
127
- MkitJob.publish(topic: :create_pod_saga, service_id: self.id, data: data)
127
+ pd = Pod.new( status: MKIt::Status::CREATED, name: SecureRandom.uuid.gsub('-','')[0..11])
128
+ self.pod << pd
129
+ MkitJob.publish(topic: :create_pod_saga, data: {pod_name: pd.name})
128
130
  }
129
131
  self.save
130
132
  end
@@ -164,6 +166,9 @@ class Service < ActiveRecord::Base
164
166
  MKIt::Interface.ip
165
167
  end
166
168
 
169
+ # TODO
170
+ # refactor to remove it from db model and check if it is needed
171
+ # this will be the pod status
167
172
  def update_status!
168
173
  combined_status = nil
169
174
  self.pod.each { |pod|
@@ -252,6 +257,7 @@ class Service < ActiveRecord::Base
252
257
  end
253
258
  def to_h(options = {})
254
259
  details = options[:details] || false
260
+
255
261
  yaml = {}
256
262
  yaml['service'] = {}
257
263
  srv = yaml['service']
@@ -269,18 +275,10 @@ class Service < ActiveRecord::Base
269
275
  srv['pods'] << p.to_h
270
276
  }
271
277
  end
272
- srv['ports'] = []
273
- self.service_port.each { |p|
274
- "#{p.external_port}:#{p.internal_port}:#{p.mode}:#{p.load_bal}".tap { |x|
275
- if p.ssl == 'true'
276
- x << ':ssl'
277
- if !p.crt.nil? && p.crt != MKIt::Utils.proxy_cert
278
- x << ":#{p.crt}"
279
- end
280
- end
281
- srv['ports'] << x
282
- }
283
- }
278
+
279
+ # ingress
280
+ srv['ingress'] = self.ingress.to_h(options)
281
+
284
282
  srv['resources'] = {}
285
283
  srv['resources']['min_replicas'] = self.min_replicas
286
284
  srv['resources']['max_replicas'] = self.max_replicas
@@ -301,7 +299,7 @@ class Service < ActiveRecord::Base
301
299
 
302
300
  def as_json(options = {})
303
301
  srv = super
304
- a=[:pod, :volume, :service_config, :service_port]
302
+ a=[:pod, :volume, :service_config, :ingress]
305
303
  a.each { | k |
306
304
  srv[k] ||= []
307
305
  self.send(k).each { |v|
@@ -34,7 +34,6 @@ class ServicePort < ActiveRecord::Base
34
34
  ports = config.match(CONFIG_EXPRESSION)
35
35
  raise MKIt::InvalidPortsConfiguration.new("no match with config expression $#{CONFIG_EXPRESSION}") if ports.nil?
36
36
 
37
- puts ports
38
37
  self.external_port = ports[1]
39
38
  self.internal_port = ports[2]
40
39
  self.mode = ports[3]
@@ -1,8 +1,8 @@
1
1
  global
2
2
  log 127.0.0.1 local2
3
3
  maxconn 4096
4
- user nobody
5
- group nobody
4
+ user haproxy
5
+ group haproxy
6
6
 
7
7
  defaults
8
8
  log global
@@ -0,0 +1,28 @@
1
+ #
2
+ # MKIt generated file
3
+ # Service <%=name%>
4
+ #
5
+
6
+ #
7
+ # frontends
8
+ #
9
+ <% ingress.frontends.each { |fe|%>
10
+ frontend <%=name%>-<%=fe.name%>-front
11
+ bind <%=lease.ip%>:<%=fe.port%> <%=if fe.ssl? then "ssl crt #{fe.crt}" end%> <%=fe.bind_options.join(' ')%>
12
+ mode <%=fe.mode%>
13
+ <%=fe.options.join("\n ")%>
14
+
15
+ use_backend <%=name%>-<%=fe.default_backend%>-back
16
+ <%}%>
17
+ #
18
+ # backends
19
+ #
20
+ <% ingress.backends.each { |be|%>
21
+ backend <%=name%>-<%=be.name%>-back
22
+ mode <%=be.mode%>
23
+ balance <%=be.load_balance%>
24
+ <%=be.options.join("\n ")%>
25
+ <%pod.each { | pod | %>
26
+ server <%=pod.name%> <%=pod.ip%><%unless be.port.nil? || be.port.empty? then%><%=":#{be.port}"%> <%=be.bind_options.join(' ')%> <%end%>
27
+ <%}%>
28
+ <%}%>
@@ -159,6 +159,19 @@
159
159
  request:
160
160
  verb: delete
161
161
  uri: "/services/<%=id%>"
162
+ - cmd: migrate
163
+ usage:
164
+ - "<service.yaml>"
165
+ help: migrate local service definition to the new schema version
166
+ args:
167
+ - name: file
168
+ help:
169
+ - file
170
+ - Service definition
171
+ mandatory: true
172
+ request:
173
+ verb: post
174
+ uri: "/services/migrate"
162
175
  - cmd: exec
163
176
  usage:
164
177
  - "<service_id_or_name> [options] -- <command> [args...]"
@@ -6,6 +6,7 @@ require 'sinatra'
6
6
 
7
7
  require_relative 'initializers/001_hash'
8
8
  require_relative 'initializers/002_openstruct'
9
+ require_relative 'initializers/003_custom_exceptions'
9
10
 
10
11
  SOCKET_PATH = File.expand_path('/tmp/app.sock')
11
12
 
@@ -8,4 +8,18 @@ class Hash
8
8
  memo[key] = val.is_a?(Hash) ? val.to_os : val
9
9
  end
10
10
  end
11
+
12
+ def remove_symbols_from_keys
13
+ self.each_with_object({}) do |(k, v), new_hash|
14
+ new_key = k.to_s
15
+ new_value = if v.is_a?(Hash)
16
+ v.remove_symbols_from_keys
17
+ elsif v.is_a?(Array)
18
+ v.map { |item| item.is_a?(Hash) ? item.remove_symbols_from_keys : item }
19
+ else
20
+ v
21
+ end
22
+ new_hash[new_key] = new_value
23
+ end
24
+ end
11
25
  end
@@ -0,0 +1,10 @@
1
+ # Load custom exceptions
2
+ require 'mkit/exceptions'
3
+
4
+ module CustomExceptions
5
+ def raise_bad_configuration(message)
6
+ raise MKIt::InvalidConfigurationException, "MKIt :: Invalid Configuration :: #{message}"
7
+ end
8
+ end
9
+
10
+ Object.include(CustomExceptions)
data/lib/mkit/ctypes.rb CHANGED
@@ -25,7 +25,7 @@ module MKIt
25
25
  module Templates
26
26
  DOCKER_RUN = 'docker/docker_run.sh'
27
27
  DOCKER_BUILD = 'docker/docker_build.sh'
28
- HAPROXY = 'haproxy/xapp_haproxy.cfg'
28
+ HAPROXY = 'haproxy/app_haproxy.cfg'
29
29
  HAPROXY_DEFAULTS = 'haproxy/0000_defaults.cfg'
30
30
  end
31
31
  end
@@ -22,7 +22,19 @@ module MKIt
22
22
  super(400, message)
23
23
  end
24
24
  end
25
- class ServiceNotFoundException < StandardError; end
25
+
26
+ class ServiceNotFoundException < BaseException
27
+ def initialize(message = nil)
28
+ super(404, message)
29
+ end
30
+ end
31
+
32
+ class InvalidConfigurationException < BaseException
33
+ def initialize(message = nil)
34
+ super(400, message)
35
+ end
36
+ end
37
+
26
38
  class PodNotFoundException < StandardError; end
27
39
  class AppAlreadyDeployedException < StandardError; end
28
40
  class InvalidPortMappingTypeException < StandardError; end
@@ -6,7 +6,7 @@ require "mkit/cmd/shell_client"
6
6
  # https://docs.docker.com/engine/reference/commandline/events
7
7
  require 'mkit/app/helpers/docker_helper'
8
8
  module MKIt
9
- class StopThread < RuntimeError; end
9
+ class StopThread < RuntimeError; end
10
10
 
11
11
  class DockerListener
12
12
  include MKIt::DockerHelper
@@ -67,22 +67,27 @@ class StopThread < RuntimeError; end
67
67
  end
68
68
  when :network
69
69
  pod_id = msg.Actor.Attributes.container
70
- inspect = inspect_instance(pod_id).to_o
71
- pod_name = inspect.Name[1..]
72
- pod = Pod.find_by(name: pod_name)
73
- unless pod.nil?
74
- case action
75
- when :connect
76
- MKItLogger.info("docker network #{action} received: #{msg} for pod #{pod_name}")
77
- pod.update_ip
78
- pod.save
79
- when :disconnect
80
- MKItLogger.debug(" #{type} #{action} <<NOOP / TODO>>")
70
+ inspect = inspect_instance(pod_id)
71
+ unless inspect.nil?
72
+ inspect = inspect.to_o
73
+ pod_name = inspect.Name[1..]
74
+ pod = Pod.find_by(name: pod_name)
75
+ unless pod.nil?
76
+ case action
77
+ when :connect
78
+ MKItLogger.info("docker network #{action} received: #{msg} for pod #{pod_name}")
79
+ pod.update_ip
80
+ pod.save
81
+ when :disconnect
82
+ MKItLogger.debug(" #{type} #{action} <<NOOP / TODO>>")
83
+ else
84
+ MKItLogger.debug(" #{type} #{action} <<TODO>>")
85
+ end
81
86
  else
82
- MKItLogger.debug(" #{type} #{action} <<TODO>>")
87
+ MKItLogger.warn("docker <<#{type}>> <#{action}> received: #{msg}. But I don't know anything about pod #{pod_id}/#{pod_name}")
83
88
  end
84
89
  else
85
- MKItLogger.warn("docker <<#{type}>> <#{action}> received: #{msg}. But I don't know anything about pod #{pod_id}/#{pod_name}")
90
+ MKItLogger.warn("docker <<#{type}>> <#{action}> received: #{msg}. But I don't know anything about pod #{pod_id}")
86
91
  end
87
92
  else
88
93
  MKItLogger.info("\t#{type} #{action} <<unknown>>")
@@ -1,5 +1,8 @@
1
+ require 'mkit/app/helpers/docker_helper'
2
+
1
3
  module MKIt
2
4
  class CreatePodSaga < ASaga
5
+ include MKIt::DockerHelper
3
6
 
4
7
  def topics
5
8
  %w{create_pod_saga}
@@ -9,20 +12,19 @@ module MKIt
9
12
  # create_pod_saga:
10
13
  #
11
14
  # payload:
12
- # * service_id
15
+ # * pod_name
13
16
  #
14
17
  # triggers
15
18
  # * nothing
16
19
  #
17
20
  def do_the(job)
18
21
  MKItLogger.info("#{self.class} <#{job.topic}> #{job.inspect}....")
19
- service = Service.find(job.service_id)
20
- # create pod
21
22
 
22
- pd = Pod.new( service: service, status: MKIt::Status::CREATED, name: SecureRandom.uuid.gsub('-','')[0..11])
23
- service.pod << pd
24
- service.save
25
- MkitJob.publish(topic: :start_pod, service_id: job.service_id, pod_id: pd.id)
23
+ pod_name = job.data['pod_name']
24
+ pod = Pod.find_by_name(pod_name)
25
+ docker_run = pod.parse
26
+ MKItLogger.info("deploying docker pod, cmd [#{docker_run}]")
27
+ create_instance(docker_run)
26
28
  end
27
29
  end
28
30
  end
@@ -0,0 +1,32 @@
1
+ require 'mkit/app/helpers/docker_helper'
2
+
3
+ module MKIt
4
+ class DestroyPodSaga < ASaga
5
+ include MKIt::DockerHelper
6
+
7
+ def topics
8
+ %w{destroy_pod_saga}
9
+ end
10
+
11
+ #
12
+ # destroy_pod_saga:
13
+ #
14
+ # payload:
15
+ # * pod_name
16
+ # * pod.id
17
+ #
18
+ # triggers
19
+ # * pod_destroyed?
20
+ #
21
+ def do_the(job)
22
+ MKItLogger.info("#{self.class} <#{job.topic}> #{job.inspect}....")
23
+
24
+ begin
25
+ remove_instance(job.data['pod_name'])
26
+ rescue => e
27
+ MKItLogger.warn(e)
28
+ end
29
+
30
+ end
31
+ end
32
+ end
@@ -1,10 +1,12 @@
1
1
  require 'mkit/sagas/asaga'
2
2
  require 'mkit/sagas/create_pod_saga'
3
+ require 'mkit/sagas/destroy_pod_saga'
3
4
 
4
5
  module MKIt
5
6
  class SagaManager
6
7
  def self.register_workers
7
8
  CreatePodSaga.new
9
+ DestroyPodSaga.new
8
10
  end
9
11
  end
10
12
  end
data/lib/mkit/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module MKIt
2
- VERSION = "0.9.1"
2
+ VERSION = "0.10.0"
3
3
  end
4
4
 
@@ -28,7 +28,9 @@ module MKIt
28
28
  MkitJob.publish(topic: :update_proxy_config, service_id: job.service_id)
29
29
  end
30
30
  when :pod_ip_updated
31
- MkitJob.publish(topic: :update_proxy_config, service_id: job.service_id)
31
+ if Service.exists?(job.service_id)
32
+ MkitJob.publish(topic: :update_proxy_config, service_id: job.service_id)
33
+ end
32
34
  else
33
35
  MKItLogger.info("#{self.class} <<TODO>> job #{job.inspect}....")
34
36
  end
@@ -1,3 +1,5 @@
1
+
2
+
1
3
  module MKIt
2
4
  class ServiceWorker < AWorker
3
5
 
@@ -0,0 +1,46 @@
1
+ ---
2
+ service:
3
+ name: httpbin
4
+ image: mccutchen/go-httpbin
5
+ command:
6
+ network: bridge
7
+ ingress:
8
+ frontend:
9
+ - name: http-in-ssl
10
+ options:
11
+ - option httpclose
12
+ - option forwardfor
13
+ bind:
14
+ port: 443
15
+ mode: http
16
+ ssl: true
17
+ options:
18
+ - accept-proxy
19
+ - transparent
20
+ - defer-accept
21
+ default_backend: server
22
+ - name: http-in
23
+ options:
24
+ - option forwardfor
25
+ bind:
26
+ port: 80
27
+ mode: http
28
+ default_backend: server
29
+ backend:
30
+ - name: server
31
+ balance: round_robin
32
+ options:
33
+ - cookie JSESSIONID prefix
34
+ bind:
35
+ port: 8080
36
+ mode: http
37
+ options:
38
+ - cookie A
39
+ - check
40
+ resources:
41
+ min_replicas: 1
42
+ max_replicas: 1
43
+ volumes: []
44
+ environment:
45
+ LOG4J_LEVEL: WARN
46
+ LOGGING_LEVEL_ROOT: WARN
@@ -1,21 +1,31 @@
1
- #
1
+ ---
2
2
  service:
3
3
  name: kafka-cluster
4
4
  network: kafka-cluster
5
5
  image: confluentinc/cp-kafka:7.1.6
6
- ports:
7
- - 9092:9092:tcp:round_robin
8
6
  volumes:
9
- - docker://kafka_cluster_secrets:/etc/kafka/secrets
10
- - docker://kafka_cluster_data:/var/lib/kafka/data
7
+ - docker://kafka_cluster_secrets:/etc/kafka/secrets
8
+ - docker://kafka_cluster_data:/var/lib/kafka/data
11
9
  environment:
12
10
  KAFKA_BROKER_ID: 1
13
11
  KAFKA_ZOOKEEPER_CONNECT: kafka-zookeeper:2181
14
- KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
12
+ KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'true'
15
13
  KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-cluster:9092
16
14
  KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT
17
- # KAFKA_CONFLUENT_SCHEMA_REGISTRY_URL: http://kafka-schema-registry
18
15
  KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
19
16
  KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
20
17
  KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
21
-
18
+ ingress:
19
+ frontend:
20
+ - name: frontend-9092
21
+ options: []
22
+ bind:
23
+ port: '9092'
24
+ mode: tcp
25
+ default_backend: backend-9092
26
+ backend:
27
+ - name: backend-9092
28
+ bind:
29
+ port: '9092'
30
+ mode: tcp
31
+ balance: round_robin
@@ -1,16 +1,33 @@
1
- #
1
+ ---
2
2
  service:
3
3
  name: kafka-magic
4
4
  network: kafka-cluster
5
- ports:
6
- - 80:80:http:round_robin
7
5
  image: digitsy/kafka-magic
8
6
  environment:
9
- KMAGIC_ALLOW_TOPIC_DELETE: "true"
10
- KMAGIC_ALLOW_SCHEMA_DELETE: "true"
11
- KMAGIC_CONFIG_STORE_TYPE: "file"
12
- KMAGIC_CONFIG_STORE_CONNECTION: "Data Source=/config/KafkaMagicConfig.db;"
13
- KMAGIC_CONFIG_ENCRYPTION_KEY: "123456"
7
+ KMAGIC_ALLOW_TOPIC_DELETE: 'true'
8
+ KMAGIC_ALLOW_SCHEMA_DELETE: 'true'
9
+ KMAGIC_CONFIG_STORE_TYPE: file
10
+ KMAGIC_CONFIG_STORE_CONNECTION: Data Source=/config/KafkaMagicConfig.db;
11
+ KMAGIC_CONFIG_ENCRYPTION_KEY: '123456'
14
12
  volumes:
15
- - docker://kafka_magic_config:/config
16
-
13
+ - docker://kafka_magic_config:/config
14
+ ingress:
15
+ frontend:
16
+ - name: frontend-80
17
+ options: []
18
+ bind:
19
+ port: '80'
20
+ mode: http
21
+ default_backend: backend-80
22
+ backend:
23
+ - name: backend-80
24
+ bind:
25
+ port: '80'
26
+ mode: http
27
+ options:
28
+ - cookie A check
29
+ balance: round_robin
30
+ options:
31
+ - option httpclose
32
+ - option forwardfor
33
+ - cookie JSESSIONID prefix
@@ -1,15 +1,26 @@
1
- #
1
+ ---
2
2
  service:
3
3
  name: kafka-zookeeper
4
4
  image: confluentinc/cp-zookeeper:7.1.6
5
5
  network: kafka-cluster
6
- ports:
7
- - 2181:2181:tcp:round_robin
8
6
  volumes:
9
- - docker://kafka_zookeeper_secrets:/etc/zookeeper/secrets
10
- - docker://kafka_zookeeper_data:/var/lib/zookeeper/data
11
- - docker://kafka_zookeeper_log:/var/lib/zookeeper/log
7
+ - docker://kafka_zookeeper_secrets:/etc/zookeeper/secrets
8
+ - docker://kafka_zookeeper_data:/var/lib/zookeeper/data
9
+ - docker://kafka_zookeeper_log:/var/lib/zookeeper/log
12
10
  environment:
13
11
  ZOOKEEPER_CLIENT_PORT: 2181
14
12
  ZOOKEEPER_TICK_TIME: 2000
15
-
13
+ ingress:
14
+ frontend:
15
+ - name: frontend-2181
16
+ options: []
17
+ bind:
18
+ port: '2181'
19
+ mode: tcp
20
+ default_backend: backend-2181
21
+ backend:
22
+ - name: backend-2181
23
+ bind:
24
+ port: '2181'
25
+ mode: tcp
26
+ balance: round_robin
@@ -1,16 +1,42 @@
1
- #
1
+ ---
2
2
  service:
3
3
  name: minio
4
4
  image: minio/minio
5
5
  command: server /data --console-address ":9001"
6
6
  network: bridge
7
- ports:
8
- - 9001:9001:http:round_robin
9
- - 9000:9000:tcp:round_robin
10
7
  environment:
11
8
  MINIO_ACCESS_KEY: minio
12
9
  MINIO_SECRET_KEY: minio123
13
10
  volumes:
14
- - docker://minio_data:/data
15
- #- /tmp/minio_data:/data
16
-
11
+ - docker://minio_data:/data
12
+ ingress:
13
+ frontend:
14
+ - name: frontend-9001
15
+ options: []
16
+ bind:
17
+ port: '9001'
18
+ mode: http
19
+ default_backend: backend-9001
20
+ - name: frontend-9000
21
+ options: []
22
+ bind:
23
+ port: '9000'
24
+ mode: tcp
25
+ default_backend: backend-9000
26
+ backend:
27
+ - name: backend-9001
28
+ bind:
29
+ port: '9001'
30
+ mode: http
31
+ options:
32
+ - cookie A check
33
+ balance: round_robin
34
+ options:
35
+ - option httpclose
36
+ - option forwardfor
37
+ - cookie JSESSIONID prefix
38
+ - name: backend-9000
39
+ bind:
40
+ port: '9000'
41
+ mode: tcp
42
+ balance: round_robin
@@ -1,9 +1,20 @@
1
- #
1
+ ---
2
2
  service:
3
3
  name: mongo
4
4
  image: mongo:4.0
5
5
  command: "--smallfiles"
6
6
  network: bridge
7
- ports:
8
- - 27017:27017:tcp:round_robin
9
-
7
+ ingress:
8
+ frontend:
9
+ - name: frontend-27017
10
+ options: []
11
+ bind:
12
+ port: '27017'
13
+ mode: tcp
14
+ default_backend: backend-27017
15
+ backend:
16
+ - name: backend-27017
17
+ bind:
18
+ port: '27017'
19
+ mode: tcp
20
+ balance: round_robin