---
# System prepended metadata

title: 將 ingress nginx 遷移成 envoy gateway
tags: [k8s]

---

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