Background
Recently I integrated a K8s system whose Ingress support is incomplete, with many features cut. However, it supports full-featured Istio, so I researched and tried Istio to see whether its features meet our needs. When integrating the system I didn’t go particularly deep into Istio’s internals — only enough to implement specific features. I may understand and use it according to my own ideas; corrections are welcome.
A Simple Introduction to Istio
Istio is an open, platform-independent service mesh providing traffic management, policy distribution, and telemetry collection.

Looking directly at the diagram, Istio’s function is traffic management within the cluster, with a visualization interface attached. Therefore if Istio provides an external egress, it can act like Ingress: traffic enters from one entrance and is forwarded to different pods.

Simple Usage After Installing Istio
I tested with minikube (1.2.0) and also used it to install Istio (1.6.8).
After Istio Is Installed
1 | kubectl -n istio-system get deploy |
Istio’s built-in Ingress: after istio is installed,
kubectl -n istio-system get deploy istio-ingressgatewayshows a built-in ingress. This ingress handles istio’s inbound traffic; it can act as an ordinary Ingress service or as istio’s gateway.
Creating External Services the Ingress Way
This approach comes from the official samples (samples/bookinfo/platform/kube/bookinfo-ingress.yaml) — of all the files, only this one is a kind: Ingress example.
Exposing interfaces with Ingress resources
It’s not quite the same as the ingress services we created before with Nginx or OpenResty, because its gateway service uses Envoy (a service proxy tool written in C++, similar to Nginx). But in istio the ingress configuration changes somewhat:

The configuration adds /* to match paths, and cannot split traffic by prefix like Nginx.
I did no further testing, but since Nginx was replaced by Envoy, some configurations are theoretically not interchangeable.
Creating External Services with gateway+vs, ds
The official samples give more of this approach, including how to split traffic and how services call each other. When creating external services we also need to specify the domain, path rules, and backend services. Thus the most minimal configuration is:
1 | # specify the gateway receiving traffic |
Distributing Traffic by Proportion
1 | # relies on the service distinguishing prod-arya-python3 and stage-arya-python3 |
Using VirtualService Together with DestinationRule
Compared with native Services, DestinationRule extends some functionality and can group by service instances. Our current version-based release approach also pairs easily with DestinationRule.
1 | # the service only selects the application name, no longer distinguishing version numbers |
Since we use istio, to be able to use some DestinationRule features later, we should follow the latter way — letting DestinationRule’s subsets split the traffic.
The kiali Interface

Summary
From the current research and usage, Istio’s IngressGateway differs somewhat from ordinary Ingress, though many functions can be replaced by it. If a project plans to use Istio from the start, I suggest not using Ingress anymore — adopt the Gateway+VirtualService form directly. Later I should also share some rules achievable with VirtualService and DestinationRule.