Skip to main content

Setup Mulesoft Runtime Fabric with Native Istio Virtual Service (for Service Mesh)

Setting up MuleSoft Runtime Fabric (RTF) with a Native Istio Virtual Service is a powerful way to leverage service mesh capabilities for your Mule applications.


Architecture Overview

The following diagram illustrates the traffic flow from the Istio Ingress Gateway to your Mule application pod via Istio resources.

       ┌──────────────────────────────┐
│ istio-ingressgateway │
│ (Envoy proxy in pod) │
└──────────────┬───────────────┘


Gateway resource
(Defines hostnames, ports, TLS certs, protocol)


VirtualService resource
(Defines routing rules — path → service mapping)


Kubernetes Service (app)


Application Pod


1. Install and Configure Istio CLI

First, download the Istio CLI and set up your environment variables.

# Download and install Istio
curl -L https://istio.io/downloadIstio | sh -

# Move into the package directory
ISTIO_DIR=$(ls -d istio-* | head -n 1)
cd $ISTIO_DIR

# Add istioctl to your PATH
export PATH=$PWD/bin:$PATH

2. Install Istio in the Kubernetes Cluster

Install Istio using the default configuration profile.

istioctl install --set profile=default -y

3. Configure TLS Secrets

If you intend to use HTTPS, you must create a TLS Secret. This secret needs to be applied to both the RTF namespace and the istio-system namespace to ensure the ingress gateway can access the certificates.

Apply to the rtf Namespace

apiVersion: v1
kind: Secret
metadata:
name: istio-vs-tls
namespace: rtf
labels:
rtf.mulesoft.com/synchronized: "true"
data:
tls.crt: <base64-encoded-cert>
tls.key: <base64-encoded-key>
type: kubernetes.io/tls

Apply to the istio-system Namespace

apiVersion: v1
kind: Secret
metadata:
name: istio-vs-tls
namespace: istio-system
labels:
rtf.mulesoft.com/synchronized: "true"
data:
tls.crt: <base64-encoded-cert>
tls.key: <base64-encoded-key>
type: kubernetes.io/tls


4. Create the Istio Gateway

Create an Istio Gateway resource in the istio-system namespace. This gateway will reference the istio-ingressgateway and the TLS secret created in the previous step.

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: istio-gwvs-tw360
namespace: istio-system
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 443
name: https
protocol: HTTPS
hosts:
- "*.istiovirtualservice.techworld360.io"
- "istiovirtualservice.techworld360.io"
tls:
mode: SIMPLE
credentialName: istio-vs-tls

Verify the Gateway:

kubectl get gw -n istio-system


5. Apply the HTTPRoute Templates

The HTTPRouteTemplate tells the RTF agent how to automatically create a VirtualService whenever a Mule application is deployed. Apply a separate template for each specific endpoint pattern.

Template for Root Host

apiVersion: rtf.mulesoft.com/v1
kind: HTTPRouteTemplate
metadata:
name: istio-virtualservice-hrt
namespace: rtf
spec:
baseEndpoints:
- https://istiovirtualservice.techworld360.io
resources:
- |
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: {{ .ResourceName }}
namespace: {{ .Namespace }}
spec:
hosts:
- {{ .Host }}
gateways:
- istio-system/istio-gwvs-tw360
http:
- match:
- uri:
prefix: {{ .Path }}
route:
- destination:
host: {{ .Service.Name }}
port:
number: {{ .Service.Port }}

Template for Wildcard Host

apiVersion: rtf.mulesoft.com/v1
kind: HTTPRouteTemplate
metadata:
name: istio-virtualservice-wildcard-hrt
namespace: rtf
spec:
baseEndpoints:
- https://*.istiovirtualservice.techworld360.io
resources:
- |
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: {{ .ResourceName }}
namespace: {{ .Namespace }}
spec:
hosts:
- {{ .Host }}
gateways:
- istio-system/istio-gwvs-tw360
http:
- match:
- uri:
prefix: {{ .Path }}
route:
- destination:
host: {{ .Service.Name }}
port:
number: {{ .Service.Port }}


6. Configure RBAC for the RTF Agent

The RTF agent requires permissions to manage Istio and Gateway API resources within your application namespace.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: rtf-agent-gateway-role-virtual-service
namespace: rtf-appnamespace
rules:
- apiGroups: ["gateway.networking.k8s.io", "networking.istio.io"]
resources: ["httproutes", "gateways", "virtualservices"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: rtf-agent-gateway-binding-virtualservice
namespace: rtf-appnamespace
subjects:
- kind: ServiceAccount
name: rtf-agent
namespace: rtf
roleRef:
kind: Role
name: rtf-agent-gateway-role-virtual-service
apiGroup: rbac.authorization.k8s.io


7. Verification

After deploying your application from the Anypoint Runtime Manager UI, verify the status of the backend resources.

A. Check Application Pods

kubectl get po -n rtf-appnamespace

B. Check the Kubernetes Service

kubectl get svc -n rtf-appnamespace

C. Check the VirtualService

Ensure that the VirtualService was successfully created by the RTF agent and points to the correct gateway and host.

kubectl get vs -n rtf-appnamespace