Kubernetes Zero-2-Hero EP.3 สร้าง Service Ingress และการทำ Horizontal Pod Autoscaler

by. Settakit

settakit
Sirisoft
11 min readAug 2, 2021

--

สวัสดีครับ กลับมาเจอกันอีกครั้งกับ Series “Kubernetes Zero-2-Hero” ใน EP.3 นี้ยังอยู่ในเรื่องของ Resource Type ของ Kubernetes Cluster ซึ่งสิ่งที่เราจะมาแนะนำให้รู้จักในวันนี้มีดังต่อไปนี้

Service

Ingress

Horizontal Pod Autoscaler

Service

มาเริ่มกันที่ Service กันก่อนเลยนะครับ โดยเราได้พูดถึง Service ไปเล็กน้อยแล้วใน EP.2 ใครที่ยังไม่ได้อ่านก็สามารถกด ลิงค์ เพื่อย้อนกลับไปอ่านกันก่อนได้นะครับ

Service เปรียบเสมือนตัวบอกทางภายใน Kubernetes Cluster ที่จะทำให้ Pod สามารถสื่อสารกันได้ภายใน Cluster และ ยังสามารถให้ User ภายนอกเข้ามาใช้งาน Pod ของเราภายใน Cluster ได้อีกด้วย โดยประเภทของ Service ที่เราจะมาทำความรู้จักกันในวันนี้ก็จะมีอยู่ด้วยกัน 3 ประเภท คือ ClusterIP LoadBalancer และ Nodeport

บางคนอาจจะสงสัยว่า “ทำไมถึงต้องมี Service คอยจัดการเรื่องการสื่อสารภายใน Cluster ด้วย Pod สามารถสื่อสารกันเองได้รึเปล่า” คำตอบคือ Pod สามารถสื่อสารกันเองได้ภายใน Cluster ด้วยหมายเลข IP ของ Pod แต่ที่จำเป็นต้องมี Service เข้ามานั้น เพราะว่า Pod มีโอกาสที่จะถูกเพิ่มหรือถูกลบได้ตลอดเวลา เมื่อ Pod ถูกลบ แล้วถูกสร้างขึ้นมาใหม่ IP ของ Pod ก็จะถูกเปลี่ยนไปด้วย ดังนั้น Pod ที่เคยสื่อสารกันด้วย IP เก่าที่เคยกำหนดไว้ก็จะไม่สามารถสื่อสารกันได้อีก จึงจำเป็นต้องมี Service ที่คอยบอกทาง เป็นตัวกลางในการสื่อสารของ Pod ภายใน Cluster

กรณีที่ไม่ใช้งาน Service

กรณีที่ใช้งาน Service

โดยการทำงานของ Service จะไม่เชื่อมต่อกับ Pod โดยใช้ IP โดยตรง แต่จะใช้ Label ภายในตัว Pod เป็นตัวระบุว่า Service นี้จะเข้าไปคุยกับ Pod ไหนตามตัวอย่างดังนี้

จะสังเกตุว่า Config ในส่วนของ Service จะมีการใช้ Selector เพื่อกำหนดให้ Service เชื่อมต่อไปยัง Pod ที่มี Label “run: first-pod” และได้มีการกำหนดให้ Service เข้าใช้งาน Container ภายใน Pod ที่ Port 80

ต่อไปเราก็จะพูดถึง Service แต่และประเภทว่าคืออะไร สามารถใช้งานได้อย่างไรบ้าง

ClusterIP

ClusterIP เป็น Service ที่เป็นตัวกลางการสื่อสารของ Pod ภายใน Cluster สื่อสารกันภายใน User ภายนอกไม่สามารถเข้ามาใช้งาน Pod ผ่าน ClusterIP ได้

สำหรับการใช้งานเราสามารถสร้าง Service ได้จากทั้ง Command และสร้างจากไฟล์ โดยสามารถสร้างจาก Command ได้ดังนี้

หรือจะสร้างจากไฟล์ YAML

โดยมี Config ภายในดังนี้

หากเราไม่ได้กำหนดประเภทให้แก่ Service ทุกๆ Service ที่เราสร้างขึ้นมาจะได้มาเป็นประเภท ClusterIP

หากใช้ Command ในการสร้าง เราสามารถสร้าง Service จาก Deployment หรือ Pod ก็ได้ โดย Selector ก็จะกำหนดการเชื่อมต่อไปยัง Label ของ Pod เองโดยอัตโนมัติ

Pod ที่เราใช้งานนั้นจะมาจาก EP ที่แล้วนะครับ ใครยังไม่ได้อ่าน สามารถคลิกที่ ลิงค์เพื่อความต่อเนื่องในการศึกษาเรียนรู้นะครับ

เราสามารถดู Service ทั้งหมดได้ด้วย Command ดังนี้

NodePort

NodePort เป็น Service ที่สามารถทำให้ User ภายนอก เข้ามาใช้งาน Pod ภายใน Cluster ได้ โดยที่ User สามารถเข้าถึงได้โดยการใช้ IP ของ Node ภายใน Cluster และ NodePort ที่ถูกกำหนดไว้ที่ตั้งแต่หมายเลข 30000–32767

เราสามารถสร้าง Service ที่เป็น NodePort ได้ด้วย Command หรือ ไฟล์ YAML ก็ได้นะครับ แต่ถ้าเราสร้างผ่าน Command เราจะไม่สามารถกำหนดหมายเลขของ NodePort ได้ โดยหมายเลขก็จะถูกสุ่มขึ้นมาตั้งแต่ 30000–32767 แต่เราก็สามารถเข้าไปแก้ไขหมายเลข NodePort ในภายหลังได้ โดยวิธีการสร้างก็จะมีดังนี้

สร้าง Service ประเภท NodePort จาก Command

จากนั้นเมื่อเรียก Service ออกมาดูจะพบว่า TYPE ของ Service จะถูกระบุไว้ว่าเป็น NodePort และมีหมายเลขของ NodePort เพิ่มเข้ามาในส่วนของคอลัมน์ PORT ดังนี้

โดยเราสามารถเข้าใช้งาน Pod ได้ผ่าน IP ของ Node และหมายเลขของ NodePort ซึ่งตอนนี้เราใช้ Kubernetes Cluster แบบ Local อยู่ เราก็สามารถเข้าได้ผ่าน localhost ตามด้วยหมายเลขของ NodePort ได้ดังนี้

หมายเลข NodePort อาจจะไม่เหมือนกันนะครับ ให้ใช้หมายเลข NodePort ของตัวเอง

หรือเราจะสร้างผ่านไฟล์ YAML ที่เป็น Config สำหรับการสร้าง Service ที่เป็น NodePort และยังสมารถกำหนดหมายเลข NodePort ได้อีกด้วย

LoadBalancer

LoadBalancer เป็น Service ที่สามารถทำให้ภายนอกเข้ามาใช้งาน Pod ภายใน Cluster ได้ แต่จะต้องใช้ External Load Balancer ของ Cloud Provider เพื่อให้ Service ประเภท LoadBalancer นั้นทำงานได้ ไม่เช่นนั้น ในส่วนของ EXTERNAL-IP เมื่อเราเรียก Service ออกมาดูจะขึ้น “pending” อยู่ตลอดเวลา ตามตัวอย่างดังนี้

หรือเราสามารถสร้างจากไฟล์ YAML

จากนั้นเมื่อเราเรียก Service ออกมาดูจะพบผลลัพธ์ดังนี้

Ingress

Ingress ทำหน้าที่เหมือนเป็นประตูทางเข้าสำหรับ User ที่จะเข้ามาใช้งาน Pod ที่อยู่ภายใน Cluster คล้ายๆ กับ NodePort และ LoadBalancer แต่สามารถทำให้ User ที่เข้ามาไม่จำเป็นต้องเข้าใช้งานผ่าน IP แต่สามารถเข้าใช้งานด้วย Host Name ได้ และ Ingress ยังสมารถจัดการในเรื่องของการทำ TLS หรือ HTTPs ในการทำ Connection แบบ Secure ได้

ซึ่งก่อนที่เราจะใช้งาน Ingress ได้ เราต้อง Install Plugin เสริมเข้าไป เพื่อที่จะสามารถใช้งาน Ingress ได้ดังนี้

ตรวจสอบว่า Ingress ได้ทำการ Install เสร็จแล้วภายใน Cluster ของเรา ผลลัพธ์จะออกมาดังนี้

เราสามารถสร้าง Ingress ได้จาก YAML ดังนี้

จากนั้นเราสามารถตรวจสอบ Ingress ภายใน Cluster ได้ ดังนี้

ทดสอบการใช้งาน Pod ด้วย Ingress

จะเห็นได้ว่าเราสามารถเข้าใช้งาน Pod ผ่าน Hostname โดยไม่ต้องเข้าผ่าน IP ได้

ต่อไปเราจะสร้าง Ingress ที่เป็น HTTPs กัน

ก่อนอื่นต้องสร้างไฟล์ Cert และ Key เพื่อนำไปใช้สร้าง Ingress แบบ HTTPs

สร้าง Secret สำหรับเก็บไฟล์ Key และ Cert

Secret เป็นหนึ่งใน Resource ใน Kubernetes แต่ใน EP เราจะยังไม่พูดถึงรายละเอียด ขอเก็บเอาไว้พูดใน EP ถัด ๆ ไปแทนนะครับ

จากนั้นตรวจสอบ Ingress ที่สร้างขึ้นมา

ทดสอบการใช้งาน Pod ด้วย Ingress

สามารถทดสอบที่ Browser จะพบว่า Ingress ที่ไม่ได้ทำ TLS หรือ HTTPs ไว้ จะไม่สามารถเข้าใช้งานผ่าน HTTPs ได้ ดังรูปภาพ

Horizontal Pod Autoscaler

Horizontal Pod Autoscaler (HPA) เป็นเครื่องมือที่สามารถทำให้ Pod ภายใน Cluster ของเราเพิ่ม หรือลดลงได้ตามจำนวนความต้องการใช้งานของ User โดย HPA จะคอยตรวจสอบการทำงานของ Pod ว่ามีการใช้ทรัพยากรไปเท่าไหร่แล้ว จากนั้นเมื่อ HPA เห็นว่า Pod ใช้ทรัพยากรไปมากจนถึงจุดที่เรากำหนดให้ทำการขยายจำนวน Pod ก็จะถูกสร้างเพิ่มขึ้นมาตามที่เรากำหนดไว้เองโดยอัตโนมัติ โดยหลังจากที่ Pod ทำงานจนการใช้งานทรัพยากรลดลงแล้ว Pod ก็จะถูกทำลายให้เหลือเท่าที่กำหนดไว้ในตอนแรก

โดยวิธีการทำ HPA นั้นก็ไม่ได้ยุ่งยากอย่างที่คิด

ก่อนอื่นต้องติดตั้ง Metric Server Plugin เข้าไป เพื่อที่จะให้ Cluster ของเรามีเครื่องมือที่คอยตรวจสอบการใช้งานทรัพยากรของ Cluster ได้ ถ้าหากไม่มี Metric Server นั้น Cluster ก็จะไม่สามารถรู้ได้เลยว่า Pod ของเราได้ใช้งานทรัพยากรไปเท่าไหร่แล้ว จึงไม่สามารถที่จะทำการตรวจสอบ และคอยเพิ่ม หรือลดจำนวนของ Pod ได้นั่นเอง

ตรวจสอบว่า Metric Server พร้อมทำงานดังนี้

จากนั้นสร้าง Deployment ขึ้นมาโดยใช้งาน Config ดังนี้

จากนั้นตรวจสอบว่า Pod ของเราได้ถูกสร้างขึ้นมาแล้ว

จากนั้นทำการสร้าง HPA จากไฟล์ YAML ดังนี้

ตรวจสอบว่า HPA ของเราได้ถูกสร้างขึ้นมาแล้ว

จากนั้นสร้าง Service เพื่อให้สามารถเข้าใช้งานได้จากภายนอก และจะได้ทำการทดสอบเรื่องของการทำ HPA ด้วย

จากนั้นใช้ Command ด้านล่างเพื่อตรวจสอบว่า Pod ของเราจะเพิ่มจำนวนตามที่เราต้องการหรือไม่ (อย่าลืมเปลี่ยนหมายเลข NodePort ด้วยล่ะ)

จะสังเกตุเห็นว่าใน Tag <td> จะได้ชื่อของ Pod ที่ไม่ซ้ำกันออกมา นั้นหมายความว่า Pod ของเราได้ทำการสร้างขึ้นมาใหม่แล้วตามจำนวนที่เรากำหนดไว้

ตรวจสอบ Pod ก็จะพบว่า Pod ได้ถูกสร้างขึ้นมาโดยอัตโนมัติเมื่อมีการเรียกใช้งาน Pod (เปิด Terminal ขึ้นมาอีกหนึ่งอันเพื่อดูความเปลี่ยนแปลงเบบ Real Time)

การทำ HPA สามารถดูได้จากทั้งการใช้งาน Memory และ CPU ซึ่งก็ขึ้นอยู่กับว่าเราจะใช้งานในรูปแบบใด ในที่นี้เราขอเลือกใช้งานเป็นดูจาก CPU

ประโยชน์ของ HPA ก็คือ Pod จะถูก Scale ตามความต้องการใช้งานของ User เมื่อ Request ที่เข้ามาภายใน Pod น้อย Pod ก็ไม่จำเป็นต้องมีหลาย Pod เพื่อช่วยกันทำงาน จึงช่วยประหยัดทรัพยากรในส่วนนี้ได้ ใช้ทรัพยากรเฉพาะช่วงเวลามี Request เข้ามายัง Pod เยอะเท่านั้น

Conclusion

  1. เราได้รู้ว่า Service สามารถใช้งานเป็นตัวกลางการสื่อสารของ Pod ภายใน Cluster จัดการปัญหาในเรื่องของจำนวน Pod ที่ไม่แน่นอน และ IP ของ Pod ที่สามารถเปลี่ยนแปลงไปได้เรื่อยๆ เพื่อให้การสื่อสารภายในนั้นเป็นไปได้อย่างไม่มีปัญหา และยังทำให้ User ภายนอกสามารถเข้ามาใช้งาน Pod ภายใน Cluster ได้
  2. Ingress เราได้รู้ว่าการทำงานจะคล้ายกับ Service ที่เป็น NodePort และ LoadBalancer ที่จะทำตัวเป็นประตูเพื่อให้ User สามารถเข้ามาใช้งาน Pod ภายใน Cluster ได้ แต่จะแตกต่างตรงที่ Ingress สามารถสร้าง Hostname และ สร้าง TLS สำหรับการทำ HTTPs ได้
  3. เราได้รู้ว่าวิธีการการทำ HPA และรู้ว่า HPA นั้นเข้ามาช่วยในเรื่องของการทำ Auto Scaling Pod เพื่อเป็นการประหยัดทรัพยากรเมื่อไม่มี Request เข้ามายัง Pod

ก็จบไปอีกหนึ่งตอนใน EP.3 นี้นะครับ สำหรับตอนถัดไปเราจะมาพูดถึงการจัดการค่า Config ต่าง ๆ สำหรับนำเอาไปใช้ภายใน Pod และเรื่องของการทำพื้นที่เก็บข้อมูลสำรองให้กับ Pod

เพื่อนๆสามารถติดตามกันได้ที่ https://www.facebook.com/sirisoft แล้วพบกันใหม่เร็วๆนี้ ขอบคุณครับ 👋🏻👋🏻👋🏻

--

--