Membuat pemberitahuan pencarian log dari wawasan Kontainer

Container insights memantau performa beban kerja kontainer yang disebarkan ke kluster Kubernetes terkelola atau terkelola mandiri. Untuk mengingatkan tentang hal yang penting, artikel ini menjelaskan cara membuat pemberitahuan berbasis log untuk situasi berikut dengan kluster Azure Kubernetes Service (AKS):

  • Ketika penggunaan CPU atau memori pada node kluster melebihi ambang batas
  • Ketika penggunaan CPU atau memori pada kontainer apa pun dalam pengontrol melebihi ambang batas dibandingkan dengan batas yang ditetapkan pada sumber daya yang sesuai
  • NotReady jumlah simpul status
  • Failed, Pending, Unknown, Running, atau Succeeded jumlah fase pod
  • Ketika ruang disk bebas pada node kluster melebihi ambang batas

Untuk memperingatkan penggunaan CPU atau memori tinggi, atau ruang disk bebas rendah pada node kluster, gunakan kueri yang disediakan untuk membuat peringatan metrik atau peringatan pengukuran metrik. Pemberitahuan metrik memiliki latensi yang lebih rendah daripada pemberitahuan pencarian log, tetapi pemberitahuan pencarian log menyediakan kueri tingkat lanjut dan kecanggihan yang lebih besar. Kueri pemberitahuan pencarian log membandingkan tanggalwaktu dengan saat ini dengan menggunakan now operator dan kembali satu jam. (Wawasan kontainer menyimpan semua tanggal dalam format Waktu Universal Terkoordinasi [UTC].)

Penting

Kueri dalam artikel ini bergantung pada data yang dikumpulkan oleh wawasan Kontainer dan disimpan di ruang kerja Analitik Log. Jika Anda telah mengubah pengaturan pengumpulan data default, kueri mungkin tidak mengembalikan hasil yang diharapkan. Terutama, jika Anda telah menonaktifkan pengumpulan data performa karena Anda telah mengaktifkan metrik Prometheus untuk kluster, kueri apa pun yang menggunakan Perf tabel tidak akan mengembalikan hasil.

Lihat Mengonfigurasi pengumpulan data dalam wawasan Kontainer menggunakan aturan pengumpulan data untuk konfigurasi prasetel termasuk menonaktifkan pengumpulan data performa. Lihat Mengonfigurasi pengumpulan data dalam insight Kontainer menggunakan ConfigMap untuk opsi pengumpulan data lebih lanjut.

Jika Anda tidak terbiasa dengan pemberitahuan Azure Monitor, lihat Gambaran Umum pemberitahuan di Microsoft Azure sebelum Memulai. Untuk mempelajari selengkapnya tentang pemberitahuan yang menggunakan kueri log, lihat Pemberitahuan pencarian log di Azure Monitor. Pelajari selengkapnya tentang peringatan metrik, lihat Peringatan metrik di Azure Monitor.

Pengukuran kueri log

Pemberitahuan pencarian log dapat mengukur dua hal berbeda, yang dapat digunakan untuk memantau komputer virtual dalam skenario yang berbeda:

  • Jumlah hasil: Menghitung jumlah baris yang dikembalikan oleh kueri dan dapat digunakan untuk bekerja dengan peristiwa seperti log peristiwa Windows, Syslog, dan pengecualian aplikasi.
  • Perhitungan nilai: Membuat perhitungan berdasarkan kolom numerik dan dapat digunakan untuk menyertakan sejumlah sumber daya. Contohnya adalah persentase CPU.

Sumber daya dan dimensi target

Anda dapat menggunakan satu aturan untuk memantau nilai beberapa instans dengan menggunakan dimensi. Misalnya, Anda akan menggunakan dimensi jika Anda ingin memantau penggunaan CPU pada beberapa instans yang menjalankan situs web atau aplikasi Anda, dan membuat pemberitahuan untuk penggunaan CPU lebih dari 80%.

Untuk membuat pemberitahuan yang ber sentris sumber daya dalam skala besar untuk langganan atau grup sumber daya, Anda dapat membagi berdasarkan dimensi. Saat Anda ingin memantau kondisi yang sama pada beberapa sumber daya Azure, pemisahan menurut dimensi membagi pemberitahuan menjadi pemberitahuan terpisah dengan mengelompokkan kombinasi unik dengan menggunakan kolom numerik atau string. Memisahkan kolom ID sumber daya Azure membuat sumber daya yang ditentukan menjadi target pemberitahuan.

Anda mungkin juga memutuskan untuk tidak memisahkan ketika Anda menginginkan kondisi pada beberapa sumber daya dalam cakupan. Misalnya, Anda mungkin ingin membuat pemberitahuan jika setidaknya lima komputer dalam cakupan grup sumber daya memiliki penggunaan CPU lebih dari 80%.

Cuplikan layar yang memperlihatkan aturan pemberitahuan pencarian log baru dengan pemisahan menurut dimensi.

Anda mungkin ingin melihat daftar peringatan oleh komputer yang terpengaruh. Anda bisa menggunakan buku kerja kustom yang menggunakan grafik sumber daya kustom untuk menyediakan tampilan ini. Gunakan kueri berikut untuk menampilkan pemberitahuan, dan gunakan sumber data Azure Resource Graph di buku kerja.

Membuat aturan pemberitahuan pencarian log

Untuk membuat aturan pemberitahuan pencarian log dengan menggunakan portal, lihat contoh pemberitahuan pencarian log ini, yang menyediakan panduan lengkap. Anda dapat menggunakan proses yang sama ini untuk membuat aturan pemberitahuan untuk kluster AKS dengan menggunakan kueri yang mirip dengan yang ada di artikel ini.

Untuk membuat aturan pemberitahuan kueri dengan menggunakan templat Azure Resource Manager (ARM), lihat Sampel templat Resource Manager untuk aturan pemberitahuan pencarian log di Azure Monitor. Anda dapat menggunakan proses yang sama ini untuk membuat templat ARM untuk kueri log di artikel ini.

Pemanfaatan sumber daya

Pemanfaatan CPU rata-rata sebagai rata-rata pemanfaatan CPU simpul anggota setiap menit (pengukuran metrik):

let endDateTime = now();
let startDateTime = ago(1h);
let trendBinSize = 1m;
let capacityCounterName = 'cpuCapacityNanoCores';
let usageCounterName = 'cpuUsageNanoCores';
KubeNodeInventory
| where TimeGenerated < endDateTime
| where TimeGenerated >= startDateTime
// cluster filter would go here if multiple clusters are reporting to the same Log Analytics workspace
| distinct ClusterName, Computer
| join hint.strategy=shuffle (
  Perf
  | where TimeGenerated < endDateTime
  | where TimeGenerated >= startDateTime
  | where ObjectName == 'K8SNode'
  | where CounterName == capacityCounterName
  | summarize LimitValue = max(CounterValue) by Computer, CounterName, bin(TimeGenerated, trendBinSize)
  | project Computer, CapacityStartTime = TimeGenerated, CapacityEndTime = TimeGenerated + trendBinSize, LimitValue
) on Computer
| join kind=inner hint.strategy=shuffle (
  Perf
  | where TimeGenerated < endDateTime + trendBinSize
  | where TimeGenerated >= startDateTime - trendBinSize
  | where ObjectName == 'K8SNode'
  | where CounterName == usageCounterName
  | project Computer, UsageValue = CounterValue, TimeGenerated
) on Computer
| where TimeGenerated >= CapacityStartTime and TimeGenerated < CapacityEndTime
| project ClusterName, Computer, TimeGenerated, UsagePercent = UsageValue * 100.0 / LimitValue
| summarize AggValue = avg(UsagePercent) by bin(TimeGenerated, trendBinSize), ClusterName

Pemanfaatan memori rata-rata sebagai rata-rata pemanfaatan memori simpul anggota setiap menit (pengukuran metrik):

let endDateTime = now();
let startDateTime = ago(1h);
let trendBinSize = 1m;
let capacityCounterName = 'memoryCapacityBytes';
let usageCounterName = 'memoryRssBytes';
KubeNodeInventory
| where TimeGenerated < endDateTime
| where TimeGenerated >= startDateTime
// cluster filter would go here if multiple clusters are reporting to the same Log Analytics workspace
| distinct ClusterName, Computer
| join hint.strategy=shuffle (
  Perf
  | where TimeGenerated < endDateTime
  | where TimeGenerated >= startDateTime
  | where ObjectName == 'K8SNode'
  | where CounterName == capacityCounterName
  | summarize LimitValue = max(CounterValue) by Computer, CounterName, bin(TimeGenerated, trendBinSize)
  | project Computer, CapacityStartTime = TimeGenerated, CapacityEndTime = TimeGenerated + trendBinSize, LimitValue
) on Computer
| join kind=inner hint.strategy=shuffle (
  Perf
  | where TimeGenerated < endDateTime + trendBinSize
  | where TimeGenerated >= startDateTime - trendBinSize
  | where ObjectName == 'K8SNode'
  | where CounterName == usageCounterName
  | project Computer, UsageValue = CounterValue, TimeGenerated
) on Computer
| where TimeGenerated >= CapacityStartTime and TimeGenerated < CapacityEndTime
| project ClusterName, Computer, TimeGenerated, UsagePercent = UsageValue * 100.0 / LimitValue
| summarize AggValue = avg(UsagePercent) by bin(TimeGenerated, trendBinSize), ClusterName

Penting

Kueri berikut menggunakan nilai <placeholder nama-kluster Anda> dan <nama pengontrol Anda> untuk mewakili kluster dan pengontrol Anda. Ganti dengan nilai khusus untuk lingkungan Anda saat Anda menyiapkan peringatan.

Pemanfaatan CPU rata-rata semua kontainer dalam pengontrol sebagai rata-rata pemanfaatan CPU dari setiap instans kontainer dalam pengontrol setiap menit (pengukuran metrik):

let endDateTime = now();
let startDateTime = ago(1h);
let trendBinSize = 1m;
let capacityCounterName = 'cpuLimitNanoCores';
let usageCounterName = 'cpuUsageNanoCores';
let clusterName = '<your-cluster-name>';
let controllerName = '<your-controller-name>';
KubePodInventory
| where TimeGenerated < endDateTime
| where TimeGenerated >= startDateTime
| where ClusterName == clusterName
| where ControllerName == controllerName
| extend InstanceName = strcat(ClusterId, '/', ContainerName),
         ContainerName = strcat(controllerName, '/', tostring(split(ContainerName, '/')[1]))
| distinct Computer, InstanceName, ContainerName
| join hint.strategy=shuffle (
    Perf
    | where TimeGenerated < endDateTime
    | where TimeGenerated >= startDateTime
    | where ObjectName == 'K8SContainer'
    | where CounterName == capacityCounterName
    | summarize LimitValue = max(CounterValue) by Computer, InstanceName, bin(TimeGenerated, trendBinSize)
    | project Computer, InstanceName, LimitStartTime = TimeGenerated, LimitEndTime = TimeGenerated + trendBinSize, LimitValue
) on Computer, InstanceName
| join kind=inner hint.strategy=shuffle (
    Perf
    | where TimeGenerated < endDateTime + trendBinSize
    | where TimeGenerated >= startDateTime - trendBinSize
    | where ObjectName == 'K8SContainer'
    | where CounterName == usageCounterName
    | project Computer, InstanceName, UsageValue = CounterValue, TimeGenerated
) on Computer, InstanceName
| where TimeGenerated >= LimitStartTime and TimeGenerated < LimitEndTime
| project Computer, ContainerName, TimeGenerated, UsagePercent = UsageValue * 100.0 / LimitValue
| summarize AggValue = avg(UsagePercent) by bin(TimeGenerated, trendBinSize) , ContainerName

Pemanfaatan memori rata-rata semua kontainer dalam pengontrol sebagai rata-rata pemanfaatan memori setiap instans kontainer dalam pengontrol setiap menit (pengukuran metrik):

let endDateTime = now();
let startDateTime = ago(1h);
let trendBinSize = 1m;
let capacityCounterName = 'memoryLimitBytes';
let usageCounterName = 'memoryRssBytes';
let clusterName = '<your-cluster-name>';
let controllerName = '<your-controller-name>';
KubePodInventory
| where TimeGenerated < endDateTime
| where TimeGenerated >= startDateTime
| where ClusterName == clusterName
| where ControllerName == controllerName
| extend InstanceName = strcat(ClusterId, '/', ContainerName),
         ContainerName = strcat(controllerName, '/', tostring(split(ContainerName, '/')[1]))
| distinct Computer, InstanceName, ContainerName
| join hint.strategy=shuffle (
    Perf
    | where TimeGenerated < endDateTime
    | where TimeGenerated >= startDateTime
    | where ObjectName == 'K8SContainer'
    | where CounterName == capacityCounterName
    | summarize LimitValue = max(CounterValue) by Computer, InstanceName, bin(TimeGenerated, trendBinSize)
    | project Computer, InstanceName, LimitStartTime = TimeGenerated, LimitEndTime = TimeGenerated + trendBinSize, LimitValue
) on Computer, InstanceName
| join kind=inner hint.strategy=shuffle (
    Perf
    | where TimeGenerated < endDateTime + trendBinSize
    | where TimeGenerated >= startDateTime - trendBinSize
    | where ObjectName == 'K8SContainer'
    | where CounterName == usageCounterName
    | project Computer, InstanceName, UsageValue = CounterValue, TimeGenerated
) on Computer, InstanceName
| where TimeGenerated >= LimitStartTime and TimeGenerated < LimitEndTime
| project Computer, ContainerName, TimeGenerated, UsagePercent = UsageValue * 100.0 / LimitValue
| summarize AggValue = avg(UsagePercent) by bin(TimeGenerated, trendBinSize) , ContainerName

Ketersediaan Sumber Daya

Node dan hitungan yang memiliki status Ready dan NotReady (pengukuran metrik):

let endDateTime = now();
let startDateTime = ago(1h);
let trendBinSize = 1m;
let clusterName = '<your-cluster-name>';
KubeNodeInventory
| where TimeGenerated < endDateTime
| where TimeGenerated >= startDateTime
| distinct ClusterName, Computer, TimeGenerated
| summarize ClusterSnapshotCount = count() by bin(TimeGenerated, trendBinSize), ClusterName, Computer
| join hint.strategy=broadcast kind=inner (
    KubeNodeInventory
    | where TimeGenerated < endDateTime
    | where TimeGenerated >= startDateTime
    | summarize TotalCount = count(), ReadyCount = sumif(1, Status contains ('Ready'))
                by ClusterName, Computer,  bin(TimeGenerated, trendBinSize)
    | extend NotReadyCount = TotalCount - ReadyCount
) on ClusterName, Computer, TimeGenerated
| project   TimeGenerated,
            ClusterName,
            Computer,
            ReadyCount = todouble(ReadyCount) / ClusterSnapshotCount,
            NotReadyCount = todouble(NotReadyCount) / ClusterSnapshotCount
| order by ClusterName asc, Computer asc, TimeGenerated desc

Kueri berikut mengembalikan jumlah fase pod berdasarkan semua fase: Failed, , Pending, UnknownRunning, atau Succeeded.

let endDateTime = now(); 
let startDateTime = ago(1h);
let trendBinSize = 1m;
let clusterName = '<your-cluster-name>';
KubePodInventory
    | where TimeGenerated < endDateTime
    | where TimeGenerated >= startDateTime
    | where ClusterName == clusterName
    | distinct ClusterName, TimeGenerated
    | summarize ClusterSnapshotCount = count() by bin(TimeGenerated, trendBinSize), ClusterName
    | join hint.strategy=broadcast (
        KubePodInventory
        | where TimeGenerated < endDateTime
        | where TimeGenerated >= startDateTime
        | summarize PodStatus=any(PodStatus) by TimeGenerated, PodUid, ClusterName
        | summarize TotalCount = count(),
                    PendingCount = sumif(1, PodStatus =~ 'Pending'),
                    RunningCount = sumif(1, PodStatus =~ 'Running'),
                    SucceededCount = sumif(1, PodStatus =~ 'Succeeded'),
                    FailedCount = sumif(1, PodStatus =~ 'Failed')
                by ClusterName, bin(TimeGenerated, trendBinSize)
    ) on ClusterName, TimeGenerated
    | extend UnknownCount = TotalCount - PendingCount - RunningCount - SucceededCount - FailedCount
    | project TimeGenerated,
              TotalCount = todouble(TotalCount) / ClusterSnapshotCount,
              PendingCount = todouble(PendingCount) / ClusterSnapshotCount,
              RunningCount = todouble(RunningCount) / ClusterSnapshotCount,
              SucceededCount = todouble(SucceededCount) / ClusterSnapshotCount,
              FailedCount = todouble(FailedCount) / ClusterSnapshotCount,
              UnknownCount = todouble(UnknownCount) / ClusterSnapshotCount
| summarize AggValue = avg(PendingCount) by bin(TimeGenerated, trendBinSize)

Catatan

Untuk memperingatkan fase pod tertentu, seperti Pending, , Failedatau Unknown, ubah baris terakhir kueri. Misalnya, untuk memperingatkan pada FailedCount, gunakan | summarize AggValue = avg(FailedCount) by bin(TimeGenerated, trendBinSize).

Kueri berikut mengembalikan disk node kluster yang melebihi ruang kosong 90% yang digunakan. Untuk mendapatkan ID kluster, jalankan kueri berikut dan salin nilai dari ClusterId properti terlebih dahulu:

InsightsMetrics
| extend Tags = todynamic(Tags)            
| project ClusterId = Tags['container.azm.ms/clusterId']   
| distinct tostring(ClusterId)   
let clusterId = '<cluster-id>';
let endDateTime = now();
let startDateTime = ago(1h);
let trendBinSize = 1m;
InsightsMetrics
| where TimeGenerated < endDateTime
| where TimeGenerated >= startDateTime
| where Origin == 'container.azm.ms/telegraf'            
| where Namespace == 'container.azm.ms/disk'            
| extend Tags = todynamic(Tags)            
| project TimeGenerated, ClusterId = Tags['container.azm.ms/clusterId'], Computer = tostring(Tags.hostName), Device = tostring(Tags.device), Path = tostring(Tags.path), DiskMetricName = Name, DiskMetricValue = Val   
| where ClusterId =~ clusterId       
| where DiskMetricName == 'used_percent'
| summarize AggValue = max(DiskMetricValue) by bin(TimeGenerated, trendBinSize)
| where AggValue >= 90

Peringatan mulai ulang kontainer individual (jumlah hasil) saat jumlah mulai ulang kontainer sistem individual melebihi ambang batas selama 10 menit terakhir:

let _threshold = 10m; 
let _alertThreshold = 2;
let Timenow = (datetime(now) - _threshold); 
let starttime = ago(5m); 
KubePodInventory
| where TimeGenerated >= starttime
| where Namespace in ('default', 'kube-system') // the namespace filter goes here
| where ContainerRestartCount > _alertThreshold
| extend Tags = todynamic(ContainerLastStatus)
| extend startedAt = todynamic(Tags.startedAt)
| where startedAt >= Timenow
| summarize arg_max(TimeGenerated, *) by Name

Langkah berikutnya