[บันทึกช่วยจำ] ลองเล่น NGINX Ingress ใน K8S Cluster บน On-Premises

Image for post
Image for post

ครั้งนี้เรามาต่อยอดจากครั้งที่แล้วจากเรื่อง [บันทึกช่วยจำ] ลองเล่น Terraform + Kubespray + Ansible = K8S Cluster บน VMware โดยที่เราจะลองใช้งาน NGINX มาใช้งานเป็น Ingress บน Service กัน

Image for post
Image for post

โดยทางผู้เขียนทำการปรับปรุง code บน Terraform จากครั้งเก่าให้สามารถสร้าง HA Proxy อีกชุดเพื่อทำหน้าที่ NLB เพื่อทำการกระจายโหลดเข้าไปที่ฝั่ง worker ทั้งหมดของ K8S Cluster เพื่อให้สะดวกให้การสร้าง K8S Cluster มากยิ่งขึ้น โดยเมื่อเราทำการสั่งคำสั่งในการสร้าง K8S Cluster จนเสร็จแล้วเราจะได้หน้าตาของ infrastructure ดังนี้

Image for post
Image for post

คราวนี้เราก็พร้อมจะไปลองใช้งาน NGINX กันแล้ว แต่ก่อนที่จะไปลองเล่นกันเรามาดูส่วนประกอบต่างๆ กันก่อนว่ามีอะไรบ้าง

Ingress, Ingress Resource เป็น service ประเภทหนึ่งมีหน้าที่บริการ application ต่างๆ ที่อยู่ภายใน cluster ส่งออกไปข้างนอกโดยที่เราสามารถกำหนด rules ต่างๆได้ดัง

Content-based routing: ใช้ในการกำหนดการว่าหากมีการเรียกแบบนี้ให้ไป service ไหน โดยจะมีการแบ่งออกเป็น 2 แบบอีก

  • Host-based routing. เป็นการกำหนดใช้ Hostname (FQDN) เป็นตัวกำหนด routing ว่าเรียกแบบนี้เข้ามาให้ไปที่ services อะไร เช่น images.demo.domain
  • Path-based routing. เป็นการกำหนดใช้ pathเป็นตัวกำหนด routing ว่าเรียกแบบนี้เข้ามาให้ไปที่ services อะไร เช่น demo.domain/images

TLS/SSL termination: ใช้ในการทำเรื่อง Offload SSL certificate

NGINX Ingress Controller เป็น application ตัวหนึ่งที่จะรันอยู่ใน cluster ทุกๆ worker node ทำหน้าที่ เป็น reverse proxy และ load balancer โดยรองรับทั้ง NGINX และ NGINX Plus

Image for post
Image for post

น่จะพร้อมลองเล่นจริงๆ แล้วละ เราไปลงเมื่อกันเลยดีกว่า

Clone โปรเจค kubernetes-ingress ของ nginxinc จาก github ซะก่อน

ขั้นตอนที่ 1 — ทำการ clone โปรเจค kubernetes-ingress มาที่เครื่องของเรา

ตั้งค่าเกี่ยว RBAC

ขั้นตอนที่ 1 — สร้าง namespace และ service account สำหรับ Ingress controller

ขั้นตอนที่ 2 — สร้าง cluster role และทำการ binding cluster role ให้กับ service account ที่สร้างขึ้นมา

สร้าง Common Resources

ขั้นตอนที่ 1 — สร้าง secret เพื่เก็บค่า TLS certificate สำหรับ default server

ขั้นตอนที่ 2— สร้าง config map สำหรับการตั้งค่า NGINX

Deploy Ingress Controller

ขั้นตอนที่ 1 — สร้าง NGINX Controller โดยใช้ DaemonSet ระบบจะทำการสร้าง Ingress Controller ทุกๆ node บน cluster

ขั้นตอนที่ 2— ตรวจสอบสถานะ Ingress Controller

ผลลัพธ์ที่ได้

ทดลอง Deploy Application

ขั้นตอนที่ 1 — สร้าง deployment สำหรับ main application

nginx-deployment-main.yaml

ขั้นตอนที่ 2— สร้าง service สำหรับ main application

nginx-service-main.yaml

ขั้นตอนที่ 3 — ตรวจสอบ pods และ service

ผลลัพธ์ที่ได้

ขั้นตอนที่ 4 — สร้าง ingress resource เพื่อกำหนด rule การ routing โดยทางผู้เขียนจะใช้ Hostname (FQDN) เป็นชื่อ k8s.lab.local ทั้งนี้ผู้ที่ลองทำตามต้องไปทำการแก้ไขไฟล์ hosts ในเครื่องตัวเองให้ระบบ k8s.lab.local ไปที่ VIP ของ HA Proxy ด้วย

ingress-resource.yaml

ตรวจสอบ ingress resource

ผลลัพธ์ที่ได้

ดูรายละเอียดของ ingress resource

ผลลัพธ์ที่ได้

แก้ไข hosts ที่เครื่องเราเองด้วยนะ

ขั้นตอนที่ 5— ทดสอบลองเรียกใช้งาน main application

Image for post
Image for post

เย้เรียกเข้าใช้งานได้แล้ว

ทดลอง Deploy Application ตัวต่อไป

ขั้นตอนที่ 1 — สร้าง deployment สำหรับ cat application

nginx-deployment-cat.yaml

ขั้นตอนที่ 2 — สร้าง service สำหรับ cat application

nginx-service-cat.yaml

ขั้นตอนที่ 3 — ตรวจสอบ pods และ service

ผลลัพธ์ที่ได้

ขั้นตอนที่ 4 — แล้วเราจะเข้าใช้ cat application ยังไงนะ ลองเรียก cat.k8s.lab.local

อย่าลืม แก้ไข hosts ที่เครื่องเราเองด้วยนะ

Image for post
Image for post

ยังเรียกไม่ได้เพราะยังไม่ได้เพิ่ม rule บน ingress resource

ขั้นตอนที่ 5— เพิ่ม rule สำหรับ cat.k8s.lab.local ให้เรียกไปที่ nginx-service-cat

ingress-resource.yaml

ตรวจสอบ ingress resource

ผลลัพธ์ที่ได้

ดูรายละเอียดของ ingress resource

ผลลัพธ์ที่ได้

ขั้นตอนที่ 5 — ทดสอบลองเรียกใช้งาน cat application อีกครั้ง

Image for post
Image for post

เย้เข้าได้แล้ว

ทดลอง Deploy Application อีกสัก 2 ตัว

ขั้นตอนที่ 1 — สร้าง deployment สำหรับ dog application

nginx-deployment-dog.yaml

ขั้นตอนที่ 2 — สร้าง service สำหรับ dog application

nginx-service-dog.yaml

ขั้นตอนที่ 3— สร้าง deployment สำหรับ rabbit application

nginx-deployment-rabbit.yaml

ขั้นตอนที่ 4 — สร้าง service สำหรับ rabbit application

nginx-service-rabbit.yaml

ขั้นตอนที่ 5— ตรวจสอบ pods และ service

ผลลัพธ์ที่ได้

ขั้นตอนที่ 6 — แก้ไข hosts ที่เครื่องเราเพื่อเพิ่ม hostname ที่เราจะเรียกเข้าไปใช้งาน service

ขั้นตอนที่ 7— เพิ่ม rule สำหรับ dog.k8s.lab.local และ rabbit.k8s.lab.local ให้เรียกไปที่ nginx-service-dog และ nginx-service-rabbit

ingress-resource.yaml

ตรวจสอบ ingress resource

ผลลัพธ์ที่ได้

ดูรายละเอียดของ ingress resource

ผลลัพธ์ที่ได้

ขั้นตอนที่ 8— ทดสอบลองเรียกใช้งาน dog application และ rabbit application

Image for post
Image for post
Image for post
Image for post

หมายเหตุ ในส่วนของ Path-based routing ทางผู้เขียนได้ทดลองแล้วพบว่าไม่สามารถทำงาน และยังสาเหตุไม่เจอเพราะอะไร หากเจอสาเหตุ และวิธีการแก้ไขแล้วจะนำมาอัพเดตในบทความครับ

สุดท้ายการลองเล่นครั้งก็เป็นเพียงการใช้งานเบื้องต้น ตัว nginx ยังไม่ลูกเล่นอีกมากมายที่ให้เราใช้งาน แต่ต้องเรียนรู้ และหัดใช้งานกันต่อไป

สุดท้ายแล้วหากท่านไหนหลงเข้ามาอ่านแล้วเห็นว่าผมยังเข้าใจผิดในเรื่องใด สามารถให้ข้อมูลเพิ่มเติมได้ครับ

Ref: https://docs.nginx.com/nginx-ingress-controller/overview/

Ref: https://github.com/nginxinc/kubernetes-ingress

Written by

นายช่างระบบระบบคอมพิวเตอร์ตัวเล็กๆ ที่อยากจะโต และเรียนรู้ไปเรื่อยๆ

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store