stock-rest-app

command
v0.0.0-...-ea02baa Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 5, 2018 License: Apache-2.0 Imports: 8 Imported by: 0

README

Stock

A simple Restful service for testing purpose. It expose an endpoint, which takes a stock ticker (stock symbol) and output the stock price. It uses the the REST resource name from environment defined in configuration.

Prerequisites

  1. Install Knative Serving
  2. Install docker

Setup

Build the app container and publish it to your registry of choice:

REPO="gcr.io/<your-project-here>"

# Build and publish the container, run from the root directory.
docker build \
  --build-arg SAMPLE=stock-rest-app \
  --tag "${REPO}/sample/stock-rest-app" \
  --file=sample/Dockerfile.golang .
docker push "${REPO}/sample/stock-rest-app"

# Replace the image reference with our published image.
perl -pi -e "s@github.com/knative/serving/sample/stock-rest-app@${REPO}/sample/stock-rest-app@g" sample/stock-rest-app/*.yaml

# Deploy the Knative Serving sample
kubectl apply -f sample/stock-rest-app/sample.yaml

Exploring

Once deployed, you can inspect the created resources with kubectl commands:

# This will show the route that we created:
kubectl get route -o yaml
# This will show the configuration that we created:
kubectl get configurations -o yaml
# This will show the Revision that was created by our configuration:
kubectl get revisions -o yaml

To access this service via curl, we first need to determine its ingress address:

watch kubectl get ingress

When the ingress is ready, you'll see an IP address in the ADDRESS field:

NAME                                 HOSTS                     ADDRESS   PORTS     AGE
stock-route-example-ela-ingress   stock-route-example.default.demo-domain.com   35.185.44.102   80        1m

Once the ADDRESS gets assigned to the cluster, you can run:

# Put the Ingress Host name into an environment variable.
export SERVICE_HOST=`kubectl get route stock-route-example -o jsonpath="{.status.domain}"`

# Put the Ingress IP into an environment variable.
export SERVICE_IP=`kubectl get ingress stock-route-example-ela-ingress -o jsonpath="{.status.loadBalancer.ingress[*]['ip']}"`

If your cluster is running outside a cloud provider (for example on Minikube), your ingress will never get an address. In that case, use the istio hostIP and nodePort as the service IP:

export SERVICE_IP=$(kubectl get po -l istio=ingress -n istio-system -o 'jsonpath={.items[0].status.hostIP}'):$(kubectl get svc istio-ingress -n istio-system -o 'jsonpath={.spec.ports[?(@.port==80)].nodePort}')

Now curl the service IP as if DNS were properly configured:

curl --header "Host:$SERVICE_HOST" http://${SERVICE_IP}
# Welcome to the stock app!
curl --header "Host:$SERVICE_HOST" http://${SERVICE_IP}/stock
# stock ticker not found!, require /stock/{ticker}
curl --header "Host:$SERVICE_HOST" http://${SERVICE_IP}/stock/<ticker>
# stock price for ticker <ticker>  is  <price>

Updating

You can update this to a new version. For example, update it with a new configuration.yaml via:

kubectl apply -f sample/stock-rest-app/updated_configuration.yaml

Once deployed, traffic will shift to the new revision automatically. You can verify the new version by checking route status:

# This will show the route that we created:
kubectl get route -o yaml

Or curling the service:

curl --header "Host:$SERVICE_HOST" http://${SERVICE_IP}
# Welcome to the share app!
curl --header "Host:$SERVICE_HOST" http://${SERVICE_IP}/share
# share ticker not found!, require /share/{ticker}
curl --header "Host:$SERVICE_HOST" http://${SERVICE_IP}/share/<ticker>
# share price for ticker <ticker>  is  <price>

Manual traffic splitting

You can manually split traffic to specific revisions. Get your revisions names via:


kubectl get revisions
NAME                                AGE
stock-configuration-example-00001   11m
stock-configuration-example-00002   4m

Update traffic part in sample/stock-rest-app/sample.yaml as:

traffic:
  - revisionName: <YOUR_FIRST_REVISION_NAME>
    percent: 50
  - revisionName: <YOUR_SECOND_REVISION_NAME>
    percent: 50

Then update your change via:

kubectl apply -f sample/stock-rest-app/sample.yaml

Once updated, you can verify the traffic splitting by looking at route status and/or curling the service.

Cleaning up

To clean up the sample service:

kubectl delete -f sample/stock-rest-app/sample.yaml

Documentation

Overview

Copyright 2018 Google LLC

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL