What Is An Istio ServiceEntry?
Istio ServiceEntry is the way to define an endpoint that doesn’t belong to the Istio Service Registry. Once the ServiceEntry is part of the registry, it can define rules and enforce policies as if they belong to the mesh.
Istio Service Entry answers the question you probably have done several times when using a Service Mesh. How can I do the same magic with external endpoints that I can do when everything is under my service mesh scope? And Istio Service Entry objects provide precisely that:
A way to have an extended mesh managing another kind of workload or, even better, in Istio’s own words:
ServiceEntry enables adding additional entries into Istio’s internal service registry so that auto-discovered services in the mesh can access/route to these manually specified services.
These services could be external to the mesh (e.g., web APIs) or mesh-internal services that are not part of the platform’s service registry (e.g., a set of VMs talking to services in Kubernetes).
What are the main capabilities of Istio ServiceEntry?
Here you can see a sample of the YAML definition of a Service Entry:
- number: 443
In this case, we have an
external-svc-redirectServiceEntry object that is handling all calls going to the wikipedia.org, and we define the port and protocol to be used (TLS – 443) and classify this service as external to the mesh (MESH_EXTERNAL) as this is an external Web page.
You can also specify more details inside the ServiceEntry configuration, so you can, for example, define a hostname or IP and translate that to a different hostname and port because you can also specify the resolution mode you want to use for this specific Service Entry. If you see the snippet above, you will find a
resolution field with NONE value that says it will not make any particular resolution. But other values valid are the following ones:
- NONE: Assume that incoming connections have already been resolved (to a specific destination IP address).
- STATIC: Use the static IP addresses specified in endpoints as the backing instances associated with the service.
- DNS: Attempt to resolve the IP address by querying the ambient DNS asynchronously.
- DNSROUNDROBIN: Attempt to resolve the IP address by querying the ambient DNS asynchronously. Unlike DNS, DNSROUNDROBIN only uses the first IP address returned when a new connection needs to be initiated without relying on complete results of DNS resolution, and references made to hosts will be retained even if DNS records change frequently eliminating draining connection pools and connection cycling.
To define the target of the ServiceEntry, you need to specify its endpoints by using a WorkloadEntry object. To do that, you need to provide the following data:
- address: Address associated with the network endpoint without the port.
- ports: Set of ports associated with the endpoint
- weight: The load balancing weight associated with the endpoint.
- locality: The locality associated with the endpoint. A locality corresponds to a failure domain (e.g., country/region/zone).
- network: Network enables Istio to group endpoints resident in the same L3 domain/network.
What Can You Do With Istio ServiceEntry?
The number of use cases is enormous. Once a ServiceEntry is similar to what you have a Virtual Service defined, you can apply any destination rule to them to do a load balancer, a protocol switch, or any logic that can be done with the
DestinationRule object. The same applies to the rest of the Istio CRD, such as
PeerAuthorization, among others.
You can also have a graphical representation of the ServiceEntry inside Kiali, a visual representation for the Istio Service Mesh, as you can see in the picture below:
As you can define, an extended mesh with endpoints outside the Kubernetes cluster is something that is becoming more usual with the explosion of clusters available and the hybrid environments when you need to manage clusters of different topologies and not lose the centralized policy-based network management that the Istio Service Mesh provides to your platform.