GPU-Live/template/prd/istio-1.23.1/samples/helloworld/README.md

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
```