원클릭으로
eg-migrate
Migrate Envoy Gateway between versions with pre-flight checks, step-by-step upgrade procedures, and rollback guidance
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Migrate Envoy Gateway between versions with pre-flight checks, step-by-step upgrade procedures, and rollback guidance
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Configure client-facing traffic policies -- timeouts, connection limits, TLS settings, HTTP behavior
Production-grade Envoy Gateway setup with comprehensive security, observability, high availability, and operational best practices
Integrate Envoy Gateway with Istio ambient mesh or Cilium for unified ingress and service mesh
Envoy Gateway version information, compatibility matrix, and upgrade readiness checks
Envoy AI Gateway contribution orchestrator — interviews you about your contribution and guides you through the correct workflow using contributor skills
Envoy Gateway contribution orchestrator — interviews you about your contribution and guides you through the correct workflow using contributor skills
| name | eg-migrate |
| description | Migrate Envoy Gateway between versions with pre-flight checks, step-by-step upgrade procedures, and rollback guidance |
| arguments | [{"name":"From","description":"Current Envoy Gateway version (e.g., v1.6.2)","required":true},{"name":"To","description":"Target Envoy Gateway version (e.g., v1.7.0). Defaults to latest stable v1.7.0.","required":false}] |
Migrate an Envoy Gateway installation from one version to another. This skill runs pre-flight checks, applies the correct CRD and controller upgrade sequence, handles version-specific breaking changes, and provides rollback guidance.
Determine the source and target versions. If the user did not provide a target version, use the default:
${From} (required -- the currently running version)${To} or v1.7.0 if not specified (latest stable release)Run every check below before touching the cluster. If any check fails, stop and resolve the issue first.
# Confirm the running controller image matches the declared From version
kubectl get deployment envoy-gateway -n envoy-gateway-system \
-o jsonpath='{.spec.template.spec.containers[0].image}'
Compare the output against ${From}. If they do not match, confirm the correct source version with the user before proceeding.
# List installed Gateway API CRDs and their stored versions
kubectl get crds | grep -E 'gateway\.networking\.k8s\.io|gateway\.envoyproxy\.io'
Record the output. This is needed to determine which CRD migrations apply.
# Gateways that are not Programmed
kubectl get gateways --all-namespaces -o json | \
jq -r '.items[] | select(.status.conditions[]? | select(.type=="Programmed" and .status!="True")) | "\(.metadata.namespace)/\(.metadata.name)"'
# HTTPRoutes that are not Accepted
kubectl get httproutes --all-namespaces -o json | \
jq -r '.items[] | select(.status.parents[]?.conditions[]? | select(.type=="Accepted" and .status!="True")) | "\(.metadata.namespace)/\(.metadata.name)"'
If any Gateways or Routes are unhealthy, investigate and fix them before upgrading. Upgrading with broken resources can mask new issues introduced by the migration.
# Full backup of every EG-related resource across all namespaces
kubectl get \
gateway,httproute,grpcroute,tlsroute,tcproute,udproute,\
securitypolicy,backendtrafficpolicy,clienttrafficpolicy,\
envoyproxy,envoyextensionpolicy,envoypatchpolicy,backendtlspolicy \
--all-namespaces -o yaml > eg-backup-$(date +%Y%m%d).yaml
Verify the backup file is non-empty and contains the expected resources:
grep -c 'kind:' eg-backup-$(date +%Y%m%d).yaml
Critical: Do not proceed without a valid backup. This file is your only recovery path if CRD changes cause data loss.
helm list -n envoy-gateway-system
helm history eg -n envoy-gateway-system
Confirm the Helm release named eg exists and is in a deployed state.
Apply the relevant notes based on the ${From} and ${To} versions. If a section does not apply to the version range, skip it.
Breaking change: BackendTLSPolicy API version moved from v1alpha3 to v1.
Before upgrading, update all BackendTLSPolicy manifests to use the new API version:
# Find all BackendTLSPolicy resources still using the old API version
kubectl get backendtlspolicy --all-namespaces -o json | \
jq -r '.items[] | "\(.metadata.namespace)/\(.metadata.name)"'
If you have BackendTLSPolicy manifests stored in Git or on disk, update them:
# Update apiVersion in local manifest files
find . -name '*.yaml' -o -name '*.yml' | \
xargs grep -l 'gateway.networking.k8s.io/v1alpha3' | \
xargs sed -i.bak 's|gateway.networking.k8s.io/v1alpha3|gateway.networking.k8s.io/v1|g'
Important: The CRD upgrade in Phase 3 will add the new stored version. Existing resources are migrated automatically by the API server, but your source-of-truth manifests (Git, Helm values, Kustomize overlays) must be updated to
v1or future applies will fail.
Known issue: HTTPRoute status.parents validation became stricter.
After upgrading, null values in status.parents fields are no longer accepted. Routes with stale or malformed status may report errors.
Potential 404 errors if CRDs are not sequenced correctly.
The CRD update must complete before the controller upgrade. If the controller starts before the new CRDs are registered, routes may return 404 until reconciliation catches up.
Post-upgrade, verify all HTTPRoutes are Accepted:
kubectl get httproutes --all-namespaces -o json | \
jq -r '.items[] | "\(.metadata.namespace)/\(.metadata.name): " + (.status.parents[]?.conditions[]? | select(.type=="Accepted") | .status)'
Jumping across multiple minor versions is supported but carries higher risk.
Recommended approach: Step through each intermediate minor version sequentially (v1.5 -> v1.6 -> v1.7). This is the safest path and ensures each version's migration logic runs correctly.
Alternative approach: If stepping through versions is impractical:
v1alpha3 to v1 (see v1.5.x to v1.6.x notes above).Warning: Multi-version jumps skip intermediate controller migration logic. Test this path in a staging environment first.
These steps apply to every version upgrade. Run them in order.
CRDs must be updated before the controller. The controller may depend on new CRD fields or versions that do not exist yet.
# Pull the target version Helm chart to get the CRD manifests
helm pull oci://docker.io/envoyproxy/gateway-helm --version ${To} --untar
# Apply Gateway API CRDs with server-side apply to handle field ownership
kubectl apply --force-conflicts --server-side -f ./gateway-helm/crds/gatewayapi-crds.yaml
# Apply Envoy Gateway CRDs
kubectl apply --force-conflicts --server-side -f ./gateway-helm/crds/generated
Verify CRDs were updated:
kubectl get crds gateways.gateway.networking.k8s.io -o jsonpath='{.metadata.annotations.gateway\.networking\.k8s\.io/bundle-version}'
Why
--force-conflicts --server-side? CRDs are cluster-scoped resources that may have field managers from the previous Helm install. Server-side apply with force-conflicts ensures clean ownership transfer without manual conflict resolution.
helm upgrade eg oci://docker.io/envoyproxy/gateway-helm \
--version ${To} \
-n envoy-gateway-system
If you have custom Helm values, include them:
helm upgrade eg oci://docker.io/envoyproxy/gateway-helm \
--version ${To} \
-n envoy-gateway-system \
-f values.yaml
# Wait for the deployment to become available
kubectl wait --timeout=5m -n envoy-gateway-system \
deployment/envoy-gateway --for=condition=Available
# Confirm the GatewayClass is accepted
kubectl get gatewayclass eg -o jsonpath='{.status.conditions[?(@.type=="Accepted")].status}'
The GatewayClass status should return True.
Run every check below after the upgrade completes. All checks must pass before declaring the migration successful.
kubectl get gatewayclass eg -o jsonpath='{.status.conditions[?(@.type=="Accepted")].status}'
# Expected: True
kubectl get gateways --all-namespaces -o json | \
jq -r '.items[] | "\(.metadata.namespace)/\(.metadata.name): " + (.status.conditions[]? | select(.type=="Programmed") | .status)'
# Expected: all True
kubectl get httproutes --all-namespaces -o json | \
jq -r '.items[] | "\(.metadata.namespace)/\(.metadata.name): " + (.status.parents[]?.conditions[]? | select(.type=="Accepted") | .status)'
# Expected: all True
kubectl get pods --all-namespaces -l app.kubernetes.io/component=proxy -o wide
# Expected: all Running, all containers Ready
# Replace with your actual gateway address and a known-good route
GATEWAY_IP=$(kubectl get gateway eg -n default -o jsonpath='{.status.addresses[0].value}')
curl -v http://${GATEWAY_IP}/healthz
# Expected: 200 OK (or the expected response for your application)
kubectl logs -n envoy-gateway-system deployment/envoy-gateway --since=5m | grep -i error
# Expected: no unexpected errors
If the upgrade fails or causes issues, roll back using the steps below.
helm rollback eg -n envoy-gateway-system
This reverts the controller deployment to the previous Helm revision.
helm list -n envoy-gateway-system
kubectl get deployment envoy-gateway -n envoy-gateway-system \
-o jsonpath='{.spec.template.spec.containers[0].image}'
Confirm the image tag matches ${From}.
Warning: CRD rollbacks are manual and risky. Downgrading CRDs can cause data loss if new fields were already populated by the newer controller. Only attempt this if the upgrade introduced CRD-level issues.
If CRD changes caused problems, restore from the backup taken in Phase 1:
# Re-apply the backed-up resources
kubectl apply -f eg-backup-$(date +%Y%m%d).yaml
For CRDs themselves, you may need to reinstall the previous version's CRDs:
helm pull oci://docker.io/envoyproxy/gateway-helm --version ${From} --untar
kubectl apply --force-conflicts --server-side -f ./gateway-helm/crds/gatewayapi-crds.yaml
kubectl apply --force-conflicts --server-side -f ./gateway-helm/crds/generated
Recommendation: If CRD rollback is necessary, consider restoring the entire cluster state from backup rather than selectively reverting CRDs. Partial CRD rollbacks can leave the cluster in an inconsistent state.
Use this checklist to track progress through the migration:
${From}eg-backup-YYYYMMDD.yaml)