# 將 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/)