Kapsayıcı içgörülerinden günlük araması uyarıları oluşturma

Kapsayıcı içgörüleri, yönetilen veya kendi kendine yönetilen Kubernetes kümelerine dağıtılan kapsayıcı iş yüklerinin performansını izler. Önemli konularda uyarı almak için, bu makalede Azure Kubernetes Service (AKS) kümeleriyle aşağıdaki durumlar için günlük tabanlı uyarıların nasıl oluşturulacağı açıklanır:

  • Küme düğümlerinde CPU veya bellek kullanımı eşiği aştığında
  • Bir denetleyici içindeki herhangi bir kapsayıcıda CPU veya bellek kullanımı, ilgili kaynakta ayarlanan sınıra kıyasla eşiği aştığında
  • NotReady durum düğümü sayıları
  • Failed, Pending, Unknown, , Runningveya Succeeded pod aşaması sayıları
  • Küme düğümlerindeki boş disk alanı eşiği aştığında

Yüksek CPU veya bellek kullanımı ya da küme düğümlerinde yetersiz boş disk alanı için uyarı vermek için, ölçüm uyarısı veya ölçüm ölçümü uyarısı oluşturmak için sağlanan sorguları kullanın. Ölçüm uyarıları günlük arama uyarılarından daha düşük gecikme süresine sahiptir, ancak günlük araması uyarıları gelişmiş sorgulama ve daha gelişmiş bir özellik sağlar. Günlük araması uyarı sorguları, işlecini kullanarak ve bir saat geriye giderek bir tarih saatini günümüzle now karşılaştırır. (Kapsayıcı içgörüleri tüm tarihleri Eşgüdümlü Evrensel Saat [UTC] biçiminde depolar.)

Önemli

Bu makaledeki sorgular, Kapsayıcı içgörüleri tarafından toplanan ve Log Analytics çalışma alanında depolanan verilere bağlıdır. Varsayılan veri toplama ayarlarını değiştirdiyseniz, sorgular beklenen sonuçları döndürmeyebilir. En önemlisi, küme için Prometheus ölçümlerini etkinleştirdiğinizden beri performans verilerinin toplanmasını devre dışı bırakmışsanız, tabloyu kullanan Perf sorgular sonuç döndürmez.

Performans veri toplamayı devre dışı bırakma da dahil olmak üzere önceden ayarlanmış yapılandırmalar için bkz . Kapsayıcı içgörülerinde veri toplamayı yapılandırma. Daha fazla veri toplama seçeneği için bkz . ConfigMap kullanarak Kapsayıcı içgörülerinde veri toplamayı yapılandırma.

Azure İzleyici uyarılarını bilmiyorsanız başlamadan önce bkz . Microsoft Azure'da uyarılara genel bakış. Günlük sorguları kullanan uyarılar hakkında daha fazla bilgi edinmek için bkz . Azure İzleyici'de günlük araması uyarıları. Ölçüm uyarıları hakkında daha fazla bilgi için bkz . Azure İzleyici'de ölçüm uyarıları.

Günlük sorgusu ölçümleri

Günlük araması uyarıları , farklı senaryolarda sanal makineleri izlemek için kullanılabilen iki farklı şeyi ölçebilir:

  • Sonuç sayısı: Sorgu tarafından döndürülen satır sayısını sayar ve Windows olay günlükleri, Syslog ve uygulama özel durumları gibi olaylarla çalışmak için kullanılabilir.
  • Değer hesaplaması: Sayısal bir sütunu temel alan bir hesaplama yapar ve herhangi bir sayıda kaynağı eklemek için kullanılabilir. Cpu yüzdesi örnek olarak gösteriliyor.

Hedef kaynaklar ve boyutlar

Boyutları kullanarak birden çok örneğin değerlerini izlemek için tek bir kural kullanabilirsiniz. Örneğin, web sitenizi veya uygulamanızı çalıştıran birden çok örnekte CPU kullanımını izlemek ve %80'in üzerinde CPU kullanımı için bir uyarı oluşturmak istiyorsanız boyutları kullanabilirsiniz.

Bir abonelik veya kaynak grubu için uygun ölçekte kaynak odaklı uyarılar oluşturmak için boyutlara göre bölebilirsiniz. Birden çok Azure kaynağında aynı koşulu izlemek istediğinizde boyutlara göre bölmek, sayısal veya dize sütunlarını kullanarak benzersiz birleşimleri gruplandırarak uyarıları ayrı uyarılara böler. Bir Azure kaynak kimliği sütununun bölünmesi, belirtilen kaynağı uyarı hedefine getirir.

Kapsamdaki birden çok kaynakta koşul olmasını istediğinizde bölmemeye de karar verebilirsiniz. Örneğin, kaynak grubu kapsamındaki en az beş makine %80'in üzerinde CPU kullanımına sahipse bir uyarı oluşturmak isteyebilirsiniz.

Boyutlara göre bölünmüş yeni bir günlük araması uyarı kuralını gösteren ekran görüntüsü.

Etkilenen bilgisayar tarafından uyarıların listesini görmek isteyebilirsiniz. Bu görünümü sağlamak için özel kaynak grafı kullanan özel bir çalışma kitabı kullanabilirsiniz. Uyarıları görüntülemek için aşağıdaki sorguyu kullanın ve çalışma kitabındaki Azure Kaynak Grafı veri kaynağını kullanın.

Günlük araması uyarı kuralı oluşturma

Portalı kullanarak günlük araması uyarı kuralı oluşturmak için, tam bir izlenecek yol sağlayan bu günlük araması uyarısı örneğine bakın. Bu makaledekine benzer sorguları kullanarak AKS kümeleri için uyarı kuralları oluşturmak için aynı işlemleri kullanabilirsiniz.

Azure Resource Manager (ARM) şablonu kullanarak sorgu uyarısı kuralı oluşturmak için bkz . Azure İzleyici'de günlük araması uyarı kuralları için Resource Manager şablon örnekleri. Bu makaledeki günlük sorguları için ARM şablonları oluşturmak için aynı işlemleri kullanabilirsiniz.

Kaynak kullanımı

Üye düğümlerin dakikada bir CPU kullanımının ortalaması olarak ortalama CPU kullanımı (ölçüm ölçümü):

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

Üye düğümlerin bellek kullanımının dakikada bir ortalaması olarak ortalama bellek kullanımı (ölçüm ölçümü):

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

Önemli

Aşağıdaki sorgular <, kümenizi ve denetleyicinizi temsil etmek için your-cluster-name> ve <your-controller-name> yer tutucu değerlerini kullanır. Uyarıları ayarlarken bunları ortamınıza özgü değerlerle değiştirin.

Bir denetleyicideki tüm kapsayıcıların, bir denetleyicideki her kapsayıcı örneğinin dakikada bir ortalama CPU kullanımı (ölçüm ölçümü) olarak ortalama CPU kullanımı:

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

Bir denetleyicideki tüm kapsayıcıların ortalama bellek kullanımı, bir denetleyicideki her kapsayıcı örneğinin dakikada bir ortalama bellek kullanımı (ölçüm ölçümü):

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

Kaynak kullanılabilirliği

Durumu Ready ve NotReady olan düğümler ve sayılar (ölçüm ölçümü):

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

Aşağıdaki sorgu, tüm aşamalara göre pod aşaması sayılarını döndürür: Failed, Pending, Unknown, Runningveya 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)

Not

, Failedveya Unknowngibi Pendingbelirli pod aşamalarında uyarı vermek için sorgunun son satırını değiştirin. Örneğin, üzerinde FailedCountuyarı vermek için kullanın | summarize AggValue = avg(FailedCount) by bin(TimeGenerated, trendBinSize).

Aşağıdaki sorgu, kullanılan %90 boş alanı aşan küme düğümleri disklerini döndürür. Küme kimliğini almak için önce aşağıdaki sorguyu çalıştırın ve özelliğinden ClusterId değeri kopyalayın:

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

Tek tek kapsayıcı yeniden başlatma sayısı son 10 dakika için bir eşiği aştığında tek tek kapsayıcı yeniden başlatılır (sonuç sayısı) uyarısı:

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

Sonraki adımlar

  • Kümelerinizi uyarmak, görselleştirmek veya çözümlemek için değerlendirilecek veya özelleştirebileceğiniz önceden tanımlanmış sorguları ve örnekleri görmek için günlük sorgusu örneklerini görüntüleyin.
  • Azure İzleyici ve Kubernetes kümenizin diğer yönlerini izleme hakkında daha fazla bilgi edinmek için bkz . Kubernetes küme performansını görüntüleme ve Kubernetes küme durumunu görüntüleme.