kubes 0.2.6 → 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/CHANGELOG.md +5 -0
- data/docs/_docs/auto-context.md +4 -4
- data/docs/_docs/config/env.md +3 -3
- data/docs/_docs/dsl/resources/service.md +21 -5
- data/docs/_docs/learn/dsl/deploy.md +2 -0
- data/docs/_docs/learn/dsl/new-project.md +1 -2
- data/docs/_docs/learn/yaml/deploy.md +2 -0
- data/docs/_docs/learn/yaml/new-project.md +1 -1
- data/docs/_includes/intro/install.md +5 -1
- data/docs/_includes/learn/cluster.md +21 -4
- data/docs/_includes/learn/repo +0 -0
- data/docs/_includes/learn/repos.md +10 -0
- data/docs/_includes/learn/review.md +2 -2
- data/docs/_reference/kubes-apply.md +2 -2
- data/docs/_reference/kubes-delete.md +1 -1
- data/docs/_reference/kubes-deploy.md +1 -1
- data/docs/_reference/kubes-describe.md +24 -0
- data/docs/_reference/kubes-exec.md +42 -0
- data/docs/_reference/kubes-get.md +27 -0
- data/docs/_reference/kubes-init.md +1 -1
- data/docs/_reference/kubes-logs.md +26 -0
- data/docs/bin/web +1 -1
- data/docs/reference.md +4 -0
- data/lib/kubes/cli.rb +21 -0
- data/lib/kubes/cli/apply.rb +1 -1
- data/lib/kubes/cli/base.rb +4 -0
- data/lib/kubes/cli/delete.rb +7 -2
- data/lib/kubes/cli/describe.rb +1 -1
- data/lib/kubes/cli/exec.rb +33 -0
- data/lib/kubes/cli/get.rb +3 -1
- data/lib/kubes/cli/help/exec.md +17 -0
- data/lib/kubes/cli/logs.rb +13 -0
- data/lib/kubes/compiler/dsl/syntax/deployment.rb +72 -2
- data/lib/kubes/compiler/dsl/syntax/service.rb +11 -0
- data/lib/kubes/hooks/builder.rb +2 -1
- data/lib/kubes/kubectl.rb +15 -3
- data/lib/kubes/kubectl/batch.rb +8 -1
- data/lib/kubes/kubectl/fetch/base.rb +24 -0
- data/lib/kubes/kubectl/fetch/deployment.rb +34 -0
- data/lib/kubes/kubectl/fetch/pods.rb +21 -0
- data/lib/kubes/util/sh.rb +1 -0
- data/lib/kubes/version.rb +1 -1
- data/lib/templates/dsl/.kubes/resources/web/deployment.rb +2 -1
- data/lib/templates/dsl/.kubes/resources/web/service.rb +1 -1
- metadata +14 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f6a93c63c1e8d4aeea46969a491b3065c97e9a1a290bfd871286e794c35cb0d6
|
4
|
+
data.tar.gz: d8dbb91a1214bf8c42a5c9dd1e591dfcf6c41ffee6feb36af0af2f7b3a519ebd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dfc13591d144fb99837297c4c766354ceed410df631e505e54517e9759b9b44b03ce9adb7738db167b55c877d7f47bbd644f1bb832df38c4213651243fcbe668
|
7
|
+
data.tar.gz: 9ed84b118c29ec8531407f4b069840d1c576eb6f120f58ead3a8560242af44b62ca3b6339f4949a5433c64fc966003d65f2871134b0ed17984cc2f461b9537bd
|
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,11 @@
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
4
4
|
This project *loosely tries* to adhere to [Semantic Versioning](http://semver.org/), even before v1.0.
|
5
5
|
|
6
|
+
## [0.3.0]
|
7
|
+
- #19 new commands: exec, logs
|
8
|
+
- delete preview
|
9
|
+
- show pods as part of get
|
10
|
+
|
6
11
|
## [0.2.6]
|
7
12
|
- #18 gcloud builder. change to config.builder
|
8
13
|
|
data/docs/_docs/auto-context.md
CHANGED
@@ -22,7 +22,7 @@ You can override configs on a per-env basis with `config/env` files. Examples:
|
|
22
22
|
```ruby
|
23
23
|
Kubes.configure do |config|
|
24
24
|
config.repo = "222222222222.dkr.ecr.us-west-2.amazonaws.com/demo"
|
25
|
-
config.kubectl.context = "dev-
|
25
|
+
config.kubectl.context = "dev-cluster"
|
26
26
|
end
|
27
27
|
```
|
28
28
|
|
@@ -31,7 +31,7 @@ end
|
|
31
31
|
```ruby
|
32
32
|
Kubes.configure do |config|
|
33
33
|
config.repo = "333333333333.dkr.ecr.us-west-2.amazonaws.com/demo"
|
34
|
-
config.kubectl.context = "prod-
|
34
|
+
config.kubectl.context = "prod-cluster"
|
35
35
|
end
|
36
36
|
```
|
37
37
|
|
@@ -39,8 +39,8 @@ end
|
|
39
39
|
|
40
40
|
With this setup, when you deploy with kubes, it will automatically switch the kubectl context based on `KUBES_ENV`. Example:
|
41
41
|
|
42
|
-
KUBES_ENV=dev kubes deploy # to dev-
|
43
|
-
KUBES_ENV=prod kubes deploy # to prod-
|
42
|
+
KUBES_ENV=dev kubes deploy # to dev-cluster context
|
43
|
+
KUBES_ENV=prod kubes deploy # to prod-cluster context
|
44
44
|
|
45
45
|
## context_keep Option
|
46
46
|
|
data/docs/_docs/config/env.md
CHANGED
@@ -11,7 +11,7 @@ Kubes.configure do |config|
|
|
11
11
|
config.repo = "111111111111.dkr.ecr.us-west-2.amazonaws.com/demo"
|
12
12
|
config.logger.level = "info"
|
13
13
|
# auto-switching
|
14
|
-
# config.kubectl.context = "dev-
|
14
|
+
# config.kubectl.context = "dev-cluster"
|
15
15
|
# config.kubectl.context_keep = false
|
16
16
|
end
|
17
17
|
```
|
@@ -25,7 +25,7 @@ You can override configs on a per-env basis with `config/env` files. Examples:
|
|
25
25
|
```ruby
|
26
26
|
Kubes.configure do |config|
|
27
27
|
config.repo = "222222222222.dkr.ecr.us-west-2.amazonaws.com/demo"
|
28
|
-
config.kubectl.context = "dev-
|
28
|
+
config.kubectl.context = "dev-cluster"
|
29
29
|
end
|
30
30
|
```
|
31
31
|
|
@@ -34,7 +34,7 @@ end
|
|
34
34
|
```ruby
|
35
35
|
Kubes.configure do |config|
|
36
36
|
config.repo = "333333333333.dkr.ecr.us-west-2.amazonaws.com/demo"
|
37
|
-
config.kubectl.context = "prod-
|
37
|
+
config.kubectl.context = "prod-cluster"
|
38
38
|
end
|
39
39
|
```
|
40
40
|
|
@@ -46,15 +46,31 @@ spec:
|
|
46
46
|
|
47
47
|
## DSL Methods
|
48
48
|
|
49
|
-
Here's a list of
|
49
|
+
Here's a list of some of the methods:
|
50
|
+
|
51
|
+
kubectl explain service.spec
|
52
|
+
|
53
|
+
* clusterIP
|
54
|
+
* externalIPs
|
55
|
+
* externalName
|
56
|
+
* externalTrafficPolicy
|
57
|
+
* healthCheckNodePort
|
58
|
+
* ipFamily
|
59
|
+
* loadBalancerIP
|
60
|
+
* loadBalancerSourceRanges
|
61
|
+
* ports
|
62
|
+
* publishNotReadyAddresses
|
63
|
+
* selector
|
64
|
+
* sessionAffinity
|
65
|
+
* sessionAffinityConfig
|
66
|
+
* type
|
67
|
+
|
68
|
+
kubectl explain service.spec.ports
|
50
69
|
|
51
70
|
* nodePort
|
52
71
|
* port
|
53
|
-
* portName: Note this field doesn't match the original field name. It's more qualified.
|
54
|
-
* ports
|
72
|
+
* portName: : Note this field doesn't match the original field name. It's more qualified.
|
55
73
|
* protocol
|
56
|
-
* selector
|
57
74
|
* targetPort
|
58
|
-
* type
|
59
75
|
|
60
76
|
{% include dsl/methods.md name="service" %}
|
@@ -7,11 +7,10 @@ If you already a project with an existing Dockerfile, you can use that. If you d
|
|
7
7
|
mkdir demo
|
8
8
|
cd demo
|
9
9
|
|
10
|
-
|
10
|
+
{% include learn/repos.md %}
|
11
11
|
|
12
12
|
Let's generate a starter project:
|
13
13
|
|
14
|
-
$ REPO=$(aws ecr describe-repositories --repository-name demo | jq -r '.repositories[].repositoryUri')
|
15
14
|
$ kubes init --app demo --repo $REPO --type dsl
|
16
15
|
create .kubes/config.rb
|
17
16
|
create .kubes/config/env/dev.rb
|
@@ -4,7 +4,7 @@ Install kubes via RubyGems.
|
|
4
4
|
|
5
5
|
gem install kubes
|
6
6
|
|
7
|
-
Ruby 2.7 and
|
7
|
+
Ruby 2.7 and above is recommended.
|
8
8
|
|
9
9
|
## kubectl
|
10
10
|
|
@@ -13,3 +13,7 @@ Kubes calls kubectl. Kubes has been tested with kubectl v1.15+. Generally, it sh
|
|
13
13
|
## docker
|
14
14
|
|
15
15
|
Kubes calls docker. Kubes has been tested with docker 18.x-ce+. Generally, it should work with most versions of docker.
|
16
|
+
|
17
|
+
## gcloud
|
18
|
+
|
19
|
+
If you are using the [gcloud builder](% link _docs/config/builder.md %), set up and configure the [gcloud cli](https://cloud.google.com/sdk/install).
|
@@ -1,12 +1,12 @@
|
|
1
|
-
You'll need a Kubernetes cluster and a Docker repo to be able to push to. Setting up a Kubernetes cluster is a little bit out scope for this tutorial. We'll provide the docs and links though. We'll
|
1
|
+
You'll need a Kubernetes cluster and a Docker repo to be able to push to. Setting up a Kubernetes cluster is a little bit out scope for this tutorial. We'll provide the docs and links though. We'll provide instructions for AWS and Google.
|
2
2
|
|
3
|
-
## Create an EKS cluster
|
3
|
+
## AWS: Create an EKS cluster
|
4
4
|
|
5
5
|
Here are the AWS docs to create an EKS cluster:
|
6
6
|
|
7
7
|
* [Creating an Amazon EKS cluster](https://docs.aws.amazon.com/eks/latest/userguide/create-cluster.html)
|
8
8
|
|
9
|
-
## Create an ECR Repo
|
9
|
+
## AWS: Create an ECR Repo
|
10
10
|
|
11
11
|
Here are the AWS docs to create a repo:
|
12
12
|
|
@@ -19,4 +19,21 @@ Here are also the commands to create an ECR repo:
|
|
19
19
|
|
20
20
|
We'll be using the `$REPO` variable for the rest of the tutorial.
|
21
21
|
|
22
|
-
|
22
|
+
## Google: Create GKE Cluster
|
23
|
+
|
24
|
+
Here are the Google docs to create an GKE cluster:
|
25
|
+
|
26
|
+
* [Creating an Google GKE cluster](https://cloud.google.com/kubernetes-engine/docs/how-to/creating-a-regional-cluster)
|
27
|
+
|
28
|
+
## Google: GCR Repo
|
29
|
+
|
30
|
+
For google, you do not have to create a repo. You simply push to the right repo url. Example:
|
31
|
+
|
32
|
+
export GOOGLE_PROJECT=project-123
|
33
|
+
REPO=gcr.io/$GOOGLE_PROJECT/demo
|
34
|
+
|
35
|
+
## Repo Variable
|
36
|
+
|
37
|
+
We'll be using the `$REPO` variable for the rest of the tutorial.
|
38
|
+
|
39
|
+
Note: Though we're using AWS and Google here, Kubes works with any Cloud Provider. Please adjust your commands and the `$REPO` variable for your cloud provider.
|
File without changes
|
@@ -0,0 +1,10 @@
|
|
1
|
+
For this tutorial, here are examples of AWS ECR and Google GCR repos, though any repo will work.
|
2
|
+
|
3
|
+
AWS:
|
4
|
+
|
5
|
+
REPO=$(aws ecr describe-repositories --repository-name demo | jq -r '.repositories[].repositoryUri')
|
6
|
+
|
7
|
+
Google:
|
8
|
+
|
9
|
+
export GOOGLE_PROJECT=project-123
|
10
|
+
REPO=gcr.io/$GOOGLE_PROJECT/demo
|
@@ -4,10 +4,10 @@ The `config.rb` is where you can configure Kubes settings.
|
|
4
4
|
|
5
5
|
```ruby
|
6
6
|
Kubes.configure do |config|
|
7
|
-
config.repo = "112233445566.dkr.ecr.us-west-2.amazonaws.com/demo"
|
7
|
+
config.repo = "112233445566.dkr.ecr.us-west-2.amazonaws.com/demo" # may be gcr.io/project-123/demo
|
8
8
|
config.logger.level = "info"
|
9
9
|
# auto-switching
|
10
|
-
# config.kubectl.context = "dev-
|
10
|
+
# config.kubectl.context = "dev-cluster"
|
11
11
|
end
|
12
12
|
```
|
13
13
|
|
@@ -5,11 +5,11 @@ reference: true
|
|
5
5
|
|
6
6
|
## Usage
|
7
7
|
|
8
|
-
kubes apply [
|
8
|
+
kubes apply [ROLE] [RESOURCE]
|
9
9
|
|
10
10
|
## Description
|
11
11
|
|
12
|
-
Apply the Kubernetes YAML files without
|
12
|
+
Apply the Kubernetes YAML files without building docker image
|
13
13
|
|
14
14
|
|
15
15
|
## Options
|
@@ -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:
|
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
|
+
|
data/docs/bin/web
CHANGED
data/docs/reference.md
CHANGED
@@ -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 %})
|
data/lib/kubes/cli.rb
CHANGED
@@ -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")
|
data/lib/kubes/cli/apply.rb
CHANGED
data/lib/kubes/cli/base.rb
CHANGED
data/lib/kubes/cli/delete.rb
CHANGED
@@ -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
|
-
|
8
|
-
|
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
|
data/lib/kubes/cli/describe.rb
CHANGED
@@ -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
|
data/lib/kubes/cli/get.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
class Kubes::CLI
|
2
2
|
class Get < Base
|
3
3
|
def run
|
4
|
-
|
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>
|
@@ -104,7 +139,42 @@ module Kubes::Compiler::Dsl::Syntax
|
|
104
139
|
end
|
105
140
|
|
106
141
|
def default_templateSpec
|
107
|
-
{
|
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
|
+
}
|
108
178
|
end
|
109
179
|
|
110
180
|
def default_templateMetadata
|
@@ -33,8 +33,19 @@ module Kubes::Compiler::Dsl::Syntax
|
|
33
33
|
|
34
34
|
def default_spec
|
35
35
|
{
|
36
|
+
clusterIP: clusterIP,
|
37
|
+
externalIPs: externalIPs,
|
38
|
+
externalName: externalName,
|
39
|
+
externalTrafficPolicy: externalTrafficPolicy,
|
40
|
+
healthCheckNodePort: healthCheckNodePort,
|
41
|
+
ipFamily: ipFamily,
|
42
|
+
loadBalancerIP: loadBalancerIP,
|
43
|
+
loadBalancerSourceRanges: loadBalancerSourceRanges,
|
36
44
|
ports: ports,
|
45
|
+
publishNotReadyAddresses: publishNotReadyAddresses,
|
37
46
|
selector: selector,
|
47
|
+
sessionAffinity: sessionAffinity,
|
48
|
+
sessionAffinityConfig: sessionAffinityConfig,
|
38
49
|
type: type,
|
39
50
|
}
|
40
51
|
end
|
data/lib/kubes/hooks/builder.rb
CHANGED
data/lib/kubes/kubectl.rb
CHANGED
@@ -9,17 +9,29 @@ module Kubes
|
|
9
9
|
|
10
10
|
def run
|
11
11
|
validate!
|
12
|
+
|
13
|
+
options = @options.dup
|
14
|
+
options[:exit_on_fail] = exit_on_fail unless exit_on_fail.nil?
|
15
|
+
|
12
16
|
params = args.flatten.join(' ')
|
13
17
|
command = "kubectl #{@name} #{params}" # @name: apply or delete
|
14
|
-
|
15
|
-
options[:exit_on_fail] = exit_on_fail unless exit_on_fail.nil?
|
18
|
+
|
16
19
|
switch_context do
|
17
20
|
run_hooks(@name) do
|
18
|
-
|
21
|
+
if options[:capture]
|
22
|
+
capture(command, options)
|
23
|
+
else
|
24
|
+
sh(command, options)
|
25
|
+
end
|
19
26
|
end
|
20
27
|
end
|
21
28
|
end
|
22
29
|
|
30
|
+
def execute(args, options={})
|
31
|
+
command = "kubectl #{args}"
|
32
|
+
capture(command)
|
33
|
+
end
|
34
|
+
|
23
35
|
# Useful for kustomize mode
|
24
36
|
def validate!
|
25
37
|
return true unless Kubes.kustomize?
|
data/lib/kubes/kubectl/batch.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
class Kubes::Kubectl
|
2
2
|
class Batch
|
3
|
+
include Kubes::Logging
|
3
4
|
include Kubes::Util::Consider
|
4
5
|
include Ordering
|
5
6
|
|
@@ -8,8 +9,14 @@ class Kubes::Kubectl
|
|
8
9
|
end
|
9
10
|
|
10
11
|
def run
|
12
|
+
# @options[:preview] is really only used for kubectl delete
|
13
|
+
logger.info "Will run:" if @options[:preview]
|
11
14
|
sorted_files.each do |file|
|
12
|
-
|
15
|
+
if @options[:preview]
|
16
|
+
logger.info " kubectl #{@name} -f #{file}"
|
17
|
+
else
|
18
|
+
Kubes::Kubectl.run(@name, @options.merge(file: file))
|
19
|
+
end
|
13
20
|
end
|
14
21
|
end
|
15
22
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "json"
|
2
|
+
|
3
|
+
module Kubes::Kubectl::Fetch
|
4
|
+
class Base
|
5
|
+
include Kubes::Logging
|
6
|
+
include Kubes::Util::Sh
|
7
|
+
|
8
|
+
def initialize(options={})
|
9
|
+
@options = options
|
10
|
+
end
|
11
|
+
|
12
|
+
def fetch_items
|
13
|
+
o = {
|
14
|
+
capture: true,
|
15
|
+
output: "json",
|
16
|
+
show_command: false,
|
17
|
+
}
|
18
|
+
kubectl = Kubes::Kubectl.new(:get, @options.merge(o)) # kubes get -f .kubes/output
|
19
|
+
resp = kubectl.run
|
20
|
+
data = JSON.load(resp)
|
21
|
+
data['items']
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Kubes::Kubectl::Fetch
|
2
|
+
class Deployment < Base
|
3
|
+
def metadata
|
4
|
+
items = fetch_items
|
5
|
+
# Not checking if deployment exists because kubes will error on `kubes get` from missing deployments already
|
6
|
+
deployments = items.select { |i| i['kind'] == "Deployment" }
|
7
|
+
|
8
|
+
if deployments.size > 1 && !@options[:name]
|
9
|
+
names = deployments.map { |d| d['metadata']['name'] }
|
10
|
+
logger.info <<~EOL
|
11
|
+
INFO: More than one deployment found.
|
12
|
+
Deployment names: #{names.join(', ')}
|
13
|
+
Using #{names.first}
|
14
|
+
Note: You can specify the deployment to use with --name
|
15
|
+
EOL
|
16
|
+
end
|
17
|
+
|
18
|
+
deployment = find_deployment(deployments)
|
19
|
+
unless deployment
|
20
|
+
logger.error "ERROR: No deployment found".color(:red)
|
21
|
+
exit 1
|
22
|
+
end
|
23
|
+
deployment['metadata']
|
24
|
+
end
|
25
|
+
|
26
|
+
def find_deployment(deployments)
|
27
|
+
if @options[:name]
|
28
|
+
deployments.find { |d| d['metadata']['name'] == @options[:name] }
|
29
|
+
else
|
30
|
+
deployments.first
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Kubes::Kubectl::Fetch
|
2
|
+
class Pods < Base
|
3
|
+
def show
|
4
|
+
items = fetch_items
|
5
|
+
# Not checking if deployment exists because kubes will error on `kubes get` from missing deployments already
|
6
|
+
deployments = items.select { |i| i['kind'] == "Deployment" }
|
7
|
+
|
8
|
+
deployments.each do |deployment|
|
9
|
+
logger.info "Pods for deployment #{deployment['metadata']['name']}:".color(:green)
|
10
|
+
show_for(deployment)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def show_for(deployment)
|
15
|
+
metadata = deployment['metadata']
|
16
|
+
labels = metadata['labels'].map { |k,v| "#{k}=#{v}" }.join(',')
|
17
|
+
ns = metadata['namespace']
|
18
|
+
sh("kubectl get pod -l #{labels} -n #{ns}")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/kubes/util/sh.rb
CHANGED
@@ -32,6 +32,7 @@ module Kubes::Util
|
|
32
32
|
|
33
33
|
def capture(command, options={})
|
34
34
|
exit_on_fail = options[:exit_on_fail].nil? ? true : options[:exit_on_fail]
|
35
|
+
logger.info "=> #{command}" if options[:show_command]
|
35
36
|
out = `#{command}`.strip
|
36
37
|
unless $?.success?
|
37
38
|
logger.error "ERROR: running #{command}".color(:red)
|
data/lib/kubes/version.rb
CHANGED
@@ -7,4 +7,5 @@ image built_image # IE: user/<%= app %>:kubes-2020-06-13T19-55-16-43afc6e
|
|
7
7
|
# revisionHistoryLimit 1 # uncomment to reduce old ReplicaSets, default is 10 https://bit.ly/3hqrzyP
|
8
8
|
# maxUnavailable 25
|
9
9
|
|
10
|
-
# More docs: kubes.guru/docs/dsl/deployment/
|
10
|
+
# More docs: kubes.guru/docs/dsl/resources/deployment/
|
11
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kubes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tung Nguyen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-08-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -317,6 +317,8 @@ files:
|
|
317
317
|
- docs/_includes/layering/layers.md
|
318
318
|
- docs/_includes/learn/cluster.md
|
319
319
|
- docs/_includes/learn/next-steps.md
|
320
|
+
- docs/_includes/learn/repo
|
321
|
+
- docs/_includes/learn/repos.md
|
320
322
|
- docs/_includes/learn/review.md
|
321
323
|
- docs/_includes/learn/start.md
|
322
324
|
- docs/_includes/reference.md
|
@@ -329,11 +331,15 @@ files:
|
|
329
331
|
- docs/_reference/kubes-completion_script.md
|
330
332
|
- docs/_reference/kubes-delete.md
|
331
333
|
- docs/_reference/kubes-deploy.md
|
334
|
+
- docs/_reference/kubes-describe.md
|
332
335
|
- docs/_reference/kubes-docker-build.md
|
333
336
|
- docs/_reference/kubes-docker-help.md
|
334
337
|
- docs/_reference/kubes-docker-push.md
|
335
338
|
- docs/_reference/kubes-docker.md
|
339
|
+
- docs/_reference/kubes-exec.md
|
340
|
+
- docs/_reference/kubes-get.md
|
336
341
|
- docs/_reference/kubes-init.md
|
342
|
+
- docs/_reference/kubes-logs.md
|
337
343
|
- docs/_reference/kubes-version.md
|
338
344
|
- docs/_sass/bootstrap-overrides.scss
|
339
345
|
- docs/_sass/buttons.scss
|
@@ -457,12 +463,15 @@ files:
|
|
457
463
|
- lib/kubes/cli/deploy.rb
|
458
464
|
- lib/kubes/cli/describe.rb
|
459
465
|
- lib/kubes/cli/docker.rb
|
466
|
+
- lib/kubes/cli/exec.rb
|
460
467
|
- lib/kubes/cli/get.rb
|
461
468
|
- lib/kubes/cli/help.rb
|
462
469
|
- lib/kubes/cli/help/completion.md
|
463
470
|
- lib/kubes/cli/help/completion_script.md
|
464
471
|
- lib/kubes/cli/help/deploy.md
|
472
|
+
- lib/kubes/cli/help/exec.md
|
465
473
|
- lib/kubes/cli/init.rb
|
474
|
+
- lib/kubes/cli/logs.rb
|
466
475
|
- lib/kubes/cli/sequence.rb
|
467
476
|
- lib/kubes/command.rb
|
468
477
|
- lib/kubes/compiler.rb
|
@@ -533,6 +542,9 @@ files:
|
|
533
542
|
- lib/kubes/kubectl/args/standard.rb
|
534
543
|
- lib/kubes/kubectl/batch.rb
|
535
544
|
- lib/kubes/kubectl/decider.rb
|
545
|
+
- lib/kubes/kubectl/fetch/base.rb
|
546
|
+
- lib/kubes/kubectl/fetch/deployment.rb
|
547
|
+
- lib/kubes/kubectl/fetch/pods.rb
|
536
548
|
- lib/kubes/kubectl/kustomize.rb
|
537
549
|
- lib/kubes/kubectl/ordering.rb
|
538
550
|
- lib/kubes/logger.rb
|