Episode 3 installs Istio for the first time: comparing the three methods (istioctl, Istio Operator, and Helm), choosing the right profile for your environment, and laying out an upgrade strategy with canary installs and istioctl x upgrade.

Your cluster is ready from episode 0, and the architecture is understood from episode 2. Now it is time for the real thing: installing Istio. Episode 3 covers the three installation methods, how to pick a profile that fits your environment, and a safe upgrade strategy — decisions that will affect your entire mesh operations.
Do not rush. The choice of installation method is not a matter of taste alone: it determines how you upgrade, who holds the configuration state, and how easily installation can be automated.
The simplest and most widely used method for practice and small environments:
istioctl install --set profile=demo -yistioctl install --set profile=demo applies a specific profile and waits until all components are ready. The advantages of this method: one command, clear output, and a --set mechanism for direct customization. The drawbacks: it is less suited to GitOps because the configuration lives in the command line rather than in a manifest.
A method based on the Kubernetes Operator pattern: you define an IstioOperator resource and the operator keeps the cluster state aligned with that description.
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
name: example-istiocontrolplane
spec:
profile: demoBecause this resource is plain YAML, it can be stored in a repository and applied through GitOps. The operator also handles upgrades in a more controlled way. The drawbacks: an additional concept (the operator) and an operator release cycle you must keep track of.
The method closest to the modern Kubernetes ecosystem. Every component (base, istiod, ingress gateway) is a Helm chart:
helm repo add istio https://istio-release.storage.googleapis.com/charts
helm install istio-base istio/base -n istio-system --create-namespace
helm install istiod istio/istiod -n istio-system --set profile=defaulthelm install istiod istio/istiod gives you granular control through values and natural integration with Helm-based GitOps tools like ArgoCD. The drawback: you must understand the install order — base first, then istiod, then the gateway — rather than a single command.
Istio ships several built-in profiles:
Check the available profiles with istioctl profile list. For production, start from default and enable observability components selectively, rather than copying demo wholesale.
As your needs grow, create a custom profile file instead of stacking --set flags:
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
name: prod-profile
spec:
profile: default
components:
ingressGateways:
- name: istio-ingressgateway
enabled: true
egressGateways:
- name: istio-egressgateway
enabled: true
meshConfig:
enablePrometheusMerge: trueThis file can be applied with istioctl install -f prod-profile.yaml and stored in Git for auditability.
Upgrading a minor version of Istio with istioctl x upgrade can only move one minor version per step (for example 1.21 to 1.22, not directly to 1.23). The process: verify the pre-requisites, download the new istioctl version, then run the upgrade:
istioctl x precheck
istioctl x upgrade -yAlways run istioctl x precheck before an upgrade to catch issues such as lagging CRDs. Read the release notes of the target version because some features change or get deprecated.
To reduce risk, use a canary install: install the new version alongside the old one, then move workloads one by one via a revision label.
istioctl install --revision=canary --set profile=default -y
kubectl label namespace default istio.io/rev=canary --overwriteThe istio.io/rev=canary label on the namespace makes new workloads in that namespace use the canary revision. The old istiod keeps serving workloads that have not moved yet, so rolling back is just a matter of switching the label back. We will cover the full workload migration details in episode 4.
Warning
Never mix two Istio versions in the same cluster without understanding the consequences. A canary install requires attention to revision labels, DNS, and CRD compatibility.
Episode 3 actually got Istio running: you now understand the three installation methods (istioctl, operator, Helm), can choose the right profile, and have an upgrade strategy using canary installs and istioctl x upgrade.
Key takeaways:
--set flags.istioctl x precheck is mandatory before an upgrade.istio.io/rev label for gradual migration.In the next episode, episode 4, we will enable sidecar injection and workload onboarding — switching namespaces to the istio-injection=enabled or istio.io/rev label, understanding the difference between automatic and manual injection with istioctl kube-inject, and adding non-Kubernetes workloads through WorkloadEntry.