111 lines
4.2 KiB
Markdown
111 lines
4.2 KiB
Markdown
# Helloworld service
|
|
|
|
This sample includes two versions of a simple helloworld service that returns its version
|
|
and instance (hostname) when called.
|
|
It can be used as a test service when experimenting with version routing.
|
|
|
|
This service is also used to demonstrate canary deployments working in conjunction with autoscaling.
|
|
See [Canary deployments using Istio](https://istio.io/blog/2017/0.1-canary).
|
|
|
|
## Start the helloworld service
|
|
|
|
The following commands assume you have
|
|
[automatic sidecar injection](https://istio.io/docs/setup/additional-setup/sidecar-injection/#automatic-sidecar-injection)
|
|
enabled in your cluster.
|
|
If not, you'll need to modify them to include
|
|
[manual sidecar injection](https://istio.io/docs/setup/additional-setup/sidecar-injection/#manual-sidecar-injection).
|
|
|
|
To run both versions of the helloworld service, use the following command:
|
|
|
|
```bash
|
|
kubectl apply -f helloworld.yaml
|
|
```
|
|
|
|
Alternatively, you can run just one version at a time by first defining the service:
|
|
|
|
```bash
|
|
kubectl apply -f helloworld.yaml -l service=helloworld
|
|
```
|
|
|
|
and then deploying version v1, v2, or both:
|
|
|
|
```bash
|
|
kubectl apply -f helloworld.yaml -l version=v1
|
|
kubectl apply -f helloworld.yaml -l version=v2
|
|
```
|
|
|
|
For even more flexibility, there is also a script, `gen-helloworld.sh`, that will
|
|
generate YAML for the helloworld service. This script takes the following
|
|
arguments:
|
|
|
|
| Argument | Default | Description |
|
|
|-----------------------|---------|------------------------------------------------------------------------|
|
|
| `-h`,`--help` | | Prints usage information. |
|
|
| `--version` | `v1` | Specifies the version that will be returned by the helloworld service. |
|
|
| `--includeService` | `true` | If `true` the service will be included in the YAML. |
|
|
| `--includeDeployment` | `true` | If `true` the deployment will be included in the YAML. |
|
|
|
|
You can use this script to deploy a custom version:
|
|
|
|
```bash
|
|
./gen-helloworld.sh --version customversion | \
|
|
kubectl apply -f -
|
|
```
|
|
|
|
## Configure the helloworld gateway
|
|
|
|
*___Note:___ Istio intends to make the Kubernetes [Gateway API](https://gateway-api.sigs.k8s.io/) the default API for traffic management [in the future](https://istio.io/latest/blog/2022/gateway-api-beta/). You can use the Gateway API to configure the helloworld service, instead of the classic Istio configuration model, by following the instructions in [./gateway-api/README.md](./gateway-api/README.md), instead of the instructions below.*
|
|
|
|
Apply the helloworld gateway configuration:
|
|
|
|
```bash
|
|
kubectl apply -f helloworld-gateway.yaml
|
|
```
|
|
|
|
Follow [these instructions](https://istio.io/docs/tasks/traffic-management/ingress/ingress-control/#determining-the-ingress-ip-and-ports)
|
|
to set the INGRESS_HOST and INGRESS_PORT variables and then confirm the sample is running using curl:
|
|
|
|
```bash
|
|
export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
|
|
curl http://$GATEWAY_URL/hello
|
|
```
|
|
|
|
## Autoscale the services
|
|
|
|
Note that a Kubernetes [Horizontal Pod Autoscaler](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/)
|
|
only works if all containers in the pods request cpu. In this sample the deployment
|
|
containers in `helloworld.yaml` are configured with the request.
|
|
The injected istio-proxy containers also include cpu requests,
|
|
making the helloworld service ready for autoscaling.
|
|
|
|
Enable autoscaling on both versions of the service:
|
|
|
|
```bash
|
|
kubectl autoscale deployment helloworld-v1 --cpu-percent=50 --min=1 --max=10
|
|
kubectl autoscale deployment helloworld-v2 --cpu-percent=50 --min=1 --max=10
|
|
kubectl get hpa
|
|
```
|
|
|
|
## Generate load
|
|
|
|
```bash
|
|
./loadgen.sh &
|
|
./loadgen.sh & # run it twice to generate lots of load
|
|
```
|
|
|
|
Wait for about 2 minutes and then check the number of replicas:
|
|
|
|
```bash
|
|
kubectl get hpa
|
|
```
|
|
|
|
If the autoscaler is functioning correctly, the `REPLICAS` column should have a value > 1.
|
|
|
|
## Cleanup
|
|
|
|
```bash
|
|
kubectl delete -f helloworld.yaml
|
|
kubectl delete -f helloworld-gateway.yaml
|
|
kubectl delete hpa helloworld-v1 helloworld-v2
|
|
```
|