ยินดีต้อนรับสู่ วันที่ 7: ระบบเครือข่าย ClusterIP และ NodePort Services!
วันนี้เราจะมาทำความเข้าใจว่า Kubernetes จัดการการเชื่อมต่อเครือข่ายระหว่าง Pods และการเปิดให้ภายนอกเข้าถึงได้อย่างไร ผ่านวัตถุที่เรียกว่า Service พร้อมทดลองสลับประเภท Service และตรวจสอบผลบน Headlamp UI ครับ
ช่วงที่ 1: สรุปแนวคิดสถาปัตยกรรม
เข้าใจปัญหา IP ของ Pod ที่ไม่คงที่ (Ephemeral), หน้าที่ของ Service Load Balancer, และความต่างระหว่าง ClusterIP กับ NodePort
ช่วงที่ 2: การลงมือปฏิบัติจริง (5 ขั้นตอน)
Expose Deployment เป็น ClusterIP, สำรวจ Endpoints บน UI, ยิง Curl ทดสอบ DNS ภายใน, Patch เป็น NodePort และเทียบพอร์ตบน UI
สรุปแนวคิดและสถาปัตยกรรม (5–10 นาที)
ทำไมต้องมี Service?
Pod ใน Kubernetes มีวงจรชีวิตไม่แน่นอน (Ephemeral) เมื่อถูกรีสตาร์ตหรืออัปเกรด IP จะเปลี่ยนไปเสมอ Service จึงทำหน้าที่เป็น Stable IP / DNS Name คอยรับ Traffic แล้วทำ Load Balancing กระจายไปยัง Pods ผ่าน Selector Labels
ClusterIP (Default)
เปิดให้เข้าถึงได้เฉพาะภายใน Cluster เท่านั้น โดย Kubernetes จะสร้าง Virtual Internal IP ประจำ Service เหมาะสำหรับการสื่อสารระหว่าง Microservices หรือเชื่อมต่อ Database หลังบ้านที่ไม่เปิดสู่สาธารณะ
http://web-internal
NodePort
เปิดพอร์ตตรงบน Node ทุกตัวใน Cluster (ช่วงหมายเลขพอร์ต 30000–32767) ทำให้ผู้ใช้ภายนอกเข้าถึง Service ได้โดยตรงผ่านรูปแบบ <NodeIP>:<NodePort> โดย Service จะส่งต่อ Traffic เข้า ClusterIP ต่อไป
ขั้นตอนลงมือปฏิบัติจริง (15–20 นาที)
เปิด Terminal แล้วสร้าง Service แบบ ClusterIP เพื่อเชื่อมต่อไปยัง web-app Deployment ที่เราสร้างไว้ในวันที่ 6:
kubectl expose deployment web-app --port=80 --targetport=80 --type=ClusterIP --name=web-internal
service/web-internal exposed และได้รับ Cluster-IP ภายในคลัสเตอร์ทันที
เปิด Headlamp UI เพื่อสำรวจการจับคู่ปลายทางของ Service ไปยัง Pods อัตโนมัติ:
- เปิด Headlamp UI ขึ้นมา (ผ่าน http://localhost:8080 หรือ Headlamp Desktop)
- ไปที่เมนูด้านซ้าย Network > Services แล้วคลิกเลือก web-internal
- สังเกตในส่วน Endpoints: คุณจะเห็นรายการ IP Address ของ Pods ทั้ง 4 ตัวที่ตรงกับ Selector ของ Service นี้อย่างชัดเจน
สร้าง Pod ชั่วคราวเพื่อรันคำสั่ง curl ทดสอบเรียกใช้งานผ่านชื่อ Service ภายใน Cluster โดยระบบ CoreDNS จะแปลงชื่อ Service เป็น ClusterIP ให้เอง:
kubectl run test-curl --rm -it --image=curlimages/curl -- curl http://web-internal
<h1>Welcome to nginx!</h1> และ Pod ชั่วคราวจะลบตัวเองออกไปอัตโนมัติ
ปรับเปลี่ยนชนิดของ Service จาก ClusterIP เป็น NodePort เพื่อเปิดพอร์ตภายนอก ด้วยคำสั่ง patch:
kubectl patch svc web-internal -p '{"spec": {"type": "NodePort"}}'
ตรวจสอบหมายเลขพอร์ตที่ได้รับจัดสรรทั้งบน Terminal และหน้าต่างกราฟิกของ Headlamp:
kubectl get svc web-internal
- สังเกตในคอลัมน์ PORT(S) ของ Terminal: จะแสดงผลในรูปแบบ
80:3xxxx/TCP(ตัวเลขหลังเครื่องหมายทวิภาค เช่น31234คือเลขพอร์ต NodePort ภายนอก) - สลับกลับมาที่ Headlamp UI ในหน้า Network > Services > web-internal: สังเกตการอัปเดตประเภท Type เป็น NodePort พร้อมแสดงเลขพอร์ตภายนอกที่ถูกเปิดให้อย่างชัดเจน
ลองสร้าง Service และสลับชนิดเป็น NodePort ดูนะครับ หากส่องดู Endpoints บน Headlamp UI เรียบร้อยแล้ว แจ้งได้เลยครับ!