kubernetes_leader_election 0.1.2 → 0.3.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.
- checksums.yaml +4 -4
- data/lib/kubernetes_leader_election/version.rb +1 -1
- data/lib/kubernetes_leader_election.rb +18 -11
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8249770ccbb46bf6eb75d9fd0e10200b9ab5e4c471b4f5bbccc9dfa7e82cb102
|
4
|
+
data.tar.gz: d587d3fb3292107e29a67d35da72d106b453942b0112369906142a4da23d85d5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c9bfbf38f35665c19401f23e26399378bdae1747fd934bd6875b626c1edfe22104a9198a96a38f4cf5dc880ebff252ee8f35e9139b4441be60c2f005efc6b0ab
|
7
|
+
data.tar.gz: d2b9afc8dab855511bf0b430b213a64a9438e4c5b4c425377d40fbfed8c492c190d9d52837397cef21343c6ca0c561a06aba68596ecd15b6fd7aa3168b69de96
|
@@ -9,12 +9,13 @@ class KubernetesLeaderElection
|
|
9
9
|
FAILED_KUBERNETES_REQUEST =
|
10
10
|
[Timeout::Error, OpenSSL::SSL::SSLError, Kubeclient::HttpError, SystemCallError, HTTP::ConnectionError].freeze
|
11
11
|
|
12
|
-
def initialize(name, kubeclient, logger:, statsd: nil, interval: 30)
|
12
|
+
def initialize(name, kubeclient, logger:, statsd: nil, interval: 30, retry_backoffs: [0.1, 0.5, 1, 2, 4])
|
13
13
|
@name = name
|
14
14
|
@kubeclient = kubeclient
|
15
15
|
@statsd = statsd
|
16
16
|
@logger = logger
|
17
17
|
@interval = interval
|
18
|
+
@retry_backoffs = retry_backoffs
|
18
19
|
end
|
19
20
|
|
20
21
|
# not using `call` since we never want to be restarted
|
@@ -34,11 +35,17 @@ class KubernetesLeaderElection
|
|
34
35
|
|
35
36
|
private
|
36
37
|
|
38
|
+
# allow callers to use any refresh tokens for their kubeclient
|
39
|
+
# see https://github.com/abonas/kubeclient/issues/530 for a better solution
|
40
|
+
def kubeclient
|
41
|
+
@kubeclient.respond_to?(:call) ? @kubeclient.call : @kubeclient
|
42
|
+
end
|
43
|
+
|
37
44
|
# show that we are alive or crash because we cannot reach the api (split-brain az)
|
38
45
|
def signal_alive
|
39
|
-
with_retries(*FAILED_KUBERNETES_REQUEST
|
46
|
+
with_retries(*FAILED_KUBERNETES_REQUEST) do
|
40
47
|
patch = { spec: { renewTime: microtime } }
|
41
|
-
reply =
|
48
|
+
reply = kubeclient.patch_entity(
|
42
49
|
"leases", @name, patch, 'strategic-merge-patch', ENV.fetch("POD_NAMESPACE")
|
43
50
|
)
|
44
51
|
|
@@ -64,8 +71,8 @@ class KubernetesLeaderElection
|
|
64
71
|
# retry request on regular api errors
|
65
72
|
reraise = ->(e) { e.is_a?(Kubeclient::HttpError) && e.error_code == ALREADY_EXISTS_CODE }
|
66
73
|
|
67
|
-
with_retries(*FAILED_KUBERNETES_REQUEST, reraise: reraise
|
68
|
-
|
74
|
+
with_retries(*FAILED_KUBERNETES_REQUEST, reraise: reraise) do
|
75
|
+
kubeclient.create_entity(
|
69
76
|
"Lease",
|
70
77
|
"leases",
|
71
78
|
metadata: {
|
@@ -92,8 +99,8 @@ class KubernetesLeaderElection
|
|
92
99
|
rescue Kubeclient::HttpError => e
|
93
100
|
raise e unless e.error_code == ALREADY_EXISTS_CODE # lease already exists
|
94
101
|
|
95
|
-
lease = with_retries(*FAILED_KUBERNETES_REQUEST
|
96
|
-
|
102
|
+
lease = with_retries(*FAILED_KUBERNETES_REQUEST) do
|
103
|
+
kubeclient.get_entity("leases", @name, namespace)
|
97
104
|
rescue Kubeclient::ResourceNotFoundError
|
98
105
|
nil
|
99
106
|
end
|
@@ -108,8 +115,8 @@ class KubernetesLeaderElection
|
|
108
115
|
# this is still a race-condition since we could be deleting the newly succeeded leader
|
109
116
|
# see https://github.com/kubernetes/kubernetes/issues/20572
|
110
117
|
@logger.info message: "deleting stale lease"
|
111
|
-
with_retries(*FAILED_KUBERNETES_REQUEST
|
112
|
-
|
118
|
+
with_retries(*FAILED_KUBERNETES_REQUEST) do
|
119
|
+
kubeclient.delete_entity("leases", @name, namespace)
|
113
120
|
end
|
114
121
|
false # leader is dead, do not assume leadership here to avoid race condition
|
115
122
|
else
|
@@ -117,14 +124,14 @@ class KubernetesLeaderElection
|
|
117
124
|
end
|
118
125
|
end
|
119
126
|
|
120
|
-
def with_retries(*errors, times
|
127
|
+
def with_retries(*errors, times: @retry_backoffs.size, reraise: nil)
|
121
128
|
yield
|
122
129
|
rescue *errors => e
|
123
130
|
retries ||= -1
|
124
131
|
retries += 1
|
125
132
|
raise if retries >= times || reraise&.call(e)
|
126
133
|
@logger.warn message: "Retryable error", type: e.class.to_s, retries: times - retries
|
127
|
-
sleep
|
134
|
+
sleep @retry_backoffs[retries] || @retry_backoffs.last
|
128
135
|
retry
|
129
136
|
end
|
130
137
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kubernetes_leader_election
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Grosser
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-02-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: kubeclient
|
@@ -24,7 +24,7 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
-
description:
|
27
|
+
description:
|
28
28
|
email: michael@grosser.it
|
29
29
|
executables: []
|
30
30
|
extensions: []
|
@@ -37,7 +37,7 @@ homepage: https://github.com/grosser/kubernetes_leader_election
|
|
37
37
|
licenses:
|
38
38
|
- MIT
|
39
39
|
metadata: {}
|
40
|
-
post_install_message:
|
40
|
+
post_install_message:
|
41
41
|
rdoc_options: []
|
42
42
|
require_paths:
|
43
43
|
- lib
|
@@ -45,15 +45,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
45
45
|
requirements:
|
46
46
|
- - ">="
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version: 2.
|
48
|
+
version: 2.7.0
|
49
49
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
50
50
|
requirements:
|
51
51
|
- - ">="
|
52
52
|
- !ruby/object:Gem::Version
|
53
53
|
version: '0'
|
54
54
|
requirements: []
|
55
|
-
rubygems_version: 3.
|
56
|
-
signing_key:
|
55
|
+
rubygems_version: 3.1.6
|
56
|
+
signing_key:
|
57
57
|
specification_version: 4
|
58
58
|
summary: Elect a kubernetes leader using leases for ruby
|
59
59
|
test_files: []
|