Skip to content

Commit

Permalink
Add kubernetes actions task in kubectl
Browse files Browse the repository at this point in the history
The task `kubectl-actions` is a generic task which can be used to perform k8s-actions. We take the whole script as a `params` whereas the existing task `kubectl-deploy` only works for deploying the pod and fulfills the specific criteria.

Signed-off-by: vinamra28 <[email protected]>
  • Loading branch information
vinamra28 committed Jun 26, 2020
1 parent e680707 commit 6a5e8fa
Show file tree
Hide file tree
Showing 6 changed files with 212 additions and 51 deletions.
182 changes: 131 additions & 51 deletions kubectl/README.md
Original file line number Diff line number Diff line change
@@ -1,53 +1,58 @@
# Kubectl

This Task deploys (or delete) a Kubernates resource (pod). It uses
[`kubectl`](https://kubernetes.io/zh/docs/reference/kubectl/kubectl/) for that.
## Install ClusterRole

## Install the Task
**CAUTION:** The `clusterrole.yaml` is just a sample, should be modified based on real requirements to avoid potential security issues.

```
kubectl apply -f https://raw.githubusercontent.com/tektoncd/catalog/v1beta1/kubectl/kubectl-deploy.yaml
kubectl apply -f https://raw.githubusercontent.com/tektoncd/catalog/master/kubectl/clusterrole.yaml
```

## Install ClusterRole
**CAUTION:** The `clusterrole.yaml` is just a sample, should be modified based on real requirements to avoid potential security issues.
## Install ClusterRolebinding

```
kubectl apply -f https://raw.githubusercontent.com/tektoncd/catalog/v1beta1/kubectl/clusterrole.yaml
kubectl apply -f https://raw.githubusercontent.com/tektoncd/catalog/master/kubectl/clusterrolebinding.yaml
```

## Install ClusterRolebinding
# `kubectl-deploy`

This Task deploys (or delete) a Kubernates resource (pod). It uses
[`kubectl`](https://kubernetes.io/zh/docs/reference/kubectl/kubectl/) for that.

## Install the Task

```
kubectl apply -f https://raw.githubusercontent.com/tektoncd/catalog/v1beta1/kubectl/clusterrolebinding.yaml
kubectl apply -f https://raw.githubusercontent.com/tektoncd/catalog/master/kubectl/kubectl-deploy.yaml
```

## Inputs
## Inputs

### Parameters

* **action**: The action to perform to the resource, support `get`, `create`, `apply`, `delete`, `replace`, `patch`.
* **manifest**: The content of the resource to deploy.
* **success-condition/failure-condition**: SuccessCondition and failureCondition are optional expressions which are evaluated upon every update of the resource. If failureCondition is ever evaluated to true, the step is considered failed. Likewise, if successCondition is ever evaluated to true the step is considered successful. It uses kubernetes label selection syntax and can be applied against any field of the resource (not just labels). Multiple AND conditions can be represented by comma delimited expressions. For more details, see: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/.
* **merge-strategy**: The strategy used to merge a patch, defaults to `strategic`, supported `strategic`, `merge` and `json`.
* **output**: Extracted from fields of the resource, only support jsonpath. Should define as a `yaml` array(array even if only one item):
```
- name: output
value: |
- name: job-name
valueFrom: '{.metadata.name}'
- name: job-namespace
valueFrom: '{.metadata.namespace}'
- **action**: The action to perform to the resource, support `get`, `create`, `apply`, `delete`, `replace`, `patch`.
- **manifest**: The content of the resource to deploy.
- **success-condition/failure-condition**: SuccessCondition and failureCondition are optional expressions which are evaluated upon every update of the resource. If failureCondition is ever evaluated to true, the step is considered failed. Likewise, if successCondition is ever evaluated to true the step is considered successful. It uses kubernetes label selection syntax and can be applied against any field of the resource (not just labels). Multiple AND conditions can be represented by comma delimited expressions. For more details, see: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/.
- **merge-strategy**: The strategy used to merge a patch, defaults to `strategic`, supported `strategic`, `merge` and `json`.
- **output**: Extracted from fields of the resource, only support jsonpath. Should define as a `yaml` array(array even if only one item):

```yaml
- name: output
value: |
- name: job-name
valueFrom: '{.metadata.name}'
- name: job-namespace
valueFrom: '{.metadata.namespace}'
```
The extracted value will be write to`/tekton/results/$(name)`.
* **set-ownerreference**: Set the `ownerReferences` for the resource as pod of `step`, default to false.

- **set-ownerreference**: Set the `ownerReferences` for the resource as pod of `step`, default to false.

## Usage

This TaskRun runs the Task to deploy the given Kubernetes resource.

```
```yaml
apiVersion: tekton.dev/v1beta1
kind: TaskRun
metadata:
Expand All @@ -56,31 +61,106 @@ spec:
taskRef:
name: kubectl-deploy-pod
params:
- name: action
value: create
- name: success-condition
value: status.phase == Running
- name: failure-condition
value: status.phase in (Failed, Error)
- name: output
value: |
- name: job-name
valueFrom: '{.metadata.name}'
- name: job-namespace
valueFrom: '{.metadata.namespace}'
- name: set-ownerreference
value: "true"
- name: manifest
value: |
apiVersion: v1
kind: Pod
metadata:
generateName: myapp-pod-
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: docker
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 30']
- name: action
value: create
- name: success-condition
value: status.phase == Running
- name: failure-condition
value: status.phase in (Failed, Error)
- name: output
value: |
- name: job-name
valueFrom: '{.metadata.name}'
- name: job-namespace
valueFrom: '{.metadata.namespace}'
- name: set-ownerreference
value: "true"
- name: manifest
value: |
apiVersion: v1
kind: Pod
metadata:
generateName: myapp-pod-
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: docker
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 30']
```

# `kubectl-actions`

This is a generic task used to perform kubernetes actions such as `kubectl get deployment` or `kubectl create -f filename.yaml`. For more commands [see](https://kubernetes.io/docs/reference/kubectl/overview/).

## Install the task

```
kubectl apply -f https://raw.githubusercontent.com/tektoncd/catalog/master/kubectl/kubectl-actions.yaml
```
## Inputs
### Parameters
- **script**: script of `kubectl` commands to execute e.g. `kubectl get pod $1 -0 yaml`. This will take the first value of ARGS as pod name (_default_: `kubectl $@`)
- **args**: args to execute which are appended to `kubectl` e.g. `start-build myapp` (_default_: `help`)
- **image**: Default image being `gcr.io/cloud-builders/kubectl`. If somebody wants to use their own image then they can provide it as a part of params.
### Workspaces
- **kubeconfig-dir**: If you want to deploy you application to another cluster then you can mount your `kubeconfig` file via this `workspace`. (Default: _emptyDir:{}_ in case `kubeconfig` is not mounted)
- **manifest-dir**: Manifest files can be provided via the workspaces.(Default: _emptyDir:{}_ in case no manifest is provided)
## Usage
In case no manifests are mounted
```yaml
apiVersion: tekton.dev/v1beta1
kind: TaskRun
metadata:
name: kubectl-run
spec:
taskRef:
name: kubectl-actions
params:
- name: SCRIPT
value: |
kubectl get pods
echo "-----------"
kubectl get deploy
workspaces:
- name: kubeconfig-dir
emptyDir: {}
- name: manifest-dir
emptyDir: {}
```

## Patch Deployment Image Example

The following [example](./examples/update-deployment-image.yaml) can be used to create a task to patch the image of a container in an existing deployment.

### Installing the Task

```
kubectl apply -f https://raw.githubusercontent.com/tektoncd/catalog/master/kubectl/examples/update-deployment-image.yaml
```

## Usage

```yaml
apiVersion: tekton.dev/v1beta1
kind: TaskRun
metadata:
name: update-deployment-run
spec:
taskRef:
name: update-deployment
params:
- name: REPLACEMENT_IMAGE
value: quay.io/vinamra2807/social-client:v2
- name: DEPLOYMENT_NAME
value: my-client-v1
```
18 changes: 18 additions & 0 deletions kubectl/examples/kubectl-actions-run.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
apiVersion: tekton.dev/v1beta1
kind: TaskRun
metadata:
name: kubectl-run
spec:
taskRef:
name: kubectl-actions
params:
- name: script
value: |
kubectl get pods
echo "---------"
kubectl get deploy
workspaces:
- name: kubeconfig-dir
emptyDir: {}
- name: manifest-dir
emptyDir: {}
File renamed without changes.
1 change: 1 addition & 0 deletions kubectl/taskrun.yaml → kubectl/examples/taskrun.yaml
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

apiVersion: tekton.dev/v1beta1
kind: TaskRun
metadata:
Expand Down
26 changes: 26 additions & 0 deletions kubectl/examples/update-deployment-image.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: update-deployment-image
spec:
params:
- name: BASE_IMAGE
default: gcr.io/cloud-builders/kubectl
description: The base image for the task.
type: string
- name: REPLACEMENT_IMAGE
description: The name of the image that needs to be replaced.
type: string
- name: DEPLOYMENT_NAME
description: The name of the deployment in which image needs to be replaced.
type: string
steps:
- name: patch-image
image: $(params.BASE_IMAGE)
script: |
kubectl patch deployment $(params.DEPLOYMENT_NAME) --patch='{"spec":{"template":{"spec":{
"containers":[{
"name": "$(params.DEPLOYMENT_NAME)",
"image":"$(params.REPLACEMENT_IMAGE)"
}]
}}}}'
36 changes: 36 additions & 0 deletions kubectl/kubectl-actions.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: kubectl-actions
spec:
workspaces:
- name: manifest-dir
- name: kubeconfig-dir
params:
- name: script
description: The Kubernetes CLI script to run
type: string
default: "kubectl $@"
- name: args
description: The Kubernetes CLI arguments to run
type: array
default:
- "help"
- name: image
default: gcr.io/cloud-builders/kubectl #image is huge
description: Kubectl wrapper image
steps:
- name: kubectl
image: $(params.image)
workingDir: $(workspaces.manifest-dir.path)
script: |
#!/usr/bin/env bash
if [[ -f $(workspaces.kubeconfig-dir.path)/kubeconfig ]]; then
export KUBECONFIG=$(workspaces.kubeconfig-dir.path)/kubeconfig
fi
$(params.script)
args:
- "$(params.args)"

0 comments on commit 6a5e8fa

Please sign in to comment.