Skip to content

Deploy applications on Kubernetes

We now have the required environment Kubernetes, Gloo and Istio setup, as part of this chapter let us setup the services that will interact.

For this demo we will use three simple microservices namely customer, preference and recommendation; customer and preference services will be deployed on the Kubernetes cluster1 and the recommendation will be on the vm1.

Image title

Demo Service Interactions

All the applications used this demo are available as helm charts in my GitHub repo, let us add that helm repo,

helm repo add istio-demo-apps https://github.com/kameshsampath/istio-demo-apps
helm repo update

Now doing a helm search repo istio-demo-apps should show the following apps,

NAME                            CHART VERSION   APP VERSION     DESCRIPTION
istio-demo-apps/customer        0.1.0           1.0.0           A Helm chart to deploy customer demo application
istio-demo-apps/preference      0.1.0           1.0.0           A Helm chart to deploy Preference demo application
istio-demo-apps/recommendation  0.1.0           1.0.0           A Helm chart for A Helm chart to deploy recommendation demo application

Enable automatic sidecar injection on the default namespace,

kubectl label ns default istio.io/rev=1-11-5 --overwrite

Important

Since we use revision based we use istio.io/rev label. If you have already labelled the namespace with istio-injection=enabled then remove it by,

kubectl label ns default istio-injection-

Deploy customer service,

helm install --kube-context="$CLUSTER1" \
  customer istio-demo-apps/customer \
  --set enableIstioGateway="true"

Resources

Pods and Services

kubectl --context="$CLUSTER1" get svc,pods
NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
service/kubernetes   ClusterIP   172.18.0.1    <none>        443/TCP    39h
service/customer     ClusterIP   172.18.7.18   <none>        8080/TCP   3m9s

NAME                            READY   STATUS    RESTARTS   AGE
pod/customer-59f5854d89-cm84k   2/2     Running   0          3m9s

Gateway and Virtual Services

kubectl --context="$CLUSTER1" get gw,svc
NAME                                           AGE
gateway.networking.istio.io/customer-gateway   4m57s

NAME                                                GATEWAYS               HOSTS   AGE
virtualservice.networking.istio.io/customer-v1-vs   ["customer-gateway"]   ["*"]   4m57s

Interacting with Services

Retrieve the Istio Ingress Gateway url to access the application,

export INGRESS_GATEWAY_IP=$(kubectl --context ${CLUSTER1} -n istio-gateways get svc ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].*}')
export SVC_URL="${INGRESS_GATEWAY_IP}/customer"

Call Service

Call the service using the script,

$DEMO_HOME/bin/call_service.sh

Poll Service

Poll the service using the script,

$DEMO_HOME/bin/poll_service.sh

Using Default Browser

Open the URL in the browser open http://$SVC_URL.

The service calls will fail with error,

customer => Service host 'http://preference:8080' not known.

Let us deploy preference service,

helm install --kube-context="$CLUSTER1" preference istio-demo-apps/preference

Now getting pods and services should show the following output,

kubectl --context="$CLUSTER1" get svc,pods
NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
service/kubernetes   ClusterIP   172.18.0.1    <none>        443/TCP    39h
service/customer     ClusterIP   172.18.7.18   <none>        8080/TCP   30m
service/preference   ClusterIP   172.18.6.50   <none>        8080/TCP   73s

NAME                             READY   STATUS    RESTARTS   AGE
pod/customer-6bbb45d7db-5db6l    2/2     Running   0          11m
pod/preference-b95d64c99-9wjfp   2/2     Running   0          72s

Now calling the customer service again,

curl $SVC_URL

The command should shown an output like,

customer => preference => Service host 'http://recommendation:8080' not known.%

Excellent! We not got our Kubernetes services ready. In next chapter lets deploy the recommendation service and make services to work together.