โลกิ - การรวบรวมบันทึกโดยใช้วิธีโพร

ขอคารวะชาวเมือง Khabrovsk! ก่อนเริ่มการลงทะเบียนเรียนหลักสูตรใหม่ "แนวทางปฏิบัติและเครื่องมือ DevOps" เราได้เตรียมการแปลเนื้อหาที่น่าสนใจสำหรับคุณ

บทความนี้เป็นการแนะนำสั้น ๆ เกี่ยวกับโลกิ โปรเจ็กต์โลกิ สนับสนุนโดย Grafana และมุ่งเป้าไปที่การรวบรวมบันทึกแบบรวมศูนย์ (จากเซิร์ฟเวอร์หรือคอนเทนเนอร์)

แรงบันดาลใจหลักสำหรับโลกิคือ โพร ด้วยแนวคิดในการนำแนวทางของเขามาประยุกต์ใช้กับการจัดการบันทึก:

  • การใช้ป้ายกำกับในการจัดเก็บข้อมูล
  • การใช้ทรัพยากรเพียงเล็กน้อย

เราจะกลับมาดูวิธีการทำงานของ Prometheus และยกตัวอย่างการใช้งานในบริบทของ Kubernetes

คำไม่กี่คำเกี่ยวกับโพร

เพื่อให้เข้าใจอย่างถ่องแท้ว่า Loki ทำงานอย่างไร สิ่งสำคัญคือต้องย้อนกลับไปและจดจำ Prometheus ไว้สักเล็กน้อย

หนึ่งในคุณสมบัติที่โดดเด่นของ Prometheus คือการดึงข้อมูลตัวชี้วัดจากจุดรวบรวม (ผ่านผู้ส่งออก) และจัดเก็บไว้ใน TSDB (ฐานข้อมูลอนุกรมเวลา) พร้อมด้วยการเพิ่มข้อมูลเมตาในรูปแบบของป้ายกำกับ

ทำไมถึงจำเป็น

เมื่อเร็วๆ นี้ Prometheus ได้กลายเป็นมาตรฐานในโลกของคอนเทนเนอร์และ Kubernetes โดยการติดตั้งนั้นง่ายมาก และคลัสเตอร์ Kubernetes ก็มาพร้อมกับตำแหน่งข้อมูลดั้งเดิมสำหรับ Prometheus Prometheus ยังสามารถแยกตัววัดจากแอปพลิเคชันที่ใช้งานในคอนเทนเนอร์ในขณะที่จัดเก็บป้ายกำกับเฉพาะ ดังนั้นการตรวจสอบแอปพลิเคชันจึงทำได้ง่ายมาก

น่าเสียดายที่ยังไม่มีโซลูชันแบบครบวงจรสำหรับการจัดการบันทึก และคุณต้องค้นหาวิธีแก้ปัญหาด้วยตนเอง:

  • บริการคลาวด์ที่มีการจัดการสำหรับการรวมบันทึกแบบรวมศูนย์ (AWS, Azure หรือ Google)
  • บริการตรวจสอบ “การตรวจสอบเป็นบริการ” (เช่น Datadog)
  • สร้างบริการรวบรวมบันทึกของคุณเอง

สำหรับตัวเลือกที่สาม โดยปกติแล้วฉันใช้ Elasticsearch แม้ว่าฉันจะไม่พอใจกับมันเสมอไป (โดยเฉพาะอย่างยิ่งความหนักหน่วงและความซับซ้อนของการกำหนดค่า)

โลกิได้รับการออกแบบให้ใช้งานได้ง่ายขึ้นตามหลักการดังต่อไปนี้:

  • ง่ายต่อการเริ่มต้น
  • ใช้ทรัพยากรน้อย
  • ทำงานได้อย่างอิสระโดยไม่ต้องบำรุงรักษาเป็นพิเศษ
  • ทำหน้าที่เป็นส่วนเสริมของ Prometheus เพื่อช่วยในการสืบสวนจุดบกพร่อง

อย่างไรก็ตาม ความเรียบง่ายนี้มาพร้อมกับการประนีประนอมบางประการ หนึ่งในนั้นคือการไม่จัดทำดัชนีเนื้อหา ดังนั้นการค้นหาข้อความจึงไม่มีประสิทธิภาพหรือสมบูรณ์มากนัก และไม่อนุญาตให้มีสถิติเกี่ยวกับเนื้อหาของข้อความ แต่เนื่องจาก Loki ต้องการเทียบเท่ากับ grep และเป็นส่วนเสริมของ Prometheus นี่จึงไม่ใช่ข้อเสีย

การสืบสวนเหตุการณ์

เพื่อให้เข้าใจได้ดีขึ้นว่าเหตุใด Loki จึงไม่ต้องการการจัดทำดัชนี เรากลับไปที่วิธีการตรวจสอบเหตุการณ์ที่นักพัฒนา Loki ใช้กัน:

โลกิ - การรวบรวมบันทึกโดยใช้วิธีโพร
1 การแจ้งเตือน → 2 แดชบอร์ด → 3 แบบสอบถามเฉพาะกิจ → 4 การรวมบันทึก → 5 การติดตามแบบกระจาย → 6 แก้ไข!
(1 คำเตือน → 2 แดชบอร์ด → 3 แบบสอบถามเฉพาะกิจ → 4 การรวมบันทึก → 5 การติดตามแบบกระจาย → 6 การแก้ไข!)

แนวคิดก็คือเราได้รับการแจ้งเตือนบางประเภท (การแจ้งเตือน Slack, SMS ฯลฯ) และหลังจากนั้น:

  • ดูแดชบอร์ด Grafana
  • ดูตัวชี้วัดการบริการ (เช่น ใน Prometheus)
  • ดูรายการบันทึก (เช่น ใน Elasticsearch)
  • อาจจะดูร่องรอยแบบกระจาย (Jaeger, Zipkin ฯลฯ )
  • และแก้ไขปัญหาเดิมในที่สุด

ในกรณีของสแต็ก Grafana + Prometheus + Elasticsearch + Zipkin คุณจะต้องใช้เครื่องมือสี่ชนิดที่แตกต่างกัน เพื่อลดเวลา คงจะดีถ้าสามารถทำตามขั้นตอนเหล่านี้ทั้งหมดโดยใช้เครื่องมือเดียว: Grafana เป็นที่น่าสังเกตว่าแนวทางการวิจัยนี้ถูกนำมาใช้ใน Grafana ตั้งแต่เวอร์ชัน 6 ดังนั้นจึงสามารถเข้าถึงข้อมูล Prometheus ได้โดยตรงจาก Grafana

โลกิ - การรวบรวมบันทึกโดยใช้วิธีโพร
หน้าจอ Explorer แบ่งระหว่าง Prometheus และ Loki

จากหน้าจอนี้ คุณสามารถดูบันทึก Loki ที่เกี่ยวข้องกับตัววัด Prometheus ได้โดยใช้แนวคิดการแยกหน้าจอ ตั้งแต่เวอร์ชัน 6.5 Grafana ช่วยให้คุณสามารถแยกวิเคราะห์ ID การติดตามในรายการบันทึก Loki เพื่อติดตามลิงก์ไปยังเครื่องมือติดตามแบบกระจายที่คุณชื่นชอบ (Jaeger)

การทดสอบโลกิท้องถิ่น

วิธีที่ง่ายที่สุดในการทดสอบ Loki ในเครื่องคือการใช้นักเทียบท่าเขียน ไฟล์นักเทียบท่าเขียนอยู่ในที่เก็บโลกิ คุณสามารถรับพื้นที่เก็บข้อมูลได้โดยใช้คำสั่งต่อไปนี้ git:

$ git clone https://github.com/grafana/loki.git

จากนั้นคุณต้องไปที่ไดเร็กทอรีการผลิต:

$ cd production

หลังจากนี้ คุณจะได้รับอิมเมจ Docker เวอร์ชันล่าสุด:

$ docker-compose pull

สุดท้าย Loki stack จะถูกเปิดใช้งานด้วยคำสั่งต่อไปนี้:

$ docker-compose up

สถาปัตยกรรมโลกิ

นี่คือไดอะแกรมขนาดเล็กที่มีสถาปัตยกรรมโลกิ:

โลกิ - การรวบรวมบันทึกโดยใช้วิธีโพร
หลักการสถาปัตยกรรมโลกิ

เว็บไคลเอ็นต์รันแอปพลิเคชันบนเซิร์ฟเวอร์ Promtail รวบรวมบันทึกและส่งไปยัง Loki เว็บไคลเอ็นต์ยังส่งข้อมูลเมตาไปยัง Loki อีกด้วย โลกิรวบรวมทุกอย่างแล้วส่งต่อให้กราฟาน่า
โลกิเปิดตัวแล้ว หากต้องการดูส่วนประกอบที่มีอยู่ ให้รันคำสั่งต่อไปนี้:

$ docker ps

ในกรณีของ Docker ที่ติดตั้งใหม่ คำสั่งควรส่งคืนผลลัพธ์ต่อไปนี้:

IMAGE               PORTS                  NAMES
grafana/promtail:                          production_promtail_1
grafana/grafana: m  0.0.0.0:3000->3000/tcp production_grafana_1
grafana/loki: late  80/tcp,0.0.0.0:3100... production_loki_1

เราเห็นส่วนประกอบต่อไปนี้:

  • Promtail: ตัวแทนที่รับผิดชอบในการรวมศูนย์บันทึก
  • Grafana: เครื่องมือแดชบอร์ดที่มีชื่อเสียง
  • โลกิ: ภูตการรวมศูนย์ข้อมูล

ในฐานะที่เป็นส่วนหนึ่งของโครงสร้างพื้นฐานแบบคลาสสิก (เช่น ตามเครื่องเสมือน) จะต้องปรับใช้ตัวแทน Promtail บนแต่ละเครื่อง Grafana และ Loki สามารถติดตั้งได้ในเครื่องเดียวกัน

การปรับใช้กับ Kubernetes

การติดตั้งส่วนประกอบ Loki บน Kubernetes จะเป็นดังนี้:

  • daemonSet สำหรับการปรับใช้ Promtail agent บนแต่ละเครื่องในเซิร์ฟเวอร์คลัสเตอร์
  • การปรับใช้โลกิ
  • และอันสุดท้ายคือการปรับใช้ Grafana

โชคดีที่ Loki มีให้บริการในรูปแบบแพ็คเกจ Helm ทำให้ง่ายต่อการปรับใช้

การติดตั้งผ่าน Heml

คุณควรติดตั้ง Heml ไว้แล้ว สามารถดาวน์โหลดได้จากพื้นที่เก็บข้อมูล GitHub ของโครงการ มันถูกติดตั้งโดยการแตกไฟล์เก็บถาวรที่สอดคล้องกับสถาปัตยกรรมของคุณและเพิ่มหางเสือ $PATH.

หมายเหตุ: Helm เวอร์ชัน 3.0.0 เปิดตัวเมื่อเร็ว ๆ นี้ เนื่องจากมีการเปลี่ยนแปลงมากมาย ผู้อ่านควรรอสักครู่ก่อนใช้งาน.

การเพิ่มแหล่งที่มาของ Helm

ขั้นตอนแรกคือการเพิ่มพื้นที่เก็บข้อมูล "loki" โดยใช้คำสั่งต่อไปนี้:

$ helm add loki https://grafana.github.io/loki/charts

หลังจากนี้ คุณสามารถค้นหาแพ็คเกจชื่อ “loki” ได้:

$ helm search loki

ผล:

loki/loki       0.17.2 v0.4.0 Loki: like Prometheus, but for logs.
loki/loki-stack 0.19.1 v0.4.0 Loki: like Prometheus, but for logs.
loki/fluent-bit 0.0.2  v0.0.1 Uses fluent-bit Loki go plugin for...
loki/promtail   0.13.1 v0.4.0 Responsible for gathering logs and...

แพ็คเกจเหล่านี้มีคุณสมบัติดังต่อไปนี้:

  • แพคเกจ โลกิ/โลกิ ตรงกับเซิร์ฟเวอร์ Loki เท่านั้น
  • แพคเกจ โลกิ/คล่องบิต อนุญาตให้คุณปรับใช้ DaemonSet โดยใช้ fluent-bin เพื่อรวบรวมบันทึกแทน Promtail
  • แพคเกจ โลกิ/พรอมเทล มีเอเจนต์การรวบรวมไฟล์บันทึก
  • แพคเกจ โลกิ/โลกิ-สแต็คช่วยให้คุณสามารถปรับใช้ Loki ร่วมกับ Promtail ได้ทันที

กำลังติดตั้งโลกิ

หากต้องการปรับใช้ Loki กับ Kubernetes ให้รันคำสั่งต่อไปนี้ในเนมสเปซ “การตรวจสอบ”:

$ helm upgrade --install loki loki/loki-stack --namespace monitoring

หากต้องการบันทึกลงดิสก์ ให้เพิ่มพารามิเตอร์ --set loki.persistence.enabled = true:

$ helm upgrade --install loki loki/loki-stack 
              --namespace monitoring 
              --set loki.persistence.enabled=true

หมายเหตุ: หากคุณต้องการปรับใช้ Grafana ในเวลาเดียวกัน ให้เพิ่มพารามิเตอร์ --set grafana.enabled = true

เมื่อคุณรันคำสั่งนี้ คุณควรได้รับผลลัพธ์ต่อไปนี้:

LAST DEPLOYED: Tue Nov 19 15:56:54 2019
NAMESPACE: monitoring
STATUS: DEPLOYED
RESOURCES:
==> v1/ClusterRole
NAME AGE
loki-promtail-clusterrole 189d
…
NOTES:
The Loki stack has been deployed to your cluster. Loki can now be added as a datasource in Grafana.
See <a href="http://docs.grafana.org/features/datasources/loki/">http://docs.grafana.org/features/datasources/loki/</a> for more details.

เมื่อดูสถานะของพ็อดในเนมสเปซ "การตรวจสอบ" เราจะเห็นว่าทุกอย่างถูกปรับใช้:

$ kubectl -n monitoring get pods -l release=loki

ผล:

NAME                 READY  STATUS   RESTARTS  AGE
loki-0               1/1    Running  0         147m
loki-promtail-9zjvc  1/1    Running  0         3h25m
loki-promtail-f6brf  1/1    Running  0         11h
loki-promtail-hdcj7  1/1    Running  0         3h23m
loki-promtail-jbqhc  1/1    Running  0         11h
loki-promtail-mj642  1/1    Running  0         62m
loki-promtail-nm64g  1/1    Running  0         24m

พ็อดทั้งหมดกำลังทำงานอยู่ ตอนนี้ได้เวลาทำแบบทดสอบแล้ว!

กำลังเชื่อมต่อกับ Grafana

หากต้องการเชื่อมต่อกับ Grafana ภายใต้ Kubernetes คุณต้องเปิดอุโมงค์ไปยังพ็อด ด้านล่างนี้เป็นคำสั่งให้เปิดพอร์ต 3000 สำหรับพ็อด Grafana:

$ kubectl -n port-forward monitoring svc/loki-grafana 3000:80

จุดสำคัญอีกประการหนึ่งคือความจำเป็นในการกู้คืนรหัสผ่านผู้ดูแลระบบ Grafana รหัสผ่านจะถูกเก็บเป็นความลับ loki-grafana ในสนาม .data.admin-user ในรูปแบบ base64

หากต้องการกู้คืน คุณต้องรันคำสั่งต่อไปนี้:

$ kubectl -n monitoring get secret loki-grafana 
 --template '{{index .data "admin-password" | base64decode}}'; echo

ใช้รหัสผ่านนี้ร่วมกับบัญชีผู้ดูแลระบบเริ่มต้น (ผู้ดูแลระบบ)

การกำหนดแหล่งข้อมูล Loki ใน Grafana

ก่อนอื่น ตรวจสอบให้แน่ใจว่าได้สร้างแหล่งข้อมูล Loki แล้ว (การกำหนดค่า/แหล่งข้อมูล)
นี่คือตัวอย่าง:

โลกิ - การรวบรวมบันทึกโดยใช้วิธีโพร
ตัวอย่างการตั้งค่าแหล่งข้อมูลสำหรับ Loki

เมื่อคลิกที่ "ทดสอบ" คุณสามารถตรวจสอบการเชื่อมต่อกับโลกิได้

การร้องขอต่อโลกิ

ตอนนี้ไปที่ Grafana ไปที่ส่วน "สำรวจ" เมื่อได้รับบันทึกจากคอนเทนเนอร์ Loki จะเพิ่มข้อมูลเมตาจาก Kubernetes ดังนั้นจึงเป็นไปได้ที่จะดูบันทึกของคอนเทนเนอร์เฉพาะ

ตัวอย่างเช่น เมื่อต้องการเลือกบันทึกคอนเทนเนอร์ Promtail คุณสามารถใช้แบบสอบถามต่อไปนี้: {container_name = "promtail"}.
นอกจากนี้ อย่าลืมเลือกแหล่งข้อมูล Loki ด้วย

แบบสอบถามนี้จะส่งคืนกิจกรรมคอนเทนเนอร์ดังนี้:

โลกิ - การรวบรวมบันทึกโดยใช้วิธีโพร
ผลลัพธ์การค้นหาใน Grafana

เพิ่มลงในแดชบอร์ด

ตั้งแต่ Grafana 6.4 เป็นต้นไป คุณสามารถวางข้อมูลบันทึกบนแดชบอร์ดได้โดยตรง หลังจากนี้ ผู้ใช้จะสามารถสลับระหว่างจำนวนคำขอบนไซต์และการติดตามแอปพลิเคชันได้อย่างรวดเร็ว

ด้านล่างนี้เป็นตัวอย่างของแดชบอร์ดที่ใช้การโต้ตอบนี้:

โลกิ - การรวบรวมบันทึกโดยใช้วิธีโพร
แดชบอร์ดตัวอย่างพร้อมตัววัด Prometheus และบันทึก Loki

อนาคตของโลกิ

ฉันเริ่มใช้ Loki ในเดือนพฤษภาคม/มิถุนายนด้วยเวอร์ชัน 0.1 วันนี้เวอร์ชัน 1 และแม้กระทั่ง 1.1 และ 1.2 ได้เปิดตัวแล้ว

ต้องยอมรับว่าเวอร์ชัน 0.1 ไม่เสถียรพอ แต่ 0.3 ได้แสดงสัญญาณแห่งความเป็นผู้ใหญ่อย่างแท้จริงแล้ว และเวอร์ชันต่อๆ ไป (0.4 จากนั้น 1.0) ก็ทำให้การแสดงผลนี้แข็งแกร่งขึ้นเท่านั้น

หลังจาก 1.0.0 ไม่มีใครมีข้อแก้ตัวใดๆ ที่จะไม่ใช้เครื่องมือที่ยอดเยี่ยมนี้

การปรับปรุงเพิ่มเติมไม่ควรเกี่ยวกับ Loki แต่เป็นการรวมเข้ากับ Grafana ที่ยอดเยี่ยม ในความเป็นจริง Grafana 6.4 มีการบูรณาการที่ดีกับแดชบอร์ดอยู่แล้ว

Grafana 6.5 ซึ่งเปิดตัวเมื่อเร็วๆ นี้ ได้ปรับปรุงการบูรณาการนี้เพิ่มเติมโดยจดจำเนื้อหาบันทึกในรูปแบบ JSON โดยอัตโนมัติ

วิดีโอด้านล่างแสดงตัวอย่างเล็กๆ น้อยๆ ของกลไกนี้:

โลกิ - การรวบรวมบันทึกโดยใช้วิธีโพร
การใช้สตริง Loki ที่เปิดเผยใน Grafana

คุณสามารถใช้ฟิลด์ JSON อันใดอันหนึ่งได้ ตัวอย่างเช่น สำหรับ:

  • เชื่อมโยงไปยังเครื่องมือภายนอก
  • การกรองเนื้อหาบันทึก

ตัวอย่างเช่น คุณสามารถคลิกที่ TracId เพื่อไปที่ Zipkin หรือ Jaeger

ตามปกติเราหวังว่าจะได้รับความคิดเห็นของคุณและขอเชิญคุณ เปิดการสัมมนาผ่านเว็บซึ่งเราจะพูดถึงการพัฒนาอุตสาหกรรม DevOps ในปี 2019 และหารือเกี่ยวกับเส้นทางการพัฒนาที่เป็นไปได้สำหรับปี 2020

ที่มา: will.com