07
10-Day Kubernetes Track • Week 2

วันที่ 7: ClusterIP & NodePort Services

คู่มือปฏิบัติการ • 20–30 นาทีต่อวัน • สัปดาห์ที่ 2

ยินดีต้อนรับสู่ วันที่ 7: ระบบเครือข่าย ClusterIP และ NodePort Services!

วันนี้เราจะมาทำความเข้าใจว่า Kubernetes จัดการการเชื่อมต่อเครือข่ายระหว่าง Pods และการเปิดให้ภายนอกเข้าถึงได้อย่างไร ผ่านวัตถุที่เรียกว่า Service พร้อมทดลองสลับประเภท Service และตรวจสอบผลบน Headlamp UI ครับ

5-10m

ช่วงที่ 1: สรุปแนวคิดสถาปัตยกรรม

เข้าใจปัญหา IP ของ Pod ที่ไม่คงที่ (Ephemeral), หน้าที่ของ Service Load Balancer, และความต่างระหว่าง ClusterIP กับ NodePort

15-20m

ช่วงที่ 2: การลงมือปฏิบัติจริง (5 ขั้นตอน)

Expose Deployment เป็น ClusterIP, สำรวจ Endpoints บน UI, ยิง Curl ทดสอบ DNS ภายใน, Patch เป็น NodePort และเทียบพอร์ตบน UI

1

สรุปแนวคิดและสถาปัตยกรรม (5–10 นาที)

ทำไมต้องมี Service?

Pod ใน Kubernetes มีวงจรชีวิตไม่แน่นอน (Ephemeral) เมื่อถูกรีสตาร์ตหรืออัปเกรด IP จะเปลี่ยนไปเสมอ Service จึงทำหน้าที่เป็น Stable IP / DNS Name คอยรับ Traffic แล้วทำ Load Balancing กระจายไปยัง Pods ผ่าน Selector Labels

• Service → Endpoints → Target Pods

ClusterIP (Default)

เปิดให้เข้าถึงได้เฉพาะภายใน Cluster เท่านั้น โดย Kubernetes จะสร้าง Virtual Internal IP ประจำ Service เหมาะสำหรับการสื่อสารระหว่าง Microservices หรือเชื่อมต่อ Database หลังบ้านที่ไม่เปิดสู่สาธารณะ

• เรียกผ่านชื่อ Service DNS ได้ เช่น http://web-internal

NodePort

เปิดพอร์ตตรงบน Node ทุกตัวใน Cluster (ช่วงหมายเลขพอร์ต 30000–32767) ทำให้ผู้ใช้ภายนอกเข้าถึง Service ได้โดยตรงผ่านรูปแบบ <NodeIP>:<NodePort> โดย Service จะส่งต่อ Traffic เข้า ClusterIP ต่อไป

• ช่องทางพื้นฐานในการเชื่อมต่อจากภายนอก Cluster
2

ขั้นตอนลงมือปฏิบัติจริง (15–20 นาที)

ติ๊กถูกเมื่อทำแต่ละขั้นตอนเสร็จ
Step 1 of 5

เปิด Terminal แล้วสร้าง Service แบบ ClusterIP เพื่อเชื่อมต่อไปยัง web-app Deployment ที่เราสร้างไว้ในวันที่ 6:

Terminal Bash • Expose ClusterIP Service
kubectl expose deployment web-app --port=80 --targetport=80 --type=ClusterIP --name=web-internal
✓ ผลลัพธ์ที่คาดหวัง: Terminal จะแสดงข้อความ service/web-internal exposed และได้รับ Cluster-IP ภายในคลัสเตอร์ทันที
Step 2 of 5

เปิด Headlamp UI เพื่อสำรวจการจับคู่ปลายทางของ Service ไปยัง Pods อัตโนมัติ:

  1. เปิด Headlamp UI ขึ้นมา (ผ่าน http://localhost:8080 หรือ Headlamp Desktop)
  2. ไปที่เมนูด้านซ้าย Network > Services แล้วคลิกเลือก web-internal
  3. สังเกตในส่วน Endpoints: คุณจะเห็นรายการ IP Address ของ Pods ทั้ง 4 ตัวที่ตรงกับ Selector ของ Service นี้อย่างชัดเจน
หาก Pods ตัวใดดับไป หรือถูกแทนที่ด้วย Replica ใหม่ Endpoints ในหน้านี้จะอัปเดต IP ให้โดยอัตโนมัติ
Step 3 of 5

สร้าง Pod ชั่วคราวเพื่อรันคำสั่ง curl ทดสอบเรียกใช้งานผ่านชื่อ Service ภายใน Cluster โดยระบบ CoreDNS จะแปลงชื่อ Service เป็น ClusterIP ให้เอง:

Terminal Bash • Test Internal DNS with Curl
kubectl run test-curl --rm -it --image=curlimages/curl -- curl http://web-internal
✓ ผลลัพธ์ที่คาดหวัง: หากสำเร็จ จะได้รับข้อความตอบกลับเป็น HTML หน้าแรกของ Nginx เช่น <h1>Welcome to nginx!</h1> และ Pod ชั่วคราวจะลบตัวเองออกไปอัตโนมัติ
Step 4 of 5

ปรับเปลี่ยนชนิดของ Service จาก ClusterIP เป็น NodePort เพื่อเปิดพอร์ตภายนอก ด้วยคำสั่ง patch:

Terminal Bash • Patch Service to NodePort
kubectl patch svc web-internal -p '{"spec": {"type": "NodePort"}}'
Kubernetes จะสุ่มจัดสรรหมายเลขพอร์ตภายนอกในช่วง 30000–32767 เข้ากับ Service นี้โดยทันที
Step 5 of 5

ตรวจสอบหมายเลขพอร์ตที่ได้รับจัดสรรทั้งบน Terminal และหน้าต่างกราฟิกของ Headlamp:

Terminal Bash • Check NodePort Assignment
kubectl get svc web-internal
  1. สังเกตในคอลัมน์ PORT(S) ของ Terminal: จะแสดงผลในรูปแบบ 80:3xxxx/TCP (ตัวเลขหลังเครื่องหมายทวิภาค เช่น 31234 คือเลขพอร์ต NodePort ภายนอก)
  2. สลับกลับมาที่ Headlamp UI ในหน้า Network > Services > web-internal: สังเกตการอัปเดตประเภท Type เป็น NodePort พร้อมแสดงเลขพอร์ตภายนอกที่ถูกเปิดให้อย่างชัดเจน
✓ ผลลัพธ์ที่คาดหวัง: ทั้งบน Terminal และ Headlamp UI จะแสดงผลตรงกัน ยืนยันว่า Service สามารถรับ Traffic จากภายนอกโหนดผ่านพอร์ต NodePort ได้สำเร็จ
ภารกิจสำหรับวันที่ 7 (Day 7 Mission)

ลองสร้าง Service และสลับชนิดเป็น NodePort ดูนะครับ หากส่องดู Endpoints บน Headlamp UI เรียบร้อยแล้ว แจ้งได้เลยครับ!

ขั้นตอนถัดไป: เมื่อพร้อมแล้ว บอกผมได้เลยนะครับเพื่อไปต่อใน วันที่ 8: ConfigMaps และการฉีด Environment Variables เข้าสู่ Pods
ข้อความแจ้งเตือน