'Kubernetes Istio Gateway & VirtualService Config Flask Example

I try to get some hands on experience with K8s & istio. I am using minikube and I try to deploy a dummy flask web-app. However, for some reason I do not manage to get the istio routing working.

E.g.

curl -v -H 'Host: hello.com' 'http://127.0.0.1/' --> 503 Service Unavailable

Do you see any issue in my specs?

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: flask-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "hello.com" 

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: flaskvirtualservice
spec:
  hosts:
  - "hello.com" 
  gateways:
  - flask-gateway
  http:
  - route:
    - destination:
        host: flask.default.svc.cluster.local
        port:
          number: 5000
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: flask
  labels:
    app: flask
spec:
  replicas: 1
  selector:
    matchLabels:
      app: flask
  template:
    metadata:
      labels:
        app: flask
    spec:
      containers:
      - name: flask
        image: digitalocean/flask-helloworld
        ports:
        - containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
  name: flask-service
spec:
  selector:
    app.kubernetes.io/name: flask
  ports:
  - name: name-of-service-port
    protocol: TCP
    port: 80
    targetPort: 5000

Thanks for your support here!

Cheers

EDIT:

here the updated service definition

apiVersion: v1
kind: Service
metadata:
  name: flask
  labels:
    app: flask
    service: flask
spec:
  ports:
  - port: 5000
    name: http
  selector:
    app: flask


Solution 1:[1]

I would suggest you look at this sample from the istio repo:

https://github.com/istio/istio/tree/master/samples/helloworld

This helloworld app is a flask app and you can find the python source code in src


Syntax

In your yaml you do not have --- between your Gateway and VirtualService.

DNS

You also don't make mention of DNS IE you need to make sure that the box you are running curl on has the ability to resolve your domain hello.com to the istio service ip. Since you are using minikube you could add an entry to your OS hosts file.

Routability

It has the ability to send requests to it, IE if you are outside the cluster you need an external ip or do something with kubectl port-forward ...

I hope this helps you sort things out!

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 jlonganecker