kubernetes-deploy 0.21.1 → 0.22.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b7b6b27e2d19b9194f53092f3037a6597d0c098b
4
- data.tar.gz: 5c1e656293fdb2f0e193bdb90419bd7629f683fd
3
+ metadata.gz: 93fa4f3f00a9ff96a2dfc20fa26ead2ccf77d5e2
4
+ data.tar.gz: 6b1e6a305c64c94ffb1cb38b5f7d722ba2e11fd6
5
5
  SHA512:
6
- metadata.gz: f6968be66492775b5edac4e2a30fe30c168aafd1db5766f5a97eae84c2fd42dd5603c608960d6b0aadc5dec6f717842c41b9dbbd6cd7f6dad69716b1106b33e3
7
- data.tar.gz: 751eb781b35bdf1081c41d4f182b84cc97a897b7c199c5020ecd2691c1478fb48174a1527d9ad0e3a58103a4dff734f149b261682d52a923fdb516239db0f8f0
6
+ metadata.gz: 88e0586648309f18d49b7d7e27650edd273bc0fdef8ae9bb0a0aa639ed6e4016fb0d7c6d2a1c25caede0774bb5fdc30b79d100e0ade49fcd6dd1a3823d20dc3a
7
+ data.tar.gz: a2ae7f6b727838b2c090c4208d0d321dee080902f8a50057c62f53691888294121211b863225945d5178ceea24876299e49ebdee1bc70f911e66eafd129e28fe
@@ -4,6 +4,14 @@ shared: &shared
4
4
  - exit_status: "*"
5
5
  limit: 1
6
6
  steps:
7
+ - name: 'Run Test Suite (:kubernetes: 1.12-latest)'
8
+ <<: *shared
9
+ command: bin/ci
10
+ agents:
11
+ queue: k8s-ci
12
+ env:
13
+ LOGGING_LEVEL: 4
14
+ KUBERNETES_VERSION: v1.12-latest
7
15
  - name: 'Run Test Suite (:kubernetes: 1.11-latest)'
8
16
  <<: *shared
9
17
  command: bin/ci
@@ -28,11 +36,3 @@ steps:
28
36
  env:
29
37
  LOGGING_LEVEL: 4
30
38
  KUBERNETES_VERSION: v1.9-latest
31
- - name: 'Run Test Suite (:kubernetes: 1.8-latest)'
32
- <<: *shared
33
- command: bin/ci
34
- agents:
35
- queue: minikube-ci
36
- env:
37
- LOGGING_LEVEL: 4
38
- KUBERNETES_VERSION: v1.8-latest
@@ -4,6 +4,14 @@ shared: &shared
4
4
  - exit_status: "*"
5
5
  limit: 1
6
6
  steps:
7
+ - name: 'Run Test Suite (:kubernetes: 1.12-latest)'
8
+ <<: *shared
9
+ command: bin/ci
10
+ agents:
11
+ queue: k8s-ci
12
+ env:
13
+ LOGGING_LEVEL: 4
14
+ KUBERNETES_VERSION: v1.12-latest
7
15
  - name: 'Run Test Suite (:kubernetes: 1.11-latest)'
8
16
  <<: *shared
9
17
  command: bin/ci
@@ -28,11 +36,3 @@ steps:
28
36
  env:
29
37
  LOGGING_LEVEL: 4
30
38
  KUBERNETES_VERSION: v1.9-latest
31
- - name: 'Run Test Suite (:kubernetes: 1.8-latest)'
32
- <<: *shared
33
- command: bin/ci
34
- agents:
35
- queue: minikube-ci
36
- env:
37
- LOGGING_LEVEL: 4
38
- KUBERNETES_VERSION: v1.8-latest
data/.gitignore CHANGED
@@ -17,3 +17,4 @@ coverage/*
17
17
  dev/flamegraph.svg
18
18
  dev/profile
19
19
  dev/flamegraph.pl
20
+ .local-context
@@ -1,3 +1,30 @@
1
+ ## 0.22.0
2
+
3
+ *Features*
4
+ - **[Breaking change]** `kubernetes-restart` now produces StatsD `distribution` instead of `metric`.
5
+ Dashboards that used these metrics will need to be updated. ([#374](https://github.com/Shopify/kubernetes-deploy/pull/374))
6
+ - `kubernetes-run` now produces StatsD `distribution` to aid in tracking usage ([#374](https://github.com/Shopify/kubernetes-deploy/pull/374))
7
+
8
+ *Enhancements*
9
+ - Predeploy RoleBinding before unmanaged pods ([#354](https://github.com/Shopify/kubernetes-deploy/pull/354))
10
+
11
+ *Bug Fixes*
12
+ - Fixed bug in `kubernetes-restart` that caused "Pod spec does not contain a template
13
+ container called 'task-runner'" error message to not be printed
14
+ ([#371](https://github.com/Shopify/kubernetes-deploy/pull/371))
15
+
16
+ *Other*
17
+ - Kubernetes 1.8 is no longer officially supported as of this version
18
+
19
+ ## 0.21.1
20
+
21
+ *Enhancements*
22
+ - Improved failure detection for job resources. ([#355](https://github.com/Shopify/kubernetes-deploy/pull/355))
23
+ - Unmanaged pods are now immediately identified as failed if they are evicted, preempted or deleted out of band. This is especially important to `kubernetes-run`. ([#353](https://github.com/Shopify/kubernetes-deploy/pull/353))
24
+
25
+ *Other*
26
+ - Relaxed our `googleauth` dependency. ([#333](https://github.com/Shopify/kubernetes-deploy/pull/333))
27
+
1
28
  ## 0.21.0
2
29
 
3
30
  *Features*
@@ -13,7 +40,6 @@
13
40
  - All resources marked as prunable will now be added to the prune whitelist ([#326](https://github.com/Shopify/kubernetes-deploy/pull/326))
14
41
  - Improve deploy status detection by ensuring we examine the correct generation ([#325](https://github.com/Shopify/kubernetes-deploy/pull/325))
15
42
 
16
- *Bug Fixes*
17
43
 
18
44
  ## 0.20.5
19
45
  *Enhancements*
data/README.md CHANGED
@@ -69,21 +69,26 @@ This repo also includes related tools for [running tasks](#kubernetes-run) and [
69
69
  ## Prerequisites
70
70
 
71
71
  * Ruby 2.3+
72
- * Your cluster must be running Kubernetes v1.8.0 or higher<sup>1</sup>
72
+ * Your cluster must be running Kubernetes v1.9.0 or higher<sup>1</sup>
73
73
  * Each app must have a deploy directory containing its Kubernetes templates (see [Templates](#using-templates-and-variables))
74
74
  * You must remove the` kubectl.kubernetes.io/last-applied-configuration` annotation from any resources in the namespace that are not included in your deploy directory. This annotation is added automatically when you create resources with `kubectl apply`. `kubernetes-deploy` will prune any resources that have this annotation and are not in the deploy directory.<sup>2</sup>
75
75
  * Each app managed by `kubernetes-deploy` must have its own exclusive Kubernetes namespace.
76
76
 
77
- <sup>1</sup> We run integration tests against these Kubernetes versions. Kubernetes v1.7 was officially
78
- supported in gem versions < 0.21. Kubernetes v1.6 was officially supported in gem versions < 0.16. Kubernetes
79
- v1.5 was officially supported in gem versions < 0.12.
77
+ <sup>1</sup> We run integration tests against these Kubernetes versions. You can find our
78
+ offical compatibility chart below.
80
79
 
81
80
  <sup>2</sup> This requirement can be bypassed with the `--no-prune` option, but it is not recommended.
82
81
 
82
+ | Kubernetes version | Last officially supported in gem version |
83
+ | :----------------: | :-------------------: |
84
+ | 1.5 | 0.11.2 |
85
+ | 1.6 | 0.15.2 |
86
+ | 1.7 | 0.20.6 |
87
+ | 1.8 | 0.21.1 |
83
88
 
84
89
  ## Installation
85
90
 
86
- 1. [Install kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-binary-via-curl) (requires v1.8.0 or higher) and make sure it is available in your $PATH
91
+ 1. [Install kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-binary-via-curl) (requires v1.9.0 or higher) and make sure it is available in your $PATH
87
92
  2. Set up your [kubeconfig file](https://kubernetes.io/docs/tasks/access-application-cluster/authenticate-across-clusters-kubeconfig/) for access to your cluster(s).
88
93
  3. `gem install kubernetes-deploy`
89
94
 
@@ -374,7 +379,7 @@ Based on this specification `kubernetes-run` will create a new pod with the entr
374
379
 
375
380
  If you work for Shopify, just run `dev up`, but otherwise:
376
381
 
377
- 1. [Install kubectl version 1.8.0 or higher](https://kubernetes.io/docs/user-guide/prereqs/) and make sure it is in your path
382
+ 1. [Install kubectl version 1.9.0 or higher](https://kubernetes.io/docs/user-guide/prereqs/) and make sure it is in your path
378
383
  2. [Install minikube](https://kubernetes.io/docs/getting-started-guides/minikube/#installation) (required to run the test suite)
379
384
  3. Check out the repo
380
385
  4. Run `bin/setup` to install dependencies
@@ -385,16 +390,23 @@ To install this gem onto your local machine, run `bundle exec rake install`.
385
390
 
386
391
  ## Running the test suite locally
387
392
 
388
- 1. Start [minikube](https://kubernetes.io/docs/getting-started-guides/minikube/#installation) (`minikube start [options]`)
389
- 2. Make sure you have a context named "minikube" in your kubeconfig. Minikube adds this context for you when you run `minikube start`; please do not rename it. You can check for it using `kubectl config get-contexts`.
390
- 3. Run `bundle exec rake test`
393
+ Using minikube:
391
394
 
395
+ 1. Start [minikube](https://kubernetes.io/docs/getting-started-guides/minikube/#installation) (`minikube start [options]`).
396
+ 2. Make sure you have a context named "minikube" in your kubeconfig. Minikube adds this context for you when you run `minikube start`. You can check for it using `kubectl config get-contexts`.
397
+ 3. Run `bundle exec rake test` (or `dev test` if you work for Shopify).
392
398
 
399
+ Using another local cluster:
393
400
 
394
- To see the full-color output of a specific integration test, you can use `PRINT_LOGS=1 bundle exec ruby -I test test/integration/kubernetes_deploy_test.rb -n/test_name/`.
401
+ 1. Start your cluster.
402
+ 2. Put the name of the context you want to use in a file named `.local-context` in the root of this project. For example: `echo "dind" > .local-context`.
403
+ 3. Run `bundle exec rake test` (or `dev test` if you work for Shopify).
395
404
 
396
405
  To make StatsD log what it would have emitted, run a test with `STATSD_DEV=1`.
397
406
 
407
+ To see the full-color output of a specific integration test, you can use `PRINT_LOGS=1`. For example: `PRINT_LOGS=1 bundle exec ruby -I test test/integration/kubernetes_deploy_test.rb -n/test_name/`.
408
+
409
+
398
410
 
399
411
 
400
412
  ![test-output](screenshots/test-output.png)
data/bin/setup CHANGED
@@ -9,8 +9,8 @@ if [ ! -x "$(which minikube)" ]; then
9
9
  fi
10
10
 
11
11
  if [ ! -x "$(which kubectl)" ]; then
12
- echo -e "\n\033[0;33mPlease install kubectl version 1.8.0 or higher:\nhttps://kubernetes.io/docs/user-guide/prereqs/\033[0m"
12
+ echo -e "\n\033[0;33mPlease install kubectl version 1.9.0 or higher:\nhttps://kubernetes.io/docs/user-guide/prereqs/\033[0m"
13
13
  else
14
14
  KUBECTL_VERSION=$(kubectl version --short --client | grep -oe "v[[:digit:]\.]\+")
15
- echo -e "\n\033[0;32mKubectl version $KUBECTL_VERSION is already installed. This gem requires version v1.8.0 or greater.\033[0m"
15
+ echo -e "\n\033[0;32mKubectl version $KUBECTL_VERSION is already installed. This gem requires version v1.9.0 or greater.\033[0m"
16
16
  fi
@@ -28,7 +28,7 @@ Gem::Specification.new do |spec|
28
28
  spec.add_dependency "googleauth", "~> 0.6.6" # https://github.com/google/google-auth-library-ruby/issues/153
29
29
  spec.add_dependency "ejson", "~> 1.0"
30
30
  spec.add_dependency "colorize", "~> 0.8"
31
- spec.add_dependency "statsd-instrument", "~> 2.2"
31
+ spec.add_dependency "statsd-instrument", "~> 2.3"
32
32
 
33
33
  spec.add_development_dependency "bundler"
34
34
  spec.add_development_dependency "rake", "~> 10.0"
@@ -1,4 +1,3 @@
1
- # rubocop:disable Naming/FileName
2
1
  # frozen_string_literal: true
3
2
 
4
3
  require 'active_support/core_ext/object/blank'
@@ -22,6 +21,6 @@ require 'kubernetes-deploy/duration_parser'
22
21
  require 'kubernetes-deploy/sync_mediator'
23
22
 
24
23
  module KubernetesDeploy
25
- MIN_KUBE_VERSION = '1.8.0'
24
+ MIN_KUBE_VERSION = '1.9.0'
26
25
  KubernetesDeploy::StatsD.build
27
26
  end
@@ -73,7 +73,7 @@ module KubernetesDeploy
73
73
  timestamp, message = log_line.split(" ", 2)
74
74
  [Time.parse(timestamp), message]
75
75
  rescue ArgumentError
76
- # If the log file can't be opened, k8s 1.8 writes an error message without a timestamp to stdout
76
+ # Don't fail on unparsable timestamp
77
77
  [nil, log_line]
78
78
  end
79
79
 
@@ -52,6 +52,7 @@ module KubernetesDeploy
52
52
  ConfigMap
53
53
  PersistentVolumeClaim
54
54
  ServiceAccount
55
+ RoleBinding
55
56
  Pod
56
57
  )
57
58
 
@@ -82,10 +83,8 @@ module KubernetesDeploy
82
83
  apps/v1beta1/StatefulSet
83
84
  autoscaling/v1/HorizontalPodAutoscaler
84
85
  policy/v1beta1/PodDisruptionBudget
86
+ batch/v1beta1/CronJob
85
87
  )
86
- if server_version >= Gem::Version.new('1.8.0')
87
- wl << "batch/v1beta1/CronJob"
88
- end
89
88
  wl + cluster_resource_discoverer.crds(@sync_mediator).select(&:prunable?).map(&:group_version_kind)
90
89
  end
91
90
 
@@ -76,6 +76,14 @@ module KubernetesDeploy
76
76
  )
77
77
  end
78
78
 
79
+ def build_rbac_v1_kubeclient(context)
80
+ _build_kubeclient(
81
+ api_version: "v1",
82
+ context: context,
83
+ endpoint_path: "/apis/rbac.authorization.k8s.io"
84
+ )
85
+ end
86
+
79
87
  def _build_kubeclient(api_version:, context:, endpoint_path: nil)
80
88
  # Find a context defined in kube conf files that matches the input context by name
81
89
  friendly_configs = config_files.map { |f| GoogleFriendlyConfig.read(f) }
@@ -10,7 +10,6 @@ module KubernetesDeploy
10
10
  def sync(mediator)
11
11
  super
12
12
  @latest_rs = exists? ? find_latest_rs(mediator) : nil
13
- @server_version ||= mediator.kubectl.server_version
14
13
  end
15
14
 
16
15
  def status
@@ -210,10 +210,6 @@ module KubernetesDeploy
210
210
  limbo_message.match(/(?:not found)|(?:back-off)/i)
211
211
  "Failed to pull image #{@image}. "\
212
212
  "Did you wait for it to be built and pushed to the registry before deploying?"
213
- elsif limbo_message == "Generate Container Config Failed"
214
- # reason/message are backwards in <1.8.0 (next condition used by 1.8.0+)
215
- # Fixed by https://github.com/kubernetes/kubernetes/commit/df41787b1a3f51b73fb6db8a2203f0a7c7c92931
216
- "Failed to generate container configuration: #{limbo_reason}"
217
213
  elsif limbo_reason == "CreateContainerConfigError"
218
214
  "Failed to generate container configuration: #{limbo_message}"
219
215
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+ module KubernetesDeploy
3
+ class RoleBinding < KubernetesResource
4
+ TIMEOUT = 30.seconds
5
+
6
+ def status
7
+ exists? ? "Created" : "Unknown"
8
+ end
9
+
10
+ def deploy_succeeded?
11
+ exists?
12
+ end
13
+
14
+ def deploy_failed?
15
+ false
16
+ end
17
+
18
+ def timeout_message
19
+ UNUSUAL_FAILURE_MESSAGE
20
+ end
21
+ end
22
+ end
@@ -10,7 +10,6 @@ module KubernetesDeploy
10
10
  def sync(mediator)
11
11
  super
12
12
  @pods = exists? ? find_pods(mediator) : []
13
- @server_version ||= mediator.kubectl.server_version
14
13
  end
15
14
 
16
15
  def status
@@ -58,14 +58,14 @@ module KubernetesDeploy
58
58
  raise DeploymentTimeoutError
59
59
  end
60
60
  raise FatalDeploymentError unless success
61
- ::StatsD.measure('restart.duration', StatsD.duration(start), tags: tags('success', deployments))
61
+ ::StatsD.distribution('restart.duration', StatsD.duration(start), tags: tags('success', deployments))
62
62
  @logger.print_summary(:success)
63
63
  rescue DeploymentTimeoutError
64
- ::StatsD.measure('restart.duration', StatsD.duration(start), tags: tags('timeout', deployments))
64
+ ::StatsD.distribution('restart.duration', StatsD.duration(start), tags: tags('timeout', deployments))
65
65
  @logger.print_summary(:timed_out)
66
66
  raise
67
67
  rescue FatalDeploymentError => error
68
- ::StatsD.measure('restart.duration', StatsD.duration(start), tags: tags('failure', deployments))
68
+ ::StatsD.distribution('restart.duration', StatsD.duration(start), tags: tags('failure', deployments))
69
69
  @logger.summary.add_action(error.message) if error.message != error.class.to_s
70
70
  @logger.print_summary(:failure)
71
71
  raise
@@ -28,6 +28,7 @@ module KubernetesDeploy
28
28
  end
29
29
 
30
30
  def run!(task_template:, entrypoint:, args:, env_vars: [], verify_result: true)
31
+ start = Time.now.utc
31
32
  @logger.reset
32
33
 
33
34
  @logger.phase_heading("Initializing task")
@@ -44,11 +45,14 @@ module KubernetesDeploy
44
45
  else
45
46
  record_status_once(pod)
46
47
  end
48
+ ::StatsD.distribution('task_runner.duration', StatsD.duration(start), tags: statsd_tags('success'))
47
49
  @logger.print_summary(:success)
48
50
  rescue DeploymentTimeoutError
51
+ ::StatsD.distribution('task_runner.duration', StatsD.duration(start), tags: statsd_tags('timeout'))
49
52
  @logger.print_summary(:timed_out)
50
53
  raise
51
54
  rescue FatalDeploymentError
55
+ ::StatsD.distribution('task_runner.duration', StatsD.duration(start), tags: statsd_tags('failure'))
52
56
  @logger.print_summary(:failure)
53
57
  raise
54
58
  end
@@ -164,7 +168,9 @@ module KubernetesDeploy
164
168
  def set_container_overrides!(pod_definition, entrypoint, args, env_vars)
165
169
  container = pod_definition.spec.containers.find { |cont| cont.name == 'task-runner' }
166
170
  if container.nil?
167
- raise TaskConfigurationError, "Pod spec does not contain a template container called 'task-runner'"
171
+ message = "Pod spec does not contain a template container called 'task-runner'"
172
+ @logger.summary.add_paragraph(message)
173
+ raise TaskConfigurationError, message
168
174
  end
169
175
 
170
176
  container.command = entrypoint
@@ -198,5 +204,9 @@ module KubernetesDeploy
198
204
  def kubeclient
199
205
  @kubeclient ||= build_v1_kubeclient(@context)
200
206
  end
207
+
208
+ def statsd_tags(status)
209
+ %W(namespace:#{@namespace} context:#{@context} status:#{status})
210
+ end
201
211
  end
202
212
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module KubernetesDeploy
3
- VERSION = "0.21.1"
3
+ VERSION = "0.22.0"
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kubernetes-deploy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.21.1
4
+ version: 0.22.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Katrina Verey
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2018-10-25 00:00:00.000000000 Z
12
+ date: 2018-11-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -87,14 +87,14 @@ dependencies:
87
87
  requirements:
88
88
  - - "~>"
89
89
  - !ruby/object:Gem::Version
90
- version: '2.2'
90
+ version: '2.3'
91
91
  type: :runtime
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
95
  - - "~>"
96
96
  - !ruby/object:Gem::Version
97
- version: '2.2'
97
+ version: '2.3'
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: bundler
100
100
  requirement: !ruby/object:Gem::Requirement
@@ -244,6 +244,7 @@ files:
244
244
  - lib/kubernetes-deploy/kubernetes_resource/redis.rb
245
245
  - lib/kubernetes-deploy/kubernetes_resource/replica_set.rb
246
246
  - lib/kubernetes-deploy/kubernetes_resource/resource_quota.rb
247
+ - lib/kubernetes-deploy/kubernetes_resource/role_binding.rb
247
248
  - lib/kubernetes-deploy/kubernetes_resource/service.rb
248
249
  - lib/kubernetes-deploy/kubernetes_resource/service_account.rb
249
250
  - lib/kubernetes-deploy/kubernetes_resource/stateful_set.rb