ADPT

สรุป Red Hat Webinar: แนวทางการพัฒนา Kubernetes Native Application

ในการนำ Application มาทำงานอยู่บน Kubernetes ต้องทำอะไรบ้าง เพื่อให้สามารถทำงานได้ดี ใน Webinar ครั้งนี้ทีมงาน Red Hat ได้แก่คุณวรวิทย์ เลิศกิติพงศ์พันธ์และคุณนัทที จิรัฐติวงศ์วิบูล ได้มาสรุป Best Practice เอาไว้ดังนี้

Credit: Red Hat

Configuration ด้าน Resource

1 Keep Application Configuration Outside Container Image

Developer ควรจะต้องพัฒนา code ให้สามารถอ่าน configuration จากภายนอกได้ เช่น ใช้ property file หรือใช้ environment variables โดยทาง Kubernetes สามารถใช้ ConfigMap และ Secrets ในการเก็บ configuration โดย Config Map ใช้เก็บ configuration ทั่วๆ ไป สำหรับ configuration ที่เป็น Confidential ควรใช้ Secret โดยควรมีการทำ Role Base Access Control (RBAC) เพื่อควบคุมสิทธิ์ในการเข้าถึง Secret และการทำเข้ารหัสเพิ่มเติมสำหรับข้อมูล secret ที่เก็บบน etcd ด้วย (encrypt data at rest)

วิธีการนี้จะทำให้ เรามี configuration สำหรับแต่ละ environment โดยใช้ container image เดียวกันได้

2 Specify Resources Request and Limit in Pod Definition

การกำหนดทรัพยากรขั้นต่ำและค่าสูงสุดที่ต้องการใช้งานได้ในการทำงานของแต่ละ pod จะทำให้ผู้ดูแลระบบมั่นใจได้ว่าทรัพยากรโดยรวมนั้นจะไม่ถูกใช้งานหมดไปในการทำงาน และไม่ทำให้ Application หนึ่งๆ นั้นใช้งานทรัพยากรไปจนหมด โดยทรัพยากรขั้นต่ำที่ต้องการ (Request) และสูงสุดที่จะใช้ได้ (Limit) จะมีผลกับ Quality of Service (QoS) ที่ Kubernetes ใช้ในการบริหารจัดการ pod

อย่างไรก็ดี Developer ก็มักไม่ทราบว่าควรจะตั้งค่าตรงนี้ให้สูงแค่ไหนดี ซึ่งตรงนี้ก็จะมีเครื่องมือช่วย

ในการวัดปริมาณทรัพยากรที่เหมาะสมนั้นอาจทำได้ทั้งการทำ Load Test เพื่อทดสอบ หรือการใช้เครื่องมืออย่าง Limit Range สำหรับการกำหนด Request หรือ Limit ให้กับ pod ที่ไม่ได้ถูกกำหนดค่า Request หรือ Limit ไว้ และ Vertical Pod Autoscaler (VPA) ที่สามารถตรวจสอบทรัพยากรที่ใช้ในจริงแล้วให้คำแนะนำ Request และ Limit ที่เหมาะสม หรือจัดการกำหนดค่าให้กับเราโดยอัตโนมัติ

3 Always Defined Liveness and Readiness Probe

ควรมีการทำ Health Check เพื่อให้ทราบว่าแต่ละส่วนของ Application บนระบบนั้นพร้อมให้บริการหรือไม่ ทำให้ Application พร้อมใช้งานอยู่เสมอ

การตรวจสอบ Liveness คือการตรวจว่า Pod ยังทำงานอยู่หรือเปล่า ถ้าไม่ทำงานก็จะ Restart ให้ ส่วน Readiness จะดูที่ Application แต่ละ Pod พร้อมให้บริการหรือไม่ ถ้ามีปัญหาก็จะไม่ส่ง Traffic เข้าไป

ในเชิงการทำงานจะมี Startup Probe เพิ่มเข้ามาอีกอัน สำหรับกรณีตรวจสอบการ Start ระบบขึ้นมาทำงาน

ในการ Probe ทำได้ 3 แบบ คือ HTTP/HTTPS, TCP และการเรียกใช้ Command ภายในระบบ

Configuration ด้าน Reliability & Visibility

4 Protect Application with Pod Disruption Budget

ตั้งค่าระบบให้มั่นใจว่าในระหว่างที่มีการ Maintenance Node อยู่ หรือบาง Node มีปัญหาจริงๆ Cluster จะจัดการให้ยังมีจำนวน Pod มากพอสำหรับให้บริการได้ โดยการกำหนดค่า PodDisruptionBudget ว่า maxUnavailable หรือ minAvailable ควรจะเป็นเท่าไหร่

5 Ensure that Pods Terminate Gracefully

Kubernetes มีกระบวนการในการทำให้ Pod นั้นสามารถ Terminate ได้อย่างถูกต้องโดยเมื่อ Pod เข้าสู่สถานะ Terminating แล้ว Pod จะไม่ได้รับ Traffic ใหม่เพิ่มเติม และ เริ่มเคลียร์ Resource เมื่อได้รับ SIGTERM Signal โดยสามารถทำ preStop hook เพิ่มเติมได้ ถ้ามีความจำเป็นพิเศษในการจัดการ resources ที่ pod ใช้งาน จากนั้นจึงรอเวลาช่วงหนึ่งตาม terminationGracePeriodSeconds โดยค่า default คือ 30 วินาที ก่อนที่จะส่ง SIGKILL ไปยัง Pod นั้นๆ

ตรงนี้เองเป็นสาเหตุว่าทำไมตอนสั่ง Kill Pod ถึงต้องมีเวลาช่วงหนึ่งก่อนที่ Pod จะหยุดทำงานไปจริงๆ

6 Implement Application Monitoring and Alert

ตรวจสอบให้มั่นใจได้อยู่ตลอดว่าระบบสามารถให้บริการได้ในระดับ Application Level ด้วยการใช้ Prometheus, Grafana และ Alert Manager มาช่วยในระดับ Ops ส่วนในระดับ Application นั้นสามารถกำหนด metrics ในระดับ Application โดยใช้ library ต่างๆ เช่น MicroProfile Metrics ในกรณีที่ใช้ Java

ใน Red Hat OpenShift จะมี Developer Console มาให้ และเลือกดู Metric เพิ่มเติมได้ตามต้องการ รวมถึงตั้งเงื่อนไขการ Alert ได้เลย ทำให้สะดวกในการตรวจสอบการทำงานเบื้องต้นได้เลยเป็นอีกทางเลือกหนึ่งที่ช่วยอำนวยความสะดวก ไม่ต้องทำการติดตั้ง monitoring stack เองภายนอก

7 Configure the Applications to Write their Logs to stdout/stderr

ช่วยให้สามารถตรวจสอบได้ว่า Application นั้นยังคงทำงานตอบสนองต่อความต้องการทางธุรกิจได้ตลอด โดย Developer สามารถเขียนข้อมูลลง Log ผ่าน stdout/stderr ได้เลย แล้ว ที่ Node ของ Kubernetes จะใช้ log collector เช่น fluentd คอยตรวจสอบ ก่อนจะรวมข้อมูล Log ไปเก็บไว้ศูนย์กลางโดยสามารถใช้ Kibana / Elasticsearch มาช่วยได้ และ ควรกำหนด Role ให้แต่ละคนเข้าถึงข้อมูลเฉพาะที่เกี่ยวกับตัวเองได้

8 Run One Process per Container

ควรออกแบบ Application ให้แต่ละ Container มี 1 Process เพื่อให้เหมาะสมต่อการใช้งานภายในสถาปัตยกรรม Microservice มากที่สุด และทำให้การทำ Signal Routing เกิดขึ้นได้อย่างเหมาะสม รวมถึงลดโอกาสการเสียทรัพยากรไปกับ Zombie Process และ ในกรณีที่มีความจำเป็น อาจจะทำหลายๆ container ใน 1 pod ก็ได้

9 Implement Resilience Measures – Circuit Breaker, Timeout, Retries and Rate Limits

เก็บข้อมูลเพิ่มเติมเพื่อให้สามารถเพิ่มความทนทานให้กับระบบได้ เช่น การใช้ Hystrix ในระดับโค้ด หรือการใช้ Service Mesh อย่าง Istio ทำให้จัดการกับกรณีที่เกิด Failure ในระบบได้ง่ายยิ่งขึ้น ควบคุมพฤติกรรมของระบบได้จาก Platform โดยตรงเลย

Configuration ด้าน Security ให้กับ Application และ Platform โดยพยายามยึดเรื่อง ShiftLeft Security เป็นหลัก

10 Use Trusted Base Container

ควรใช้ Base Image จาก Source ที่เชื่อใช้ เช่น จาก Vendor ที่มีการจัดการดีๆ และใช้ DevOps Tool ในการทำ Image Sacnning, ตั้งค่าให้ Cluster ดึง Image มาจาก Registry ที่เชื่อใจเท่านั้น ก็จะทำให้ทุกคนเริ่มใช้ของจากแหล่งที่ปลอดภัยมาก่อน

เดือนธันวาคมที่ผ่านมา กว่า 51% ของ Image ใน Docker Hub นั้นมีช่องโหว่ CVE และบางส่วนนั้นก็มี Malware อยู่ภายในระบบด้วย จึงต้องระวังในส่วนนี้ให้ดี

Red Hat เองก็มี Registry ของตนเองให้ใช้ โดยมี Base Image ที่เป็นที่นิยมให ้โดย Red Hat จะคอย Scan และ Update ให้อยู่ตลอด พร้อมระบุ Health Index ที่มีการอัปเดตให้เสมอ และจะทราบทันทีว่า Image เก่าๆ มีปัญหาอะไรบ้าง

11 Use a Separate Build Image and Runtime Image

แยกตัว Build Image กับ Runtime Image ออกจากกัน จะทำให้บริหารจัดการขนาดของ Container ได้ดีขึ้น และลด Attack Surface ที่จะเกิดขึ้นให้เหลือน้อยลงได้

เทคนิคที่เหมาะสมนั้นก็คือการใช้ Multistage Docker Build, การใช้ความสามารถ OpenShift S2I (Source to Image) สำหรับ Java, Go และ C# ที่ช่วยทำ Multistage Build ได้อย่างอัตโนมัติ หรือเลือกใช้ Quarkus สำหรับ Java

12 Use TLS to Protect Communication Between Applications

เราสามารถใช้ Service Mesh เข้ามาช่วยให้มีการเข้ารหัสในการสื่อสารระหว่าง Service ภายใน Cluster ให้หมด จะได้ปกป้องข้อมูลสำคัญที่มีการรับส่งได้ วิธีนี้จะทำให้สะดวกเพราะเป็น Configuration ไม่ต้องทำที่ระดับ Code ของ Application

แนะนำ Free E-Book: Kubernetes Patterns

ทีมงาน Red Hat ได้แนะนำให้ผู้ที่สนใจสามารถศึกษาข้อมูลเชิงลึกเพิ่มเติมได้จาก E-Book ที่ Red Hat แจกฟรีภายใต้ชื่อ Kubernetes Patterns ที่ได้รวบรวมเอาเนื้อหาเหล่านี้เอาไว้อย่างครบถ้วนแล้วที่ https://www.redhat.com/en/topics/cloud-native-apps/introduction-to-kubernetes-patterns

สนใจติดต่อ Red Hat ได้ทันที

ผู้ที่สนใจรายละเอียดเพิ่มเติม สามารถศึกษาข้อมูลเพิ่มเติมได้ที่ https://www.openshift.com/ หรือติดต่อทีมงาน Red Hat ประจำประเทศไทยได้ที่ Email rchemae@redhat.com 

 


About techtalkthai

ทีมงาน TechTalkThai เป็นกลุ่มบุคคลที่ทำงานในสาย Enterprise IT ที่มีความเชี่ยวชาญทางด้าน Network, Security, Server, Storage, Operating System และ Virtualization มารวมตัวกันเพื่ออัพเดตข่าวสารทางด้าน Enterprise IT ให้แก่ชาว IT ในไทยโดยเฉพาะ

Check Also

[Guest Post] ASUS ส่ง ‘ExpertBook B9’ อัพเกรดใหม่เดินหน้าบุกตลาดโน้ตบุ๊กกลุ่มธุรกิจ ชูน้ำหนักสุดเบาเพียง 1 กิโลกรัม และระบบความปลอดภัยระดับองค์กร พร้อมขยายตลาดเจาะกลุ่มการศึกษาเปิดตัว ‘ASUS BR1100’ สำหรับเด็กวัยประถมศึกษา

เอซุส (ประเทศไทย) จำกัด เปิดตัวสองโน้ตบุ๊กใหม่ในกลุ่มผลิตภัณฑ์องค์กร (Commercial) นำโดยโน้ตบุ๊กธุรกิจ ASUS ExpertBook B9 (B9400) รุ่นล่าสุดประจำปี 2021 ที่มาพร้อมการอัพเกรดใหม่ ตอบโจทย์คนทำงานยิ่งขึ้น พร้อมเปิดตลาดการศึกษา …

AIS x Gorilla ผนึกกำลังประยุกต์ใช้ AI-Vision ในอุตสาหกรรมค้าปลีกและอสังหาฯ บนเครือข่าย AIS 5G

ในช่วงเปลี่ยนผ่านสู่ยุคดิจิทัล ปฏิเสธไม่ได้เลยว่า AI หรือปัญญาประดิษฐ์ได้เข้ามามีบทบาทสำคัญอย่างมากในการขับเคลื่อนอุตสาหกรรมต่าง ๆ ด้วยความสามารถในการเรียนรู้เพื่อคิดวิเคราะห์ข้อมูลได้ใกล้เคียงกับมนุษย์ จนถึงขั้นเรียนรู้เข้าใจผ่านข้อมูลภาพและวิดีโอจากการมองเห็นผ่านกล้องด้วยเทคโนโลยี AI Vision ซึ่งในปี 2021 มีการวิเคราะห์ว่า เทคโนโลยี AI Vision …