, ,

Istio Service Mesh Design for VKS Clusters (VCAP-VKS Exam Series, Part 15)

Objective 3.6 asks you to create an implementation of service mesh, not to name one. Here is how Istio actually lands on a VKS cluster, what sidecar and ambient mode cost in CPU and addresses, and the CNI choice that stops the install dead.

VCAP-VKS Exam Series · Part 15 of 34

A candidate in one of my study groups asked whether Objective 3.6 wanted him to learn Istio properly or just recognise the name on an architecture diagram. Published wording is Create an implementation of service mesh, and the verb is carrying most of the weight in that sentence, because an implementation is a set of decisions you can defend under questioning, not a package you can spell.

Key takeaways: Objective 3.6, published wording Create an implementation of service mesh. Istio is the mesh VKS ships, and it arrives as a Standard Package installed on the workload cluster with the VCF CLI, never as a Supervisor Service, so nothing about a running mesh appears in the vSphere Client. Broadcom documents the Istio add-on as incompatible with clusters built on the Cilium CNI, which makes Antrea the only safe answer today. Runtime support for the mesh, as opposed to install and upgrade support only, arrived with VKS 3.4, so a 3.3.x estate is running an installable but not fully supported mesh. Sidecar mode costs roughly 0.20 vCPU and 60 MB per meshed pod at benchmark load; ambient costs 0.06 vCPU and 12 MB per node. Read the sidecar versus ambient decision table below as this Part’s artifact.
Who this is for: You can provision a VKS cluster and expose an application on it, you have read that Istio gives you mutual TLS, and nobody has yet asked you to justify the CPU bill or say what happens when the mesh control plane is down. This Part covers Objective 3.6, published wording Create an implementation of service mesh. Terms on first use: a service mesh is a proxy layer that carries traffic between services so that encryption, retries, routing and telemetry are applied outside application code; Istio is the mesh Broadcom packages for VKS; istiod is its control plane; a sidecar is an Envoy proxy injected into every meshed pod; ambient mode replaces per pod sidecars with ztunnel, a per node proxy handling layer 4, plus an optional waypoint proxy per namespace handling layer 7; mTLS is mutual TLS, where both ends present a certificate; PeerAuthentication is the Istio object that sets whether mTLS is required; a Standard Package is a Carvel style bundle shipped in a Broadcom repository and installed with the VCF CLI; CNI is container network interface, the plugin that gives pods addresses, with Antrea as the VKS default and Cilium as an option; AKO is the Avi Kubernetes Operator; a VIP is a virtual IP address on the load balancer. Where the lab stands: Part 14 activated the Supervisor and Parts 11 to 13 fixed the address plan. This Part decides whether a mesh belongs on top of it, and at what price.

Mesh decisions that belong to the platform team

Three decisions sit under this objective and only one of them involves typing. Does this estate need a mesh at all. Sidecar or ambient. One mesh per workload cluster or one mesh spanning several. Everything downstream, the values file, the gateway manifest, the injection label, falls out of those three answers.

Start with whether, because popular study advice gets this wrong in a specific and expensive way. You will read that you should install a mesh so that traffic between services is encrypted. On a VKS cluster that argument is weak. Antrea NetworkPolicy already restricts pod to pod traffic inside the cluster, and the NSX distributed firewall already restricts it at the hypervisor, and neither of those puts a proxy in the request path. A mesh earns its keep when you need one of four things that policy cannot give you: authorisation decisions based on workload identity rather than source address, weighted traffic splitting for a canary release, retry and timeout behaviour applied uniformly without touching application code, and per hop telemetry that survives a service being rewritten. If you cannot name which of those four you are buying, you are buying an Envoy process per pod and paying for it every day after.

Second, understand where Istio physically lands, because this is the single most common misreading I see in study notes. Istio is a VKS Standard Package. Standard Packages are Carvel style bundles pulled from a Broadcom repository and driven by the VCF CLI, and they install on the workload cluster. Harbor, which this series reaches in Part 19, is a Supervisor Service and shows up in the vSphere Client under Supervisor Services. Istio does not, and never will. If a question puts a mesh in the vSphere Client, that question is testing whether you know the difference.

That does not let the Supervisor off the hook. Which CNI the cluster runs was fixed in the cluster manifest against a ClusterClass the Supervisor published. Whether an ingress gateway can get an address depends on the load balancer wired in at enablement, sized back in Part 11. Whether nodes can pull Istio images depends on the registry trust set in Part 10. A mesh that refuses to come up is nearly always a Supervisor level object declining to cooperate, and the fastest diagnosis is to stop reading Istio logs and go and look at the namespace.

One naming note, because it will bite you in the CLI. VKS is the product formerly called TKG Service or TKGS, and the rename has not reached the plumbing. Package repositories live in the tkg-system namespace and ClusterClass names still carry tkg strings, so a tkg prefix is not evidence that you are on an old product.

flowchart TD
  A[Do you need L7 policy, canary split or per hop telemetry] -->|no| B[Stay with Antrea NetworkPolicy and NSX DFW]
  A -->|yes| C{Which CNI does the cluster run}
  C -->|Cilium| D[Istio add on will not install, rebuild the cluster on Antrea]
  C -->|Antrea| E{What is the latency budget per hop}
  E -->|tight, L4 only| F[Ambient mode, ztunnel per node]
  E -->|room for L7| G[Ambient mode plus waypoint per namespace]
  E -->|per pod control required| H[Sidecar injection per namespace]
Decision order for Objective 3.6. CNI comes before mode, because one answer ends the conversation.

Discovery before design

Two commands tell you whether a mesh is even reachable on this cluster. Run them against the workload cluster context, not the Supervisor. Versions in the lab for everything below:

# Tested against: VCF 9.0, vCenter 9.0.0.0, Supervisor Kubernetes 1.32, # VKS 3.3.2, VKr v1.32.0, kubectl 1.32.3, kubectl-vsphere 9.0.0, VCF CLI 9.0.1 $ kubectl config use-context app-prod-01 $ vcf package available list -n tkg-system | grep -i istio istio.kubernetes.vmware.com Istio 1.27.4+vmware.1-vks.1 $ kubectl get cluster app-prod-01 -n ns-app-prod -o jsonpath='{.spec.topology.variables[?(@.name=="cni")].value}’ {"name":"antrea"}

If that last command returns cilium, stop. Broadcom lists the Istio add-on as incompatible with Cilium clusters in the VKS Standard Packages release notes, and the install does not degrade gracefully, it fails. There is no supported flag that works around it. You rebuild the cluster on Antrea or you go without a mesh, and since CNI is chosen at cluster creation and not changeable afterwards, that is a rebuild and a workload migration, not an edit.

Sidecar mode and ambient mode compared

Sidecar mode is what most people picture. Label a namespace, restart the workloads, and every pod comes back with a second container running Envoy. All traffic in and out of the pod goes through it. Ambient mode splits that job in two. A ztunnel DaemonSet on each node carries encrypted layer 4 traffic between pods, and a waypoint proxy, deployed only for the namespaces that need it, handles layer 7 work such as header routing and weighted splits. Pods themselves stay untouched, which means enrolling an application into an ambient mesh does not require restarting it.

Published Istio benchmark figures make the cost difference concrete rather than theoretical. At 1,000 HTTP requests per second with a 1 KB payload, a single sidecar proxy with two worker threads consumes about 0.20 vCPU and 60 MB of memory, a waypoint proxy about 0.25 vCPU and 60 MB, and a ztunnel proxy about 0.06 vCPU and 12 MB. Those are per proxy numbers at load, and the multiplier is what matters: sidecars multiply by pod count, ztunnel multiplies by node count.

Proxy cost per instance at benchmark load 1,000 requests per second, 1 KB payload, two worker threads. Published Istio 1.24 figures. vCPU consumed Sidecar 0.20 vCPU Waypoint 0.25 vCPU Ztunnel 0.06 vCPU Memory consumed Sidecar 60 MB Waypoint 60 MB Ztunnel 12 MB

Apply that to the reference estate. My application cluster runs 3 worker nodes carrying 62 pods across the meshed namespaces. Sidecar mode at the benchmark rate would be 62 proxies, so 12.4 vCPU and about 3.7 GB of memory reserved for plumbing, on nodes sized with 4 vCPU each. Ambient layer 4 on the same cluster is 3 ztunnels, so 0.18 vCPU and 36 MB. Real traffic is nowhere near 1,000 requests per second per pod, and my measured idle sidecar footprint was closer to 45 MB, but the ratio holds and the ratio is the design input. Ambient wins on arithmetic until you need layer 7 on many namespaces at once, at which point waypoints start reintroducing the cost you avoided.

Design factorSidecar modeAmbient modeWhich to pick
EnrolmentNamespace label plus a pod restart for every workloadNamespace label, no restart requiredAmbient, if you cannot get a maintenance window
Resource multiplierPer pod, 0.20 vCPU and 60 MB at benchmark loadPer node, 0.06 vCPU and 12 MB, plus per namespace waypointsAmbient on dense clusters, sidecar on very sparse ones
Layer 7 featuresEverywhere, for free, whether wanted or notOnly where a waypoint is deployedSidecar if nearly every namespace needs L7
Blast radius of a bad configOne proxy per pod, failures are localised but numerousOne ztunnel per node, a bad rollout takes every pod on that nodeSidecar where node level failure is unacceptable
Troubleshooting surfaceFamiliar, one Envoy config dump per podSplit across ztunnel and waypoint, fewer engineers have seen itSidecar if the on call team is new to Istio
CNI requirementAntrea only, Cilium clusters fail the installAntrea only, same limitationNeither, on a Cilium cluster

Reference artifact: sidecar versus ambient decision matrix for a VKS workload cluster.

Costs a mesh imposes on a Supervisor estate

CPU is the cost people budget for. Addresses are the cost that actually stops a rollout. An Istio ingress gateway is a Service of type LoadBalancer, which means it consumes exactly one VIP from the pool wired at Supervisor enablement, allocated by AKO or by NCP depending on the networking mode you chose. That is not a problem for one cluster. Put a mesh on six workload clusters and you have added six VIPs to a pool that was sized in Part 13 before anyone mentioned a mesh. Hostname separation is free, because one gateway VIP fronts as many hostnames as you like through Gateway and VirtualService objects, so the honest number is one VIP per mesh, not one per application.

Certificates are the second hidden cost. Istio runs its own certificate authority by default and issues short lived workload certificates that have nothing to do with the trusted CA bundle you configured on the Supervisor. Broadcom supports bringing your own CA to the Istio package, and on any estate with a security team that audits certificate issuance you will be made to use it. Decide that before the mesh is carrying production traffic, because swapping the root afterwards means every workload certificate reissues at once.

Support boundary worth knowing: Istio has been installable as a VKS Standard Package for a while, but VKS 3.4 was the release that added runtime support for it, beyond the install and upgrade support offered for other standard packages. If your estate sits on VKS 3.3.x, as this lab does, you can run a mesh and Broadcom will help you install and upgrade it, but you are thinner on support for the thing while it is serving traffic. Move to 3.4 or later before a mesh goes in front of anything that has a service level objective attached.

Third cost, and the one that catches vSphere administrators specifically: an Istio namespace is not a vSphere Namespace. Sidecar injection is controlled by a label on a Kubernetes namespace inside the workload cluster. A vSphere Namespace lives on the Supervisor and governs resource quota, storage policy and VM classes. Labelling the wrong one does nothing at all, silently, which is the worst kind of nothing.

Failure worth rehearsing

Here is what a mesh install looks like when the design homework was skipped. Cluster built on Cilium because somebody read a blog post about eBPF, then asked for a mesh three weeks later:

$ vcf package install istio -p istio.kubernetes.vmware.com -v 1.27.4+vmware.1-vks.1 –values-file istio-data-values.yaml -n istio-installed Waiting for PackageInstall reconciliation for 'istio' | Error: Reconcile failed: Deploying: kapp: Error: waiting on reconcile deployment/istio-cni-node (apps/v1) namespace: istio-system: Finished unsuccessfully (Deployment is not progressing: ProgressDeadlineExceeded) $ kubectl -n istio-system logs ds/istio-cni-node –tail=5 error: failed to install CNI plugin: conflicting CNI configuration detected in /etc/cni/net.d, refusing to chain

Fix is not in that log. Fix is a new cluster on Antrea and a workload migration, roughly two days of work for us including the change record. Check the CNI before you promise anyone a mesh.

Field note, and what I would do differently

My worst mesh day was not an install. It was a PeerAuthentication object. Wanting a clean security posture, I applied strict mTLS at mesh scope, in istio-system, on a Friday afternoon, which tells you something about my judgement that year. Within about ninety seconds Prometheus dashboards went blank and half the alerting fired. Cause was not the meshed applications, they were fine. Prometheus was scraping targets that had no proxy, the mesh now demanded a client certificate on those connections, and every scrape failed. Forty minutes of a very bright red wall later I reverted to permissive at mesh scope and reapplied strict namespace by namespace, checking scrape targets after each one. That took a further two days and was completely uneventful, which is the point. Set mesh wide policy to permissive, tighten per namespace, and keep monitoring components either fully in the mesh or explicitly excluded, never straddling the boundary.

Exam focus for objective 3.6

Objective 3.6, Create an implementation of service mesh:

What this objective expects you to be able to do. Given a described estate, choose whether a mesh is warranted, name Istio as the supported option on VKS, place it correctly as a Standard Package on the workload cluster, and sequence the steps that get it running: check CNI, add or confirm the package repository, generate the data values file, install into its own namespace, then enrol namespaces and expose a gateway. You also need to attribute the resulting objects to the right layer, because a gateway Service pulls an address from Supervisor owned infrastructure.

Item types this tends to appear in. Build list and drag and drop, because installation is inherently ordered. Matching, pairing Istio components with what they do, and pairing a requirement with sidecar or ambient. Multiple selection multiple choice for prerequisites and limitations, where the Cilium incompatibility is an obvious distractor to include.

Trap that catches experienced admins. Treating the mesh like Harbor. Harbor installs as a Supervisor Service, is managed from the vSphere Client, and serves the whole Supervisor. Istio installs as a Standard Package with the VCF CLI, against one workload cluster kubeconfig, and is invisible to vCenter. Every time an option says you enable the mesh from Workload Management or from Supervisor Services, that option is wrong, and it is wrong in a way that feels right to somebody who learned Harbor first.

Objective checkpoint

Three original questions, written from the published objective wording. These are not exam items.

1. A team asks you to add a service mesh to an existing VKS cluster provisioned with the Cilium CNI. What is the correct answer, and why.
Answer: the mesh cannot be added to that cluster; it must be rebuilt on Antrea and the workloads migrated. Reasoning: Broadcom documents the VKS Istio add-on as incompatible with Cilium provisioned clusters, and CNI cannot be changed after cluster creation.

2. On which cluster is the Istio Standard Package installed, and with which tool.
Answer: on the workload cluster, using the VCF CLI against that cluster’s kubeconfig. Reasoning: Standard Packages are workload cluster add-ons; only Supervisor Services such as Harbor are installed and visible at the Supervisor layer.

3. Two meshed applications must be reachable on two different hostnames from one VKS cluster. At minimum, how many load balancer virtual IP addresses does the mesh require.
Answer: one. Reasoning: the ingress gateway is a single Service of type LoadBalancer, and hostname separation is expressed in Istio Gateway and VirtualService objects behind that one address.

Service mesh call for this estate

My recommendation for the reference estate, stated plainly. Run one mesh, on one cluster, in ambient mode, on Antrea, with waypoints deployed only for the two namespaces that actually need weighted routing. Keep the PostgreSQL StatefulSet outside it entirely, because a database gains nothing from layer 7 features and loses something real to an extra hop on every query. Set PeerAuthentication to permissive at mesh scope and strict per namespace. Budget one VIP for the gateway and add it to the address plan before you install, not after. And move the estate to VKS 3.4 or later first, so that the mesh you are running is supported while it runs and not merely while you install it.

What to avoid: sidecar injection turned on across every namespace because it was one label and felt tidy. That decision costs vCPU per pod forever, adds a restart to every future workload change, and buys layer 7 capability for services that will never use it.

Tonight, in your own lab: run vcf package available list -n tkg-system against a workload cluster, find the Istio version your VKr supports, then read the cluster manifest and confirm which CNI it was built with. Write both down. Those two facts decide the entire implementation, and if you can produce them from memory for your own estate you are already answering this objective better than most candidates. Next Part starts Section 4 and gets hands on with Supervisor creation across NSX VPC, NSX segment, vDS and Avi. If you arrived here from a TKGI platform, the migration path is covered separately in the TKGI to VKS Series, and the product level walkthrough underneath this whole series lives in the VKS Series.

VCAP-VKS Exam Series · Part 15 of 34
« Previous: Part 14  |  Guide  |  Next: Part 16 »

References

About The Author


Discover more from Journal of Intelligent Infrastructure

Subscribe to get the latest posts sent to your email.

Leave a Reply

Your email address will not be published. Required fields are marked *

Architect’s Toolkit

About the Author

Dr. Pranay Jha is a Cloud and AI Consultant with 18+ years of experience in hybrid cloud, virtualization, and enterprise infrastructure transformation. He specializes in VMware technologies, multi-cloud strategy, and Generative AI solutions. He holds a PhD in Computer Applications with research focused on Cloud and AI, has published multiple research papers, and has been a VMware vExpert since 2016 and a VMUG Community Leader.

Discover more from Journal of Intelligent Infrastructure

Subscribe now to keep reading and get access to the full archive.

Continue reading