Skip to content

[DOCS#3037]: Add Istio sidecar to Ambient Mode migration topic - #3029

Draft
electricjesus wants to merge 20 commits into
tigera:mainfrom
electricjesus:seth/docs-3037-ambient-sidecar-migration
Draft

electricjesus wants to merge 20 commits into
tigera:mainfrom
electricjesus:seth/docs-3037-ambient-sidecar-migration

Conversation

@electricjesus

Copy link
Copy Markdown
Member

Product Version(s):
Calico Enterprise, next / unreleased.

Issue:

Link to docs preview:

  • /calico-enterprise/next/compliance/istio/migrate-from-sidecar

Summary

New page. Moves a self-managed Istio sidecar mesh to the Calico-managed Ambient Mode mesh, one namespace at a time.

Three commits:

  1. Phil DiCorpo's draft, exactly as attached to DOCS-3037.
  2. Sidebar entry under Security > Istio Ambient Mode.
  3. HTML comments changed to MDX comment syntax. <!-- --> is a syntax error in MDX v3, and it broke the whole site build.

Five ENG REVIEW notes are still in the source and still unanswered. The one in "Plan your cutover" is a blocker. The page's stated reason for the no-coexistence rule does not match the operator code. I will post the detail inline.

Not in scope

calico-cloud and calico. The page applies there too. Separate PR once the content settles.

Test plan

  • BUILD_NEXT=true yarn build passes. onBrokenLinks: 'throw' and no broken links.
  • Page checked in a local dev build. Sidebar, tables, admonitions and $[prodname] all render right.
  • Deploy preview inspected.
Added a topic for migrating from an Istio sidecar mesh to Istio Ambient Mode.

AI assistance: This PR was written in part with the assistance of generative AI.

electricjesus and others added 3 commits September 15, 2026 11:26
Phil's draft from DOCS-3037, attachment 39169, committed as attached.
Open ENG REVIEW comments stay in the file for now.

Co-authored-by: Phil DiCorpo <phil@tigera.io>
Docusaurus 3 compiles these pages as MDX v3, where an HTML comment is a
syntax error. The five notes broke the MDX build, and one broken file
fails the whole site compile.

Content is unchanged. The notes stay invisible in the rendered page.
Copilot AI lite review requested due to automatic review settings September 15, 2026 10:37
@netlify

netlify Bot commented Sep 15, 2026

Copy link
Copy Markdown

Deploy Preview for calico-docs-preview-next ready!

Name Link
🔨 Latest commit 4403608
🔍 Latest deploy log https://app.netlify.com/projects/calico-docs-preview-next/deploys/6ab41b8821c307000832086d
😎 Deploy Preview https://deploy-preview-3029--calico-docs-preview-next.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

@netlify

netlify Bot commented Sep 15, 2026

Copy link
Copy Markdown

Deploy Preview succeeded!

Built without sensitive environment variables

Name Link
🔨 Latest commit 4403608
🔍 Latest deploy log https://app.netlify.com/projects/tigera/deploys/6ab41b873170380008fbc576
😎 Deploy Preview https://deploy-preview-3029--tigera.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
Lighthouse
Lighthouse
1 paths audited
Performance: 76 (🔴 down 22 from production)
Accessibility: 98 (no change from production)
Best Practices: 92 (no change from production)
SEO: 100 (no change from production)
PWA: -
View the detailed breakdown and full score reports
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

Critical migration-safety issues remain unresolved.

Pull request overview

Adds a Calico Enterprise guide for migrating self-managed Istio sidecar meshes to Calico-managed Ambient Mode.

Changes:

  • Documents prerequisites, migration patterns, Waypoints, verification, rollback, and troubleshooting.
  • Adds policy, observability, and network-policy guidance.
  • Adds the guide to the Istio Ambient Mode sidebar.
File summaries
File Description
sidebars-calico-enterprise.js Adds the migration guide to navigation.
calico-enterprise/compliance/istio/migrate-from-sidecar.mdx Adds the migration procedure and supporting guidance.
Review details

Suppressed comments (7)

calico-enterprise/compliance/istio/migrate-from-sidecar.mdx:118

  • The guard checks only the Gateway CRD. A cluster can already have that CRD while lacking GatewayClass or HTTPRoute, causing this command to skip installation and later waypoint apply or route creation to fail.
   kubectl get crd gateways.gateway.networking.k8s.io &> /dev/null || \
     kubectl apply --server-side -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.6.0/experimental-install.yaml

calico-enterprise/compliance/istio/migrate-from-sidecar.mdx:150

  • The 24-hour window is presented as the planning limit even though the review note acknowledges it is only Istio's default and has not been tested by Tigera. Certificate lifetime is configurable, so customers may either run out sooner or unnecessarily rush the migration. Verify the bundled configuration/tested lifetime or instruct users to check the actual certificate expiry and provide a supported renewal or rollback path.
* **Certificates are not rotated.** After the self-managed istiod is gone, sidecars can no longer refresh their workload certificates. Istio's default certificate lifetime is 24 hours, so plan to finish the migration well inside that window.

calico-enterprise/compliance/istio/migrate-from-sidecar.mdx:306

  • Only Deployments are restarted here, so StatefulSets, DaemonSets, and standalone pods in the namespace retain their sidecars. The page then treats the namespace as migrated and validates it, leaving those workloads outside ambient mode. Restart every supported workload controller and explicitly handle standalone pods before declaring the namespace migrated.
1. **Restart the workloads** to drop the sidecars:

   ```bash
   kubectl rollout restart deployment -n <namespace>
   kubectl rollout status deployment -n <namespace>

calico-enterprise/compliance/istio/migrate-from-sidecar.mdx:364

  • The rollback only removes the namespace label, but the procedure also supports attaching a Waypoint to an individual Service. In that case the service-level istio.io/use-waypoint label remains and traffic is still attached after rollback. Remove the label from the namespace and every service that was labeled.
| Waypoint attached | `kubectl label namespace <namespace> istio.io/use-waypoint-` |

calico-enterprise/compliance/istio/migrate-from-sidecar.mdx:190

  • --purge removes the Istio CRDs, which cascades deletion of the VirtualService, AuthorizationPolicy, DestinationRule, and other custom resources that Steps 3–4 later ask the user to inspect, replace, or retain. The procedure therefore loses the live policy objects before migration and cannot preserve L4 policies as stated; use a component-only uninstall that retains them, or explicitly recreate the backup after the managed CRDs are installed before continuing.
1. Uninstall the self-managed control plane, including the Istio CNI plugin:

   ```bash
   istioctl uninstall --purge
**calico-enterprise/compliance/istio/migrate-from-sidecar.mdx:320**
* Deleting every selector-based policy that contains an L7 rule also deletes any L4 rules in the same policy. zTunnel can enforce those L4 rules, so a mixed policy must be split and its L4 portion retained rather than removed wholesale.

Delete the selector-based policies that contain Layer 7 rules, which you have already replaced with Waypoint-targeted equivalents:

kubectl delete authorizationpolicy <policy-name> -n <namespace>

calico-enterprise/compliance/istio/migrate-from-sidecar.mdx:334

  • This is not true for the phased path: removing the self-managed control plane removes or changes the injector used by namespaces that still have sidecar-injection labels. New or restarted pods in those namespaces will not remain equivalent to the old mesh, even though they are not yet labeled ambient. Call out that they must be frozen or provide a tested coexistence/transition mechanism.
Repeat for each namespace. Namespaces you have not labeled are unaffected, subject to the certificate and mTLS constraints described in [Pattern 2](#pattern-2-phased-namespace-by-namespace).
  • Files reviewed: 2/2 changed files
  • Comments generated: 13
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

* Connect-time load balancing is not compatible with Istio Ambient Mode.
* Destination ports are preserved only when Istio is deployed without Waypoint. If you deploy Waypoint, traffic through the Waypoint shows port 15008 as its destination port.

{/* ENG REVIEW: confirm eBPF dataplane + ambient status for the shipping version. Fixes for the host-probe/SNAT issue landed in projectcalico/calico#9159 and #9192; confirm whether eBPF mode is a supported configuration for the bundled Istio, and whether Waypoint on eBPF is supported (see istio/istio#55481). If it is not, it belongs in this list. */}

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed in e5e2f66, the operator has no dataplane gate and CTLB is already listed as not compatible

Comment thread calico-enterprise/compliance/istio/migrate-from-sidecar.mdx Outdated
Comment thread calico-enterprise/compliance/istio/migrate-from-sidecar.mdx Outdated
Comment thread calico-enterprise/compliance/istio/migrate-from-sidecar.mdx Outdated
Comment thread calico-enterprise/compliance/istio/migrate-from-sidecar.mdx Outdated
Comment thread calico-enterprise/compliance/istio/migrate-from-sidecar.mdx Outdated
Comment thread calico-enterprise/compliance/istio/migrate-from-sidecar.mdx Outdated
Comment thread calico-enterprise/compliance/istio/migrate-from-sidecar.mdx Outdated
Comment thread calico-enterprise/compliance/istio/migrate-from-sidecar.mdx Outdated
Comment thread calico-enterprise/compliance/istio/migrate-from-sidecar.mdx Outdated
Copilot AI review requested due to automatic review settings September 23, 2026 18:06

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Unresolved critical and moderate issues affect migration safety, policy enforcement, workload coverage, and rollback.

Get a fresh assessment by requesting another Copilot review.

Review effort: Lite
Findings: 3 High severity · 3 Medium severity · 1 Low severity

Open (7)
Resolved since last review (12)


## Step 3: Deploy Waypoints, if you need Layer 7

Skip this step if all of your `AuthorizationPolicy` resources are Layer 4 only and you do not use `VirtualService` for routing, retries, fault injection, or header manipulation.

| Last completed step | Rollback |
| --- | --- |
| Waypoint attached | `kubectl label namespace <namespace> istio.io/use-waypoint-` |

The Tigera Operator installs istiod, the Istio CNI plugin, and zTunnel into the `calico-system` namespace.
It cannot run alongside a self-managed Istio control plane.
Both installations use a validating webhook named `istiod-default-validator`, both add an Istio CNI plugin to the same CNI configuration on every node, and both control planes manage the same built-in `GatewayClass` resources.
Comment on lines +348 to +350
kubectl rollout restart deployment -n <namespace>
kubectl rollout status deployment -n <namespace>
```
| Ambient mode enabled | `kubectl label namespace <namespace> istio.io/dataplane-mode-` |
| Sidecar injection removed | Re-add the label you recorded in [Inventory your mesh](#inventory-your-mesh): `kubectl label namespace <namespace> istio-injection=enabled`, or `kubectl label namespace <namespace> istio.io/rev=<revision>` |
| Workloads restarted | Re-add the injection label, then `kubectl rollout restart deployment -n <namespace>` |
| Old policies deleted | `kubectl apply -f istio-config-backup.yaml` |
Comment on lines +360 to +369
Delete the selector-based policies that contain Layer 7 rules, which you have already replaced with Waypoint-targeted equivalents:

```bash
kubectl delete authorizationpolicy <policy-name> -n <namespace>
```

Delete the `VirtualService` resources you replaced with `HTTPRoute`:

```bash
kubectl delete virtualservice <name> -n <namespace>
Copilot AI review requested due to automatic review settings September 23, 2026 18:13

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot AI review requested due to automatic review settings September 23, 2026 18:33

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

The migration procedure contains unresolved policy, workload, namespace, rollback, and resource-handling issues, including a critical risk of deleting L4 enforcement.

Get a fresh assessment by requesting another Copilot review.

Review effort: Lite
Findings: 4 High severity · 3 Medium severity · 1 Low severity

Open (8)
Previously missed (4)

In code that hasn't changed since last review

Medium severity Uninstall justification lacks verified resource ownership conflicts

calico-enterprise/​compliance/​istio/​migrate-from-sidecar.mdx:150

This justification does not match the operator implementation closely enough to support a destructive uninstall. The managed renderer is a calico-istio release in calico-system, and its expected resources include both istiod-default-validator and a separate istio-validator-calico-system; the operator code does not establish that the sidecar and managed installations both own the same GatewayClass resources. Replace this with the exact, tested conflicts (for example, the shared webhook/CNI resources) and the version scope before making this mandatory.

Medium severity Commands assume an incorrect fixed mesh root namespace

calico-enterprise/​compliance/​istio/​migrate-from-sidecar.mdx:183

This assumes every self-managed installation uses istio-system as its root namespace, but the supported starting point does not impose that constraint. With a customized meshConfig.rootNamespace (or a revision using another control-plane namespace), the commands below inspect the wrong namespace and mesh-wide policies remain outside the managed root, changing enforcement after Step 2. Resolve the configured root namespace first and use it in the commands, or explicitly narrow the supported starting point.

Medium severity Skip condition omits Waypoint-required authentication and traffic policies

calico-enterprise/​compliance/​istio/​migrate-from-sidecar.mdx:339

This skip condition omits two features that the table above says require a Waypoint: RequestAuthentication must target a Waypoint, and DestinationRule traffic policies are applied by the Waypoint. A user with either can therefore skip Step 3 and silently lose JWT authentication or traffic-policy behavior after the sidecars are removed. Include those cases in the condition or provide a separate migration path.

Medium severity Restart misses StatefulSets, DaemonSets, and standalone pods

calico-enterprise/​compliance/​istio/​migrate-from-sidecar.mdx:397

This restart covers only Deployments, but the supported starting point is not limited to Deployment workloads. StatefulSets, DaemonSets, and other workload controllers can retain their injected sidecars, so the namespace may be advanced while those pods are still running in sidecar mode. Enumerate the relevant workload types (and handle standalone pods where applicable) before declaring the namespace migrated.


:::

Delete the selector-based policies that contain Layer 7 rules, which you have already replaced with Waypoint-targeted equivalents:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants