- ทำความเข้าใจเกี่ยวกับการบันทึก (Logging) และการตรวจสอบ (Monitoring) ใน Kubernetes
- เหตุใดการบันทึก (Logging) จึงมีความสำคัญใน Kubernetes
- การบันทึก (Logging) ใน Kubernetes
- การใช้แบ็กเอนด์การบันทึก (Logging Backend)
- การตรวจสอบ (Monitoring) ใน Kubernetes
- เมตริก (Metrics) ใน Kubernetes
- โพรมีธีอุส (Prometheus) และกราฟานา (Grafana)
- การตรวจสุขภาพ (Health Checks) ใน Kubernetes
เมื่อแอปพลิเคชันมีความซับซ้อนและขนาดเพิ่มขึ้น ความสำคัญของการบันทึกที่เชื่อถือได้และกลไกการตรวจสอบจะกลายเป็นสิ่งสำคัญยิ่ง โดยเฉพาะอย่างยิ่งในสภาพแวดล้อมคอนเทนเนอร์ที่ควบคุมโดย Kubernetes ซึ่งไมโครเซอร์วิสหลายตัวทำงานร่วมกันเพื่อทำแอพ
ในการจัดการและแก้ไขปัญหาระบบดังกล่าว คุณต้องมองเห็นลักษณะการทำงานและประสิทธิภาพของแอปพลิเคชันของคุณ นี่คือที่มาของแนวคิดของการบันทึกและการตรวจสอบ นอกจากนี้ เราจะพูดถึงการตรวจสุขภาพ (health checks) ใน Kubernetes ซึ่งมีความสำคัญต่อการรักษาสุขภาพและประสิทธิภาพของแอปพลิเคชันของคุณ แต่ก่อนอื่น เรามาเริ่มกันที่ภาพรวมของการบันทึกและการตรวจสอบในการทำแอพใน Kubernetes
1. ทำความเข้าใจเกี่ยวกับการบันทึก (Logging) และการตรวจสอบ (Monitoring) ใน Kubernetes
ในบริบทของ Kubernetes การบันทึกเป็นวิธีการเข้าถึงบันทึกสำหรับคอนเทนเนอร์ที่ทำงานใน Pod ของคุณ เป็นส่วนประกอบที่สำคัญสำหรับการดีบักและทำความเข้าใจพฤติกรรมของแอปพลิเคชันและระบบของคุณ ในทางกลับกัน การตรวจสอบเกี่ยวข้องกับการสังเกตและติดตามประสิทธิภาพและการใช้ทรัพยากรของคลัสเตอร์ โหนด พ็อด และคอนเทนเนอร์ของคุณในการทำแอพ
การตรวจสอบเป็นพื้นฐานสำหรับการระบุและวินิจฉัยข้อบกพร่อง การวางแผนความสามารถ และการทำความเข้าใจความสมบูรณ์โดยรวมของระบบของคุณ การบันทึกและการมอนิเตอร์ร่วมกันมอบเครื่องมือที่จำเป็นในการบำรุงรักษาระบบที่แข็งแกร่งและมีประสิทธิภาพ
2. เหตุใดการบันทึก (Logging) จึงมีความสำคัญใน Kubernetes
หากไม่มีการเข้าสู่ระบบ การวินิจฉัยปัญหาในระบบแบบกระจายอย่าง Kubernetes ก็เหมือนกับการงมเข็มในมหาสมุทร บันทึกจะให้ข้อมูลที่สำคัญเกี่ยวกับสิ่งที่เกิดขึ้นในขณะที่เกิดข้อผิดพลาด ทำให้เป็นเครื่องมือสำหรับการดีบัก นอกจากนี้ยังสามารถให้ข้อมูลเชิงลึกที่มีค่าเกี่ยวกับประสิทธิภาพของระบบและพฤติกรรมของผู้ใช้เมื่อใช้ร่วมกับการตรวจสอบ
3. การบันทึก (Logging) ใน Kubernetes
Kubernetes ไม่รองรับการรวมบันทึกแบบเนทีฟ แต่ทำให้บันทึกพร้อมใช้งานผ่าน Kubernetes API และอินเทอร์เฟซkubectl
บรรทัดคำสั่ง ตามค่าเริ่มต้น Kubernetes จะบันทึกสตรีม stdout และ stderr สำหรับทุกคอนเทนเนอร์ในพ็อด
หากต้องการดูบันทึกของคอนเทนเนอร์ที่กำลังทำงานอยู่ คุณสามารถใช้kubectl logs
คำสั่ง:
kubectl logs <pod-name> <container-name>
ตัวอย่างเช่น หากต้องการดูบันทึกของคอนเทนเนอร์ชื่อ “my-app” ในพ็อดชื่อ “my-pod” คุณต้องเรียกใช้:
kubectl logs my-pod my-app
แม้ว่าฟังก์ชันการบันทึกพื้นฐานนี้จะมีประโยชน์สำหรับการดีบักอย่างง่าย แต่สำหรับสภาพแวดล้อมที่ซับซ้อนมากขึ้น คุณอาจต้องใช้แบ็กเอนด์การบันทึกเฉพาะที่รวมบันทึกจากหลายพ็อดและให้คุณสมบัติการสืบค้นและการวิเคราะห์ขั้นสูงเพิ่มเติม ตัวอย่างของแบ็กเอนด์การบันทึกยอดนิยม ได้แก่ Elasticsearch, Fluentd และ Logstash (สแต็ก ELK) รวมถึงโซลูชันบนคลาวด์ เช่น Google Stackdriver และ AWS CloudWatch
4. การใช้แบ็กเอนด์การบันทึก (Logging Backend)
ลองพิจารณา Fluentd ซึ่งเป็นแบ็กเอนด์การบันทึกที่โฮสต์โดย CNCF และเป็นส่วนสำคัญของสถาปัตยกรรมการบันทึก Kubernetes จำนวนมาก Fluentd รวบรวมบันทึกจากแต่ละโหนดและส่งต่อไปยังแบ็กเอนด์ที่คุณเลือก
ในการตั้งค่า Fluentd โดยทั่วไป คุณจะปรับใช้เป็น DaemonSet ในคลัสเตอร์ Kubernetes สิ่งนี้ทำให้แน่ใจว่า Fluentd Pod ทำงานบนแต่ละโหนดในคลัสเตอร์ของคุณ โดยรวบรวมบันทึกจากคอนเทนเนอร์ทั้งหมดที่ทำงานบนโหนดนั้น
เมื่อใช้ร่วมกับ Elasticsearch สำหรับพื้นที่จัดเก็บบันทึกและ Kibana สำหรับการแสดงภาพ Fluentd จะจัดรูปแบบ EFK stack ซึ่งเป็นโซลูชันการบันทึกแบบโอเพ่นซอร์สที่มีประสิทธิภาพสำหรับ Kubernetes นี่คือวิธีที่คุณสามารถสร้างการตั้งค่าดังกล่าว:
- ตั้งค่า Elasticsearch และ Kibana : ปรับใช้ Elasticsearch และ Kibana กับคลัสเตอร์ของคุณ คุณสามารถใช้ตัวจัดการแพ็คเกจ Helm เพื่อทำให้การปรับใช้ง่ายขึ้น
- ปรับใช้ Fluentd : ถัดไป ปรับใช้ Fluentd เป็น DaemonSet กับคลัสเตอร์ของคุณ กำหนดค่า Fluentd เพื่อรวบรวมบันทึกจากแต่ละโหนดและส่งต่อไปยังบริการ Elasticsearch ของคุณ
- กำหนดค่า Fluentd : การกำหนดค่าของ Fluentd จะกำหนดวิธีการรวบรวมและส่งต่อบันทึก ข้อมูลนี้ระบุไว้ใน ConfigMap ซึ่งต่อจากนั้นติดตั้งใน Fluentd Pods เป็นไฟล์กำหนดค่า
- การดูบันทึกของคุณใน Kibana : ด้วยการส่งต่อบันทึก Fluentd ไปยัง Elasticsearch คุณสามารถใช้ Kibana เพื่อสำรวจและแสดงภาพบันทึกของคุณ
อย่าลืมรักษาความปลอดภัยส่วนหลังการบันทึกของคุณ ตัวอย่างเช่น คุณควรกำหนดค่าการควบคุมการเข้าถึงสำหรับ Kibana และเข้ารหัสการสื่อสารระหว่าง Fluentd, Elasticsearch และ Kibana
5. การตรวจสอบ (Monitoring) ใน Kubernetes
ตอนนี้เราได้กล่าวถึงการบันทึกแล้ว เรามาให้ความสนใจกับการตรวจสอบกัน การตรวจสอบใน Kubernetes เกี่ยวข้องกับการติดตามเมตริกประสิทธิภาพของคลัสเตอร์ โหนด พ็อด และคอนเทนเนอร์ของคุณ
เช่นเดียวกับการบันทึก Kubernetes ไม่มีโซลูชันในตัวสำหรับการตรวจสอบ แต่จะเปิดเผยเมตริกต่างๆ ที่สามารถรวบรวมและวิเคราะห์โดยเครื่องมือภายนอก เครื่องมือเหล่านี้สามารถช่วยคุณแสดงภาพข้อมูลประสิทธิภาพ ตั้งค่าการแจ้งเตือนสำหรับปัญหาที่อาจเกิดขึ้น และดำเนินการวางแผนกำลังการผลิตในการทำแอพ
6. เมตริก (Metrics) ใน Kubernetes
เมตริกที่ Kubernetes มอบให้สามารถแบ่งออกเป็นสองประเภท:
- เมตริกทรัพยากร : เหล่านี้คือเมตริกการใช้ CPU และหน่วยความจำ สถิติดิสก์ I/O และสถิติการใช้งานเครือข่าย เซิร์ฟเวอร์เมตริกซึ่งเป็นตัวรวมข้อมูลการใช้ทรัพยากรทั่วทั้งคลัสเตอร์มักจะให้ข้อมูลเหล่านี้
- เมตริกที่กำหนดเอง : เป็นเมตริกตามอำเภอใจของแอปพลิเคชันของคุณ ซึ่งแสดงผ่านรหัสแอปพลิเคชันหรือเอเจนต์การมอนิเตอร์
7. โพรมีธีอุส (Prometheus) และกราฟานา (Grafana)
Prometheus เป็นระบบตรวจสอบโอเพ่นซอร์สและฐานข้อมูลอนุกรมเวลา โดยจะรวบรวมเมตริกจากเป้าหมายที่กำหนดค่าในช่วงเวลาที่กำหนด ประเมินนิพจน์กฎ และสามารถทริกเกอร์การแจ้งเตือนหากพบว่าเงื่อนไขบางอย่างเป็นจริง
ในทางกลับกัน Grafana เป็นแพลตฟอร์มโอเพ่นซอร์สสำหรับการสร้างภาพและการวิเคราะห์ ช่วยให้คุณสามารถสอบถาม แสดงภาพ แจ้งเตือน และทำความเข้าใจเมตริกของคุณ Grafana รองรับ Prometheus และเป็นตัวเลือกยอดนิยมสำหรับการตั้งค่าแดชบอร์ด
ต่อไปนี้คือคำแนะนำในการตั้งค่าโดยย่อ:
- ติดตั้ง Prometheus : คุณสามารถติดตั้ง Prometheus ในคลัสเตอร์ Kubernetes โดยใช้ Helm เมื่อติดตั้งแล้ว ให้กำหนดค่า Prometheus เพื่อขูดเมตริกจากแอปพลิเคชันของคุณ
- ติดตั้ง Grafana : ติดตั้ง Grafana ในคลัสเตอร์ Kubernetes อีกครั้งโดยใช้ Helm
- เพิ่ม Prometheus เป็นแหล่งข้อมูล : ใน Grafana UI ให้เพิ่ม Prometheus เป็นแหล่งข้อมูล
- ตั้งค่าแดชบอร์ด : Grafana ให้คุณสร้างแดชบอร์ดแบบกำหนดเอง หรือคุณสามารถนำเข้าแดชบอร์ดที่สร้างไว้ล่วงหน้าที่แบ่งปันโดยชุมชน
- ตั้งค่าการแจ้งเตือน : Grafana รองรับการสร้างการแจ้งเตือนตามเมตริกและส่งการแจ้งเตือนเมื่อตรงตามเงื่อนไขบางประการ
Prometheus ยังมี Alertmanager ซึ่งเป็นส่วนประกอบที่จัดการการแจ้งเตือนที่ส่งโดยแอปพลิเคชันไคลเอนต์ โดยเฉพาะเซิร์ฟเวอร์ จะดูแลการขจัดข้อมูลซ้ำ จัดกลุ่ม และกำหนดเส้นทางไปยังเครื่องรับที่ถูกต้อง
8. การตรวจสุขภาพ (Health Checks) ใน Kubernetes
นอกเหนือจากการบันทึกและการตรวจสอบแล้ว Kubernetes ยังมีโพรบสองประเภทเพื่อตรวจสอบความสมบูรณ์ของพ็อด ได้แก่ โพรบความพร้อมและความมีชีวิต
โพรบความพร้อมใช้เพื่อระบุว่าคอนเทนเนอร์พร้อมให้บริการตามคำขอหรือไม่ หากการตรวจสอบความพร้อมล้มเหลว ตัวควบคุมปลายทางจะลบที่อยู่ IP ของพ็อดออกจากจุดสิ้นสุดของบริการทั้งหมดที่ตรงกับพ็อด สถานะความพร้อมเริ่มต้นก่อนการหน่วงเวลาเริ่มต้นคือ ล้มเหลว
Liveness probesใช้เพื่อทราบเมื่อต้องรีสตาร์ทคอนเทนเนอร์ หากการตรวจสอบความคงอยู่ล้มเหลว kubelet จะฆ่าคอนเทนเนอร์ และคอนเทนเนอร์จะอยู่ภายใต้นโยบายการรีสตาร์ท
คุณสามารถกำหนดโพรบในข้อมูลจำเพาะของ Pod ของคุณสำหรับแต่ละคอนเทนเนอร์:
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- name: liveness
image: k8s.gcr.io/liveness
args:
- /server
livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: Custom-Header
value: Awesome
initialDelaySeconds: 3
periodSeconds: 3
ในตัวอย่างนี้ Kubernetes จะเริ่มส่งคำขอ HTTP ไปยัง http://:8080/healthz
คอนเทนเนอร์ liveness
3 วินาทีหลังจากคอนเทนเนอร์เริ่มทำงาน หากโพรบล้มเหลว Kubernetes จะรีสตาร์ทคอนเทนเนอร์
การบันทึก การตรวจสอบ และการตรวจสอบความสมบูรณ์เป็นรากฐานที่สำคัญของแอปพลิเคชันที่เชื่อถือได้และยืดหยุ่นบน Kubernetes พวกเขาให้ข้อมูลเชิงลึกที่จำเป็นในการทำความเข้าใจพฤติกรรมของแอปพลิเคชันและเพื่อแก้ไขปัญหาและแก้ไขปัญหาได้อย่างทันท่วงที
แม้ว่า Kubernetes จะไม่มีเครื่องมือในตัวสำหรับการบันทึกและการตรวจสอบ แต่ก็มีกลไกและ API ที่อนุญาตให้รวมเข้ากับเครื่องมือโอเพ่นซอร์สและเชิงพาณิชย์ที่มีประสิทธิภาพ การจับคู่ Kubernetes กับระบบต่างๆ เช่น Elasticsearch, Fluentd, Kibana, Prometheus และ Grafana ช่วยให้นักพัฒนาและผู้ดูแลระบบได้รับข้อมูลเชิงลึกเกี่ยวกับระบบของตน ช่วยให้มั่นใจได้ว่าระบบจะทำงานได้อย่างราบรื่นและมีประสิทธิภาพ
การทำความเข้าใจและนำเทคนิคเหล่านี้ไปใช้ คุณกำลังทำแอพบน Kubernetes ที่ไม่เพียงแข็งแกร่งและปรับขนาดได้ แต่ยังสังเกตได้และบำรุงรักษาได้ด้วย ความรู้ของสิ่งที่เกิดขึ้นภายในคลัสเตอร์และแอปพลิเคชันของคุณ ณ ช่วงเวลาใดเวลาหนึ่งคือสิ่งที่แยกแอปพลิเคชันที่ทำงานได้ดีและเชื่อถือได้ออกจากระเบิดเวลาที่รอการหยุดทำงานครั้งต่อไป อย่าลืมสละเวลาและความพยายามในการตั้งค่าการบันทึก การตรวจสอบ และการตรวจสอบสถานะอย่างละเอียดสำหรับแอปพลิเคชัน Kubernetes ซึ่งเป็นการลงทุนที่สำคัญสำหรับความสำเร็จในระยะยาวของการทำแอพของคุณ