Kubernetes Ingress ยุคใหม่: ย้ายจาก ingress-nginx ไป Gateway API ทีละขั้นตอน

Kubernetes Ingress กำลังเปลี่ยนไปสู่ Gateway API อธิบายความต่าง วิธีเลือก Controller และขั้นตอนย้ายจาก ingress-nginx ทีละขั้น พร้อมตัวอย่าง YAML และแผนทดสอบ

โดย ทีมงาน THAI DATA CLOUD อ่าน 10 นาที เข้าชม 1 ครั้ง

แชร์FacebookXLINELinkedIn
Kubernetes Ingress และการย้ายไป Gateway API

Kubernetes Ingress แบบเดิมกำลังถูกแทนที่ด้วย Gateway API ซึ่งเป็นมาตรฐานใหม่ของโครงการ Kubernetes สำหรับจัดการ Traffic ขาเข้า ประเด็นนี้เร่งด่วนขึ้นสำหรับคลัสเตอร์ที่ใช้ ingress-nginx เพราะโครงการได้ประกาศยุติการพัฒนาและเหลือเพียงการดูแลแบบจำกัดในช่วงเปลี่ยนผ่าน [ตรวจสอบ: วันที่ประกาศและกำหนดสิ้นสุดการดูแลจาก Kubernetes Blog] ทีมที่ใช้อยู่ควรวางแผนย้ายไป Gateway API หรือ Ingress Controller ตัวอื่นที่ยังพัฒนาต่อเนื่อง

สิ่งที่ต้องแยกให้ชัดคือ ingress-nginx ที่ดูแลโดยชุมชน Kubernetes เป็นคนละโครงการกับ NGINX Ingress Controller ที่พัฒนาโดยผู้ผลิต NGINX ก่อนวางแผนให้ตรวจว่าคลัสเตอร์ของคุณใช้ตัวไหน

Kubernetes Ingress กับ Gateway API ต่างกันอย่างไร

มิติ Ingress Gateway API
โครงสร้าง Resource เดียวรวมทุกอย่าง แยกเป็น GatewayClass, Gateway และ Route
การแบ่งความรับผิดชอบ ผู้ดูแลคลัสเตอร์และทีมแอปแก้ Resource เดียวกัน ทีม Platform ดูแล Gateway ทีมแอปดูแล Route ของตัวเอง
โปรโตคอล HTTP และ HTTPS เป็นหลัก HTTP, gRPC, TLS, TCP และ UDP
ฟีเจอร์ขั้นสูง ใช้ Annotation ซึ่งต่างกันในแต่ละ Controller กำหนดใน Spec มาตรฐาน เช่น Header Matching และ Traffic Splitting
การย้าย Controller ต้องแปลง Annotation ใหม่ Route ส่วนใหญ่ใช้ต่อได้ถ้า Controller รองรับฟีเจอร์เดียวกัน

ปัญหาหลักของ Kubernetes Ingress แบบเดิมคือฟีเจอร์ที่เกินกว่าการ Route พื้นฐานต้องใช้ Annotation เฉพาะของแต่ละ Controller การเปลี่ยน Controller จึงต้องแก้ Manifest จำนวนมาก Gateway API แก้ปัญหานี้ด้วยการกำหนดฟีเจอร์เหล่านี้เป็นมาตรฐาน ดูเอกสารทางการได้ที่ Gateway API

ส่วนประกอบของ Gateway API ที่มาแทน Kubernetes Ingress

  • GatewayClass: ระบุว่าใช้ Controller ตัวไหน คล้าย StorageClass
  • Gateway: กำหนด Listener เช่น พอร์ต 443 และ Certificate เป็นจุดรับ Traffic
  • HTTPRoute: กำหนดว่า Host และ Path ใดไปที่ Service ไหน ทีมแอปสร้างเองใน Namespace ของตัวเองได้

เลือก Controller สำหรับ Gateway API

Controller ที่รองรับ Gateway API มีหลายตัว เช่น Envoy Gateway, Istio, Cilium, NGINX Gateway Fabric, Traefik, Kong และ HAProxy ตรวจระดับการรองรับของแต่ละตัวได้จากหน้า Implementations ในเอกสาร Gateway API ให้เลือกโดยพิจารณาจาก

  • ระดับ Conformance ของ Gateway API ที่ Controller ผ่าน
  • ฟีเจอร์ที่แอปใช้อยู่ เช่น Rate Limiting, Authentication และ WebSocket
  • ความคุ้นเคยของทีม เช่น ทีมที่ใช้ Service Mesh อยู่แล้วอาจเลือก Controller ที่มากับ Mesh นั้น
  • รอบการออก Release และช่องทาง Support

ขั้นตอนที่ 1: สำรวจ Kubernetes Ingress และ Annotation ที่ใช้

kubectl get ingress -A
kubectl get ingress -A -o yaml | grep "nginx.ingress.kubernetes.io" | sort | uniq -c | sort -rn

คำสั่งที่สองนับว่า Annotation แต่ละตัวถูกใช้กี่ครั้ง ช่วยให้รู้ว่าต้องหาฟีเจอร์อะไรมาทดแทน เช่น rewrite-target, ssl-redirect, auth-url และ configuration-snippet ตัวหลังสุดควรตรวจเป็นพิเศษ เพราะเป็นการแทรก Config ของ NGINX โดยตรง ซึ่งไม่มีสิ่งเทียบเท่าในมาตรฐาน

ขั้นตอนที่ 2: ติดตั้ง Gateway API CRD และ Controller

ติดตั้ง CRD ของ Gateway API ตามเวอร์ชันที่ Controller รองรับ แล้วติดตั้ง Controller คู่ขนานกับ ingress-nginx เดิม โดยยังไม่เปลี่ยน DNS ทำให้ทดสอบได้โดยไม่กระทบผู้ใช้

ขั้นตอนที่ 3: แปลง Kubernetes Ingress เป็น HTTPRoute

เครื่องมือ ingress2gateway จากโครงการ Kubernetes ช่วยแปลง Ingress Resource เป็น Gateway API ได้ส่วนหนึ่ง แต่ต้องตรวจผลทุกไฟล์ ตัวอย่าง HTTPRoute ที่ได้

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: shop
  namespace: shop
spec:
  parentRefs:
    - name: public-gateway
      namespace: gateway-system
  hostnames:
    - "shop.example.com"
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /api
      backendRefs:
        - name: shop-api
          port: 8080

ถ้า Route อยู่คนละ Namespace กับ Gateway ต้องตั้ง allowedRoutes ใน Gateway ให้รับ Route จาก Namespace นั้น และถ้า Route ชี้ไป Service ข้าม Namespace ต้องสร้าง ReferenceGrant

ขั้นตอนที่ 4: ทดสอบก่อนเปลี่ยน DNS

ทดสอบผ่าน IP ของ Gateway ใหม่โดยตรงด้วย curl แล้วกำหนด Host Header เอง

curl -sv --resolve shop.example.com:443:<gateway-ip> https://shop.example.com/api/health

ตรวจ Redirect, Header, Timeout, ขนาด Request Body สูงสุด และ WebSocket ให้เหมือนระบบเดิม ค่าเริ่มต้นของ Controller แต่ละตัวต่างกัน จุดนี้มักเป็นต้นเหตุของปัญหาหลังย้าย

ขั้นตอนที่ 5: ย้าย Traffic ทีละส่วน

ลด TTL ของ DNS ล่วงหน้า แล้วย้ายทีละ Hostname เริ่มจากระบบที่ไม่สำคัญ เก็บ ingress-nginx ไว้คู่ขนานจนกว่าจะมั่นใจ แล้วจึงลบ Ingress Resource เดิมและถอน Controller เก่าออก

ถ้ายังไม่พร้อมย้ายไป Gateway API

ถ้ามี Ingress จำนวนมากหรือทีมยังไม่พร้อมเปลี่ยนโครงสร้าง ทางเลือกระยะสั้นคือย้ายไป Ingress Controller ตัวอื่นที่ยังรองรับ Kubernetes Ingress แบบเดิม ซึ่งทำให้ Manifest ของ Kubernetes Ingress ส่วนใหญ่ใช้ต่อได้ แต่ยังต้องแปลง Annotation อยู่ดี และควรวางแผนไป Gateway API ในรอบถัดไป เพราะฟีเจอร์ใหม่ของระบบนิเวศ Kubernetes พัฒนาบน Gateway API เป็นหลัก

คำถามที่พบบ่อย

Kubernetes Ingress จะถูกยกเลิกไหม?

Ingress API ยังอยู่ใน Kubernetes และใช้งานได้ต่อไป สิ่งที่ยุติคือโครงการ ingress-nginx ส่วน Ingress API ไม่มีการพัฒนาฟีเจอร์ใหม่แล้ว และ Gateway API คือทิศทางหลักของโครงการ

Gateway API พร้อมใช้ใน Production หรือยัง?

แกนหลักของ Gateway API อย่าง Gateway และ HTTPRoute อยู่ในสถานะ GA ตั้งแต่เวอร์ชัน 1.0 ปี 2023 และ Controller หลายตัวรองรับในระดับ Production แล้ว

ต้องย้าย Kubernetes Ingress ทุกตัวพร้อมกันไหม?

ไม่ต้อง Ingress Controller เดิมและ Gateway API Controller รันคู่ขนานกันได้ ให้ย้ายทีละ Hostname หรือทีละแอป

ingress2gateway แปลงได้ครบทุกอย่างไหม?

ไม่ครบ เครื่องมือแปลงโครงสร้างพื้นฐานได้ดี แต่ Annotation เฉพาะของ Controller เดิมอาจแปลงไม่ได้หรือแปลงได้บางส่วน ต้องตรวจผลและทดสอบทุกครั้ง

สรุป

การย้าย Kubernetes Ingress ไป Gateway API เป็นโอกาสจัดโครงสร้าง Traffic ขาเข้าให้แบ่งความรับผิดชอบชัดเจนขึ้นและเปลี่ยน Controller ได้ง่ายขึ้นในอนาคต ให้เริ่มจากสำรวจ Annotation ที่ใช้ เลือก Controller ติดตั้งคู่ขนาน แปลงและทดสอบ แล้วย้าย Traffic ทีละส่วน

THAI DATA CLOUD ให้บริการ Cloud Server และ Cloud Linux Server ที่ใช้สร้าง Kubernetes Cluster ได้ พร้อม Private Network สำหรับเชื่อมต่อระหว่าง Node [ตรวจสอบ: มีบริการ Managed Kubernetes หรือไม่ และรองรับ Load Balancer แบบใด] หากต้องการให้ทีมช่วยวางแผนย้าย ปรึกษาได้ที่ ติดต่อ THAI DATA CLOUD

แชร์FacebookXLINELinkedIn

มีคำถามเรื่องบริการ? ติดต่อทีมงาน