You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ma...@apache.org on 2023/01/20 19:10:04 UTC

[camel-karavan] branch main updated: Aws yaml update (#628)

This is an automated email from the ASF dual-hosted git repository.

marat pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-karavan.git


The following commit(s) were added to refs/heads/main by this push:
     new 06359e9a Aws yaml update (#628)
06359e9a is described below

commit 06359e9ad1ecfdede76b9d45aef4a284459091ef
Author: Mrinal Sharma <mr...@users.noreply.github.com>
AuthorDate: Fri Jan 20 14:09:58 2023 -0500

    Aws yaml update (#628)
    
    * added a rest example
    
    * Moved code to Quarkus folder
    
    * Added Storage Class
    
    * updated yaml fils to support spring-boot
    
    * update documentstion
---
 karavan-cloud/AWS.md                               |  73 +++------
 karavan-cloud/AWS/karavan-pv.yaml                  |  16 --
 karavan-cloud/AWS/karavan-pvc.yaml                 |  10 +-
 karavan-cloud/AWS/karavan-quarkus-pipeline.yaml    |   4 +-
 karavan-cloud/AWS/karavan-quarkus-task-aws.yaml    | 166 +++++++++------------
 karavan-cloud/AWS/karavan-sc.yaml                  |  10 ++
 karavan-cloud/AWS/karavan-secret.yaml              |   2 +-
 ...line.yaml => karavan-spring-boot-pipeline.yaml} |   6 +-
 .../AWS/karavan-spring-boot-task-aws.yaml          | 136 +++++++++++++++++
 karavan-cloud/AWS/kustomization.yaml               |   3 +-
 .../rest-service/quarkus/CreateNewUser.java        |  14 ++
 .../rest-service/quarkus/DeleteUserById.java       |  15 ++
 karavan-demo/rest-service/quarkus/GetAllUsers.java |  16 ++
 karavan-demo/rest-service/quarkus/GetUserById.java |  15 ++
 karavan-demo/rest-service/quarkus/Readme.md        |  11 ++
 .../rest-service/quarkus/application.properties    |  15 ++
 karavan-demo/rest-service/quarkus/users.yaml       |  78 ++++++++++
 17 files changed, 411 insertions(+), 179 deletions(-)

diff --git a/karavan-cloud/AWS.md b/karavan-cloud/AWS.md
index ac1cf582..11df2f41 100644
--- a/karavan-cloud/AWS.md
+++ b/karavan-cloud/AWS.md
@@ -26,57 +26,14 @@ Create public subnet.
     ```
     kubectl config set-context --current --namespace=karavan
     ```
-8. Create a Volume in the same region as your node. Make sure volume is in same availability-zone as your Node's EC2 instance.
-    ```
-    aws ec2 create-volume --availability-zone your-availability-zone --volume-type gp2 --size 50 --tag-specifications 'ResourceType=volume,Tags=[{Key=karavan-kubernetes,Value=karavan-kubernetes}]'
-    ```
-    copy the VolumeId, it will be used later.
-9. The Amazon EBS CSI driver isn't installed when you first create a cluster. To use the driver, you must add it as an Amazon EKS add-on or as a self-managed add-on.
-    For instructions on how to add it as an Amazon EKS add-on, see [Managing the Amazon EBS CSI driver as an Amazon EKS add-on](https://docs.aws.amazon.com/eks/latest/userguide/managing-ebs-csi.html). Before moving to the next step, wait until driver status is Active.
-10. Create your Amazon EBS CSI plugin IAM role with the AWS CLI. for more details reffer [csi-iam-role](https://docs.aws.amazon.com/eks/latest/userguide/csi-iam-role.html)
-    ``` 
-    aws eks describe-cluster --name karavan-kubernetes-cluster  --query "cluster.identity.oidc.issuer" --output text
-    ```
-    1. Create the IAM role.Copy the following contents to a file that's named aws-ebs-csi-driver-trust-policy.json. Replace 111122223333 with your account ID, region-code with your AWS Region, and EXAMPLED539D4633E53DE1B71EXAMPLE with the value that was returned in the previous step.
-       ```
-		{
-		"Version": "2012-10-17",
-		"Statement": [
-			{
-			"Effect": "Allow",
-			"Principal": {
-				"Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
-			},
-			"Action": "sts:AssumeRoleWithWebIdentity",
-			"Condition": {
-				"StringEquals": {
-				"oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com",
-				"oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa"
-				}
-			}
-			}
-			]
-		}
-       ```
-    2. Create the role. 
-       ```
-       aws iam create-role --role-name AmazonEKS_EBS_CSI_DriverRole_karavan --assume-role-policy-document file://"aws-ebs-csi-driver-trust-policy.json"
-       ```
-    3. Attach the required AWS managed policy to the role with the following command.
-       ```
-       aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy --role-name AmazonEKS_EBS_CSI_DriverRole_karavan
-       ```
-    4. Annotate the ebs-csi-controller-sa Kubernetes service account with the ARN of the IAM role. Replace 111122223333 with your account ID
-       ```
-       kubectl annotate serviceaccount ebs-csi-controller-sa \
-       -n kube-system \
-       eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/AmazonEKS_EBS_CSI_DriverRole_karavan --overwrite
-       ```
-    5. `kubectl rollout restart deployment ebs-csi-controller -n kube-system`
-    6. `eksctl utils associate-iam-oidc-provider --cluster karavan-kubernetes-cluster --approve`
+8. Create a [Storage Class](https://docs.aws.amazon.com/eks/latest/userguide/efs-csi.html#efs-install-driver ). To learn more about storage class in AWS you can [read](https://aws.amazon.com/blogs/storage/persistent-storage-for-kubernetes)
 
+ 9. Modify AWS/karavan-sc.yaml. Update fileSystemId with the fileSystemId created in above step.
+    ```
+	kubectl apply -f AWS/karavan-sc.yaml
+	```
 
-11. Install Tekton
+10. Install Tekton
     ```
     kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml
     ```
@@ -87,12 +44,13 @@ Create public subnet.
     Set `disable-affinity-assistant` equals `true`
     ```
     kubectl edit configmap feature-flags -n tekton-pipelines
+    ```
 
-12. Modify the karavan-secret.yaml file and apply Karavan Secret.
+11. Modify the karavan-secret.yaml file and apply Karavan Secret.
     ```
      kubectl apply -f AWS/karavan-secret.yaml
     ```	 
-13. Update karavan-pv.yaml with the AWS volumeId created above. If you like to use managed infispan service, update `karavan-app-deployment-public.yaml` with below details. Username / password for the infispan service should be admin/password
+12. If you like to use managed infispan service, update `karavan-app-deployment-public.yaml` with below details.    Username / password for the infispan service should be admin/password
     ```
             - env:
             - name: KUBERNETES_NAMESPACE
@@ -104,14 +62,13 @@ Create public subnet.
             - name: quarkus.infinispan-client.devservices.enabled
               value: No
     ```
-14. Create Karavan Instance and apply
+13. Create Karavan Instance and apply
     ```
     kubectl apply -k AWS --namespace karavan
     ```
-15. Install the NGINX ingress controller
+14. Open Karavan Page in browser. Karavan expose the NodePort service on node port 30365. Find out the ip addres of the cluster node and open the url
     ```
-	kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.5.1/deploy/static/provider/cloud/deploy.yaml
-	kubectl port-forward --namespace=karavan service/karavan 8080:80
+	http://NodeIP:30365
 	```
 
 15. If you want to delete the deployment
@@ -119,3 +76,9 @@ Create public subnet.
     kubectl delete -k AWS --namespace karavan
     ```
 
+
+### Optional
+1.  Access Tekton Dashboard 
+    ```
+    kubectl port-forward -n tekton-pipelines service/tekton-dashboard 9097:9097
+
diff --git a/karavan-cloud/AWS/karavan-pv.yaml b/karavan-cloud/AWS/karavan-pv.yaml
deleted file mode 100644
index b10ade01..00000000
--- a/karavan-cloud/AWS/karavan-pv.yaml
+++ /dev/null
@@ -1,16 +0,0 @@
-apiVersion: v1
-kind: PersistentVolume
-metadata:
-  name: karavan-data
-  labels:
-    type: "karavanAmazonEbs"
-spec:
-  capacity:
-    storage: 30Gi
-  accessModes:
-    - ReadWriteOnce
-  csi:
-    driver: ebs.csi.aws.com
-    fsType: ext4
-    volumeHandle: volume-id
-    
\ No newline at end of file
diff --git a/karavan-cloud/AWS/karavan-pvc.yaml b/karavan-cloud/AWS/karavan-pvc.yaml
index b3219c98..5daf9a46 100644
--- a/karavan-cloud/AWS/karavan-pvc.yaml
+++ b/karavan-cloud/AWS/karavan-pvc.yaml
@@ -7,8 +7,8 @@ spec:
     requests:
       storage: 30Gi
   accessModes:
-    - ReadWriteOnce
-  storageClassName: ""
+    - ReadWriteMany
+  storageClassName: "efs-sc"
   
 ---
 apiVersion: v1
@@ -21,7 +21,8 @@ spec:
       storage: 20Gi
   volumeMode: Filesystem
   accessModes:
-    - ReadWriteOnce
+    - ReadWriteMany
+  storageClassName: "efs-sc"
 
 ---
 apiVersion: v1
@@ -34,5 +35,6 @@ spec:
       storage: 10Gi
   volumeMode: Filesystem      
   accessModes:
-    - ReadWriteOnce
+    - ReadWriteMany
+  storageClassName: "efs-sc"
    
diff --git a/karavan-cloud/AWS/karavan-quarkus-pipeline.yaml b/karavan-cloud/AWS/karavan-quarkus-pipeline.yaml
index da18daff..f442cc05 100644
--- a/karavan-cloud/AWS/karavan-quarkus-pipeline.yaml
+++ b/karavan-cloud/AWS/karavan-quarkus-pipeline.yaml
@@ -7,13 +7,13 @@ spec:
     - name: PROJECT_ID
       type: string
   tasks:
-    - name: karavan-build-deploy
+    - name: karavan-task-dev-quarkus
       params:
         - name: project
           value: $(params.PROJECT_ID)
       taskRef:
         kind: Task
-        name: karavan-quarkus-builder
+        name: karavan-task-dev-quarkus
       workspaces:
         - name: karavan-m2-cache
           workspace: karavan-m2-cache
diff --git a/karavan-cloud/AWS/karavan-quarkus-task-aws.yaml b/karavan-cloud/AWS/karavan-quarkus-task-aws.yaml
index ef98c1f9..d05d4caf 100644
--- a/karavan-cloud/AWS/karavan-quarkus-task-aws.yaml
+++ b/karavan-cloud/AWS/karavan-quarkus-task-aws.yaml
@@ -1,43 +1,40 @@
 apiVersion: tekton.dev/v1beta1
 kind: Task
 metadata:
-  name: karavan-quarkus-builder
+  name: karavan-task-dev-quarkus
 spec:
   params:
     - name: project
       type: string 
   steps:
     - name: karavan-create-aws-ecr-repository
-      image: amazon/aws-cli:2.9.3@sha256:6a37d15ee2f17362cdd2807aeae6b0e38575ea417224d1c4999cbc2923d67da6 #tag: 2.0.52
+      image: amazon/aws-cli:2.9.16@sha256:60068fc3b68082ecab44a0e93e76ff3641247f5c4f12f3a80366ba053a45ed8d
       script: |
-         #!/usr/bin/env bash
-         echo "Configure aws-cli"
-         export NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)
-         REPO_NAME=${NAMESPACE}/$(inputs.params.project)
-         aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID 
-         aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY
-         aws configure set region $AWS_REGION
-         aws configure set output $AWS_OUTPUT 
-         password=$(aws ecr get-login-password --region ${AWS_REGION})
-         output=$(aws ecr describe-repositories --repository-names ${REPO_NAME} 2>&1)
-         if [ $? -ne 0 ]; then
-          if echo ${output} | grep -q RepositoryNotFoundException; then
-            output=$(aws ecr create-repository --repository-name ${NAMESPACE}/$(inputs.params.project) --region $AWS_REGION --tags '[{"Key":'\""$NAMESPACE"\"',"Value":"$(inputs.params.project)"}]')
-            if [ $? -ne 0 ]; then
-             >&2 echo ${output}
-             echo "Failed to create repository $REPO_NAME"
-             exit 1
-            else
-             echo "Successfully created repository $REPO_NAME"
+        #!/usr/bin/env bash
+        echo "Configure aws-cli"
+        export NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)
+        REPO_NAME=${NAMESPACE}/$(inputs.params.project)
+        aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID 
+        aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY
+        aws configure set region $AWS_REGION
+        aws configure set output $AWS_OUTPUT 
+        password=$(aws ecr get-login-password --region ${AWS_REGION})
+        output=$(aws ecr describe-repositories --repository-names ${REPO_NAME} 2>&1)
+        if [ $? -ne 0 ]; then
+            if echo ${output} | grep -q RepositoryNotFoundException; then
+                output=$(aws ecr create-repository --repository-name ${NAMESPACE}/$(inputs.params.project) --region $AWS_REGION --tags '[{"Key":'\""$NAMESPACE"\"',"Value":"$(inputs.params.project)"}]')
+                if [ $? -ne 0 ]; then
+                    >&2 echo ${output}
+                    echo "Failed to create repository $REPO_NAME"
+                    exit 1
+                else
+                    echo "Successfully created repository $REPO_NAME"
+                fi
             fi
-          else
-            >&2 echo ${output}
-            exit 1
-          fi
-         else
+        else
             >&2 echo "Repository $REPO_NAME already exist. ${output}"
-         fi
-         echo $password > /workspace/ecr_password.txt
+        fi
+        echo $password > /workspace/ecr_password.txt
       env:
         - name: AWS_ACCESS_KEY_ID
           valueFrom:
@@ -64,96 +61,71 @@ spec:
             secretKeyRef:
               name: karavan
               key: aws_account                      
-    - name: karavan-build-deploy
+    - name: karavan-task-dev-quarkus
       script: |
-          #!/usr/bin/env bash
-          KAMELETS_DIR="/kamelets"
-          if  [[ $KAMELETS_GIT_REPOSITORY == https* ]] ;
-          then
-              replacer=https://$KAMELETS_GIT_PASSWORD@
-              prefix=https://
-              url="${KAMELETS_GIT_REPOSITORY/$prefix/$replacer}"    
-              git clone --depth 1 --branch ${KAMELETS_GIT_BRANCH} $url ${KAMELETS_DIR}
-          else
-              git clone --depth 1 --branch ${KAMELETS_GIT_BRANCH} ${KAMELETS_GIT_REPOSITORY} ${KAMELETS_DIR}    
-          fi
+        #!/usr/bin/env bash
+        CHECKOUT_DIR="/scripts"
+        KAMELETS_DIR="/scripts/kamelets"
+        
+        if  [[ $GIT_REPOSITORY == https* ]] ;
+        then
+            replacer=https://$GIT_PASSWORD@
+            prefix=https://
+            url="${GIT_REPOSITORY/$prefix/$replacer}"
+            git clone --depth 1 --branch ${GIT_BRANCH} $url ${CHECKOUT_DIR}
+        else
+            git clone --depth 1 --branch ${GIT_BRANCH} ${GIT_REPOSITORY} ${CHECKOUT_DIR}
+        fi
+        
+        cd ${CHECKOUT_DIR}/$(inputs.params.project)
+        
+        entrypoint -Dcamel.jbang.version=3.20.1 camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR}
+        
+        export LAST_COMMIT=$(git rev-parse --short HEAD)
+        export DATE=$(date '+%Y%m%d%H%M%S')
+        export TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
+        export NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)
 
-          CHECKOUT_DIR="/scripts"
-          
-          if  [[ $PROJECTS_GIT_REPOSITORY == https* ]] ;
-          then
-              replacer=https://$PROJECTS_GIT_PASSWORD@
-              prefix=https://
-              url="${PROJECTS_GIT_REPOSITORY/$prefix/$replacer}"    
-              git clone --depth 1 --branch ${PROJECTS_GIT_BRANCH} $url ${CHECKOUT_DIR}
-          else
-              git clone --depth 1 --branch ${PROJECTS_GIT_BRANCH} ${PROJECTS_GIT_REPOSITORY} ${CHECKOUT_DIR}    
-          fi
+        echo "Deploying in AWS Kubernetes"
+        export TOKEN=$(cat /workspace/ecr_password.txt)
+        /opt/mvnd/bin/mvnd package \
+        -Dquarkus.container-image.build=true \
+        -Dquarkus.container-image.push=true \
+        -Dquarkus.container-image.insecure=false \
+        -Dquarkus.container-image.username=AWS \
+        -Dquarkus.container-image.password=${TOKEN} \
+        -Dquarkus.container-image.registry=$AWS_ACCOUNT.dkr.ecr.$AWS_REGION.amazonaws.com \
+        -Dquarkus.container-image.builder=jib \
+        -Dquarkus.kubernetes.deploy=true \
+        -Dquarkus.kubernetes.deployment-target=kubernetes \
+        -Dquarkus.kubernetes.add-version-to-label-selectors=false \
+        -Dquarkus.kubernetes.labels.\"app\"=$(inputs.params.project) \
+        -Dquarkus.kubernetes.labels.\"app.kubernetes.io/runtime\"=camel \
+        -Dquarkus.container-image.group=${NAMESPACE} \
+        -Dquarkus.container-image.tag=${DATE}
 
-          cd ${CHECKOUT_DIR}/$(inputs.params.project) 
-
-          entrypoint -Dcamel.jbang.version=3.20.1 camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR}
-
-          export LAST_COMMIT=$(git rev-parse --short HEAD)
-          export DATE=$(date '+%Y%m%d%H%M%S')
-          TOKEN="$(cat /workspace/ecr_password.txt)"
-          export NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)
-          /opt/mvnd/bin/mvnd package \
-            -Dquarkus.container-image.build=true \
-            -Dquarkus.container-image.push=true \
-            -Dquarkus.container-image.insecure=false \
-            -Dquarkus.container-image.username=AWS \
-            -Dquarkus.container-image.password=${TOKEN} \
-            -Dquarkus.container-image.registry=$AWS_ACCOUNT.dkr.ecr.$AWS_REGION.amazonaws.com \
-            -Dquarkus.container-image.builder=jib \
-            -Dquarkus.kubernetes.deploy=true \
-            -Dquarkus.kubernetes.deployment-target=kubernetes \
-            -Dquarkus.kubernetes.add-version-to-label-selectors=false \
-            -Dquarkus.kubernetes.labels.\"app.kubernetes.io/runtime\"=camel \
-            -Dquarkus.container-image.group=${NAMESPACE} \
-            -Dquarkus.container-image.tag=${DATE}
       image: ghcr.io/apache/camel-karavan-builder:3.18.6
       env:
-        - name: PROJECTS_GIT_REPOSITORY
+        - name: GIT_REPOSITORY
           valueFrom:
             secretKeyRef:
               name: karavan
               key: git-repository
-        - name: PROJECTS_GIT_USERNAME
+        - name: GIT_USERNAME
           valueFrom:
             secretKeyRef:
               name: karavan
               key: git-username
-        - name: PROJECTS_GIT_PASSWORD
+        - name: GIT_PASSWORD
           valueFrom:
             secretKeyRef:
               name: karavan
               key: git-password
-        - name: PROJECTS_GIT_BRANCH
+        - name: GIT_BRANCH
           valueFrom:
             secretKeyRef:
               name: karavan
               key: git-branch
-        - name: KAMELETS_GIT_REPOSITORY
-          valueFrom:
-            secretKeyRef:
-              name: karavan
-              key: git-repository
-        - name: KAMELETS_GIT_USERNAME
-          valueFrom:
-            secretKeyRef:
-              name: karavan
-              key: git-username
-        - name: KAMELETS_GIT_PASSWORD
-          valueFrom:
-            secretKeyRef:
-              name: karavan
-              key: git-password
-        - name: KAMELETS_GIT_BRANCH
-          valueFrom:
-            secretKeyRef:
-              name: karavan
-              key: git-branch      
         - name: AWS_ACCOUNT
           valueFrom:
             secretKeyRef:
diff --git a/karavan-cloud/AWS/karavan-sc.yaml b/karavan-cloud/AWS/karavan-sc.yaml
new file mode 100644
index 00000000..9378b9a2
--- /dev/null
+++ b/karavan-cloud/AWS/karavan-sc.yaml
@@ -0,0 +1,10 @@
+apiVersion: storage.k8s.io/v1
+kind: StorageClass
+metadata:
+  name: efs-sc
+provisioner: efs.csi.aws.com
+parameters:
+  provisioningMode: efs-ap
+  fileSystemId: fileSystemId
+  directoryPerms: "700"
+    
\ No newline at end of file
diff --git a/karavan-cloud/AWS/karavan-secret.yaml b/karavan-cloud/AWS/karavan-secret.yaml
index 9985351a..46e8e533 100644
--- a/karavan-cloud/AWS/karavan-secret.yaml
+++ b/karavan-cloud/AWS/karavan-secret.yaml
@@ -11,7 +11,7 @@ stringData:
   git-repository: https://github.com/mgubaidullin/karavan-demo.git
   git-password: demo
   git-username: demo
-  git-main: main
+  git-branch: main
   aws_access_key_id:  aws_access_key_id
   aws_secret_access_key: aws_secret_access_key
   aws_region: aws_region
diff --git a/karavan-cloud/AWS/karavan-quarkus-pipeline.yaml b/karavan-cloud/AWS/karavan-spring-boot-pipeline.yaml
similarity index 79%
copy from karavan-cloud/AWS/karavan-quarkus-pipeline.yaml
copy to karavan-cloud/AWS/karavan-spring-boot-pipeline.yaml
index da18daff..e07a63a7 100644
--- a/karavan-cloud/AWS/karavan-quarkus-pipeline.yaml
+++ b/karavan-cloud/AWS/karavan-spring-boot-pipeline.yaml
@@ -1,19 +1,19 @@
 apiVersion: tekton.dev/v1beta1
 kind: Pipeline
 metadata:
-  name: karavan-pipeline-dev-quarkus
+  name: karavan-pipeline-dev-spring-boot
 spec:
   params:
     - name: PROJECT_ID
       type: string
   tasks:
-    - name: karavan-build-deploy
+    - name: karavan-task-dev-spring-boot
       params:
         - name: project
           value: $(params.PROJECT_ID)
       taskRef:
         kind: Task
-        name: karavan-quarkus-builder
+        name: karavan-task-dev-spring-boot
       workspaces:
         - name: karavan-m2-cache
           workspace: karavan-m2-cache
diff --git a/karavan-cloud/AWS/karavan-spring-boot-task-aws.yaml b/karavan-cloud/AWS/karavan-spring-boot-task-aws.yaml
new file mode 100644
index 00000000..d0dff99f
--- /dev/null
+++ b/karavan-cloud/AWS/karavan-spring-boot-task-aws.yaml
@@ -0,0 +1,136 @@
+apiVersion: tekton.dev/v1beta1
+kind: Task
+metadata:
+  name: karavan-task-dev-spring-boot
+spec:
+  params:
+    - name: project
+      type: string 
+  steps:
+    - name: karavan-create-aws-ecr-repository
+      image: amazon/aws-cli:2.9.16@sha256:60068fc3b68082ecab44a0e93e76ff3641247f5c4f12f3a80366ba053a45ed8d
+      script: |
+          #!/usr/bin/env bash
+          echo "Configure aws-cli"
+          export NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)
+          REPO_NAME=${NAMESPACE}/$(inputs.params.project)
+          aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID 
+          aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY
+          aws configure set region $AWS_REGION
+          aws configure set output $AWS_OUTPUT 
+          password=$(aws ecr get-login-password --region ${AWS_REGION})
+          output=$(aws ecr describe-repositories --repository-names ${REPO_NAME} 2>&1)
+          if [ $? -ne 0 ]; then
+              if echo ${output} | grep -q RepositoryNotFoundException; then
+                  output=$(aws ecr create-repository --repository-name ${NAMESPACE}/$(inputs.params.project) --region $AWS_REGION --tags '[{"Key":'\""$NAMESPACE"\"',"Value":"$(inputs.params.project)"}]')
+                  if [ $? -ne 0 ]; then
+                      >&2 echo ${output}
+                      echo "Failed to create repository $REPO_NAME"
+                      exit 1
+                  else
+                      echo "Successfully created repository $REPO_NAME"
+                  fi
+              fi
+          else
+              >&2 echo "Repository $REPO_NAME already exist. ${output}"
+          fi
+          echo $password > /workspace/ecr_password.txt
+      env:
+        - name: AWS_ACCESS_KEY_ID
+          valueFrom:
+            secretKeyRef:
+              name: karavan
+              key: aws_access_key_id
+        - name: AWS_SECRET_ACCESS_KEY
+          valueFrom:
+            secretKeyRef:
+              name: karavan
+              key: aws_secret_access_key 
+        - name: AWS_REGION
+          valueFrom:
+            secretKeyRef:
+              name: karavan
+              key: aws_region
+        - name: AWS_OUTPUT
+          valueFrom:
+            secretKeyRef:
+              name: karavan
+              key: aws_output     
+        - name: AWS_ACCOUNT
+          valueFrom:
+            secretKeyRef:
+              name: karavan
+              key: aws_account                      
+    - name: karavan-task-dev-spring-boot
+      script: |
+          #!/usr/bin/env bash
+          CHECKOUT_DIR="/scripts"
+          KAMELETS_DIR="/scripts/kamelets"
+
+          if  [[ $GIT_REPOSITORY == https* ]] ;
+          then
+              replacer=https://$GIT_PASSWORD@
+              prefix=https://
+              url="${GIT_REPOSITORY/$prefix/$replacer}"
+              git clone --depth 1 --branch ${GIT_BRANCH} $url ${CHECKOUT_DIR}
+          else
+              git clone --depth 1 --branch ${GIT_BRANCH} ${GIT_REPOSITORY} ${CHECKOUT_DIR}
+          fi
+
+          cd ${CHECKOUT_DIR}/$(inputs.params.project)
+
+          entrypoint -Dcamel.jbang.version=3.20.1 camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR}
+
+          export LAST_COMMIT=$(git rev-parse --short HEAD)
+          export DATE=$(date '+%Y%m%d%H%M%S')
+          export TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
+          export NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)
+
+          echo "Deploying in AWS Kubernetes"
+          export TOKEN=$(cat /workspace/ecr_password.txt)
+          /opt/mvnd/bin/mvnd package k8s:build k8s:push k8s:resource k8s:apply \
+              -Pkubernetes \
+              -Djkube.namespace=${NAMESPACE} \
+              -Djkube.docker.push.username=AWS \
+              -Djkube.docker.push.password=${TOKEN} \
+              -Djkube.docker.skip.extendedAuth=true \
+              -Djkube.docker.push.registry=$AWS_ACCOUNT.dkr.ecr.$AWS_REGION.amazonaws.com \
+              -Djkube.generator.name=$AWS_ACCOUNT.dkr.ecr.$AWS_REGION.amazonaws.com/${NAMESPACE}/$(inputs.params.project):${DATE}
+
+      image: ghcr.io/apache/camel-karavan-builder:3.18.6
+      env:
+        - name: GIT_REPOSITORY
+          valueFrom:
+            secretKeyRef:
+              name: karavan
+              key: git-repository
+        - name: GIT_USERNAME
+          valueFrom:
+            secretKeyRef:
+              name: karavan
+              key: git-username
+        - name: GIT_PASSWORD
+          valueFrom:
+            secretKeyRef:
+              name: karavan
+              key: git-password
+        - name: GIT_BRANCH
+          valueFrom:
+            secretKeyRef:
+              name: karavan
+              key: git-branch
+        - name: AWS_ACCOUNT
+          valueFrom:
+            secretKeyRef:
+              name: karavan
+              key: aws_account
+        - name: AWS_REGION
+          valueFrom:
+            secretKeyRef:
+              name: karavan
+              key: aws_region                             
+  workspaces:
+    - mountPath: /root/.m2
+      name: karavan-m2-cache
+    - mountPath: /jbang/.jbang/cache
+      name: karavan-jbang-cache
\ No newline at end of file
diff --git a/karavan-cloud/AWS/kustomization.yaml b/karavan-cloud/AWS/kustomization.yaml
index 3387d4f4..4611cb53 100644
--- a/karavan-cloud/AWS/kustomization.yaml
+++ b/karavan-cloud/AWS/kustomization.yaml
@@ -3,10 +3,11 @@ kind: Kustomization
 
 resources:
 - karavan-acl.yaml
-- karavan-pv.yaml
 - karavan-pvc.yaml
 - karavan-quarkus-pipeline.yaml
+- karavan-spring-boot-pipeline.yaml
 - karavan-quarkus-task-aws.yaml
+- karavan-spring-boot-task-aws.yaml
 - karavan-app-deployment-public.yaml
 - karavan-app-service-node-port.yaml
 - pipeline-service-account.yaml
diff --git a/karavan-demo/rest-service/quarkus/CreateNewUser.java b/karavan-demo/rest-service/quarkus/CreateNewUser.java
new file mode 100644
index 00000000..e581232d
--- /dev/null
+++ b/karavan-demo/rest-service/quarkus/CreateNewUser.java
@@ -0,0 +1,14 @@
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+@Singleton
+@Named("CreateNewUser")
+public class CreateNewUser implements Processor {
+
+  public void process(Exchange exchange) throws Exception {
+      exchange.getOut().setHeader(Exchange.HTTP_RESPONSE_CODE, "202");
+  }
+}
\ No newline at end of file
diff --git a/karavan-demo/rest-service/quarkus/DeleteUserById.java b/karavan-demo/rest-service/quarkus/DeleteUserById.java
new file mode 100644
index 00000000..78e21694
--- /dev/null
+++ b/karavan-demo/rest-service/quarkus/DeleteUserById.java
@@ -0,0 +1,15 @@
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+@Singleton
+@Named("DeleteUserById")
+public class DeleteUserById implements Processor {
+
+  public void process(Exchange exchange) throws Exception {
+      exchange.getOut().setHeader(Exchange.HTTP_RESPONSE_CODE, "200");
+      exchange.getOut().setBody("User Deleted");
+  }
+}
\ No newline at end of file
diff --git a/karavan-demo/rest-service/quarkus/GetAllUsers.java b/karavan-demo/rest-service/quarkus/GetAllUsers.java
new file mode 100644
index 00000000..3399b793
--- /dev/null
+++ b/karavan-demo/rest-service/quarkus/GetAllUsers.java
@@ -0,0 +1,16 @@
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+@Singleton
+@Named("GetAllUsers")
+public class GetAllUsers implements Processor {
+
+  public void process(Exchange exchange) throws Exception {
+
+    exchange.getOut().setBody("[{\"username\":\"Karavan1\"},{\"username\":\"Karavan2\"}]");
+    exchange.getOut().setHeader(Exchange.HTTP_RESPONSE_CODE, "200");
+  }
+}
\ No newline at end of file
diff --git a/karavan-demo/rest-service/quarkus/GetUserById.java b/karavan-demo/rest-service/quarkus/GetUserById.java
new file mode 100644
index 00000000..e123af31
--- /dev/null
+++ b/karavan-demo/rest-service/quarkus/GetUserById.java
@@ -0,0 +1,15 @@
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+@Singleton
+@Named("GetUserById")
+public class GetUserById implements Processor {
+
+  public void process(Exchange exchange) throws Exception {
+      exchange.getOut().setBody("{\"username\":\"Karavan\"" +exchange.getIn().getHeader(Exchange.HTTP_PATH) + "}");
+      exchange.getOut().setHeader(Exchange.HTTP_RESPONSE_CODE, "200");
+  }
+}
\ No newline at end of file
diff --git a/karavan-demo/rest-service/quarkus/Readme.md b/karavan-demo/rest-service/quarkus/Readme.md
new file mode 100644
index 00000000..18250893
--- /dev/null
+++ b/karavan-demo/rest-service/quarkus/Readme.md
@@ -0,0 +1,11 @@
+1. This example explains the setup of Rest service using Karavan
+2. This service listen on Nodeport 30011
+3. Supported Rest API's
+   ```
+	| METHOD | PATH                                    | BODY             |RETURN   |
+	|--------|-----------------------------------------|------------------|---------|
+	| GET    | http://localhost:30011/v1/users         |                  |   200   |
+	| GET    | http://localhost:30011/v1/users/karavan |                  |   200   |
+	| DELETE | http://localhost:30011/v1/users/karavan |                  |   200   |
+    | POST   | http://localhost:30011/v1/users         |{"name":"karavan"}|   202   |
+   ```
diff --git a/karavan-demo/rest-service/quarkus/application.properties b/karavan-demo/rest-service/quarkus/application.properties
new file mode 100644
index 00000000..340eeef9
--- /dev/null
+++ b/karavan-demo/rest-service/quarkus/application.properties
@@ -0,0 +1,15 @@
+camel.karavan.project-id=openapi
+camel.karavan.project-name=OpenApi
+camel.karavan.project-description=Example to show Openapi usage
+camel.jbang.gav=org.camel.karavan.demo:openapi:1
+camel.jbang.runtime=quarkus
+camel.jbang.quarkusVersion=2.13.5.Final
+camel.jbang.dependencies=camel:microprofile-health,mvn:io.quarkus:quarkus-kubernetes,mvn:io.quarkus:quarkus-container-image-jib
+camel.health.enabled=true
+camel.health.exposure-level=full
+quarkus.container-image.name=openapi
+quarkus.kubernetes.replicas=2
+quarkus.kubernetes.ports."ports".host-port=30011
+quarkus.kubernetes.ports."ports".container-port=8080
+quarkus.kubernetes.service-type=NodePort
+quarkus.kubernetes.ports."ports".node-port=30011
\ No newline at end of file
diff --git a/karavan-demo/rest-service/quarkus/users.yaml b/karavan-demo/rest-service/quarkus/users.yaml
new file mode 100644
index 00000000..f5165c28
--- /dev/null
+++ b/karavan-demo/rest-service/quarkus/users.yaml
@@ -0,0 +1,78 @@
+- rest:
+    id: rest-c531
+    delete:
+      - id: delete-33db
+        param:
+          - name: id
+            type: path
+            dataType: integer
+            description: The user ID.
+            required: true
+        path: '/users/{id}'
+        to: 'direct:rest4'
+    get:
+      - id: get-b4ae
+        path: /users
+        description: Optional extended description in CommonMark or HTML.
+        produces: application/json
+        to: 'direct:rest1'
+      - id: get-e323
+        param:
+          - name: metadata
+            type: query
+            dataType: boolean
+            description: Optional extended description in CommonMark or HTML.
+            required: false
+          - name: id
+            type: path
+            dataType: integer
+            description: The user ID.
+            required: true
+        path: '/users/{id}'
+        to: 'direct:rest3'
+    post:
+      - id: post-9770
+        param:
+          - name: body
+            type: body
+            required: true
+        path: /users
+        consumes: application/json
+        to: 'direct:rest2'
+    path: /v1
+- route:
+    id: route-e42a
+    from:
+      uri: 'direct:rest4'
+      id: from-5726
+      steps:
+        - process:
+            ref: DeleteUserById
+            id: process-b244
+- route:
+    id: route-9e81
+    from:
+      uri: 'direct:rest1'
+      id: from-1004
+      steps:
+        - process:
+            ref: GetAllUsers
+            id: process-2fa0
+- route:
+    id: route-1f92
+    from:
+      uri: 'direct:rest3'
+      id: from-dad4
+      steps:
+        - process:
+            ref: GetUserById
+            id: process-fe23
+- route:
+    id: route-8560
+    from:
+      uri: 'direct:rest2'
+      id: from-31dd
+      steps:
+        - process:
+            ref: CreateNewUser
+            id: process-7025