# 將 ingress nginx 遷移成 envoy gateway 根據 k8s 官方文件的 [Ingress NGINX Retirement: What You Need to Know](https://kubernetes.io/blog/2025/11/11/ingress-nginx-retirement/) 裡面提到 ingress nginx 目前維護者很少,所以逐步停止 ingress nginx,建議使用者改用 gateway api ## 步驟 ### Step 1: Install Envoy Gateway - 輸入以下指令安裝 Envoy Gateway ```bash helm install eg oci://docker.io/envoyproxy/gateway-helm --version v1.6.3 -n envoy-gateway-system --create-namespace ``` - 輸入以下指令確認 gateway 已安裝完成 ```bash kubectl wait --timeout=5m -n envoy-gateway-system deployment/envoy-gateway --for=condition=Available ``` ### Step 2: 建立 Gateway class - 先建立一個 `gateway-class.yaml` 檔案,內容如下 ```yaml apiVersion: gateway.networking.k8s.io/v1beta1 kind: GatewayClass metadata: name: eg spec: controllerName: gateway.envoyproxy.io/controller ``` - 建立後,輸入指令套用 ```bash kubectl apply -f gateway-class.yaml ``` ### Step 3: 安裝 ingress2gateway :::info 請先在環境下安裝 go 語言唷! ::: - 輸入以下指令安裝 ```bash go install github.com/kubernetes-sigs/ingress2gateway@latest ``` - 安裝後,你需要先進入 `$(env GOPATH)/bin` 目錄才能使用喔 ### Step 4: 套用 gateway - 首先將 ingress 轉成 gateway 的 yaml 設定檔 ```bash ./ingress2gateway print --providers=ingress-nginx --ingress-nginx-ingress-class=public --all-namespaces > /usr/local/gateways.yaml ``` - 打開 `/usr/local/gateways.yaml` 修改 `gatewayClassName` - ```yaml spec: gatewayClassName: eg # <--- 這裡必須與 kubectl get gatewayclass 的結果一致 listeners: - name: http protocol: HTTP port: 80 allowedRoutes: namespaces: from: All addresses: - value: 192.168.12.12 # <--- 如果有必要,在這裡直接要求 IP,否則不要有 addresses 區塊 type: IPAddress ``` ### Step 5: 刪除 ingress 因為筆者使用 microk8s 當時在安裝時可能有點混亂,所以有開啟內建的 ingress addon 和手動套用 nginx ingress 下面提供兩者一起刪除的方法 - 輸入以下指令,清除 microk8s 內建的 ingress ```bash microk8s disable ingress ``` - 輸入以下指令,清除手動安裝的 nginx ingress ```bash kubectl delete namespace ingress-nginx ``` - 輸入以下指令,清除舊的 ingress route 規則 ```bash kubectl delete ingress --all ``` ## 參考資料 - [Step-by-Step Guide: Moving from ingress-nginx to Envoy Gateway](https://jimmysong.io/blog/migrating-from-ingress-nginx-to-envoy-gateway/)