krane 2.3.5 → 2.4.1
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/.github/workflows/ci.yml +7 -16
- data/CHANGELOG.md +29 -0
- data/README.md +11 -11
- data/dev.yml +2 -2
- data/krane.gemspec +2 -2
- data/lib/krane/common.rb +1 -0
- data/lib/krane/deploy_task.rb +4 -0
- data/lib/krane/kubernetes_resource/custom_resource_definition.rb +4 -1
- data/lib/krane/kubernetes_resource/mutating_webhook_configuration.rb +1 -0
- data/lib/krane/kubernetes_resource/stateful_set.rb +4 -6
- data/lib/krane/restart_task.rb +24 -11
- data/lib/krane/template_sets.rb +2 -2
- data/lib/krane/version.rb +1 -1
- metadata +6 -7
- data/.buildkite/pipeline.nightly.yml +0 -15
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 93f7d9e842d616ea60e2c509f5e5a3fcb54d24375d426efd0345ba3a07dd2008
|
|
4
|
+
data.tar.gz: 24ccdd3165654319b55632a866f85839268644cb32ee719f55f03de6e5f63eb6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1c90430d28fe8513dd86aef6d160e04257beb66f294b998d780c66b27d8bdb7e5320947b06894399c49bcb336795f72a338fb197f3be4626467bfb286bbde2f0
|
|
7
|
+
data.tar.gz: 98fc07319ed605978d558777cea947a187bf3857d229b95945096d446fdbacd2637102e34a9e03afb9f5472105ce39d5d396f9c1cf8bc6f4c0677f28e6b88e9b
|
data/.github/workflows/ci.yml
CHANGED
|
@@ -11,24 +11,23 @@ jobs:
|
|
|
11
11
|
fail-fast: false
|
|
12
12
|
matrix:
|
|
13
13
|
ruby:
|
|
14
|
-
|
|
15
|
-
- '3.0' # With k8s 1.
|
|
16
|
-
- '3.0' # With k8s 1.
|
|
14
|
+
# Use unique Ruby versions, or GitHub gets confused when building the rest of the matrix
|
|
15
|
+
- '3.0.3' # With k8s 1.23
|
|
16
|
+
- '3.0.2' # With k8s 1.22
|
|
17
|
+
- '3.0.1' # With k8s 1.21
|
|
17
18
|
- '3.0' # With k8s 1.20
|
|
18
19
|
- '2.7' # With k8s 1.19
|
|
19
|
-
- '2.6.6' # With k8s 1.18
|
|
20
|
-
- '2.6.6' # With k8s 1.17
|
|
21
20
|
include:
|
|
22
21
|
# Match kind images with chosen version https://github.com/kubernetes-sigs/kind/releases
|
|
23
|
-
- ruby: '3.0'
|
|
22
|
+
- ruby: '3.0.3'
|
|
24
23
|
kind_version: 'v0.11.1'
|
|
25
24
|
kubernetes_version: '1.23.0'
|
|
26
25
|
kind_image: 'kindest/node:v1.23.0@sha256:49824ab1727c04e56a21a5d8372a402fcd32ea51ac96a2706a12af38934f81ac'
|
|
27
|
-
- ruby: '3.0'
|
|
26
|
+
- ruby: '3.0.2'
|
|
28
27
|
kind_version: 'v0.11.1'
|
|
29
28
|
kubernetes_version: '1.22.0'
|
|
30
29
|
kind_image: 'kindest/node:v1.22.0@sha256:b8bda84bb3a190e6e028b1760d277454a72267a5454b57db34437c34a588d047'
|
|
31
|
-
- ruby: '3.0'
|
|
30
|
+
- ruby: '3.0.1'
|
|
32
31
|
kind_version: 'v0.11.1'
|
|
33
32
|
kubernetes_version: '1.21.1'
|
|
34
33
|
kind_image: 'kindest/node:v1.21.1@sha256:69860bda5563ac81e3c0057d654b5253219618a22ec3a346306239bba8cfa1a6'
|
|
@@ -40,14 +39,6 @@ jobs:
|
|
|
40
39
|
kind_version: 'v0.11.1'
|
|
41
40
|
kubernetes_version: '1.19.11'
|
|
42
41
|
kind_image: 'kindest/node:v1.19.11@sha256:07db187ae84b4b7de440a73886f008cf903fcf5764ba8106a9fd5243d6f32729'
|
|
43
|
-
- ruby: '2.6.6'
|
|
44
|
-
kind_version: 'v0.11.1'
|
|
45
|
-
kubernetes_version: '1.18.19'
|
|
46
|
-
kind_image: '1.18: kindest/node:v1.18.19@sha256:7af1492e19b3192a79f606e43c35fb741e520d195f96399284515f077b3b622c'
|
|
47
|
-
- ruby: '2.6.6'
|
|
48
|
-
kind_version: 'v0.11.1'
|
|
49
|
-
kubernetes_version: '1.17.17'
|
|
50
|
-
kind_image: 'kindest/node:v1.17.17@sha256:66f1d0d91a88b8a001811e2f1054af60eef3b669a9a74f9b6db871f2f1eeed00'
|
|
51
42
|
|
|
52
43
|
steps:
|
|
53
44
|
- uses: actions/checkout@v2
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,34 @@
|
|
|
1
1
|
## next
|
|
2
2
|
|
|
3
|
+
## 2.4.1
|
|
4
|
+
|
|
5
|
+
*Enhancements*
|
|
6
|
+
|
|
7
|
+
- Support restart task for stateful sets that use the `OnDelete` strategy [#840](https://github.com/Shopify/krane/pull/840)
|
|
8
|
+
- Make `krane render` produce output in a deterministic order [#871](https://github.com/Shopify/krane/pull/871)
|
|
9
|
+
|
|
10
|
+
*Other*
|
|
11
|
+
|
|
12
|
+
- Remove buildkite [#869](https://github.com/Shopify/krane/pull/869)
|
|
13
|
+
|
|
14
|
+
## 2.4.0
|
|
15
|
+
|
|
16
|
+
*Enhancements*
|
|
17
|
+
|
|
18
|
+
- Ensure deploy tasks fail without at least one non-empty resource [#865](https://github.com/Shopify/krane/issues/865)
|
|
19
|
+
|
|
20
|
+
*Other*
|
|
21
|
+
|
|
22
|
+
- Remove Ruby 2.6 and K8s < 1.19 from the CI testing matrix. All fixtures have been updated to be compatible with K8s 1.22+.
|
|
23
|
+
|
|
24
|
+
## 2.3.7
|
|
25
|
+
|
|
26
|
+
- isolated_execution_state active_support require for Rails 7+
|
|
27
|
+
|
|
28
|
+
## 2.3.6
|
|
29
|
+
|
|
30
|
+
- Update kubeclient for better Ruby 3.1 compatibility.
|
|
31
|
+
|
|
3
32
|
## 2.3.5
|
|
4
33
|
|
|
5
34
|
- Psych 4 compatibility
|
data/README.md
CHANGED
|
@@ -73,24 +73,24 @@ If you need the ability to render dynamic values in templates before deploying,
|
|
|
73
73
|
|
|
74
74
|
## Prerequisites
|
|
75
75
|
|
|
76
|
-
* Ruby 2.
|
|
77
|
-
* Your cluster must be running Kubernetes v1.
|
|
76
|
+
* Ruby 2.7+
|
|
77
|
+
* Your cluster must be running Kubernetes v1.19.0 or higher<sup>1</sup>
|
|
78
78
|
|
|
79
79
|
<sup>1</sup> We run integration tests against these Kubernetes versions. You can find our
|
|
80
80
|
official compatibility chart below.
|
|
81
81
|
|
|
82
|
-
| Kubernetes version | Last officially supported in gem version |
|
|
83
|
-
|
|
84
|
-
| 1.
|
|
85
|
-
| 1.
|
|
86
|
-
| 1.
|
|
87
|
-
| 1.
|
|
88
|
-
| 1.
|
|
89
|
-
| 1.
|
|
82
|
+
| Kubernetes version | Currently Tested? | Last officially supported in gem version |
|
|
83
|
+
|:------------------:|-------------------|:----------------------------------------:|
|
|
84
|
+
| 1.18 | No | 2.3.7 |
|
|
85
|
+
| 1.19 | Yes | -- |
|
|
86
|
+
| 1.20 | Yes | -- |
|
|
87
|
+
| 1.21 | Yes | -- |
|
|
88
|
+
| 1.22 | Yes | -- |
|
|
89
|
+
| 1.23 | Yes | -- |
|
|
90
90
|
|
|
91
91
|
## Installation
|
|
92
92
|
|
|
93
|
-
1. [Install kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-binary-via-curl) (requires v1.
|
|
93
|
+
1. [Install kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-binary-via-curl) (requires v1.19.0 or higher) and make sure it is available in your $PATH
|
|
94
94
|
2. Set up your [kubeconfig file](https://kubernetes.io/docs/tasks/access-application-cluster/authenticate-across-clusters-kubeconfig/) for access to your cluster(s).
|
|
95
95
|
3. `gem install krane`
|
|
96
96
|
|
data/dev.yml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: krane
|
|
3
3
|
up:
|
|
4
|
-
- ruby:
|
|
4
|
+
- ruby: '3.0.3' # Matches gemspec
|
|
5
5
|
- bundler
|
|
6
6
|
- custom:
|
|
7
7
|
name: Install Kubernetes in Docker (KinD)
|
|
@@ -13,7 +13,7 @@ up:
|
|
|
13
13
|
- custom:
|
|
14
14
|
name: Create KinD Cluster
|
|
15
15
|
met?: bin/kind get clusters | grep -q krane
|
|
16
|
-
meet: bin/kind create cluster --name krane
|
|
16
|
+
meet: bin/kind create cluster --name krane --image "kindest/node:v1.22.0@sha256:b8bda84bb3a190e6e028b1760d277454a72267a5454b57db34437c34a588d047"
|
|
17
17
|
down: |
|
|
18
18
|
((bin/kind get clusters | grep -q krane) && bin/kind delete cluster --name krane) || true
|
|
19
19
|
commands:
|
data/krane.gemspec
CHANGED
|
@@ -27,14 +27,14 @@ Gem::Specification.new do |spec|
|
|
|
27
27
|
|
|
28
28
|
spec.required_ruby_version = '>= 2.6.0'
|
|
29
29
|
spec.add_dependency("activesupport", ">= 5.0")
|
|
30
|
-
spec.add_dependency("kubeclient", "~> 4.
|
|
30
|
+
spec.add_dependency("kubeclient", "~> 4.9")
|
|
31
31
|
spec.add_dependency("googleauth", "~> 0.8")
|
|
32
32
|
spec.add_dependency("ejson", "~> 1.0")
|
|
33
33
|
spec.add_dependency("colorize", "~> 0.8")
|
|
34
34
|
spec.add_dependency("statsd-instrument", ['>= 2.8', "< 4"])
|
|
35
35
|
spec.add_dependency("oj", "~> 3.0")
|
|
36
36
|
spec.add_dependency("concurrent-ruby", "~> 1.1")
|
|
37
|
-
spec.add_dependency("jsonpath", "~> 0
|
|
37
|
+
spec.add_dependency("jsonpath", "~> 1.0")
|
|
38
38
|
spec.add_dependency("thor", ">= 1.0", "< 2.0")
|
|
39
39
|
|
|
40
40
|
# Basics
|
data/lib/krane/common.rb
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require 'active_support'
|
|
4
|
+
require 'active_support/isolated_execution_state' if ActiveSupport::VERSION::MAJOR > 6
|
|
4
5
|
require 'active_support/core_ext/object/blank'
|
|
5
6
|
require 'active_support/core_ext/hash/reverse_merge'
|
|
6
7
|
require 'active_support/core_ext/hash/slice'
|
data/lib/krane/deploy_task.rb
CHANGED
|
@@ -254,6 +254,10 @@ module Krane
|
|
|
254
254
|
|
|
255
255
|
StatsD.client.gauge('discover_resources.count', resources.size, tags: statsd_tags)
|
|
256
256
|
|
|
257
|
+
if resources.empty?
|
|
258
|
+
raise FatalDeploymentError, "No deployable resources were found!"
|
|
259
|
+
end
|
|
260
|
+
|
|
257
261
|
resources.sort
|
|
258
262
|
rescue InvalidTemplateError => e
|
|
259
263
|
record_invalid_template(logger: @logger, err: e.message, filename: e.filename,
|
|
@@ -37,7 +37,10 @@ module Krane
|
|
|
37
37
|
|
|
38
38
|
def group_version_kind
|
|
39
39
|
group = @definition.dig("spec", "group")
|
|
40
|
-
|
|
40
|
+
# Since 1.22: spec.version is removed in v1; use spec.versions instead.
|
|
41
|
+
# New spec here: https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/#create-a-customresourcedefinition
|
|
42
|
+
# This is only used in testing, so we will simply take the first version we see:
|
|
43
|
+
version = @definition.dig("spec", "versions", 0, "name")
|
|
41
44
|
"#{group}/#{version}/#{kind}"
|
|
42
45
|
end
|
|
43
46
|
|
|
@@ -27,13 +27,11 @@ module Krane
|
|
|
27
27
|
"Consider switching to rollingUpdate.")
|
|
28
28
|
@success_assumption_warning_shown = true
|
|
29
29
|
end
|
|
30
|
-
true
|
|
31
|
-
else
|
|
32
|
-
observed_generation == current_generation &&
|
|
33
|
-
status_data['currentRevision'] == status_data['updateRevision'] &&
|
|
34
|
-
desired_replicas == status_data['readyReplicas'].to_i &&
|
|
35
|
-
desired_replicas == status_data['currentReplicas'].to_i
|
|
36
30
|
end
|
|
31
|
+
observed_generation == current_generation &&
|
|
32
|
+
status_data['currentRevision'] == status_data['updateRevision'] &&
|
|
33
|
+
desired_replicas == status_data['readyReplicas'].to_i &&
|
|
34
|
+
desired_replicas == status_data['currentReplicas'].to_i
|
|
37
35
|
end
|
|
38
36
|
|
|
39
37
|
def deploy_failed?
|
data/lib/krane/restart_task.rb
CHANGED
|
@@ -69,10 +69,10 @@ module Krane
|
|
|
69
69
|
deployments, statefulsets, daemonsets = identify_target_workloads(deployments, statefulsets,
|
|
70
70
|
daemonsets, selector: selector)
|
|
71
71
|
|
|
72
|
-
@logger.phase_heading("Triggering restart
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
72
|
+
@logger.phase_heading("Triggering restart")
|
|
73
|
+
restart_deployments!(deployments)
|
|
74
|
+
restart_statefulsets!(statefulsets)
|
|
75
|
+
restart_daemonsets!(daemonsets)
|
|
76
76
|
|
|
77
77
|
if verify_result
|
|
78
78
|
@logger.phase_heading("Waiting for rollout")
|
|
@@ -210,7 +210,15 @@ module Krane
|
|
|
210
210
|
apps_v1_kubeclient.patch_daemon_set(record.metadata.name, build_patch_payload(record), @namespace)
|
|
211
211
|
end
|
|
212
212
|
|
|
213
|
-
def
|
|
213
|
+
def delete_statefulset_pods(record)
|
|
214
|
+
pods = kubeclient.get_pods(namespace: record.metadata.namespace)
|
|
215
|
+
pods.select! do |pod|
|
|
216
|
+
pod.metadata.ownerReferences.find { |ref| ref.uid == record.metadata.uid }
|
|
217
|
+
end
|
|
218
|
+
pods.each { |pod| kubeclient.delete_pod(pod.metadata.name, pod.metadata.namespace) }
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
def restart_deployments!(deployments)
|
|
214
222
|
deployments.each do |record|
|
|
215
223
|
begin
|
|
216
224
|
patch_deployment_with_restart(record)
|
|
@@ -221,18 +229,23 @@ module Krane
|
|
|
221
229
|
end
|
|
222
230
|
end
|
|
223
231
|
|
|
224
|
-
def
|
|
232
|
+
def restart_statefulsets!(statefulsets)
|
|
225
233
|
statefulsets.each do |record|
|
|
226
|
-
|
|
234
|
+
@logger.info("Triggered `StatefulSet/#{record.metadata.name}` restart")
|
|
235
|
+
if record.spec.updateStrategy&.type == "OnDelete"
|
|
236
|
+
@logger.info("`StatefulSet/#{record.metadata.name}` has updateStrategy: OnDelete," \
|
|
237
|
+
" Restarting by forcefully deleting child pods"
|
|
238
|
+
)
|
|
239
|
+
delete_statefulset_pods(record)
|
|
240
|
+
else
|
|
227
241
|
patch_statefulset_with_restart(record)
|
|
228
|
-
@logger.info("Triggered `StatefulSet/#{record.metadata.name}` restart")
|
|
229
|
-
rescue Kubeclient::HttpError => e
|
|
230
|
-
raise RestartAPIError.new(record.metadata.name, e.message)
|
|
231
242
|
end
|
|
243
|
+
rescue Kubeclient::HttpError => e
|
|
244
|
+
raise RestartAPIError.new(record.metadata.name, e.message)
|
|
232
245
|
end
|
|
233
246
|
end
|
|
234
247
|
|
|
235
|
-
def
|
|
248
|
+
def restart_daemonsets!(daemonsets)
|
|
236
249
|
daemonsets.each do |record|
|
|
237
250
|
begin
|
|
238
251
|
patch_daemonset_with_restart(record)
|
data/lib/krane/template_sets.rb
CHANGED
|
@@ -104,11 +104,11 @@ module Krane
|
|
|
104
104
|
dir_paths.each do |template_dir|
|
|
105
105
|
resource_templates[template_dir] = Dir.foreach(template_dir).select do |filename|
|
|
106
106
|
filename.end_with?(*VALID_TEMPLATES) || filename == EjsonSecretProvisioner::EJSON_SECRETS_FILE
|
|
107
|
-
end
|
|
107
|
+
end.sort
|
|
108
108
|
end
|
|
109
109
|
|
|
110
110
|
# Filename paths
|
|
111
|
-
file_paths.each do |filename|
|
|
111
|
+
file_paths.sort.each do |filename|
|
|
112
112
|
dir_name = File.dirname(filename)
|
|
113
113
|
resource_templates[dir_name] ||= []
|
|
114
114
|
resource_templates[dir_name] << File.basename(filename) unless resource_templates[dir_name].include?(filename)
|
data/lib/krane/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: krane
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.4.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Katrina Verey
|
|
@@ -10,7 +10,7 @@ authors:
|
|
|
10
10
|
autorequire:
|
|
11
11
|
bindir: exe
|
|
12
12
|
cert_chain: []
|
|
13
|
-
date: 2022-
|
|
13
|
+
date: 2022-02-02 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: activesupport
|
|
@@ -32,14 +32,14 @@ dependencies:
|
|
|
32
32
|
requirements:
|
|
33
33
|
- - "~>"
|
|
34
34
|
- !ruby/object:Gem::Version
|
|
35
|
-
version: '4.
|
|
35
|
+
version: '4.9'
|
|
36
36
|
type: :runtime
|
|
37
37
|
prerelease: false
|
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
|
39
39
|
requirements:
|
|
40
40
|
- - "~>"
|
|
41
41
|
- !ruby/object:Gem::Version
|
|
42
|
-
version: '4.
|
|
42
|
+
version: '4.9'
|
|
43
43
|
- !ruby/object:Gem::Dependency
|
|
44
44
|
name: googleauth
|
|
45
45
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -136,14 +136,14 @@ dependencies:
|
|
|
136
136
|
requirements:
|
|
137
137
|
- - "~>"
|
|
138
138
|
- !ruby/object:Gem::Version
|
|
139
|
-
version: 0
|
|
139
|
+
version: '1.0'
|
|
140
140
|
type: :runtime
|
|
141
141
|
prerelease: false
|
|
142
142
|
version_requirements: !ruby/object:Gem::Requirement
|
|
143
143
|
requirements:
|
|
144
144
|
- - "~>"
|
|
145
145
|
- !ruby/object:Gem::Version
|
|
146
|
-
version: 0
|
|
146
|
+
version: '1.0'
|
|
147
147
|
- !ruby/object:Gem::Dependency
|
|
148
148
|
name: thor
|
|
149
149
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -411,7 +411,6 @@ executables:
|
|
|
411
411
|
extensions: []
|
|
412
412
|
extra_rdoc_files: []
|
|
413
413
|
files:
|
|
414
|
-
- ".buildkite/pipeline.nightly.yml"
|
|
415
414
|
- ".github/CODEOWNERS"
|
|
416
415
|
- ".github/ISSUE_TEMPLATE.md"
|
|
417
416
|
- ".github/probots.yml"
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
steps:
|
|
2
|
-
- name: 'Run Test Suite (:kubernetes: 1.16-latest)'
|
|
3
|
-
command: bin/ci
|
|
4
|
-
agents:
|
|
5
|
-
queue: k8s-ci
|
|
6
|
-
env:
|
|
7
|
-
LOGGING_LEVEL: 4
|
|
8
|
-
KUBERNETES_VERSION: v1.16-latest
|
|
9
|
-
- name: 'Run Test Suite (:kubernetes: 1.15-latest)'
|
|
10
|
-
command: bin/ci
|
|
11
|
-
agents:
|
|
12
|
-
queue: k8s-ci
|
|
13
|
-
env:
|
|
14
|
-
LOGGING_LEVEL: 4
|
|
15
|
-
KUBERNETES_VERSION: v1.15-latest
|