Naplókeresési riasztások létrehozása a Container Insightsból
A Container Insights figyeli a felügyelt vagy önállóan felügyelt Kubernetes-fürtökön üzembe helyezett tárolókhoz kapcsolódó számítási feladatok teljesítményét. Ez a cikk azt ismerteti, hogyan hozhat létre naplóalapú riasztásokat az Azure Kubernetes Service-fürtökkel kapcsolatos következő helyzetekre:
- Ha a fürtcsomópontok cpu- vagy memóriakihasználtsága meghaladja a küszöbértéket
- Ha egy vezérlőn belüli tároló processzor- vagy memóriakihasználtsága meghaladja a küszöbértéket a megfelelő erőforráson beállított korláthoz képest
NotReady
állapotcsomópontok számaFailed
,Pending
,Unknown
,Running
vagySucceeded
podfázisok száma- Ha a fürtcsomópontok szabad lemezterülete meghaladja a küszöbértéket
Ha riasztást szeretne készíteni a magas processzor- vagy memóriahasználatról, illetve a fürtcsomópontok alacsony szabad lemezterületéről, a megadott lekérdezésekkel hozzon létre metrikariasztást vagy metrikamérési riasztást. A metrikaalapú riasztások kisebb késéssel rendelkeznek, mint a naplókeresési riasztások, de a naplókeresési riasztások speciális lekérdezést és kifinomultabb eljárást biztosítanak. A naplókeresési riasztási lekérdezések az operátor használatával now
összehasonlítják a dátumidőt a jelenhez, és egy órával későbbre mennek vissza. (A Container Insights az összes dátumot koordinált univerzális idő [UTC] formátumban tárolja.)
Fontos
A cikkben szereplő lekérdezések a Container Insights által gyűjtött és egy Log Analytics-munkaterületen tárolt adatoktól függenek. Ha módosította az alapértelmezett adatgyűjtési beállításokat, előfordulhat, hogy a lekérdezések nem a várt eredményeket adják vissza. Különösen, ha letiltotta a teljesítményadatok gyűjtését, mivel engedélyezte a Prometheus-metrikákat a fürthöz, a Perf
táblát használó lekérdezések nem adnak vissza eredményeket.
Lásd: Adatgyűjtés konfigurálása a Container Insightsban adatgyűjtési szabály használatával előre beállított konfigurációkhoz, beleértve a teljesítményadatok gyűjtésének letiltását. További adatgyűjtési lehetőségekért tekintse meg az adatgyűjtés konfigurálása a Container Insightsban a ConfigMap használatával című témakört.
Ha nem ismeri az Azure Monitor-riasztásokat, a kezdés előtt tekintse meg a Microsoft Azure riasztásainak áttekintését. A napló lekérdezéseket használó riasztásokról további információt az Azure Monitor naplókeresési riasztásai című témakörben talál. A metrikariasztásokról további információt az Azure Monitor metrikariasztásai című témakörben talál.
Lekérdezésmérések naplózása
A naplókeresési riasztások két különböző dolgot mérhetnek, amelyek különböző forgatókönyvek virtuális gépeinek monitorozására használhatók:
- Eredményszám: Megszámlálja a lekérdezés által visszaadott sorok számát, és használható olyan események kezelésére, mint a Windows-eseménynaplók, a Syslog és az alkalmazás kivételei.
- Érték kiszámítása: Numerikus oszlop alapján végez számítást, és tetszőleges számú erőforrás belefoglalására használható. Ilyen például a processzorhasználat százalékos aránya.
Célerőforrások és dimenziók
Egy szabály használatával dimenziókkal figyelheti több példány értékeit. Például dimenziókat használna, ha a webhelyet vagy alkalmazást futtató több példány processzorhasználatát szeretné figyelni, és több mint 80%-os processzorhasználatra vonatkozó riasztást hozna létre.
Ha erőforrás-központú riasztásokat szeretne létrehozni nagy méretekben egy előfizetéshez vagy erőforráscsoporthoz, dimenziók szerint oszthatja fel. Ha ugyanazt a feltételt több Azure-erőforráson szeretné monitorozni, a dimenziók szerinti felosztás a riasztásokat külön riasztásokra osztja fel az egyedi kombinációk numerikus vagy sztringoszlopok használatával történő csoportosításával. Az Azure-erőforrás-azonosító oszlop felosztásával a megadott erőforrás a riasztási célhelyre kerül.
Dönthet úgy is, hogy nem osztja fel a elemet, ha több erőforrásra vonatkozó feltételt szeretne a hatókörben. Előfordulhat például, hogy riasztást szeretne létrehozni, ha az erőforráscsoport hatókörében legalább öt gép processzorhasználata meghaladja a 80%-ot.
Előfordulhat, hogy látni szeretné az érintett számítógép riasztásainak listáját. Ezt a nézetet egyéni erőforrás-diagramot használó egyéni munkafüzetet használhat. A következő lekérdezés használatával jeleníthet meg riasztásokat, és használhatja az Azure Resource Graph adatforrást a munkafüzetben.
Naplókeresési riasztási szabály létrehozása
Ha naplókeresési riasztási szabályt szeretne létrehozni a portál használatával, tekintse meg ezt a példát egy naplókeresési riasztásra, amely teljes körű útmutatót nyújt. Ugyanezekkel a folyamatokkal riasztási szabályokat hozhat létre az AKS-fürtökhöz a cikkben szereplő lekérdezésekhez hasonló lekérdezésekkel.
Ha Azure Resource Manager-sablonnal (ARM) szeretne lekérdezési riasztási szabályt létrehozni, tekintse meg a Resource Manager-sablonmintákat a naplókeresési riasztási szabályokhoz az Azure Monitorban. Ugyanezekkel a folyamatokkal hozhat létre ARM-sablonokat a jelen cikkben szereplő napló lekérdezésekhez.
Erőforrás-kihasználtság
Átlagos CPU-kihasználtság a tagcsomópontok percenkénti cpu-kihasználtságának átlagaként (metrikamérés):
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
Átlagos memóriakihasználtság a tagcsomópontok percenkénti memóriakihasználtságának átlagaként (metrikamérés):
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
Fontos
Az alábbi lekérdezések a fürt és a vezérlő nevének><> helyőrző értékeit <használják. A riasztások beállításakor cserélje le őket a környezetére jellemző értékekre.
Egy vezérlő összes tárolójának átlagos CPU-kihasználtsága egy vezérlő minden tárolópéldányának percenkénti cpu-kihasználtságának átlagaként (metrikamérés):
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
Egy vezérlő összes tárolójának átlagos memóriakihasználtsága egy vezérlő minden tárolópéldányának percenkénti memóriakihasználtságaként (metrikamérés):
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
Erőforrás elérhetősége
A Ready és NotReady állapotú csomópontok és számok (metrikamérés):
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
Az alábbi lekérdezés a podfázisok számát adja vissza az összes fázis alapján: Failed
, , Pending
, Running
Unknown
vagy 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)
Feljegyzés
Riasztás egyes podfázisok esetén, például Pending
Failed
Unknown
a lekérdezés utolsó sorának módosításához. Például a riasztáshoz használja a következőtFailedCount
| summarize AggValue = avg(FailedCount) by bin(TimeGenerated, trendBinSize)
: .
Az alábbi lekérdezés olyan fürtcsomópontok lemezeit adja vissza, amelyek túllépik a 90%-os szabad területet. A fürtazonosító lekéréséhez először futtassa a következő lekérdezést, és másolja ki az értéket a ClusterId
tulajdonságból:
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
Az egyes tárolók újraindulása (az eredmények száma) riasztás, ha az egyes rendszertároló-újraindítások száma meghaladja az elmúlt 10 perc küszöbértékét:
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
Következő lépések
- A napló lekérdezési példáiban előre definiált lekérdezéseket és példákat tekinthet meg, amelyekkel kiértékelheti vagy testre szabhatja a fürtök riasztását, vizualizációját vagy elemzését.
- Az Azure Monitorról és a Kubernetes-fürt egyéb aspektusainak monitorozásáról további információt a Kubernetes-fürt teljesítményének megtekintése és a Kubernetes-fürt állapotának megtekintése című témakörben talál.