kubes 0.2.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.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/.dockerignore +4 -0
  3. data/CHANGELOG.md +18 -1
  4. data/Dockerfile +14 -0
  5. data/docs/_docs/auto-context.md +4 -4
  6. data/docs/_docs/ci/cloudbuild.md +69 -0
  7. data/docs/_docs/config/builder.md +46 -0
  8. data/docs/_docs/config/env.md +3 -3
  9. data/docs/_docs/dsl/resources/deployment.md +0 -5
  10. data/docs/_docs/dsl/resources/network_policy.md +1 -1
  11. data/docs/_docs/dsl/resources/service.md +21 -5
  12. data/docs/_docs/helpers.md +2 -2
  13. data/docs/_docs/learn/dsl/deploy.md +2 -0
  14. data/docs/_docs/learn/dsl/new-project.md +1 -2
  15. data/docs/_docs/learn/yaml/deploy.md +2 -0
  16. data/docs/_docs/learn/yaml/new-project.md +1 -1
  17. data/docs/_docs/learn/yaml/review-project.md +0 -5
  18. data/docs/_docs/yaml.md +0 -5
  19. data/docs/_includes/intro/install.md +5 -1
  20. data/docs/_includes/learn/cluster.md +21 -4
  21. data/docs/_includes/learn/repo +0 -0
  22. data/docs/_includes/learn/repos.md +10 -0
  23. data/docs/_includes/learn/review.md +2 -2
  24. data/docs/_includes/sidebar.html +6 -0
  25. data/docs/_reference/kubes-apply.md +2 -2
  26. data/docs/_reference/kubes-delete.md +1 -1
  27. data/docs/_reference/kubes-deploy.md +1 -1
  28. data/docs/_reference/kubes-describe.md +24 -0
  29. data/docs/_reference/kubes-exec.md +42 -0
  30. data/docs/_reference/kubes-get.md +27 -0
  31. data/docs/_reference/kubes-init.md +1 -1
  32. data/docs/_reference/kubes-logs.md +26 -0
  33. data/docs/bin/web +1 -1
  34. data/docs/reference.md +4 -0
  35. data/lib/kubes/cli.rb +21 -0
  36. data/lib/kubes/cli/apply.rb +1 -1
  37. data/lib/kubes/cli/base.rb +4 -0
  38. data/lib/kubes/cli/build.rb +2 -2
  39. data/lib/kubes/cli/delete.rb +7 -2
  40. data/lib/kubes/cli/describe.rb +1 -1
  41. data/lib/kubes/cli/docker.rb +2 -2
  42. data/lib/kubes/cli/exec.rb +33 -0
  43. data/lib/kubes/cli/get.rb +3 -1
  44. data/lib/kubes/cli/help/exec.md +17 -0
  45. data/lib/kubes/cli/logs.rb +13 -0
  46. data/lib/kubes/compiler/dsl/syntax/deployment.rb +77 -10
  47. data/lib/kubes/compiler/dsl/syntax/service.rb +11 -0
  48. data/lib/kubes/compiler/shared/helpers.rb +2 -1
  49. data/lib/kubes/config.rb +2 -0
  50. data/lib/kubes/docker.rb +19 -0
  51. data/lib/kubes/docker/strategy/build/base.rb +24 -0
  52. data/lib/kubes/docker/strategy/build/docker.rb +11 -0
  53. data/lib/kubes/docker/strategy/build/gcloud.rb +10 -0
  54. data/lib/kubes/docker/strategy/hooks.rb +9 -0
  55. data/lib/kubes/docker/{base.rb → strategy/image_name.rb} +19 -32
  56. data/lib/kubes/docker/strategy/push/base.rb +9 -0
  57. data/lib/kubes/docker/{push.rb → strategy/push/docker.rb} +2 -5
  58. data/lib/kubes/docker/strategy/push/gcloud.rb +9 -0
  59. data/lib/kubes/docker/strategy/utils.rb +9 -0
  60. data/lib/kubes/hooks/builder.rb +2 -1
  61. data/lib/kubes/kubectl.rb +15 -3
  62. data/lib/kubes/kubectl/batch.rb +8 -1
  63. data/lib/kubes/kubectl/fetch/base.rb +24 -0
  64. data/lib/kubes/kubectl/fetch/deployment.rb +34 -0
  65. data/lib/kubes/kubectl/fetch/pods.rb +21 -0
  66. data/lib/kubes/util/sh.rb +1 -0
  67. data/lib/kubes/version.rb +1 -1
  68. data/lib/templates/dsl/.kubes/resources/web/deployment.rb +3 -1
  69. data/lib/templates/dsl/.kubes/resources/web/service.rb +1 -1
  70. data/lib/templates/yaml/.kubes/resources/web/deployment.yaml.tt +0 -5
  71. metadata +28 -5
  72. data/lib/kubes/docker/build.rb +0 -22
@@ -56,6 +56,7 @@
56
56
  <li><a href="{% link _docs/config/docker.md %}">Docker</a></li>
57
57
  <li><a href="{% link _docs/config/env.md %}">Env</a></li>
58
58
  <li><a href="{% link _docs/config/kubectl.md %}">Kubectl</a></li>
59
+ <li><a href="{% link _docs/config/builder.md %}">Builder</a></li>
59
60
  </ul>
60
61
  </li>
61
62
  <li><a href="{% link _docs/yaml.md %}">YAML</a></li>
@@ -93,6 +94,11 @@
93
94
  </li>
94
95
  <li><a href="{% link _docs/kustomize.md %}">Kustomize Support</a></li>
95
96
  <li><a href="{% link _docs/auto-context.md %}">Auto Context</a></li>
97
+ <li>CI/CD
98
+ <ul>
99
+ <li><a href="{% link _docs/ci/cloudbuild.md %}">CloudBuild</a></li>
100
+ </ul>
101
+ </li>
96
102
  <li>More
97
103
  <ul class="more">
98
104
  <li><a href="{% link support.md %}">Support</a></li>
@@ -5,11 +5,11 @@ reference: true
5
5
 
6
6
  ## Usage
7
7
 
8
- kubes apply [APP] [RESOURCE]
8
+ kubes apply [ROLE] [RESOURCE]
9
9
 
10
10
  ## Description
11
11
 
12
- Apply the Kubernetes YAML files without changing them
12
+ Apply the Kubernetes YAML files without building docker image
13
13
 
14
14
 
15
15
  ## Options
@@ -5,7 +5,7 @@ reference: true
5
5
 
6
6
  ## Usage
7
7
 
8
- kubes delete [APP] [RESOURCE]
8
+ kubes delete [ROLE] [RESOURCE]
9
9
 
10
10
  ## Description
11
11
 
@@ -5,7 +5,7 @@ reference: true
5
5
 
6
6
  ## Usage
7
7
 
8
- kubes deploy [APP] [RESOURCE]
8
+ kubes deploy [ROLE] [RESOURCE]
9
9
 
10
10
  ## Description
11
11
 
@@ -0,0 +1,24 @@
1
+ ---
2
+ title: kubes describe
3
+ reference: true
4
+ ---
5
+
6
+ ## Usage
7
+
8
+ kubes describe [ROLE] [RESOURCE]
9
+
10
+ ## Description
11
+
12
+ Describe Kubernetes resource using the compiled YAML files
13
+
14
+
15
+ ## Options
16
+
17
+ ```
18
+ [--image=IMAGE] # override image
19
+ [--compile], [--no-compile] # whether or not to compile the .kube/resources
20
+ # Default: true
21
+ [--verbose], [--no-verbose]
22
+ [--noop], [--no-noop]
23
+ ```
24
+
@@ -0,0 +1,42 @@
1
+ ---
2
+ title: kubes exec
3
+ reference: true
4
+ ---
5
+
6
+ ## Usage
7
+
8
+ kubes exec
9
+
10
+ ## Description
11
+
12
+ Exec into the latest container from the deployment
13
+
14
+ The exec command finds the latest pod from the deployment and runs `kubectl exec -ti POD bash` to get you into it. It spares you from having to manually find and type it.
15
+
16
+ ## Examples
17
+
18
+ kubes exec
19
+ kubes exec sh
20
+ kubes exec ls -l
21
+
22
+ ## Multiple Deployments
23
+
24
+ If you have have multiple deployments in your ``.kubes/resources` then the command will use the first deployment by default. You can specify the specfic deployment with the `--name` option. Examples:
25
+
26
+ kubes exec --name demo-web
27
+ kubes exec --name demo-clock
28
+ kubes exec --name demo-worker
29
+ kubes exec --name demo-web sh
30
+ kubes exec --name demo-web ls -l
31
+
32
+
33
+ ## Options
34
+
35
+ ```
36
+ [--compile], [--no-compile] # whether or not to compile the .kube/resources
37
+ # Default: true
38
+ n, [--name=NAME] # deployment name to use. IE: demo-web
39
+ [--verbose], [--no-verbose]
40
+ [--noop], [--no-noop]
41
+ ```
42
+
@@ -0,0 +1,27 @@
1
+ ---
2
+ title: kubes get
3
+ reference: true
4
+ ---
5
+
6
+ ## Usage
7
+
8
+ kubes get [ROLE] [RESOURCE]
9
+
10
+ ## Description
11
+
12
+ Get Kubernetes resource using the compiled YAML files
13
+
14
+
15
+ ## Options
16
+
17
+ ```
18
+ [--image=IMAGE] # override image
19
+ [--compile], [--no-compile] # whether or not to compile the .kube/resources
20
+ # Default: true
21
+ o, [--output=OUTPUT] # Output format: json|yaml|wide|name
22
+ [--show-pods], [--no-show-pods] # Also show pods from deployments
23
+ # Default: true
24
+ [--verbose], [--no-verbose]
25
+ [--noop], [--no-noop]
26
+ ```
27
+
@@ -15,7 +15,7 @@ Init project
15
15
  ## Options
16
16
 
17
17
  ```
18
- a, --app=APP # Docker repo name. Example: demo-web. Generates .kubes/APP/resources folder
18
+ a, --app=APP # Docker repo name. Example: web. Generates .kubes/APP/resources folder
19
19
  [--force] # Bypass overwrite are you sure prompt for existing files
20
20
  t, [--type=TYPE] # Type: dsl or yaml
21
21
  # Default: yaml
@@ -0,0 +1,26 @@
1
+ ---
2
+ title: kubes logs
3
+ reference: true
4
+ ---
5
+
6
+ ## Usage
7
+
8
+ kubes logs
9
+
10
+ ## Description
11
+
12
+ logs from all deployment pods
13
+
14
+
15
+ ## Options
16
+
17
+ ```
18
+ [--compile], [--no-compile] # whether or not to compile the .kube/resources
19
+ # Default: true
20
+ n, [--name=NAME] # deployment name to use. IE: demo-web
21
+ f, [--follow], [--no-follow] # Follow logs
22
+ # Default: true
23
+ [--verbose], [--no-verbose]
24
+ [--noop], [--no-noop]
25
+ ```
26
+
@@ -5,4 +5,4 @@
5
5
  # bin/web -P 8888
6
6
 
7
7
  bundle exec jekyll clean
8
- exec bundle exec jekyll serve --host 0.0.0.0 "$@"
8
+ exec bundle exec jekyll serve "$@"
@@ -10,6 +10,10 @@ title: CLI Reference
10
10
  * [kubes completion_script]({% link _reference/kubes-completion_script.md %})
11
11
  * [kubes delete]({% link _reference/kubes-delete.md %})
12
12
  * [kubes deploy]({% link _reference/kubes-deploy.md %})
13
+ * [kubes describe]({% link _reference/kubes-describe.md %})
13
14
  * [kubes docker]({% link _reference/kubes-docker.md %})
15
+ * [kubes exec]({% link _reference/kubes-exec.md %})
16
+ * [kubes get]({% link _reference/kubes-get.md %})
14
17
  * [kubes init]({% link _reference/kubes-init.md %})
18
+ * [kubes logs]({% link _reference/kubes-logs.md %})
15
19
  * [kubes version]({% link _reference/kubes-version.md %})
@@ -9,6 +9,9 @@ module Kubes
9
9
  compile_option = Proc.new {
10
10
  option :compile, type: :boolean, default: true, desc: "whether or not to compile the .kube/resources"
11
11
  }
12
+ name_option = Proc.new {
13
+ option :name, aliases: %w[n], desc: "deployment name to use. IE: demo-web"
14
+ }
12
15
 
13
16
  desc "docker SUBCOMMAND", "Docker subcommands"
14
17
  long_desc Help.text(:docker)
@@ -60,15 +63,33 @@ module Kubes
60
63
  Describe.new(options.merge(role: role, resource: resource)).run
61
64
  end
62
65
 
66
+ desc "exec", "Exec into the latest container from the deployment"
67
+ long_desc Help.text(:exec)
68
+ compile_option.call
69
+ name_option.call
70
+ def exec(*cmd)
71
+ Exec.new(options.merge(cmd: cmd)).run
72
+ end
73
+
63
74
  desc "get [ROLE] [RESOURCE]", "Get Kubernetes resource using the compiled YAML files"
64
75
  long_desc Help.text(:get)
65
76
  image_option.call
66
77
  compile_option.call
67
78
  option :output, aliases: %w[o], desc: "Output format: json|yaml|wide|name"
79
+ option :show_pods, type: :boolean, default: true, desc: "Also show pods from deployments"
68
80
  def get(role=nil, resource=nil)
69
81
  Get.new(options.merge(role: role, resource: resource)).run
70
82
  end
71
83
 
84
+ desc "logs", "logs from all deployment pods"
85
+ long_desc Help.text(:logs)
86
+ compile_option.call
87
+ name_option.call
88
+ option :follow, aliases: %w[f], type: :boolean, default: true, desc: "Follow logs"
89
+ def logs(*cmd)
90
+ Logs.new(options.merge(cmd: cmd)).run
91
+ end
92
+
72
93
  long_desc Help.text(:init)
73
94
  Init.options.each { |args| option(*args) }
74
95
  register(Init, "init", "init", "Init project")
@@ -1,7 +1,7 @@
1
1
  class Kubes::CLI
2
2
  class Apply < Base
3
3
  def run
4
- Compile.new(@options).run unless @options[:compile] == false
4
+ compile
5
5
  logger.info "Deploying kubes resources"
6
6
  Kubes::Kubectl::Decider.new(:apply, @options).run
7
7
  end
@@ -5,5 +5,9 @@ class Kubes::CLI
5
5
  def initialize(options={})
6
6
  @options = options
7
7
  end
8
+
9
+ def compile
10
+ Compile.new(@options).run unless @options[:compile] == false
11
+ end
8
12
  end
9
13
  end
@@ -1,8 +1,8 @@
1
1
  class Kubes::CLI
2
2
  class Build < Base
3
3
  def run
4
- Kubes::Docker::Build.new(@options).run
5
- Kubes::Docker::Push.new(@options).run
4
+ Kubes::Docker.new(@options, "build").run
5
+ Kubes::Docker.new(@options, "push").run
6
6
  end
7
7
  end
8
8
  end
@@ -3,9 +3,14 @@ class Kubes::CLI
3
3
  include Kubes::Util::Sure
4
4
 
5
5
  def run
6
+ compile
7
+ perform(preview: true) unless @options[:yes]
6
8
  sure?("This will delete resources. Are you sure?")
7
- Compile.new(@options).run
8
- Kubes::Kubectl::Decider.new(:delete, @options).run
9
+ perform(preview: false)
10
+ end
11
+
12
+ def perform(preview: false)
13
+ Kubes::Kubectl::Decider.new(:delete, @options.merge(preview: preview)).run
9
14
  end
10
15
  end
11
16
  end
@@ -1,7 +1,7 @@
1
1
  class Kubes::CLI
2
2
  class Describe < Base
3
3
  def run
4
- Compile.new(@options).run unless @options[:compile] == false
4
+ compile
5
5
  Kubes::Kubectl.run(:describe, @options)
6
6
  end
7
7
  end
@@ -4,7 +4,7 @@ class Kubes::CLI
4
4
  long_desc Help.text("docker:build")
5
5
  option :push, type: :boolean, default: false
6
6
  def build
7
- builder = Kubes::Docker::Build.new(options)
7
+ builder = Kubes::Docker.new(options, "build")
8
8
  builder.run
9
9
  push if options[:push]
10
10
  end
@@ -13,7 +13,7 @@ class Kubes::CLI
13
13
  long_desc Help.text("docker:push")
14
14
  option :push, type: :boolean, default: false
15
15
  def push
16
- pusher = Kubes::Docker::Push.new(options)
16
+ pusher = Kubes::Docker.new(options, "push")
17
17
  pusher.run
18
18
  end
19
19
  end
@@ -0,0 +1,33 @@
1
+ class Kubes::CLI
2
+ class Exec < Base
3
+ include Kubes::Util::Sh
4
+
5
+ def run
6
+ compile
7
+ metadata = Kubes::Kubectl::Fetch::Deployment.new(@options).metadata
8
+
9
+ labels = metadata['labels'].map { |k,v| "#{k}=#{v}" }.join(',')
10
+ ns = metadata['namespace']
11
+
12
+ resp = capture("kubectl get pod -l #{labels} -n #{ns} -o json")
13
+ data = JSON.load(resp)
14
+ pod = latest_pod(data['items'])
15
+
16
+ unless pod
17
+ logger.error "ERROR: Unable to find a running pod".color(:red)
18
+ exit 1
19
+ end
20
+
21
+ name = pod['metadata']['name']
22
+ cmd = @options[:cmd].empty? ? "bash" : @options[:cmd].join(' ')
23
+ sh("kubectl exec -n #{ns} -ti #{name} -- #{cmd}")
24
+ end
25
+
26
+ # get latest running pod
27
+ def latest_pod(items)
28
+ running = items.select { |i| i['status']['phase'] == 'Running' }
29
+ sorted = running.sort_by { |i| i['metadata']['creationTimestamp'] || 0 }
30
+ sorted.last
31
+ end
32
+ end
33
+ end
@@ -1,8 +1,10 @@
1
1
  class Kubes::CLI
2
2
  class Get < Base
3
3
  def run
4
- Compile.new(@options).run unless @options[:compile] == false
4
+ compile
5
5
  Kubes::Kubectl.run(:get, @options)
6
+ pods = Kubes::Kubectl::Fetch::Pods.new(@options)
7
+ pods.show if @options[:show_pods]
6
8
  end
7
9
  end
8
10
  end
@@ -0,0 +1,17 @@
1
+ The exec command finds the latest pod from the deployment and runs `kubectl exec -ti POD bash` to get you into it. It spares you from having to manually find and type it.
2
+
3
+ ## Examples
4
+
5
+ kubes exec
6
+ kubes exec sh
7
+ kubes exec ls -l
8
+
9
+ ## Multiple Deployments
10
+
11
+ If you have have multiple deployments in your ``.kubes/resources` then the command will use the first deployment by default. You can specify the specfic deployment with the `--name` option. Examples:
12
+
13
+ kubes exec --name demo-web
14
+ kubes exec --name demo-clock
15
+ kubes exec --name demo-worker
16
+ kubes exec --name demo-web sh
17
+ kubes exec --name demo-web ls -l
@@ -0,0 +1,13 @@
1
+ class Kubes::CLI
2
+ class Logs < Base
3
+ include Kubes::Util::Sh
4
+
5
+ def run
6
+ compile
7
+ metadata = Kubes::Kubectl::Fetch::Deployment.new(@options).metadata
8
+ name = metadata['name']
9
+ follow = " -f" if @options[:follow]
10
+ sh("kubectl logs deployment/#{name}#{follow}")
11
+ end
12
+ end
13
+ end
@@ -1,7 +1,6 @@
1
1
  module Kubes::Compiler::Dsl::Syntax
2
2
  class Deployment < Resource
3
3
  fields :container, # <Object>
4
- :containers, # <[]Object>
5
4
  "matchLabels:hash", # <map[string]string>
6
5
  :sidecar, # <Object>
7
6
  :templateMetadata, # <Object>
@@ -21,6 +20,42 @@ module Kubes::Compiler::Dsl::Syntax
21
20
  fields :maxSurge, # <string>
22
21
  :maxUnavailable # <string>
23
22
 
23
+ # kubectl explain deploy.spec.template.spec
24
+ fields :activeDeadlineSeconds, # <integer>
25
+ :affinity, # <Object>
26
+ :automountServiceAccountToken, # <boolean>
27
+ :containers, # <[]Object> -required-
28
+ :dnsConfig, # <Object>
29
+ :dnsPolicy, # <string>
30
+ :enableServiceLinks, # <boolean>
31
+ :ephemeralContainers, # <[]Object>
32
+ :hostAliases, # <[]Object>
33
+ :hostIPC, # <boolean>
34
+ :hostNetwork, # <boolean>
35
+ :hostPID, # <boolean>
36
+ :hostname, # <string>
37
+ :imagePullSecrets, # <[]Object>
38
+ :initContainers, # <[]Object>
39
+ :nodeName, # <string>
40
+ :nodeSelector, # <map[string]string>
41
+ :overhead, # <map[string]string>
42
+ :preemptionPolicy, # <string>
43
+ :priority, # <integer>
44
+ :priorityClassName, # <string>
45
+ :readinessGates, # <[]Object>
46
+ :restartPolicy, # <string>
47
+ :runtimeClassName, # <string>
48
+ :schedulerName, # <string>
49
+ :securityContext, # <Object>
50
+ :serviceAccount, # <string>
51
+ :serviceAccountName, # <string>
52
+ :shareProcessNamespace, # <boolean>
53
+ :subdomain, # <string>
54
+ :terminationGracePeriodSeconds,# <integer>
55
+ :tolerations, # <[]Object>
56
+ :topologySpreadConstraints, # <[]Object>
57
+ :volumes # <[]Object>
58
+
24
59
  # kubectl explain deployment.spec.template.spec.containers
25
60
  fields :args, # <[]string>
26
61
  :command, # <[]string>
@@ -82,6 +117,11 @@ module Kubes::Compiler::Dsl::Syntax
82
117
  end
83
118
 
84
119
  def default_strategy
120
+ return unless maxUnavailable || maxSurge
121
+
122
+ maxSurge = maxUnavailable if maxUnavailable && !maxSurge
123
+ maxUnavailable = maxSurge if !maxUnavailable && maxSurge
124
+
85
125
  {
86
126
  rollingUpdate: {
87
127
  maxSurge: maxSurge,
@@ -91,14 +131,6 @@ module Kubes::Compiler::Dsl::Syntax
91
131
  }
92
132
  end
93
133
 
94
- def default_maxSurge
95
- 25
96
- end
97
-
98
- def default_maxUnavailable
99
- 25
100
- end
101
-
102
134
  def default_template
103
135
  {
104
136
  metadata: templateMetadata,
@@ -107,7 +139,42 @@ module Kubes::Compiler::Dsl::Syntax
107
139
  end
108
140
 
109
141
  def default_templateSpec
110
- { containers: containers }
142
+ {
143
+ activeDeadlineSeconds: activeDeadlineSeconds,
144
+ affinity: affinity,
145
+ automountServiceAccountToken: automountServiceAccountToken,
146
+ containers: containers,
147
+ dnsConfig: dnsConfig,
148
+ dnsPolicy: dnsPolicy,
149
+ enableServiceLinks: enableServiceLinks,
150
+ ephemeralContainers: ephemeralContainers,
151
+ hostAliases: hostAliases,
152
+ hostIPC: hostIPC,
153
+ hostNetwork: hostNetwork,
154
+ hostPID: hostPID,
155
+ hostname: hostname,
156
+ imagePullSecrets: imagePullSecrets,
157
+ initContainers: initContainers,
158
+ nodeName: nodeName,
159
+ nodeSelector: nodeSelector,
160
+ overhead: overhead,
161
+ preemptionPolicy: preemptionPolicy,
162
+ priority: priority,
163
+ priorityClassName: priorityClassName,
164
+ readinessGates: readinessGates,
165
+ restartPolicy: restartPolicy,
166
+ runtimeClassName: runtimeClassName,
167
+ schedulerName: schedulerName,
168
+ securityContext: securityContext,
169
+ serviceAccount: serviceAccount,
170
+ serviceAccountName: serviceAccountName,
171
+ shareProcessNamespace: shareProcessNamespace,
172
+ subdomain: subdomain,
173
+ terminationGracePeriodSeconds: terminationGracePeriodSeconds,
174
+ tolerations: tolerations,
175
+ topologySpreadConstraints: topologySpreadConstraints,
176
+ volumes: volumes,
177
+ }
111
178
  end
112
179
 
113
180
  def default_templateMetadata