{"id":21971289,"url":"https://github.com/eldada/kubeless-demo","last_synced_at":"2025-04-28T11:46:04.690Z","repository":{"id":114564412,"uuid":"149976772","full_name":"eldada/kubeless-demo","owner":"eldada","description":"A demo using Kubeless as a serverless framework on Kubernetes","archived":false,"fork":false,"pushed_at":"2018-10-16T08:29:50.000Z","size":5,"stargazers_count":7,"open_issues_count":0,"forks_count":4,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-30T09:21:37.157Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eldada.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-09-23T11:10:17.000Z","updated_at":"2023-08-25T02:20:09.000Z","dependencies_parsed_at":null,"dependency_job_id":"5517dcdd-e50c-48cd-ae97-ce03be0bcbe9","html_url":"https://github.com/eldada/kubeless-demo","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eldada%2Fkubeless-demo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eldada%2Fkubeless-demo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eldada%2Fkubeless-demo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eldada%2Fkubeless-demo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eldada","download_url":"https://codeload.github.com/eldada/kubeless-demo/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251309020,"owners_count":21568730,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-29T14:49:53.298Z","updated_at":"2025-04-28T11:46:04.683Z","avatar_url":"https://github.com/eldada.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Serverless on Kubernetes with Kubeless\nThis repository has a basic step-by-step demo of running serverless functions on [Kubernetes](https://kubernetes.io/) using [Kubeless](https://github.com/kubeless/kubeless).\n\nThe demo includes deploying Kubeless to [Minikube](https://github.com/kubernetes/minikube) and deploying two example functions.\n\n# Function runtimes\nKubeless supports multiple run times for its functions.\n```bash\nSupported Runtimes are:\npython2.7, python3.4, python3.6, nodejs6, nodejs8, nodejs_distroless8, ruby2.4, php7.2, go1.10, dotnetcore2.0, java1.8, ballerina0.981.0, jvm1.8\n```\nSee more details in [Kubeless runtimes documentation](https://kubeless.io/docs/runtimes/)\n\n\n# Demo\nBelow is the step-by-step demo of setting up local Kubernetes with Minikube, deploying Kubeless and functions.\n\n## Setup Kubernetes with Minikube\nStartup a local Kubernetes 1 node cluster with Minikube (this example is for Mac OS).\n```bash\n# Install Minikube v0.28.2\n$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.28.2/minikube-darwin-amd64 \u0026\u0026 \\\n        chmod +x minikube \u0026\u0026 \\\n        sudo mv minikube /usr/local/bin/\n\n# Start up an RBAC enabled Minikube (v0.28.2)\n$ minikube start --extra-config=apiserver.authorization-mode=RBAC\n$ kubectl create clusterrolebinding add-on-cluster-admin \\\n        --clusterrole=cluster-admin \\\n        --serviceaccount=kube-system:default\n\n# Get Minikube's IP (used later in the demo)\n$ MINIKUBE_IP=$(minikube ip)\n\n# Enable ingress controller\n$ minikube addons enable ingress\n\n# See the ingress controller pod\n$ kubectl get pod -n kube-system -l app=nginx-ingress-controller\n```\n\n## Setup Kubeless\nDeploy Kubeless\n```bash\n# Deploy the kubeless resources to the kubeless namespace\n$ kubectl create ns kubeless\n$ export RELEASE=$(curl -s https://api.github.com/repos/kubeless/kubeless/releases/latest | grep tag_name | cut -d '\"' -f 4)\n$ kubectl create -f https://github.com/kubeless/kubeless/releases/download/${RELEASE}/kubeless-${RELEASE}.yaml\n```\n\nYou can see the Kubernetes objects created by Kubeless\n```bash\n# See kubeless pod\n$ kubectl get pods -n kubeless\n\n# See kubeless deployment\n$ kubectl get deployment -n kubeless\n\n# See kubeless CRDs\n$ kubectl get customresourcedefinition\n```\n\nInstall the `kubeless` CLI for easy interaction with the framework\n```bash\n# Installing kubeless CLI using execute:\n$ export OS=$(uname -s| tr '[:upper:]' '[:lower:]')\n$ curl -OL https://github.com/kubeless/kubeless/releases/download/${RELEASE}/kubeless_${OS}-amd64.zip \u0026\u0026 \\\n        unzip kubeless_${OS}-amd64.zip \u0026\u0026 \\\n        sudo mv bundles/kubeless_${OS}-amd64/kubeless /usr/local/bin/\n\n# Check version\n$ kubeless version\n\n# See supported run-times\n$ kubeless get-server-config\n```\n\n## Python sample function\nA sample python function in [demo-python.py](functions/demo-python.py)\n\n### Deploy function\n```bash\n$ kubeless function deploy demo-python \\\n        --runtime python2.7 \\\n        --handler demo-python.hello \\\n        --from-file functions/demo-python.py\n\n# See functions\n$ kubectl get functions\n\n$ kubeless function ls\n```\n\n### Run function\n```bash\n# Using kubeless CLI\n$ kubeless function call demo-python --data 'Hello python world!'\n\n# Using http\n$ kubectl proxy -p 8080 \u0026\n$ curl -L --data '{\"Python\": \"Kube API\"}' \\\n        --header \"Content-Type:application/json\" \\\n        localhost:8080/api/v1/namespaces/default/services/demo-python:http-function-port/proxy/\n\n# Create a http trigger to get-python function:\n$ kubeless trigger http create demo-python --function-name demo-python\n$ kubectl get ing\n\n# Test the created http trigger with the following command:\n$ curl --data '{\"Python\": \"Ingress\"}' \\\n        --header \"Host: demo-python.${MINIKUBE_IP}.nip.io\" \\\n        --header \"Content-Type:application/json\" \\\n        ${MINIKUBE_IP}\n\n# Kubeless creates a default hostname in form of ..nip.io.\n# Alternatively, you can provide a real hostname with --hostname flag or use a different --path like this:\n$ kubeless trigger http create demo-python-hostname --function-name demo-python --path demo-python --hostname example.com\n$ kubectl get ing\n\n# Test the created http trigger with the following command:\n$ curl --data '{\"Python\": \"Ingress\", \"With\": \"Host\"}' \\\n        --header \"Host: example.com\" \\\n        --header \"Content-Type:application/json\" \\\n        ${MINIKUBE_IP}/demo-python\n```\n\n## Java sample function\nA sample Java function in [demo-java.java](functions/demo-java.java)\n\n### Deploy function\n```bash\n$ kubeless function deploy demo-java \\\n        --runtime java1.8 \\\n        --handler Demo.hello \\\n        --from-file functions/demo-java.java\n\n# See functions\n$ kubectl get functions\n\n$ kubeless function ls\n```\n\n### Run function\n```bash\n# Using kubeless CLI\n$ kubeless function call demo-java --data 'Hello java world!'\n\n# Using http\n$ kubectl proxy -p 8080 \u0026\n$ curl -L --data '{\"Java\": \"Kube API\"}' \\\n        --header \"Content-Type:application/json\" \\\n        localhost:8080/api/v1/namespaces/default/services/demo-java:http-function-port/proxy/\n\n# Create a http trigger to get-python function:\n$ kubeless trigger http create demo-java --function-name demo-java\n$ kubectl get ing\n\n# Test the created http trigger with the following command:\n$ curl --data '{\"Java\": \"Ingress\"}' \\\n        --header \"Host: demo-java.${MINIKUBE_IP}.nip.io\" \\\n        --header \"Content-Type:application/json\" \\\n        ${MINIKUBE_IP}\n\n# Kubeless creates a default hostname in form of ..nip.io.\n# Alternatively, you can provide a real hostname with --hostname flag or use a different --path like this:\n$ kubeless trigger http create demo-java-hostname --function-name demo-java --path demo-java --hostname example.com\n$ kubectl get ing\n\n# Test the created http trigger with the following command:\n$ curl --data '{\"Java\": \"Ingress\", \"With\": \"Host\"}' \\\n        --header \"Host: example.com\" \\\n        --header \"Content-Type:application/json\" \\\n        ${MINIKUBE_IP}/demo-java\n```\n\n\n## Clean up\nYou can delete the functions and uninstall Kubeless:\n```bash\n$ kubeless function delete demo-python\n$ kubeless function delete demo-java\n```\n\nDelete kubeless\n```bash\n$ kubectl delete -f https://github.com/kubeless/kubeless/releases/download/${RELEASE}/kubeless-${RELEASE}.yaml\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feldada%2Fkubeless-demo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feldada%2Fkubeless-demo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feldada%2Fkubeless-demo/lists"}