Istio Installation
24/04/2026

1. For years, the "Sidecar" model (injecting an Envoy proxy into every single pod) was the only way to get Mesh features. But it came with some complexity: Resource Bloat: Hundreds of sidecars eating up GBs of RAM. Operational Friction: Having to restart your entire application just to update the mesh version. Complexity: Troubleshooting network hops that felt like a "black box."
Enter Istio Ambient Mode. Launched into GA recently, it splits the mesh into two layers: The ztunnel (L4): A lightweight, shared agent that runs on each node. It handles the "Zero Trust" basics (mTLS, identity, and encryption) with almost zero latency. The Waypoint Proxy (L7): An optional, per-namespace proxy that you only spin up if you need "heavy lifting" like header-based routing or rate limiting. The Result: A 70% reduction in memory usage and a massive boost in pod density.


2. Istio for the AI Era (Agentgateway) The biggest news from KubeCon 2026 is Istio’s pivot toward AI-native infrastructure. Standard service meshes struggle with AI workloads because LLM traffic is unpredictable—long-running inference calls, massive context windows, and complex "Chain-of-Thought" patterns between agents. Istio has introduced Agentgateway (experimental), a dedicated data plane component designed specifically for: Inference Routing: Intelligently routing requests based on model availability or "token cost." Observability for Agents: Seeing exactly how AI agents are talking to each other and your internal databases. Resiliency: Preventing a single "hallucinating" or looping agent from DDOSing your internal microservices.

3. Multi-Cluster is No Longer a Nightmare Previously, connecting Istio clusters across different regions or clouds required a PhD in networking. With the Ambient Multicluster Beta (released early 2026), Istio now supports "Zero-Trust" connectivity across clusters without requiring a sidecar on either end. This allows for Global Failover by default. If your US-East cluster goes down, Istio can automatically route your traffic to US-West, maintaining mTLS and identity headers the entire way.

The Need,Istio's Solution Zero Trust,Do you need mTLS between every service without writing code? (Use ztunnel) Compliance,Do you need a cryptographically proven audit log of every request? AI Scaling,Are you worried about how AI agents will interact with your legacy APIs? (Use Agentgateway)
The Bottom Line In 2026, Istio has finally become what it always promised to be: Transparent. By adopting a "Sidecarless" architecture, it has removed the performance barriers that made developers hate it, while adding the AI-ready features that make architects love it. If you tried Istio three years ago and found it too heavy, it’s time to look again. Pro-Tip: If you’re starting a new project, don't even look at Sidecars. Go straight to Ambient Mode. Your cloud bill (and your SRE team) will thank you.

colima start 
brew install kind
kind create cluster --name istio-cluster
curl -L https://istio.io/downloadIstio | sh -
mkdir -p cluster-certs
cd cluster-certs
make ROOTCA_ORG="Acme LLC." ROOTCA_CN="Acme LLC Root CA" -f ../istio-1.29.2/tools/certs/Makefile.selfsigned.mk root-ca
make INTERMEDIATE_ORG="Acme LLC." INTERMEDIATE_CN="Acme LLC Intermediate CA" -f ../istio-1.29.2/tools/certs/Makefile.selfsigned.mk istiocluster-cacerts
k create secret generic cacerts -n istio-system --from-file=istiocluster/ca-cert.pem --from-file=istiocluster/ca-key.pem --from-file=istiocluster/root-cert.pem --from-file=istiocluster/cert-chain.pem
I had to increase my CPU to 4 and RAM to 8 since I am using colima and defaults are not sufficient. This is what you want to see when you are done with the installation:
 colima start --cpu 4 --memory 8 
Completed installation

istio-operator.yaml

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  name: control-plane
  namespace: istio-system
spec:
  profile: minimal
  meshConfig:
    outboundTrafficPolicy:
      mode: REGISTRY_ONLY
    trustDomain: acmellc.local

istioctl install -y -f istio-operator.yaml -n istio-system --revision prod
 kubectl get pods -n istio-system 
should show your istiod pod as running. Also run:
 istioctl version 
command to see some of the installed controller details.
Final step: namespace labeling. Since we used a revisioned installation, we’ll skip the generic istio-injection=enabled label. Instead, apply istio.io/rev=prod to ensure your workloads are injected and managed by the correct control plane revision.
 k label namespace default istio.io/rev=prod 
 # Copyright Istio Authors
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.

##################################################################################################
# httpbin service
##################################################################################################
apiVersion: v1
kind: ServiceAccount
metadata:
  name: httpbin
---
apiVersion: v1
kind: Service
metadata:
  name: httpbin
  labels:
    app: httpbin
    service: httpbin
spec:
  ports:
  - name: http
    port: 8000
    targetPort: 8080
  selector:
    app: httpbin
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpbin
spec:
  replicas: 1
  selector:
    matchLabels:
      app: httpbin
      version: v1
  template:
    metadata:
      labels:
        app: httpbin
        version: v1
    spec:
      serviceAccountName: httpbin
      containers:
      - image: docker.io/mccutchen/go-httpbin:v2.15.0
        imagePullPolicy: IfNotPresent
        name: httpbin
        ports:
        - containerPort: 8080  
 kubectl apply -f https://raw.githubusercontent.com/istio/istio/master/samples/httpbin/httpbin.yaml 

istioctl proxy-config secret deployment/httpbin -o json | jq -r '.dynamicActiveSecrets[0].secret.tlsCertificate.certificateChain.inlineBytes' | base64 --decode > chain.pem

openssl x509 -noout -text -in chain.pem
The issuer field reflects our custom intermediate CA names. Furthermore, the SPIFFE ID successfully implements the acmellc.local trust domain from our IstioOperator setup, overriding the default cluster.local value.
 X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication, TLS Web Client Authentication
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Authority Key Identifier: 
                2C:98:60:35:D6:03:DD:EE:60:4F:DD:46:58:DE:DB:3B:B9:DB:E1:1A
            X509v3 Subject Alternative Name: critical
                URI:spiffe://acmellc.local/ns/default/sa/httpbin

While our installation currently uses the minimal profile to deploy the control plane, a standard setup requires at least one ingress gateway to manage incoming traffic. To add this, we will deploy a separate IstioOperator using the empty profile. This profile acts as a clean slate, ensuring only the specific gateway components we define are installed, without re-deploying any additional control plane overhead.
 
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  name: global-ingress
  namespace: istio-system
spec:
  profile: empty
  revision: prod  # Important: Must match your control plane revision
  components:
    ingressGateways:
      - name: global-ingress
        enabled: true
        namespace: istio-system
        label:
          istio: ingressgateway # Standard practice
          ingress: global       # Your custom label

 istioctl install -y -f global-ingress.yaml --revision prod 
 k get pods -n istio-system 
global-ingress-b474c4545-2mbqv   1/1     Running   0              7m49s 
istiod-prod-7b5bd87ccc-gnf5z     1/1     Running   1 (137m ago)   14h 
Note: Going forward, the Kubernetes Gateway API should be the preferred method for configuring ingress and egress in Istio. Istio's Gateway resource continues to be supported, while the Ingress resource should be considered a legacy artifact.
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: my-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "example.com"
The Istio Gateway serves as the entry point configuration for the mesh. It instructs the underlying Envoy proxy on which ports, protocols, and hosts to monitor, enabling the secure exposure of HTTP and HTTPS services via standard or mutual TLS.
This configuration instructs the ingress controller—identified by its labels in the selector—to listen for HTTP requests on port 80 directed toward example.com
As long as the host names in Gateway and VirtualService match, and the VirtualService refers to the Gateway, the traffic will flow to the destination based on the rules in the VirtualService.
 k apply -f istio-gateway.yaml -n istio-system 

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: traffic-rules
  namespace: istio-system
spec:
  hosts:
  - "example.com"
  gateways:
  - my-gateway
  http:
  - route:
    - destination:      # You MUST have this level
        host: my-service
        subset: v1      # Optional
        port:
          number: 80    # Note that port is an object with 'number'
 k apply -f virtual-service.yaml 
 k get vs -n istio-system 
To get available CRDs for virtual services:
 kubectl get crd virtualservices.networking.istio.io -o jsonpath='{.spec.versions[*].name}' 
To check validation issues on the namespace:
 istioctl anaylze -n istio-system 
To uninstall everything we have built:
 istioctl uninstall 

blog-photo