Istio_Examples/04-Backends/02-Outboud-Traffic-Policy
2023-10-14 12:59:07 +02:00
..
2023-10-14 12:59:07 +02:00
2023-10-14 12:59:07 +02:00
2023-10-14 12:59:07 +02:00
2023-10-14 12:59:07 +02:00
2023-10-14 12:59:07 +02:00
2023-10-14 12:59:07 +02:00

Table of Contents

Description

Based on the previous example where we configured an external service through a ServiceEntry object, this example compares the behavior between setting up the MeshConfig OutboundTrafficPolicy.mode setting to REGISTRY_ONLY and ALLOW_ANY.

  • ALLOW_ANY: Allows all egress/outbound traffic from the mesh.

  • REGISTRY_ONLY: Restricted to services that figure in the service registry a and the ServiceEntry objects.

More info regarding this configuration at the pertinent documentation (https://istio.io/latest/docs/reference/config/istio.mesh.v1alpha1/#MeshConfig-OutboundTrafficPolicy-Mode)

Note:
For more information about the image used refer to here

Based on

Configuration

Gateway

Deploys an Istio gateway that's listening to the port 80 for HTTP traffic.

It doesn't filter for any specific host.

The selector field is used to "choose" which Istio Load Balancers will have this gateway assigned to.

The Istio default profile creates a Load Balancer in the namespace istio-system that has the label istio: ingressgateway set, allowing us to target that specific Load Balancer and assign this gateway resource to it.

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

Note:
The credentials resource is created further bellow through the Walkthrough steps.

Note:
For more information regarding the TLS mode configuration, refer to the following Istio documentation regarding the TLS mode field.

VirtualService

This configuration hosts 2 backends, 1 being the deployed service helloworld.default.svc.cluster.local, which will be accessible through the URL path /helloworld.

The second service will be accessible through the URL path /external, and will use as a backend the deployed ServiceEntry object, as well it has a timeout setting of 3 seconds.

This destination is the service that contains the HTTPS deployment, running over the port 8443

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: helloworld-vs
spec:
  hosts:
    - "*"
  gateways:
    - helloworld-gateway
  http:
    - match:
        - uri:
            exact: /helloworld
      route:
        - destination:
            host: helloworld
            port:
              number: 80
      rewrite:
        uri: "/"

    - timeout: 3s
      match:
        - uri:
            exact: "/external"
      route:
        - destination:
            host: help.websiteos.com
            port:
              number: 80
      rewrite:
        uri: "/websiteos/example_of_a_simple_html_page.htm"
      headers:
        request:
          set:
            HOST: "help.websiteos.com"

Service

The service will forward incoming HTTP TCP traffic from the port 80, towards the deployment port 80.

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

Deployment

Nginx deployment listens to port 80.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloworld-nginx
  labels:
    app: helloworld
spec:
  replicas: 1
  selector:
    matchLabels:
      app: helloworld
  template:
    metadata:
      labels:
        app: helloworld
    spec:
      containers:
        - name: helloworld
          image: nginx
          resources:
            requests:
              cpu: "100m"
          imagePullPolicy: IfNotPresent #Always
          ports:
            - containerPort: 80

ServiceEntry

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: external-svc
spec:
  hosts:
    - help.websiteos.com
  ports:
    - number: 80
      name: http
      protocol: HTTP
  resolution: DNS
  location: MESH_EXTERNAL

ServiceEntry

This ServiceEntry resource, defines as a destination the URL help.websiteos.com.

Note that location is set to MESH_EXTERNAL and that the resolution is set to DNS, this means that the resource is external to ou Istio Service Mesh, and the URL will be resolved through DNS

Bear in mind that when Istio is communicating with resources externals to the mesh, mTLS is disabled.

Also, policy enforcement is performed in the client side instead of the server side.

Note:/ For more information regarding the resolution field or the location field, refer to the following official Istio documentations:\

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: external-svc
spec:
  hosts:
    - help.websiteos.com
  ports:
    - number: 80
      name: http
      protocol: HTTP
  resolution: DNS
  location: MESH_EXTERNAL

Walkthrough

Set ALLOW_ANY outbound traffic policy

First step will be to have the cluster with the meshConfig.outboundTrafficPolicy.mode setting set to ALLOW_ANY.

In case you are not using a "free to destroy" sandbox, you should update the setting through the IstioOperator object.

istioctl install --set profile=default -y --set meshConfig.accessLogFile=/dev/stdout  --set meshConfig.outboundTrafficPolicy.mode=ALLOW_ANY

Deploy resources

kubectl apply -f ./
deployment.apps/helloworld-nginx created
gateway.networking.istio.io/helloworld-gateway created
service/helloworld created
serviceentry.networking.istio.io/external-svc created
virtualservice.networking.istio.io/helloworld-vs created

Get LB IP

kubectl get svc istio-ingressgateway -n istio-system
NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)                                      AGE
istio-ingressgateway   LoadBalancer   10.97.47.216   192.168.1.50   15021:31316/TCP,80:32012/TCP,443:32486/TCP   39h

Test deployments

curl 192.168.1.50/helloworld -I
HTTP/1.1 200 OK
server: istio-envoy
date: Sat, 14 Oct 2023 10:53:45 GMT
content-type: text/html
content-length: 615
last-modified: Tue, 15 Aug 2023 17:03:04 GMT
etag: "64dbafc8-267"
accept-ranges: bytes
x-envoy-upstream-service-time: 53
curl 192.168.1.50/external -I
HTTP/1.1 200 OK
date: Sat, 14 Oct 2023 10:54:13 GMT
content-type: text/html
content-length: 5186
last-modified: Mon, 17 Mar 2014 17:25:03 GMT
expires: Thu, 31 Dec 2037 23:55:55 GMT
cache-control: max-age=315360000
x-envoy-upstream-service-time: 306
server: istio-envoy

Test egress the helloworld deployment

It returns a 301 code, meaning that it was able to reach the destination, and it was attempted to redirect the traffic from HTTP to HTTPS.

kubectl exec -i -t "$(kubectl get pod -l app=helloworld | tail -n 1 | awk '{print $1}')" -- curl wikipedia.com -I
HTTP/1.1 301 Moved Permanently
server: envoy
date: Sat, 14 Oct 2023 10:54:34 GMT
content-type: text/html
content-length: 169
location: https://wikipedia.com/
x-envoy-upstream-service-time: 61

Set REGISTRY_ONLY outbound traffic policy

istioctl install --set profile=default -y --set meshConfig.accessLogFile=/dev/stdout  --set meshConfig.outboundTrafficPolicy.mode=REGISTRY_ONLY

In case you are not using a "free to destroy" sandbox, you should update the setting through the IstioOperator object.

Test (again) egress the helloworld deployment

It returns a 502 code, meaning that it wasn't able to reach the destination.

kubectl exec -i -t "$(kubectl get pod -l app=helloworld | tail -n 1 | awk '{print $1}')" -- curl wikipedia.com -I
HTTP/1.1 502 Bad Gateway
date: Thu, 20 Apr 2023 18:08:37 GMT
server: envoy
transfer-encoding: chunked

This allowed us to confirm how the setting outboundTrafficPolicy.mode influences the reachability of the traffic.

Cleanup

kubectl delete -f ./
deployment.apps "helloworld-nginx" deleted
gateway.networking.istio.io "helloworld-gateway" deleted
service "helloworld" deleted
serviceentry.networking.istio.io "external-svc" deleted
virtualservice.networking.istio.io "helloworld-vs" deleted

Links of Interest