From c623e38eb4489a9611663b474db9199cfbf67412 Mon Sep 17 00:00:00 2001 From: Benoit Jaunin Date: Mon, 10 Feb 2020 09:12:06 +0100 Subject: [PATCH] Kubernetes service (#5) * Add kubernetes service tasks * Update README.md with appropriate screenshot and tasks --- README.md | 5 + kubernetes-service/README.md | 98 ++++++++++++++ ...ice-sample-tekton-pipeline-definitions.png | Bin 0 -> 22010 bytes ...tekton-pipeline-environment-properties.png | Bin 0 -> 20583 bytes ...sample-tekton-pipeline-sample-triggers.png | Bin 0 -> 28265 bytes ...etes-service-sample-toolchain-overview.png | Bin 0 -> 28719 bytes .../sample/listener-kubernetes-service.yaml | 67 ++++++++++ .../sample/pipeline-kubernetes-service.yaml | 51 +++++++ .../task-fetch-iks-cluster-config.yaml | 126 ++++++++++++++++++ .../task-kubernetes-contextual-execution.yaml | 60 +++++++++ 10 files changed, 407 insertions(+) create mode 100644 kubernetes-service/README.md create mode 100644 kubernetes-service/sample/kubernetes-service-sample-tekton-pipeline-definitions.png create mode 100644 kubernetes-service/sample/kubernetes-service-sample-tekton-pipeline-environment-properties.png create mode 100644 kubernetes-service/sample/kubernetes-service-sample-tekton-pipeline-sample-triggers.png create mode 100644 kubernetes-service/sample/kubernetes-service-sample-toolchain-overview.png create mode 100644 kubernetes-service/sample/listener-kubernetes-service.yaml create mode 100644 kubernetes-service/sample/pipeline-kubernetes-service.yaml create mode 100644 kubernetes-service/task-fetch-iks-cluster-config.yaml create mode 100644 kubernetes-service/task-kubernetes-contextual-execution.yaml diff --git a/README.md b/README.md index ce7259f..6b5fbe4 100644 --- a/README.md +++ b/README.md @@ -10,3 +10,8 @@ Catalog of Tasks usable in [Continuous Delivery Tekton Pipelines](https://cloud. - **containerize-task**: This task is building and pushing an image to [IBM Cloud Container Registry](https://cloud.ibm.com/docs/services/Registry?topic=registry-getting-started). This taks is relying on [Buildkit](https://github.com/moby/buildkit) to perform the build of the image. [Documentation is here](./container-registry/README.md) - **vulnerability-advisor-task**: This task is verifying that a [Vulnerability Advisor scan](https://cloud.ibm.com/docs/services/Registry?topic=va-va_index) has been made for the image and process the outcome of the scan. [Documentation is here](./container-registry/README.md) + +## IBM Cloud Kubernetes Service related tasks + +- **fetch-iks-cluster-config**: This task is fetching the configuration of a [IBM Cloud Kubernetes Service cluster](https://cloud.ibm.com/docs/containers?topic=containers-getting-started) that is required to perform `kubectl` commands. [Documentation is here](./kubernetes-service/README.md) +- **kubernetes-contextual-execution**: This task is executing bash snippet/script in the context of a Kubernetes cluster configuration. [Documentation is here](./kubernetes-service/README.md) diff --git a/kubernetes-service/README.md b/kubernetes-service/README.md new file mode 100644 index 0000000..92508b9 --- /dev/null +++ b/kubernetes-service/README.md @@ -0,0 +1,98 @@ +# Kubernetes-Service related tasks + +- **fetch-iks-cluster-config**: This task is fetching the configuration of a [IBM Cloud Kubernetes Service cluster](https://cloud.ibm.com/docs/containers?topic=containers-getting-started) that is required to perform `kubectl` commands. +- **kubernetes-contextual-execution**: This task is executing bash snippet/script in the context of a Kubernetes cluster configuration. + +**WARNING: These tasks needs to run on Kubernetes cluster with minimal version 1.16. If you are using your own Delivery Pipeline Private Worker to run your tekton pipeline(s), ensure your cluster is updated to this version at least.** + +## Install the Tasks +- Add a github integration in your toolchain to the repository containing the task (https://github.com/open-toolchain/tekton-catalog) +- Add that github integration to the Definitions tab of your Continuous Delivery tekton pipeline, with the Path set to `kubernetes-service` + +## Fetch IKS Cluster Configuration helper task + +### Inputs + +#### Context - ConfigMap/Secret + + The task expects the following kubernetes resources to be defined: + +* **Secret cd-secret** + + Secret containing: + * **API_KEY**: An IBM Cloud Api Key use to access to the IBM Cloud Container registry service (https://cloud.ibm.com/iam/apikeys) + + See [sample TriggerTemplate](./sample/listener-kubernetes-service.yaml) on how to create the secret using `resourcetemplates` in a `TriggerTemplate` + +#### Resources + +* **cluster**: The Cluster PipelineResource that will be updated as output of this task. Only the name property is used to identify the cluster name. + +#### Parameters + +* **task-pvc**: the output pvc - this is the name of the PVC that is mounted for the execution of the task +* **resourceGroup**: (optional) target resource group (name or id) for the ibmcloud login operation. +* **clusterRegion**: (optional) the ibmcloud region hosting the target cluster. If not specified, it will use the toolchain region as a default. +* **clusterPipelineResourcesDirectoryFallback**: (optional) that will be used as a fallback mechanism to store the kubeconfig file for the target cluster (expressed by the inputs) + +### Outputs + +#### Resources + +* **cluster**: The Cluster PipelineResource that will be updated as output of this task. + +## Kubernetes Contextual Execution helper task + +### Inputs + +#### Context - ConfigMap/Secret + + The task expects the following kubernetes resources to be defined: + +* **Secret cd-secret** + + Secret containing: + * **API_KEY**: An IBM Cloud Api Key use to access to the IBM Cloud Container registry service (https://cloud.ibm.com/iam/apikeys) + + See [sample TriggerTemplate](./sample/listener-kubernetes-service.yaml) on how to create the secret using `resourcetemplates` in a `TriggerTemplate` + +#### Resources + +* **cluster**: The Cluster PipelineResource that corresponds to the kubernetes cluster target for the kubectl command execution. + +#### Parameters + +* **task-pvc**: the output pvc - this is the name of the PVC that is mounted for the execution of the task +* **task-pvc-mountpath**: the mountpath for the pvc (default to `/artifacts`) +* **clusterPipelineResourcesDirectory**: directory in which the kubeconfig file(s) for clusterPipelineResources are available (default to `/workspace` but this may need to be a combination of `task-pvc-mountpath` and `fetch-iks-cluster-config#clusterPipelineResourcesDirectoryFallback` if cluster pipeline resource update is not made by the `fetch-iks-cluster-config` task - ie using the fallback mechanism of kubeconfig copy to the pipelinerun pvc) +* **script**: the bash snippet to execute within the context of the kubernetes configuration (default to `kubectl version`) + +# Usage +The `sample` sub-directory contains an EventListener definition that you can include in your tekton pipeline configuration to run an example usage of the `fetch-iks-cluster-config` and `kubernetes-contextual-execution` tasks. + +1) Create a toolchain (or update a toolchain) to include: + + - the git repository that you want to clone, which can be private + - the repository containing this tekton task + - a tekton pipeline definition + + ![Toolchain overview](./sample/kubernetes-service-sample-toolchain-overview.png) + +2) Add the definitions: + + - for the tasks and the sample (`kubernetes-service` and `kubernetes-service/sample` paths) + + ![Tekton pipeline definitions](./sample/kubernetes-service-sample-tekton-pipeline-definitions.png) + +3) Add the environment properties: + + - `apikey` to provide an API key used for the ibmcloud login/access + - `clusterName` to indicate the name of the IKS cluster that you want to target + + ![Tekton pipeline environment properties](./sample/kubernetes-service-sample-tekton-pipeline-environment-properties.png) + +4) Create a manual trigger to start the sample listener + + ![Tekton pipeline sample trigger](./sample/kubernetes-service-sample-tekton-pipeline-sample-triggers.png) + +5) Run the pipeline diff --git a/kubernetes-service/sample/kubernetes-service-sample-tekton-pipeline-definitions.png b/kubernetes-service/sample/kubernetes-service-sample-tekton-pipeline-definitions.png new file mode 100644 index 0000000000000000000000000000000000000000..45b24ef1a20247d11c09bfd7a1e88690298a7b8f GIT binary patch literal 22010 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 X(8~1VJm6}DnwsZ9-;W#IBC>x1hE@YO literal 0 HcmV?d00001 diff --git a/kubernetes-service/sample/kubernetes-service-sample-tekton-pipeline-environment-properties.png b/kubernetes-service/sample/kubernetes-service-sample-tekton-pipeline-environment-properties.png new file mode 100644 index 0000000000000000000000000000000000000000..aff42474696bef1625deb7b1cdfa4de3ff3d45b1 GIT binary patch literal 20583 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 literal 0 HcmV?d00001 diff --git a/kubernetes-service/sample/kubernetes-service-sample-toolchain-overview.png b/kubernetes-service/sample/kubernetes-service-sample-toolchain-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..24f99688b0588f23fc4f9f7650cfa8fe7489de48 GIT binary patch literal 28719 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 KP literal 0 HcmV?d00001 diff --git a/kubernetes-service/sample/listener-kubernetes-service.yaml b/kubernetes-service/sample/listener-kubernetes-service.yaml new file mode 100644 index 0000000..acec7fc --- /dev/null +++ b/kubernetes-service/sample/listener-kubernetes-service.yaml @@ -0,0 +1,67 @@ +apiVersion: tekton.dev/v1alpha1 +kind: TriggerTemplate +metadata: + name: trigger-template-kubernetes-service +spec: + params: + - name: apikey + description: the ibmcloud api key + - name: clusterName + description: the name of the cluster to target + resourcetemplates: + - apiVersion: v1 + kind: Secret + metadata: + name: cd-secret + type: Opaque + stringData: + API_KEY: $(params.apikey) + - apiVersion: tekton.dev/v1alpha1 + kind: PipelineResource + metadata: + name: the-cluster + spec: + type: cluster + params: + - name: name + value: $(params.clusterName) + - name: username + value: norealvalueneeded + - name: url + value: https://no.real.value.needed + - name: token + value: norealvalueneeded + - name: cadata + value: norealvalueneeded + - apiVersion: tekton.dev/v1alpha1 + kind: PipelineRun + metadata: + name: pipelinerun-$(uid) + spec: + pipelineRef: + name: pipeline-kubernetes-service + resources: + - name: target-cluster + resourceRef: + name: the-cluster + params: + - name: pipeline-pvc + value: pipelinerun-$(uid)-pvc +--- +apiVersion: tekton.dev/v1alpha1 +kind: TriggerBinding +metadata: + name: trigger-binding-kubernetes-service +spec: + params: +--- +apiVersion: tekton.dev/v1alpha1 +kind: EventListener +metadata: + name: event-listener-kubernetes-service +spec: + triggers: + - binding: + name: trigger-binding-kubernetes-service + template: + name: trigger-template-kubernetes-service diff --git a/kubernetes-service/sample/pipeline-kubernetes-service.yaml b/kubernetes-service/sample/pipeline-kubernetes-service.yaml new file mode 100644 index 0000000..1877448 --- /dev/null +++ b/kubernetes-service/sample/pipeline-kubernetes-service.yaml @@ -0,0 +1,51 @@ +apiVersion: tekton.dev/v1alpha1 +kind: Pipeline +metadata: + name: pipeline-kubernetes-service +spec: + params: + - name: pipeline-pvc + description: the pipeline pvc name + resources: + - name: target-cluster + type: cluster + tasks: + - name: pipeline-0-setup-task + taskRef: + name: fetch-iks-cluster-config + params: + - name: task-pvc + value: $(params.pipeline-pvc) + - name: clusterPipelineResourcesDirectoryFallback + value: .tekton-clusters + resources: + inputs: + - name: cluster + resource: target-cluster + outputs: + - name: cluster + resource: target-cluster + - name: pipeline-1-kubectl-task + taskRef: + name: kubernetes-contextual-execution + params: + - name: task-pvc + value: $(params.pipeline-pvc) + - name: task-pvc-mountpath + value: /pipelinerun + - name: clusterPipelineResourcesDirectory + value: /pipelinerun/.tekton-clusters + - name: script + value: | + echo "** Here is the kubectl version:" + kubectl version + echo "** Here is the kubectl cluster-info:" + kubectl cluster-info + echo "** Here are the kubectl namespaces:" + kubectl get namespaces + resources: + inputs: + - name: cluster + resource: target-cluster + from: + - pipeline-0-setup-task diff --git a/kubernetes-service/task-fetch-iks-cluster-config.yaml b/kubernetes-service/task-fetch-iks-cluster-config.yaml new file mode 100644 index 0000000..31dfb0c --- /dev/null +++ b/kubernetes-service/task-fetch-iks-cluster-config.yaml @@ -0,0 +1,126 @@ +apiVersion: tekton.dev/v1alpha1 +kind: Task +metadata: + name: fetch-iks-cluster-config +spec: + inputs: + params: + - name: task-pvc + description: the task pvc - this is the volume where the files (Dockerfile etc..) are expected to be + - name: ibmcloudApi + description: the ibmcloud api + default: https://cloud.ibm.com + - name: continuous-delivery-context-secret + description: name of the configmap containing the continuous delivery pipeline context secrets + default: cd-secret + - name: resourceGroup + description: target resource group (name or id) for the ibmcloud login operation + default: '' + - name: clusterRegion + description: (optional) the ibmcloud region hosting the cluster (if none is found it will default to the toolchain region) + default: '' + - name: kubeAPIServerAccessible + description: | + indicates if the kubeAPIServer is exposed which is not the case for IBM Cloud Public Shared Workers (Calico network policy). + If 'true', the task is trying to update the Cluster Pipeline Resources definition with the appropriate informations + When 'false', the fallback mechanism (copy file(s)) is used. + default: 'false' + - name: clusterPipelineResourcesDirectoryFallback + description: directory in the task-pvc that will be used as a fallback mechanism to store the kubeconfig file + default: .tekton-cluster-pipeline-resources + resources: + # Will be set as optional when tekton version support it + - name: cluster + type: cluster + outputs: + resources: + # Will be set as optional when tekton version support it + - name: cluster + type: cluster + steps: + - name: setup + image: ibmcom/pipeline-base-image + workingDir: /artifacts + env: + - name: API_KEY + valueFrom: + secretKeyRef: + name: $(inputs.params.continuous-delivery-context-secret) + key: API_KEY + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + command: ["/bin/bash", "-c"] + args: + - | + set -e -o pipefail + ########################################################################## + # Setting HOME explicitly to have ibmcloud plugins available + # doing the export rather than env definition is a workaround + # until https://github.com/tektoncd/pipeline/issues/1836 is fixed + export HOME="/root" + ########################################################################## + ibmcloud config --check-version false + if [ "$(inputs.params.clusterRegion)" ]; then + TARGET_REGION=$(inputs.params.clusterRegion) + else + TARGET_REGION=$(jq -r '.region_id' /cd-config/toolchain.json | awk -F: '{print $3}') + fi + ibmcloud login -a $(inputs.params.ibmcloudApi) -r $TARGET_REGION --apikey $API_KEY + # Look for the cluster + if ibmcloud ks cluster get $(inputs.resources.cluster.name); then + KUBECONFIG_FILE=$(ibmcloud ks cluster config $(inputs.resources.cluster.name) --export -s | awk -F= '{print $2}') + else + echo "Cluster $(inputs.resources.cluster.name) not found. Accessible clusters are:" + ibmcloud ks clusters + exit 1 + fi + + # PipelineResource Cluster are managed appropriately as input resources + # but not as output resources, attempting to update the PipelineResource Cluster + # that has been given (using kubectl patch commands) + # Verifying the access to pipeline resources + updateClusterPipelineResource="false" + if [ "$(inputs.params.kubeAPIServerAccessible)" == "true" ]; then + if kubectl auth can-i get pipelineresources.tekton.dev > /dev/null 2>&1; then + updateClusterPipelineResource="true" + fi + fi + if [ "$updateClusterPipelineResource" == "true" ]; then + # TODO Need to update the Cluster Pipeline Resource with this values + # This can only be done when TriggerTemplate#resourcetemplates will accept + # Role and Binding K8S resources definition + echo "TODO - Processing $KUBECONFIG_FILE" + K8S_USER_NAME=$(yq r $KUBECONFIG_FILE users[0].name) + K8S_USER_TOKEN=$(yq r $KUBECONFIG_FILE users[0].user.auth-provider.config.id-token) + K8S_CLUSTER_URL=$(yq r $KUBECONFIG_FILE clusters[0].cluster.server) + CA_PEM_FILE="$(dirname $KUBECONFIG_FILE)/$(yq r $KUBECONFIG_FILE clusters[0].cluster.certificate-authority)" + K8S_CLUSTER_CADATA=$(base64 -w0 $CA_PEM_FILE) + echo "K8S_USER_NAME=$K8S_USER_NAME" + #echo "K8S_USER_TOKEN=$K8S_USER_TOKEN" + echo "K8S_CLUSTER_URL=$K8S_CLUSTER_URL" + #echo "K8S_CLUSTER_CADATA=$K8S_CLUSTER_CADATA" + else + echo "Access to pipelineresources.tekton.dev is required to update Cluser Pipeline Resource accordingly" + echo "Falling back to copy of $(basename $KUBECONFIG_FILE) to the pipeline run volume" + mkdir -p /artifacts/$(inputs.params.clusterPipelineResourcesDirectoryFallback)/$(inputs.resources.cluster.name) + cp $(dirname $KUBECONFIG_FILE)/$(yq r $KUBECONFIG_FILE clusters[0].cluster.certificate-authority) /artifacts/$(inputs.params.clusterPipelineResourcesDirectoryFallback)/$(inputs.resources.cluster.name) + cp $KUBECONFIG_FILE /artifacts/$(inputs.params.clusterPipelineResourcesDirectoryFallback)/$(inputs.resources.cluster.name)/kubeconfig + echo "Kubeconfig file(s) copied to /artifacts/$(inputs.params.clusterPipelineResourcesDirectoryFallback)/$(inputs.resources.cluster.name)" + fi + volumeMounts: + - mountPath: /artifacts + name: task-volume + - mountPath: /cd-config + name: cd-config-volume + volumes: + - name: task-volume + persistentVolumeClaim: + claimName: $(inputs.params.task-pvc) + - name: cd-config-volume + configMap: + name: toolchain + items: + - key: toolchain.json + path: toolchain.json \ No newline at end of file diff --git a/kubernetes-service/task-kubernetes-contextual-execution.yaml b/kubernetes-service/task-kubernetes-contextual-execution.yaml new file mode 100644 index 0000000..cc5cce5 --- /dev/null +++ b/kubernetes-service/task-kubernetes-contextual-execution.yaml @@ -0,0 +1,60 @@ +apiVersion: tekton.dev/v1alpha1 +kind: Task +metadata: + name: kubernetes-contextual-execution +spec: + inputs: + params: + - name: task-pvc + description: the task pvc - this is the volume valid for the lifetime of the pipelinerun + - name: task-pvc-mountpath + default: /artifacts + # As Cluster Pipeline Resources are not properly updated after kubernetes cluster setup + # Allow user to specify kubeconfig copy fallback directory provided by fetch-iks-cluster-context task + - name: clusterPipelineResourcesDirectory + description: directory in which the kubeconfig file(s) for clusterPipelineResources are available + default: /workspace + - name: script + description: the bash snippet to execute within the context of the kubernetes configuration + default: 'kubectl version' + resources: + - name: cluster + type: cluster + steps: + - name: execute + image: ibmcom/pipeline-base-image + workingDir: $(inputs.params.task-pvc-mountpath) + env: + - name: KUBECONFIG + value: $(inputs.params.clusterPipelineResourcesDirectory)/$(inputs.resources.cluster.name)/kubeconfig + - name: BUILD_NUMBER + valueFrom: + fieldRef: + fieldPath: metadata.annotations['devops.cloud.ibm.com/build-number'] + command: ["/bin/bash", "-c"] + args: + - | + # Validate KUBECONFIG + if test -f "$KUBECONFIG"; then + echo "KUBECONFIG=$KUBECONFIG" + else + echo "$KUBECONFIG file is not existing. Exiting now..." + exit 1 + fi + # User-defined snippet/script + $(inputs.params.script) + volumeMounts: + - mountPath: $(inputs.params.task-pvc-mountpath) + name: task-volume + - mountPath: /cd-config + name: cd-config-volume + volumes: + - name: task-volume + persistentVolumeClaim: + claimName: $(inputs.params.task-pvc) + - name: cd-config-volume + configMap: + name: toolchain + items: + - key: toolchain.json + path: toolchain.json