kuby-sidekiq 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a3d59d851bea4b84f5e198288cb2392b374a1a5bbd750cc669e771598bd0c828
4
- data.tar.gz: 8360b03ccdb9e024cb92c3b2511d08349e4ffedabd4ef128cbfb947e61b091a4
3
+ metadata.gz: 96b955437e20df29e41ac12d18bcb7ae804af4858a35e58c1a29b54b76b16ee7
4
+ data.tar.gz: 183546d8e03bba59e1baa60e253a6abf682dfbbb1d450e5c550109016e7f1c5f
5
5
  SHA512:
6
- metadata.gz: 00d1ba24c781023e82453e345bc8fdb68a28cb138b9e7181ba80b5692b1964b8dd138e01b46d7d67e1b414f741380e78c7a9417f9da93e5a6352a8077112c91e
7
- data.tar.gz: c001858e4d4b8a82c631482a990da8c3b3aa5eb8fdf89766f4e1e067406ae641512919be2f8f893519b0a9d49ed41e64f52e67d4b03b8c1bf334e3e18c56310c
6
+ metadata.gz: 64178547f2fa845ab5879cbe39d6d98d62e2fb56d8433fbc7748e69e93eff3502cd1c503ca563a270a233ee6b5d7cfe4145962817597eb1f52111daffe26a17f
7
+ data.tar.gz: 85516c3f5ba4c5f87ddf0e46dd13fe159eccf2d4ab86685840d7ff3e7ba3df3574df477ff498b6eea8ad0fd6a0b2bcbd1f2f22accdb568ac4f55de19a93c176a
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 0.5.0
2
+ * Support for multiple configurable Sidekiq processes (#2, @zhall0624)
3
+
1
4
  ## 0.4.0
2
5
  * Use kuby-redis v0.2, which uses the Spotahome Redis operator instead of KubeDB.
3
6
 
data/README.md CHANGED
@@ -66,6 +66,37 @@ bundle exec kuby -e production push
66
66
  bundle exec kuby -e production deploy
67
67
  ```
68
68
 
69
+ ## Advanced Configuration
70
+
71
+ If you have a more complex setup for Sidekiq you can specify the processes you need to create. The options method allow you to
72
+ provide command line arguments to Sidekiq in order to either specify a non-default `sidekiq.yml` file or queues for a process to
73
+ run. The process name is required.
74
+
75
+ ```ruby
76
+ require 'kuby/sidekiq'
77
+
78
+ Kuby.define(:production) do
79
+ kubernetes do
80
+
81
+ add_plugin(:sidekiq) do
82
+ replicas 2 # sets the default number of replicas for each process
83
+
84
+
85
+ process('default') # sidekiq uses sidekiq.yml by default and has 2 replicas
86
+
87
+ process('slow_process') do
88
+ options ['-C', 'config/slow_sidekiq.yml']
89
+ replicas 4 # override default number of replicas
90
+ end
91
+
92
+ process('queue_processor') do
93
+ options ['-q', 'critical', '-q', 'less_critical']
94
+ end
95
+ end
96
+ end
97
+ end
98
+ ```
99
+
69
100
  ## License
70
101
 
71
102
  Licensed under the MIT license. See LICENSE for details.
@@ -1,5 +1,6 @@
1
1
  require 'securerandom'
2
2
  require 'kuby/redis'
3
+ require_relative 'sidekiq_process'
3
4
 
4
5
  module Kuby
5
6
  module Sidekiq
@@ -10,6 +11,10 @@ module Kuby
10
11
 
11
12
  value_field :replicas, default: 1
12
13
 
14
+ def processes
15
+ @processes ||= []
16
+ end
17
+
13
18
  def connection_params
14
19
  redis_instance.connection_params
15
20
  end
@@ -19,6 +24,10 @@ module Kuby
19
24
  end
20
25
 
21
26
  def after_configuration
27
+ if processes.empty?
28
+ processes << SidekiqProcess.new(plugin: self, default_replicas: replicas)
29
+ end
30
+
22
31
  environment.kubernetes.add_plugin(:redis) do
23
32
  instance :sidekiq do
24
33
  custom_config (custom_config || []).concat(['maxmemory-policy noeviction'])
@@ -27,24 +36,28 @@ module Kuby
27
36
 
28
37
  return unless rails_app
29
38
 
30
- deployment.spec.template.spec.container(:worker).merge!(
31
- rails_app.deployment.spec.template.spec.container(:web), fields: [:env_from]
32
- )
39
+ processes.each do |process|
40
+ process.deployment.spec.template.spec.container(:worker).merge!(
41
+ rails_app.deployment.spec.template.spec.container(:web), fields: [:env_from]
42
+ )
33
43
 
34
- if rails_app.manage_database? && database = Kuby::Plugins::RailsApp::Database.get(rails_app)
35
- database.plugin.configure_pod_spec(deployment.spec.template.spec)
44
+ if rails_app.manage_database? && database = Kuby::Plugins::RailsApp::Database.get(rails_app)
45
+ database.plugin.configure_pod_spec(process.deployment.spec.template.spec)
46
+ end
36
47
  end
37
48
  end
38
49
 
39
50
  def before_deploy(manifest)
40
51
  image_with_tag = "#{docker.image.image_url}:#{kubernetes.tag || Kuby::Docker::LATEST_TAG}"
41
52
 
42
- deployment do
43
- spec do
44
- template do
45
- spec do
46
- container(:worker) do
47
- image image_with_tag
53
+ processes.each do |process|
54
+ process.deployment do
55
+ spec do
56
+ template do
57
+ spec do
58
+ container(:worker) do
59
+ image image_with_tag
60
+ end
48
61
  end
49
62
  end
50
63
  end
@@ -53,10 +66,7 @@ module Kuby
53
66
  end
54
67
 
55
68
  def resources
56
- @resources ||= [
57
- service_account,
58
- deployment
59
- ]
69
+ @resources ||= [service_account, *processes.map(&:deployment)]
60
70
  end
61
71
 
62
72
  def service_account(&block)
@@ -78,67 +88,11 @@ module Kuby
78
88
  @service_account
79
89
  end
80
90
 
81
- def deployment(&block)
82
- context = self
83
-
84
- @deployment ||= KubeDSL.deployment do
85
- metadata do
86
- name "#{context.selector_app}-sidekiq-#{ROLE}"
87
- namespace context.namespace.metadata.name
88
-
89
- labels do
90
- add :app, context.selector_app
91
- add :role, ROLE
92
- end
93
- end
94
-
95
- spec do
96
- replicas context.replicas
97
-
98
- selector do
99
- match_labels do
100
- add :app, context.selector_app
101
- add :role, ROLE
102
- end
103
- end
104
-
105
- strategy do
106
- type 'RollingUpdate'
107
-
108
- rolling_update do
109
- max_surge '25%'
110
- max_unavailable 0
111
- end
112
- end
113
-
114
- template do
115
- metadata do
116
- labels do
117
- add :app, context.selector_app
118
- add :role, ROLE
119
- end
120
- end
121
-
122
- spec do
123
- container(:worker) do
124
- name "#{context.selector_app}-sidekiq-#{ROLE}"
125
- image_pull_policy 'IfNotPresent'
126
- command %w(bundle exec sidekiq)
127
- end
128
-
129
- image_pull_secret do
130
- name context.kubernetes.registry_secret.metadata.name
131
- end
132
-
133
- restart_policy 'Always'
134
- service_account_name context.service_account.metadata.name
135
- end
136
- end
137
- end
91
+ def process(name, &block)
92
+ SidekiqProcess.new(name: name, plugin: self, default_replicas: replicas).tap do |process|
93
+ process.instance_eval(&block) if block
94
+ processes << process
138
95
  end
139
-
140
- @deployment.instance_eval(&block) if block
141
- @deployment
142
96
  end
143
97
 
144
98
  def redis_instance
@@ -0,0 +1,89 @@
1
+ require 'securerandom'
2
+
3
+ module Kuby
4
+ module Sidekiq
5
+ # This class creates a deployment for a Sidekiq Process. A process is a single instance
6
+ # of Sidekiq. Each instance can be provided command line options to specify concurrency,
7
+ # config files or queues.
8
+ # https://github.com/sidekiq/sidekiq/wiki/Best-Practices#4-use-precise-terminology
9
+ class SidekiqProcess
10
+ extend ::KubeDSL::ValueFields
11
+
12
+ ROLE='worker'
13
+
14
+ attr_reader :plugin, :name, :default_replicas
15
+
16
+ value_field :replicas, default: nil
17
+ value_field :options, default: []
18
+
19
+ def initialize(name: 'default', plugin:, default_replicas:)
20
+ @name = name
21
+ @plugin = plugin
22
+ @default_replicas = default_replicas
23
+ end
24
+
25
+ def deployment(&block)
26
+ context = self
27
+
28
+ @deployment ||= KubeDSL.deployment do
29
+ metadata do
30
+ name "#{context.plugin.selector_app}-sidekiq-#{ROLE}-#{context.name}"
31
+ namespace context.plugin.namespace.metadata.name
32
+
33
+ labels do
34
+ add :app, context.plugin.selector_app
35
+ add :role, ROLE
36
+ end
37
+ end
38
+
39
+ spec do
40
+ replicas (context.replicas || context.default_replicas)
41
+
42
+ selector do
43
+ match_labels do
44
+ add :app, context.plugin.selector_app
45
+ add :role, ROLE
46
+ end
47
+ end
48
+
49
+ strategy do
50
+ type 'RollingUpdate'
51
+
52
+ rolling_update do
53
+ max_surge '25%'
54
+ max_unavailable 0
55
+ end
56
+ end
57
+
58
+ template do
59
+ metadata do
60
+ labels do
61
+ add :app, context.plugin.selector_app
62
+ add :role, ROLE
63
+ end
64
+ end
65
+
66
+ spec do
67
+ container(:worker) do
68
+ name "#{context.plugin.selector_app}-sidekiq-#{ROLE}-#{context.name}"
69
+ image_pull_policy 'IfNotPresent'
70
+ command ['bundle', 'exec', 'sidekiq', *context.options]
71
+ end
72
+
73
+ image_pull_secret do
74
+ name context.plugin.kubernetes.registry_secret.metadata.name
75
+ end
76
+
77
+ restart_policy 'Always'
78
+ service_account_name context.plugin.service_account.metadata.name
79
+ end
80
+ end
81
+ end
82
+ end
83
+
84
+ @deployment.instance_eval(&block) if block
85
+ @deployment
86
+ end
87
+ end
88
+ end
89
+ end
@@ -1,5 +1,5 @@
1
1
  module Kuby
2
2
  module Sidekiq
3
- VERSION = '0.4.0'
3
+ VERSION = '0.5.0'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kuby-sidekiq
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cameron Dutro
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-07 00:00:00.000000000 Z
11
+ date: 2023-03-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: kuby-core
@@ -73,6 +73,7 @@ files:
73
73
  - kuby-sidekiq.gemspec
74
74
  - lib/kuby/sidekiq.rb
75
75
  - lib/kuby/sidekiq/plugin.rb
76
+ - lib/kuby/sidekiq/sidekiq_process.rb
76
77
  - lib/kuby/sidekiq/version.rb
77
78
  homepage: http://github.com/getkuby/kuby-sidekiq
78
79
  licenses: []
@@ -92,7 +93,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
92
93
  - !ruby/object:Gem::Version
93
94
  version: '0'
94
95
  requirements: []
95
- rubygems_version: 3.2.22
96
+ rubygems_version: 3.4.5
96
97
  signing_key:
97
98
  specification_version: 4
98
99
  summary: Sidekiq plugin for Kuby.