Skip to content

NimTechnology

Trình bày các công nghệ CLOUD một cách dễ hiểu.

  • Kubernetes & Container
    • Docker
    • Kubernetes
      • Gateway API
      • Ingress
      • Pod
    • Helm Chart
    • OAuth2 Proxy
    • Isito-EnvoyFilter
    • Apache Kafka
      • Kafka
      • Kafka Connect
      • Lenses
    • Vault
    • Longhorn – Storage
    • VictoriaMetrics
    • MetalLB
    • Kong Gateway
  • CI/CD
    • ArgoCD
    • ArgoWorkflows
    • Argo Events
    • Spinnaker
    • Jenkins
    • Harbor
    • TeamCity
    • Git
      • Bitbucket
  • Coding
    • DevSecOps
    • Terraform
      • GCP – Google Cloud
      • AWS – Amazon Web Service
      • Azure Cloud
    • Golang
    • Laravel
    • Python
    • Jquery & JavaScript
    • Selenium
  • Log, Monitor & Tracing
    • DataDog
    • Prometheus
    • Grafana
    • ELK
      • Kibana
      • Logstash
  • BareMetal
    • NextCloud
  • Toggle search form

[Gateway API] Migrate from NGINX Ingress to Gateway API

Posted on February 13, 2026March 4, 2026 By nim No Comments on [Gateway API] Migrate from NGINX Ingress to Gateway API

Bối cảnh: NGINX Ingress Controller sẽ ngừng hỗ trợ (End-of-Life) vào tháng 3/2026. Hướng dẫn này sử dụng Traefik làm Gateway Controller ví dụ để thay thế.


Contents

Toggle
  • Giai đoạn 1: Khảo sát & Chuẩn bị (Audit)
  • Bước 1: Kiểm tra Ingress Class
  • Bước 2: Liệt kê các tính năng NGINX đang dùng
  • Bước 3: Tạo bảng quy hoạch Migration
  • Giai đoạn 2: Cài đặt Hạ tầng Gateway API
  • Bước 4: Cài đặt CRDs (Core Resources)
  • Bước 5: Cài đặt Gateway Controller (Traefik)
  • Bước 6: Tạo Gateway (Cánh cổng đón traffic)
  • Giai đoạn 3: Thực hiện Migration (Code Transformation)
  • Ví dụ 1: Basic Routing (Cơ bản)
  • Ví dụ 2: Rewrite Path (Nâng cao)
  • Giai đoạn 4: Testing & Cutover
  • Bước 7: Test song song (Side-by-side)
  • Bước 8: Đánh dấu đã xong
  • Bước 9: Chuyển đổi DNS (Phút sự thật)
  • Bước 10: Dọn dẹp (Cleanup)

Giai đoạn 1: Khảo sát & Chuẩn bị (Audit)

Trước khi cài đặt cái mới, bạn phải hiểu rõ cái cũ đang chạy như thế nào.

Bước 1: Kiểm tra Ingress Class

Đảm bảo không có Ingress nào bị “mồ côi” (thiếu class). Nếu thiếu, việc cài Gateway API mới có thể gây conflict.

Command:

kubectl get ingress -A -o custom-columns=\
NAMESPACE:.metadata.namespace,\
NAME:.metadata.name,\
CLASS:.spec.ingressClassName

Output mẫu (Bạn sẽ thấy):

NAMESPACE       NAME                   CLASS
default python-route nginx
default go-route nginx
legacy-app old-portal <none> <-- CẢNH BÁO: Cần fix cái này

👉 Hành động: Nếu thấy <none>, hãy thêm ingressClassName: nginx vào YAML của Ingress đó ngay.

Bước 2: Liệt kê các tính năng NGINX đang dùng

Bạn cần biết mình đang phụ thuộc vào annotation nào của NGINX (Rewrite, Auth, SSL Redirect…).

Command:

# Lọc ra tất cả annotation bắt đầu bằng "nginx"
kubectl get ingress -A -o json | \
jq -r '.items[].metadata.annotations | keys[]' | \
grep nginx | \
sort -u

Output mẫu:

textnginx.ingress.kubernetes.io/auth-type
nginx.ingress.kubernetes.io/configuration-snippet
nginx.ingress.kubernetes.io/rewrite-target
nginx.ingress.kubernetes.io/ssl-redirect

Bước 3: Tạo bảng quy hoạch Migration

Tạo một báo cáo tổng thể để theo dõi tiến độ.

Command:

# 1. Định nghĩa các cột
audit_fields=(
"NAMESPACE:.metadata.namespace"
"NAME:.metadata.name"
"HOST:.spec.rules[0].host"
"MIGRATED:.metadata.labels.migrated"
"REWRITE:.metadata.annotations.nginx\.ingress\.kubernetes\.io/rewrite-target"
"TLS:.spec.tls[0].secretName"
)
columns=$(IFS=,; echo "${audit_fields[*]}")

# 2. Xuất báo cáo
kubectl get ingress -A -o custom-columns="$columns"

Output mẫu:

textNAMESPACE   NAME            HOST                     MIGRATED   REWRITE   TLS
default     python-route    example-app.com          <none>     <none>    <none>
default     api-rewrite     api.example.com          <none>     /$2       tls-secret

Giai đoạn 2: Cài đặt Hạ tầng Gateway API

Bước 4: Cài đặt CRDs (Core Resources)

Đây là bước bắt buộc để cluster hiểu khái niệm Gateway, HTTPRoute.

Command:

bashkubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.0.0/standard-install.yaml

Verify Command:

kubectl get gatewayclass

Output: No resources found (Nhưng không báo lỗi error là thành công).

Bước 5: Cài đặt Gateway Controller (Traefik)

Sử dụng Helm để cài Traefik làm Controller xử lý traffic.

Command:

helm repo add traefik https://traefik.github.io/charts
helm repo update
helm install traefik traefik/traefik --namespace traefik --create-namespace

Verify Output:

bashkubectl get pods -n traefik
# NAME                       READY   STATUS    RESTARTS   AGE
# traefik-7d5fc87d6b-x9z2p   1/1     Running   0          45s

Bước 6: Tạo Gateway (Cánh cổng đón traffic)

Tạo file gateway.yaml:

textapiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: traefik
spec:
  controllerName: traefik.io/gateway-controller
---
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: my-gateway
  namespace: default
spec:
  gatewayClassName: traefik
  listeners:
  - name: http
    protocol: HTTP
    port: 80
    allowedRoutes:
      namespaces:
        from: All  # Quan trọng: Cho phép nhận route từ mọi namespace

Apply & Verify:

bashkubectl apply -f gateway.yaml
kubectl get gateway my-gateway

Output mẫu (Quan trọng nhất):

textNAME         CLASS     ADDRESS           PROGRAMMED   AGE
my-gateway   traefik   203.0.113.88      True         2m

👉 Lưu ý: ADDRESS là IP Public mới. PROGRAMMED=True nghĩa là Gateway đã sẵn sàng.


Giai đoạn 3: Thực hiện Migration (Code Transformation)

Đây là lúc chuyển đổi từ Ingress cũ sang HTTPRoute mới.

Ví dụ 1: Basic Routing (Cơ bản)

Cũ (Ingress):

textkind: Ingress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        backend: { service: { name: python-svc, port: { number: 5000 } } }

Mới (HTTPRoute):

textapiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: python-route
spec:
  parentRefs:
  - name: my-gateway
  hostnames:
  - example.com
  rules:
  - backendRefs:
    - name: python-svc
      port: 5000

Ví dụ 2: Rewrite Path (Nâng cao)

Cũ (Ingress Annotation):

textannotations:
  nginx.ingress.kubernetes.io/rewrite-target: /$2
paths:
- path: /api/python(/|$)(.*)

Mới (HTTPRoute Filters):

textapiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: rewrite-route
spec:
  parentRefs:
  - name: my-gateway
  hostnames:
  - api.example.com
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /api/python
    filters:
    - type: URLRewrite
      urlRewrite:
        path:
          type: ReplacePrefixMatch
          replacePrefixMatch: /
    backendRefs:
    - name: python-svc
      port: 5000

Verify Route sau khi Apply:

bashkubectl get httproute
# NAME           HOSTNAMES             AGE
# python-route   ["example.com"]       10s

Giai đoạn 4: Testing & Cutover

Bước 7: Test song song (Side-by-side)

Sử dụng port-forward để test Gateway mới mà không ảnh hưởng traffic thật.

Cửa sổ terminal 1 (Gateway mới):

bash# Forward port 8080 local vào port 80 của Traefik Gateway
kubectl port-forward -n traefik svc/traefik 8080:80

Cửa sổ terminal 2 (Thực hiện test):

bash# Giả lập request vào Gateway mới
curl -i -H "Host: example.com" http://localhost:8080

Output mong đợi:

textHTTP/1.1 200 OK
Content-Type: application/json
...
{"message": "Success from Gateway API"}

So sánh với hệ thống cũ (đang chạy trên port 80 thật hoặc port-forward khác) để đảm bảo response giống hệt nhau.

Bước 8: Đánh dấu đã xong

Sau khi test OK, đánh dấu vào Ingress cũ để cập nhật bảng theo dõi.

Command:

bashkubectl label ingress python-route migrated=true

Bước 9: Chuyển đổi DNS (Phút sự thật)

  1. Lấy IP của Gateway mới: kubectl get gateway my-gateway.
  2. Vào trang quản trị Domain (GoDaddy, Cloudflare, Route53…).
  3. Sửa bản ghi A (hoặc CNAME) của example.com trỏ về IP mới.
  4. Chờ DNS lan truyền (Propagation).

Bước 10: Dọn dẹp (Cleanup)

Sau khi traffic đã ổn định trên hệ thống mới vài ngày:

bash# Xóa Ingress cũ
kubectl delete ingress python-route

# (Cuối cùng) Gỡ NGINX Controller khi đã migrate hết 100%
helm uninstall ingress-nginx -n ingress-nginx

Tóm tắt: Bạn đang xây dựng một hệ thống đường mới song song với đường cũ. Bạn test đường mới bằng xe máy (port-forward) trước, sau đó mới cắm biển chỉ dẫn (DNS) để lùa toàn bộ xe cộ sang đường mới.

Kubernetes

Post navigation

Previous Post: [K8S] Reseach VPA on K8S
Next Post: [GatewayAPI/Traefik] (Error) Failed to verify certificate: x509: certificate has expired

More Related Articles

[kubewatch] Track all changes to Kubernetes Resource. Kubernetes
[K8S] Windows pod disk size is insufficient. AWS - Amazon Web Service
[Kubernetes] Security in Kubernetes Deployments Kubernetes
Deploying Web-Based File Managers: File Browser and KubeFileBrowser with Docker and Kubernetes Docker
[Rancher/K8s] Install rancher on K8s by Helm 3 Kubernetes
[Terraform / EKS] Build EKS and Karpenter by Terraform. AWS - Amazon Web Service

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Tham Gia Group DevOps nhé!
Để Nim có nhiều động lực ra nhiều bài viết.
Để nhận được những thông báo mới nhất.

Recent Posts

  • [Rancher/EKS] Rancher from v2.12.x can not work on eks cluster. April 15, 2026
  • [Telegram/Openclaw] Configure openclaw bot in a Telegram group. March 31, 2026
  • Tutorial: Gateway API + Traefik + oauth2-proxy (Microsoft Entra ID) March 30, 2026
  • Full + incremental backup: When restoring, do deleted files come back? March 27, 2026
  • [K8S] Create long-lived kubeconfig on k8s March 23, 2026

Archives

  • April 2026
  • March 2026
  • February 2026
  • January 2026
  • December 2025
  • November 2025
  • October 2025
  • September 2025
  • August 2025
  • July 2025
  • June 2025
  • May 2025
  • April 2025
  • March 2025
  • February 2025
  • January 2025
  • December 2024
  • November 2024
  • October 2024
  • September 2024
  • August 2024
  • July 2024
  • June 2024
  • May 2024
  • April 2024
  • March 2024
  • February 2024
  • January 2024
  • December 2023
  • November 2023
  • October 2023
  • September 2023
  • August 2023
  • July 2023
  • June 2023
  • May 2023
  • April 2023
  • March 2023
  • February 2023
  • January 2023
  • December 2022
  • November 2022
  • October 2022
  • September 2022
  • August 2022
  • July 2022
  • June 2022
  • May 2022
  • April 2022
  • March 2022
  • February 2022
  • January 2022
  • December 2021
  • November 2021
  • October 2021
  • September 2021
  • August 2021
  • July 2021
  • June 2021

Categories

  • AI
    • OpenClaw
  • BareMetal
    • NextCloud
  • CI/CD
    • Argo Events
    • ArgoCD
    • ArgoWorkflows
    • Git
      • Bitbucket
    • Harbor
    • Jenkins
    • Spinnaker
    • TeamCity
  • Coding
    • DevSecOps
    • Golang
    • Jquery & JavaScript
    • Laravel
    • NextJS 14 & ReactJS & Type Script
    • Python
    • Selenium
    • Terraform
      • AWS – Amazon Web Service
      • Azure Cloud
      • GCP – Google Cloud
  • Kubernetes & Container
    • Apache Kafka
      • Kafka
      • Kafka Connect
      • Lenses
    • Docker
    • Helm Chart
    • Isito-EnvoyFilter
    • Kong Gateway
    • Kubernetes
      • Gateway API
      • Ingress
      • Pod
    • Longhorn – Storage
    • MetalLB
    • OAuth2 Proxy
    • Vault
    • VictoriaMetrics
  • Log, Monitor & Tracing
    • DataDog
    • ELK
      • Kibana
      • Logstash
    • Fluent
    • Grafana
    • Prometheus
  • Uncategorized
  • Admin

Copyright © 2026 NimTechnology.