Observabilitas - Amazon EKS

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Observabilitas

Pengantar

Alat observabilitas membantu Anda mendeteksi, memulihkan, dan menyelidiki beban kerja Anda secara efisien. Biaya data telemetri meningkat secara alami seiring dengan meningkatnya penggunaan EKS. Terkadang, mungkin sulit untuk menyeimbangkan kebutuhan operasional Anda dan mengukur apa yang penting bagi bisnis Anda dan menjaga biaya pengamatan tetap terkendali. Panduan ini berfokus pada strategi pengoptimalan biaya untuk tiga pilar pengamatan: log, metrik, dan jejak. Masing-masing praktik terbaik ini dapat diterapkan secara independen agar sesuai dengan tujuan pengoptimalan organisasi Anda.

Pencatatan log

Logging memainkan peran penting dalam memantau dan memecahkan masalah aplikasi di cluster Anda. Ada beberapa strategi yang dapat digunakan untuk mengoptimalkan biaya logging. Strategi praktik terbaik yang tercantum di bawah ini termasuk memeriksa kebijakan penyimpanan log Anda untuk menerapkan kontrol terperinci tentang berapa lama data log disimpan, mengirim data log ke opsi penyimpanan yang berbeda berdasarkan kepentingan, dan memanfaatkan penyaringan log untuk mempersempit jenis pesan log yang disimpan. Mengelola telemetri log secara efisien dapat menghemat biaya untuk lingkungan Anda.

Pesawat Kontrol EKS

Optimalkan Log Pesawat Kontrol Anda

Bidang kontrol Kubernetes adalah sekumpulan komponen yang mengelola cluster dan komponen ini mengirim berbagai jenis informasi sebagai aliran log ke grup log di Amazon. CloudWatch Meskipun ada manfaat untuk mengaktifkan semua jenis log bidang kontrol, Anda harus mengetahui informasi di setiap log dan biaya terkait untuk menyimpan semua telemetri log. Anda dikenakan biaya untuk konsumsi data CloudWatch Log standar dan biaya penyimpanan untuk log yang dikirim ke Amazon CloudWatch Logs dari cluster Anda. Sebelum mengaktifkannya, evaluasi apakah setiap aliran log diperlukan.

Misalnya, di klaster non-produksi, aktifkan jenis log tertentu secara selektif, seperti log server api, hanya untuk analisis dan nonaktifkan sesudahnya. Tetapi untuk cluster produksi, di mana Anda mungkin tidak dapat mereproduksi peristiwa, dan menyelesaikan masalah memerlukan lebih banyak informasi log, maka Anda dapat mengaktifkan semua jenis log. Rincian implementasi pengoptimalan biaya bidang kontrol lebih lanjut ada di posting blog ini.

Streaming Log ke S3

Praktik terbaik pengoptimalan biaya lainnya adalah streaming log pesawat kontrol ke S3 melalui langganan CloudWatch Log. Memanfaatkan langganan CloudWatch Log memungkinkan Anda meneruskan log secara selektif ke S3 yang menyediakan penyimpanan jangka panjang yang lebih hemat biaya dibandingkan dengan menyimpan log tanpa batas waktu. CloudWatch Misalnya, untuk kluster produksi, Anda dapat membuat grup log kritis dan memanfaatkan langganan untuk mengalirkan log ini ke S3 setelah 15 hari. Ini akan memastikan Anda memiliki akses cepat ke log untuk analisis tetapi juga menghemat biaya dengan memindahkan log ke penyimpanan yang lebih hemat biaya.

penting

Pada 9/5/2023 log EKS diklasifikasikan sebagai Vded Logs di Amazon Logs. CloudWatch Vending Logs adalah log layanan AWS khusus yang diterbitkan secara native oleh layanan AWS atas nama pelanggan dan tersedia dengan harga diskon volume. Silakan kunjungi halaman CloudWatch harga Amazon untuk mempelajari lebih lanjut tentang harga Vending Logs.

Pesawat Data EKS

Retensi Log

Kebijakan penyimpanan default Amazon CloudWatch adalah menyimpan log tanpa batas waktu dan tidak pernah kedaluwarsa, menimbulkan biaya penyimpanan yang berlaku untuk wilayah AWS Anda. Untuk mengurangi biaya penyimpanan, Anda dapat menyesuaikan kebijakan penyimpanan untuk setiap grup log berdasarkan persyaratan beban kerja Anda.

Dalam lingkungan pengembangan, periode retensi yang panjang mungkin tidak diperlukan. Namun di lingkungan produksi, Anda dapat menetapkan kebijakan retensi yang lebih lama untuk memenuhi persyaratan pemecahan masalah, kepatuhan, dan perencanaan kapasitas. Misalnya, jika Anda menjalankan aplikasi e-commerce selama musim liburan puncak, sistem berada di bawah beban yang lebih berat dan masalah dapat muncul yang mungkin tidak segera terlihat, Anda akan ingin mengatur retensi log yang lebih lama untuk pemecahan masalah terperinci dan analisis posting acara.

Anda dapat mengonfigurasi periode retensi Anda di CloudWatch konsol AWS atau AWS API dengan durasi dari 1 hari hingga 10 tahun berdasarkan setiap grup log. Memiliki periode retensi yang fleksibel dapat menghemat biaya penyimpanan log, sekaligus mempertahankan log penting.

Opsi Penyimpanan Log

Penyimpanan adalah pendorong besar biaya observabilitas oleh karena itu sangat penting untuk mengoptimalkan strategi penyimpanan log Anda. Strategi Anda harus selaras dengan persyaratan beban kerja Anda sambil mempertahankan kinerja dan skalabilitas. Salah satu strategi untuk mengurangi biaya penyimpanan log adalah dengan memanfaatkan bucket AWS S3 dan tingkatan penyimpanannya yang berbeda.

Teruskan log langsung ke S3

Pertimbangkan untuk meneruskan log yang kurang penting, seperti lingkungan pengembangan, langsung ke S3 alih-alih Cloudwatch. Ini dapat berdampak langsung pada biaya penyimpanan log. Salah satu opsi adalah meneruskan log langsung ke S3 menggunakan Fluentbit. Anda menentukan ini di [OUTPUT] bagian, tujuan di mana FluentBit mentransmisikan log kontainer untuk retensi. Tinjau parameter konfigurasi tambahan di sini.

[OUTPUT]
        Name eks_to_s3
        Match application.*
        bucket $S3_BUCKET name
        region us-east-2
        store_dir /var/log/fluentbit
        total_file_size 30M
        upload_timeout 3m

Teruskan log CloudWatch hanya untuk analisis jangka pendek

Untuk log yang lebih penting, seperti lingkungan produksi di mana Anda mungkin perlu melakukan analisis segera pada data, pertimbangkan untuk meneruskan log ke. CloudWatch Anda menentukan ini di [OUTPUT] bagian, tujuan di mana FluentBit mentransmisikan log kontainer untuk retensi. Tinjau parameter konfigurasi tambahan di sini.

[OUTPUT]
        Name eks_to_cloudwatch_logs
        Match application.*
        region us-east-2
        log_group_name fluent-bit-cloudwatch
        log_stream_prefix from-fluent-bit-
        auto_create_group On

Namun, ini tidak akan berdampak instan pada penghematan biaya Anda. Untuk penghematan tambahan, Anda harus mengekspor log ini ke Amazon S3.

Ekspor ke Amazon S3 dari CloudWatch

Untuk menyimpan CloudWatch log Amazon dalam jangka panjang, sebaiknya ekspor CloudWatch log Amazon EKS Anda ke Amazon Simple Storage Service (Amazon S3). Anda dapat meneruskan log ke bucket Amazon S3 dengan membuat tugas ekspor melalui Konsol atau API. Setelah Anda melakukannya, Amazon S3 menghadirkan banyak opsi untuk lebih mengurangi biaya. Anda dapat menentukan aturan Siklus Hidup Amazon S3 Anda sendiri untuk memindahkan log Anda ke kelas penyimpanan yang sesuai dengan kebutuhan Anda, atau memanfaatkan kelas penyimpanan Amazon S3 Intelligent-Tiering agar AWS memindahkan data secara otomatis ke penyimpanan jangka panjang berdasarkan pola penggunaan Anda. Silakan merujuk ke blog ini untuk lebih jelasnya. Misalnya, untuk lingkungan produksi Anda, log berada CloudWatch selama lebih dari 30 hari kemudian diekspor ke bucket Amazon S3. Anda kemudian dapat menggunakan Amazon Athena untuk menanyakan data di bucket Amazon S3 jika Anda perlu merujuk kembali ke log di lain waktu.

Kurangi Level Log

Berlatih pencatatan selektif untuk aplikasi Anda. Baik aplikasi dan node Anda mengeluarkan log secara default. Untuk log aplikasi Anda, sesuaikan level log agar selaras dengan kekritisan beban kerja dan lingkungan. Misalnya, aplikasi java di bawah ini mengeluarkan INFO log yang merupakan konfigurasi aplikasi default yang khas dan tergantung pada kode dapat menghasilkan volume data log yang tinggi.

import org.apache.log4j.*;

public class LogClass {
   private static org.apache.log4j.Logger log = Logger.getLogger(LogClass.class);

public static void main(String[] args) {
      log.setLevel(Level.INFO);

   log.debug("This is a DEBUG message, check this out!");
   log.info("This is an INFO message, nothing to see here!");
   log.warn("This is a WARN message, investigate this!");
   log.error("This is an ERROR message, check this out!");
   log.fatal("This is a FATAL message, investigate this!");    } }

Dalam lingkungan pengembangan, ubah level log Anda menjadiDEBUG, karena ini dapat membantu Anda men-debug masalah atau menangkap masalah potensial sebelum masuk ke produksi.

log.setLevel(Level.DEBUG);

Dalam lingkungan produksi, pertimbangkan untuk memodifikasi level log Anda ke ERROR atauFATAL. Ini akan menampilkan log hanya ketika aplikasi Anda memiliki kesalahan, mengurangi output log dan membantu Anda fokus pada data penting tentang status aplikasi Anda.

log.setLevel(Level.ERROR);

Anda dapat menyempurnakan berbagai level log komponen Kubernetes. Misalnya, jika Anda menggunakan Bottlerocket sebagai sistem operasi EKS Node Anda, ada pengaturan konfigurasi yang memungkinkan Anda untuk menyesuaikan tingkat log proses kubelet. Cuplikan pengaturan konfigurasi ini ada di bawah ini. Perhatikan tingkat log default 2 yang menyesuaikan verbositas proses logging. kubelet

[settings.kubernetes]
log-level = "2"
image-gc-high-threshold-percent = "85"
image-gc-low-threshold-percent = "80"

Untuk lingkungan pengembangan, Anda dapat mengatur level log lebih besar dari 2 untuk melihat peristiwa tambahan, ini bagus untuk debugging. Untuk lingkungan produksi, Anda dapat mengatur level ke 0 untuk hanya melihat peristiwa penting.

Filter Leverage

Saat menggunakan konfigurasi EKS Fluentbit default untuk mengirim log kontainer ke Cloudwatch, FluentBit menangkap dan mengirim SEMUA log kontainer aplikasi yang diperkaya dengan metadata Kubernetes ke Cloudwatch seperti yang ditunjukkan pada blok konfigurasi di bawah ini. [INPUT]

 [INPUT]
     Name                tail
     Tag                 application.*
     Exclude_Path        /var/log/containers/cloudwatch-agent*, /var/log/containers/fluent-bit*, /var/log/containers/aws-node*, /var/log/containers/kube-proxy*
     Path                /var/log/containers/*.log
     Docker_Mode         On
     Docker_Mode_Flush   5
     Docker_Mode_Parser  container_firstline
     Parser              docker
     DB                  /var/fluent-bit/state/flb_container.db
     Mem_Buf_Limit       50MB
     Skip_Long_Lines     On
     Refresh_Interval    10
     Rotate_Wait         30
     storage.type        filesystem
     Read_from_Head      ${READ_FROM_HEAD}

[INPUT]Bagian di atas menelan semua log kontainer. Ini dapat menghasilkan sejumlah besar data yang mungkin tidak diperlukan. Memfilter data ini dapat mengurangi jumlah data log yang dikirim CloudWatch sehingga mengurangi biaya Anda. Anda dapat menerapkan filter ke log Anda sebelum output ke CloudWatch. Fluentbit mendefinisikan ini di bagian. [FILTER] Misalnya, memfilter metadata Kubernetes agar tidak ditambahkan ke peristiwa log dapat mengurangi volume log Anda.

    [FILTER]
        Name                nest
        Match               application.*
        Operation           lift
        Nested_under        kubernetes
        Add_prefix          Kube.

    [FILTER]
        Name                modify
        Match               application.*
        Remove              Kube.<Metadata_1>
        Remove              Kube.<Metadata_2>
        Remove              Kube.<Metadata_3>

    [FILTER]
        Name                nest
        Match               application.*
        Operation           nest
        Wildcard            Kube.*
        Nested_under        kubernetes
        Remove_prefix       Kube.

Metrik

Metrik memberikan informasi berharga mengenai kinerja sistem Anda. Dengan mengkonsolidasikan semua metrik sumber daya terkait sistem atau yang tersedia di lokasi terpusat, Anda memperoleh kemampuan untuk membandingkan dan menganalisis data kinerja. Pendekatan terpusat ini memungkinkan Anda untuk membuat keputusan strategis yang lebih tepat, seperti meningkatkan atau mengurangi sumber daya. Selain itu, metrik memainkan peran penting dalam menilai kesehatan sumber daya, memungkinkan Anda untuk mengambil tindakan proaktif bila diperlukan. Umumnya skala biaya observabilitas dengan pengumpulan dan retensi data telemetri. Di bawah ini adalah beberapa strategi yang dapat Anda terapkan untuk mengurangi biaya telemetri metrik: mengumpulkan hanya metrik yang penting, mengurangi kardinalitas data telemetri Anda, dan menyempurnakan perincian pengumpulan data telemetri Anda.

Pantau apa yang penting dan kumpulkan hanya apa yang Anda butuhkan

Strategi pengurangan biaya pertama adalah mengurangi jumlah metrik yang Anda kumpulkan dan pada gilirannya, mengurangi biaya retensi.

  1. Mulailah dengan bekerja mundur dari persyaratan Anda dan/atau pemangku kepentingan Anda untuk menentukan metrik yang paling penting. Metrik sukses berbeda untuk semua orang! Ketahui seperti apa penampilan yang baik dan ukur untuk itu.

  2. Pertimbangkan untuk menyelam jauh ke dalam beban kerja yang Anda dukung dan identifikasi Indikator Kinerja Utama (KPIs) alias 'Sinyal Emas'. Ini harus selaras dengan persyaratan bisnis dan pemangku kepentingan. Menghitung SLIs, SLOs, dan SLAs menggunakan Amazon CloudWatch dan Metric Math sangat penting untuk mengelola keandalan layanan. Ikuti praktik terbaik yang diuraikan dalam panduan ini untuk memantau dan mempertahankan kinerja lingkungan EKS Anda secara efektif.

  3. Kemudian lanjutkan melalui berbagai lapisan infrastruktur untuk menghubungkan dan menghubungkan kluster EKS, node, dan metrik infrastruktur tambahan dengan beban kerja Anda. KPIs Simpan metrik bisnis dan metrik operasional Anda dalam sistem di mana Anda dapat menghubungkannya bersama-sama dan menarik kesimpulan berdasarkan dampak yang diamati pada keduanya.

  4. EKS mengekspos metrik dari bidang kontrol, cluster, pod kube-state-metrics, dan node. Relevansi semua metrik ini tergantung pada kebutuhan Anda, namun kemungkinan Anda tidak memerlukan setiap metrik tunggal di lapisan yang berbeda. Anda dapat menggunakan panduan metrik penting EKS ini sebagai dasar untuk memantau kesehatan keseluruhan cluster EKS dan beban kerja Anda.

Berikut adalah contoh konfigurasi scrape prometheus di mana kita menggunakan relabel_config untuk menyimpan hanya metrik kubelet dan untuk menghapus semua metrik container. metric_relabel_config

kubernetes_sd_configs: - role: endpoints namespaces: names: - kube-system bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token tls_config: insecure_skip_verify: true relabel_configs: - source_labels: [__meta_kubernetes_service_label_k8s_app] regex: kubelet action: keep metric_relabel_configs: - source_labels: [__name__] regex: container_(network_tcp_usage_total|network_udp_usage_total|tasks_state|cpu_load_average_10s) action: drop

Kurangi kardinalitas jika berlaku

Kardinalitas mengacu pada keunikan nilai data dalam kombinasi dengan dimensinya (misalnya label prometheus) untuk kumpulan metrik tertentu. Metrik kardinalitas tinggi memiliki banyak dimensi dan setiap kombinasi metrik dimensi memiliki keunikan yang lebih tinggi. Kardinalitas yang lebih tinggi menghasilkan ukuran data telemetri metrik yang lebih besar dan kebutuhan penyimpanan yang meningkatkan biaya.

Dalam contoh kardinalitas tinggi di bawah ini, kita melihat bahwa Metrik, Latensi, memiliki Dimensi, RequesTid, CustomerID, dan Layanan dan setiap Dimensi memiliki banyak nilai unik. Kardinalitas adalah ukuran kombinasi jumlah nilai yang mungkin per Dimensi. Dalam Prometheus, setiap set dimensi/label unik dianggap sebagai metrik baru, oleh karena itu kardinalitas tinggi berarti lebih banyak metrik.

Di lingkungan EKS dengan banyak metrik dan dimensi/label per metrik (Cluster, Namespace, Service, Pod, Container, dll), kardinalitas cenderung tumbuh. Untuk mengoptimalkan biaya, pertimbangkan kardinalitas metrik yang Anda kumpulkan dengan hati-hati. Misalnya, jika Anda menggabungkan metrik tertentu untuk visualisasi di tingkat cluster, maka Anda dapat menjatuhkan label tambahan yang berada di lapisan bawah seperti label namespace.

Untuk mengidentifikasi metrik kardinalitas tinggi di prometheus, Anda dapat menjalankan kueri PROMQL berikut untuk menentukan target scrape mana yang memiliki jumlah metrik (kardinalitas) tertinggi:

topk_max(5, max_over_time(scrape_samples_scraped[1h]))

dan kueri PROMQL berikut dapat membantu Anda menentukan target scrape mana yang memiliki tingkat churn metrik tertinggi (berapa banyak seri metrik baru yang dibuat dalam gesekan tertentu):

topk_max(5, max_over_time(scrape_series_added[1h]))

Jika Anda menggunakan grafana, Anda dapat menggunakan Mimirtool Grafana Lab untuk menganalisis dasbor grafana dan aturan prometheus Anda untuk mengidentifikasi metrik kardinalitas tinggi yang tidak digunakan. Ikuti panduan ini tentang cara menggunakan mimirtool analyze prometheus perintah mimirtool analyze dan untuk mengidentifikasi metrik aktif yang tidak direferensikan di dasbor Anda.

Pertimbangkan granularitas metrik

Mengumpulkan metrik pada granularitas yang lebih tinggi seperti setiap detik vs setiap menit dapat berdampak besar pada seberapa banyak telemetri dikumpulkan dan disimpan yang meningkatkan biaya. Tentukan interval pengumpulan gesekan atau metrik yang masuk akal yang menyeimbangkan antara granularitas yang cukup untuk melihat masalah sementara dan cukup rendah agar hemat biaya. Kurangi granularitas untuk metrik yang digunakan untuk perencanaan kapasitas dan analisis jendela waktu yang lebih besar.

Di bawah ini adalah cuplikan dari konfigurasi AWS Distro for Opentelemetry (ADOT) EKS Addon Collector default.

penting

interval gesekan prometheus global diatur ke 15 detik. Interval gesekan ini dapat ditingkatkan sehingga terjadi penurunan jumlah data metrik yang dikumpulkan di prometheus.

apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
  name: my-collector-amp

...

config: |
    extensions:
      sigv4auth:
        region: "+++<YOUR_AWS_REGION>+++" service: "aps"+++</YOUR_AWS_REGION>+++

 receivers:
   #
   # Scrape configuration for the Prometheus Receiver
   # This is the same configuration used when Prometheus is installed using the community Helm chart
   #
   prometheus:
     config:
       global:   scrape_interval: 15s
         scrape_timeout: 10s

Pelacakan

Biaya utama yang terkait dengan penelusuran berasal dari generasi penyimpanan jejak. Dengan penelusuran, tujuannya adalah untuk mengumpulkan data yang cukup untuk mendiagnosis dan memahami aspek kinerja. Namun, karena biaya jejak X-Ray didasarkan pada data yang diteruskan ke X-Ray, menghapus jejak setelah diteruskan tidak akan mengurangi biaya Anda. Mari kita tinjau cara untuk menurunkan biaya penelusuran sambil mempertahankan data agar Anda dapat melakukan analisis yang tepat.

Terapkan aturan Sampling

Tingkat pengambilan sampel X-Ray konservatif secara default. Tentukan aturan pengambilan sampel di mana Anda dapat mengontrol jumlah data yang Anda kumpulkan. Ini akan meningkatkan efisiensi kinerja sekaligus mengurangi biaya. Dengan mengurangi laju pengambilan sampel, Anda dapat mengumpulkan jejak dari permintaan hanya apa yang dibutuhkan beban kerja Anda sambil mempertahankan struktur biaya yang lebih rendah.

Misalnya, Anda memiliki aplikasi java yang ingin Anda debug jejak semua permintaan untuk 1 rute bermasalah.

Konfigurasikan melalui SDK untuk memuat aturan pengambilan sampel dari dokumen JSON

{ "version": 2, "rules": [ { "description": "debug-eks", "host": "*", "http_method": "PUT", "url_path": "/history/*", "fixed_target": 0, "rate": 1, "service_type": "debug-eks" } ], "default": { "fixed_target": 1, "rate": 0.1 } }

Melalui Konsol

Terapkan Tail Sampling dengan AWS Distro for OpenTelemetry (ADOT)

ADOT Tail Sampling memungkinkan Anda untuk mengontrol volume jejak yang tertelan dalam layanan. Namun, Tail Sampling memungkinkan Anda untuk menentukan kebijakan pengambilan sampel setelah semua rentang dalam permintaan selesai, bukan di awal. Ini selanjutnya membatasi jumlah data mentah yang ditransfer CloudWatch, sehingga mengurangi biaya.

Misalnya, jika Anda mengambil sampel 1% lalu lintas ke halaman arahan dan 10% permintaan ke halaman pembayaran, ini mungkin meninggalkan Anda dengan 300 jejak untuk jangka waktu 30 menit. Dengan aturan ADOT Tail Sampling yang menyaring kesalahan tertentu, Anda dapat dibiarkan dengan 200 jejak yang mengurangi jumlah jejak yang disimpan.

processors:
  groupbytrace:
    wait_duration: 10s
    num_traces: 300
    tail_sampling:
    decision_wait: 1s # This value should be smaller than wait_duration
    policies:
      - ..... # Applicable policies**
  batch/tracesampling:
    timeout: 0s # No need to wait more since this will happen in previous processors
    send_batch_max_size: 8196 # This will still allow us to limit the size of the batches sent to subsequent exporters

service:
  pipelines:
    traces/tailsampling:
      receivers: [otlp]
      processors: [groupbytrace, tail_sampling, batch/tracesampling]
      exporters: [awsxray]

Manfaatkan opsi Penyimpanan Amazon S3

Anda harus memanfaatkan bucket AWS S3 dan kelas penyimpanannya yang berbeda untuk menyimpan jejak. Ekspor jejak ke S3 sebelum periode retensi berakhir. Gunakan aturan Siklus Hidup Amazon S3 untuk memindahkan data jejak ke kelas penyimpanan yang memenuhi persyaratan Anda.

Misalnya, jika Anda memiliki jejak yang berusia 90 hari, Amazon S3 Intelligent-Tiering dapat secara otomatis memindahkan data ke penyimpanan jangka panjang berdasarkan pola penggunaan Anda. Anda dapat menggunakan Amazon Athena untuk menanyakan data di Amazon S3 jika Anda perlu merujuk kembali ke jejak di lain waktu. Ini selanjutnya dapat mengurangi biaya Anda untuk penelusuran terdistribusi.

Sumber Daya Tambahan: