Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Som beskrivs i Kubernetes-övervakning i Azure Monitor fungerar flera funktioner i Azure Monitor tillsammans för att tillhandahålla fullständig övervakning av dina AkS-kluster (Azure Kubernetes Service). Den här artikeln beskriver hur du aktiverar följande funktioner för AKS-kluster:
- Prometheus mätvärden
- Hanterad Grafana
- Containerloggning
- Kontrollplansloggar
Förutsättningar
- Du behöver minst deltagaråtkomst till klustret för registrering.
- Du behöver Övervakningsläsare eller Övervakningsdeltagare för att visa data när övervakning har aktiverats.
Skapa arbetsytor
I följande tabell beskrivs de arbetsytor som krävs för att stödja de Azure Monitor-funktioner som är aktiverade i den här artikeln. Om du inte redan har en befintlig arbetsyta av varje typ kan du skapa dem som en del av registreringsprocessen. Se Designa en Log Analytics-arbetsytearkitektur för vägledning om hur många arbetsytor som ska skapas och var de ska placeras.
| Egenskap | Arbetsyta | Anteckningar | 
|---|---|---|
| Hanterad Prometheus | Azure Monitor-arbetsyta | Om du inte anger en befintlig Azure Monitor-arbetsyta vid registrering används standardarbetsytan för resursgruppen. Om det inte redan finns någon standardarbetsyta i klustrets region skapas en med ett namn i formatet DefaultAzureMonitorWorkspace-<mapped_region>i en resursgrupp med namnetDefaultRG-<cluster_region>.Contributorbehörighet räcker för att aktivera tillägget för att skicka data till Azure Monitor-arbetsytan. Du behöverOwnernivåbehörighet för att länka din Azure Monitor-arbetsyta för att visa mått i Azure Managed Grafana. Detta krävs eftersom användaren som kör registreringssteget måste kunna ge rollen Azure Managed Grafana System IdentityMonitoring Readerpå Azure Monitor-arbetsytan för att kunna köra frågor mot måtten. | 
| Containerloggning Kontrollplansloggar | Log Analytics-arbetsyta | Du kan koppla ett kluster till en Log Analytics-arbetsyta i en annan Azure-prenumeration i samma Microsoft Entra-klientorganisation, men du måste använda Azure CLI eller en Azure Resource Manager-mall. Du kan för närvarande inte utföra den här konfigurationen med Azure Portal. Om du ansluter ett befintligt kluster till en Log Analytics-arbetsyta i en annan prenumeration måste resursprovidern Microsoft.ContainerService vara registrerad i prenumerationen med Log Analytics-arbetsytan. Mer information finns i Registrera en resursprovider. Om du inte anger en befintlig Log Analytics-arbetsyta används standardarbetsytan för resursgruppen. Om det inte redan finns någon standardarbetsyta i klustrets region skapas en med ett namn i formatet DefaultWorkspace-<GUID>-<Region>.En lista över mappningspar som stöds som ska användas för standardarbetsytan finns i Regionmappningar som stöds av Container Insights. Mer information om hur du konfigurerar arbetsytan med nätverkssäkerhetsperimeter finns i Konfigurera Azure Monitor med nätverkssäkerhetsperimeter . | 
| Hanterad Grafana | Azure Grafana-hanterad arbetsyta | Länka grafana-arbetsytan till din Azure Monitor-arbetsyta för att göra Prometheus-måtten som samlats in från klustret tillgängliga för Grafana-instrumentpaneler. | 
Aktivera Prometheus-mått och containerloggning
När du aktiverar Prometheus och containerloggning på ett kluster installeras en containerbaserad version av Azure Monitor-agenten i klustret. Du kan konfigurera dessa funktioner samtidigt i ett nytt eller befintligt kluster eller aktivera varje funktion separat.
Aktivera Managed Grafana för klustret samtidigt som du aktiverar insamling av Prometheus-mått. Se Länka en Grafana-arbetsyta för alternativ för att ansluta din Azure Monitor-arbetsyta och Azure Managed Grafana-arbetsyta.
Förutsättningar
- Klustret måste använda hanterad identitetsautentisering.
- Följande resursprovidrar måste registreras i prenumerationen på klustret och Azure Monitor-arbetsytan: - Microsoft.ContainerService
- Microsoft.Insights
- Microsoft.AlertsManagement (meddelandehantering)
- Microsoft.Monitor
 
- Följande resursprovidrar måste registreras i prenumerationen för Grafana-arbetsytan: - Microsoft Dashboard
 
Förutsättningar
- Hanterad identitetsautentisering är standard i CLI version 2.49.0 eller senare.
- Aks-preview-tillägget måste avinstalleras från AKS-kluster med hjälp av kommandot az extension remove --name aks-preview.
Prometheus mätvärden
Använd -enable-azure-monitor-metrics alternativet med az aks create eller az aks update beroende på om du skapar ett nytt kluster eller uppdaterar ett befintligt kluster för att installera tilläggsprogrammet för metrik som skrapar Prometheus-metrik. Då används konfigurationen som beskrivs i standardkonfigurationen för Prometheus-mått i Azure Monitor. För att ändra den här konfigurationen, se  Anpassa insamling av Prometheus-metrik i Azure Monitor-hanterad tjänst för Prometheus .
Se följande exempel.
### Use default Azure Monitor workspace
az aks create/update --enable-azure-monitor-metrics --name <cluster-name> --resource-group <cluster-resource-group>
### Use existing Azure Monitor workspace
az aks create/update --enable-azure-monitor-metrics --name <cluster-name> --resource-group <cluster-resource-group> --azure-monitor-workspace-resource-id <workspace-name-resource-id>
### Use an existing Azure Monitor workspace and link with an existing Grafana workspace
az aks create/update --enable-azure-monitor-metrics --name <cluster-name> --resource-group <cluster-resource-group> --azure-monitor-workspace-resource-id <azure-monitor-workspace-name-resource-id> --grafana-resource-id  <grafana-workspace-name-resource-id>
### Use optional parameters
az aks create/update --enable-azure-monitor-metrics --name <cluster-name> --resource-group <cluster-resource-group> --ksm-metric-labels-allow-list "namespaces=[k8s-label-1,k8s-label-n]" --ksm-metric-annotations-allow-list "pods=[k8s-annotation-1,k8s-annotation-n]"
Exempel
az aks create/update --enable-azure-monitor-metrics --name "my-cluster" --resource-group "my-resource-group" --azure-monitor-workspace-resource-id "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/my-resource-group/providers/microsoft.monitor/accounts/my-workspace"
Valfria parametrar
Vart och ett av kommandona ovan tillåter följande valfria parametrar. Parameternamnet är olika för varje, men deras användning är densamma.
| Parameter | Namn och beskrivning | 
|---|---|
| Anteckningsnycklar | --ksm-metric-annotations-allow-listKommaavgränsad lista över Kubernetes-annoteringar som används i resursens kube_resource_annotationsmått. Till exempel är kube_pod_annotations annoteringsmetrik för poddresursen. Som standard innehåller det här måttet endast namn- och namnområdesetiketter. Om du vill inkludera fler anteckningar anger du en lista över resursnamn i pluralform och Kubernetes-anteckningsnycklar som du vill tillåta för dem. En enskild*kan tillhandahållas för varje resurs för att tillåta eventuella anteckningar, men detta har allvarliga prestandakonsekvenser. Exempel:pods=[kubernetes.io/team,...],namespaces=[kubernetes.io/team],... | 
| Nycklar för etiketter | --ksm-metric-labels-allow-listKommaavgränsad lista över fler Kubernetes-etikettnycklar som används i kube_resource_labels mått för resursen. Till exempel är kube_pod_labels den etikettmetrik för poddresursen. Som standard innehåller det här måttet endast namn- och namnområdesetiketter. Om du vill inkludera fler etiketter anger du en lista med resursnamn i pluralform och Kubernetes-etikettnycklar som du vill tillåta för dem En enda *kan tillhandahållas för varje resurs för att tillåta etiketter, men det här har allvarliga prestandakonsekvenser. Exempel:pods=[app],namespaces=[k8s-label-1,k8s-label-n,...],... | 
| Inspelningsregler | --enable-windows-recording-rulesGör att du kan aktivera de inspelningsregelgrupper som krävs för att Windows-instrumentpanelerna ska fungera korrekt. | 
Containerloggar
Använd --addon monitoring-alternativet med az aks create för ett nytt kluster eller az aks enable-addon för att uppdatera ett befintligt kluster för att aktivera insamlingen av containerloggar. Se nedan för att ändra loggsamlingsinställningarna.
Se följande exempel.
### Use default Log Analytics workspace
az aks enable-addons --addon monitoring --name <cluster-name> --resource-group <cluster-resource-group-name>
### Use existing Log Analytics workspace
az aks enable-addons --addon monitoring --name <cluster-name> --resource-group <cluster-resource-group-name> --workspace-resource-id <workspace-resource-id>
### Use custom log configuration file
az aks enable-addons --addon monitoring --name <cluster-name> --resource-group <cluster-resource-group-name> --workspace-resource-id <workspace-resource-id> --data-collection-settings dataCollectionSettings.json
### Use legacy authentication
az aks enable-addons --addon monitoring --name <cluster-name> --resource-group <cluster-resource-group-name> --workspace-resource-id <workspace-resource-id> --enable-msi-auth-for-monitoring false
Exempel
az aks enable-addons --addon monitoring --name "my-cluster" --resource-group "my-resource-group" --workspace-resource-id "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/my-resource-group/providers/Microsoft.OperationalInsights/workspaces/my-workspace"
Loggkonfigurationsfil
Om du vill anpassa loggsamlingsinställningarna för klustret kan du ange konfigurationen som en JSON-fil med följande format. Om du inte anger någon konfigurationsfil används standardinställningarna i tabellen nedan.
{
  "interval": "1m",
  "namespaceFilteringMode": "Include",
  "namespaces": ["kube-system"],
  "enableContainerLogV2": true, 
  "streams": ["Microsoft-Perf", "Microsoft-ContainerLogV2"]
}
Var och en av inställningarna i konfigurationen beskrivs i följande tabell.
| Namn | Beskrivning | 
|---|---|
| interval | Avgör hur ofta agenten samlar in data.  Giltiga värden är 1–30 m i 1m intervall Om värdet ligger utanför det tillåtna intervallet är det standardvärdet 1 m. Förvalt: 1 m. | 
| namespaceFilteringMode | Inkludera: Samlar endast in data från värdena i fältet namnområden . Exkludera: Samlar in data från alla namnområden förutom värdena i fältet namnområden . Av: Ignorerar val av namnområde och samlar in data på alla namnområden. Standard: Av | 
| namespaces | Matris med kommaavgränsade Kubernetes-namnområden för att samla in inventerings- och perf-data baserat på namnområdetFilteringMode. Till exempel samlar namnrymder = ["kube-system", "default"] med inställningen Inkludera endast dessa två namnområden. Med inställningen Exkludera samlar agenten in data från alla andra namnområden förutom kube-system och standard. Med en Av-inställning samlar agenten in data från alla namnområden, inklusive kube-system och standard. Ogiltiga och okända namnområden ignoreras. Ingen. | 
| enableContainerLogV2 | Boolesk flagga för att aktivera ContainerLogV2-schema. Om värdet är true matas stdout-/stderr-loggarna in i tabellen ContainerLogV2 . Annars matas containerloggarna in i tabellen ContainerLog , om inget annat anges i ConfigMap. När du anger enskilda strömmar måste du inkludera motsvarande tabell för ContainerLog eller ContainerLogV2. Standard: Sant | 
| streams | En matris med tabellströmmar. Se Stream-värden för en lista över giltiga strömmar och deras motsvarande tabeller. Förvald: ContainerLogV2, KubeEvents, KubePodInventory | 
Strömma värden
När du anger vilka tabeller som ska samlas in med HJÄLP av CLI eller ARM anger du ett dataströmnamn som motsvarar en viss tabell på Log Analytics-arbetsytan. I följande tabell visas dataströmnamnet för varje tabell.
Anteckning
Om du är bekant med strukturen för en datainsamlingsregel anges dataströmnamnen i den här tabellen i avsnittet Dataflöden i DCR.
| Strömning | Tabell för containerinsikter | 
|---|---|
| Microsoft-ContainerInventory | Behållarinventarie | 
| Microsoft-ContainerLog | ContainerLog | 
| Microsoft-ContainerLogV2 | ContainerLogV2 | 
| Microsoft -ContainerLogV2-HighScale | ContainerLogV2 (högskalat läge)1 | 
| Microsoft-ContainerNodeInventory | Inventeringslista för Containernoder | 
| Microsoft-InsightsMetrics | InsightsMetrics | 
| Microsoft-KubeEvents | KubeEvents | 
| Microsoft-KubeMonAgentEvents | KubeMonAgentEvents | 
| Microsoft-KubeNodeInventory | KubeNodeInventory | 
| Microsoft-KubePodInventory | KubePodInventory | 
| Microsoft-KubePVInventory | KubePVInventory | 
| Microsoft-KubeServices | KubeServices | 
| Microsoft-Perf | Perf | 
| Microsoft-RetinaNetworkFlowLogs | RetinaNetworkFlowLogs | 
1 Använd inte både Microsoft-ContainerLogV2 och MicrosoftContainerLogV2-HighScale tillsammans. Detta resulterar i dubbletter av data.
Tillämpliga tabeller och mått
Inställningarna för insamlingsfrekvens och namnområdesfiltrering gäller inte för alla loggdata. I följande tabeller visas tabellerna i Log Analytics-arbetsytan tillsammans med de inställningar som gäller för var och en.
| Tabellnamn | Intervall? | Namnområden? | Anmärkningar | 
|---|---|---|---|
| Behållarinventarie | Yes | Yes | |
| Inventeringslista för Containernoder | Yes | Nej | Datainsamlingsinställningen för namnområden är inte tillämplig eftersom Kubernetes Node inte är en resurs med namnområdesomfång | 
| KubeNodeInventory | Yes | Nej | Datainsamlingsinställningen för namnområden är inte tillämplig Kubernetes Node är inte en resurs med namnområdesomfång | 
| KubePodInventory | Yes | Yes | |
| KubePVInventory | Yes | Yes | |
| KubeServices | Yes | Yes | |
| KubeEvents | Nej | Yes | Datainsamlingsinställning för intervall gäller inte för Kubernetes-händelser | 
| Perf | Yes | Yes | Datainsamlingsinställningen för namnområden gäller inte för Kubernetes Node-relaterade mått eftersom Kubernetes-noden inte är ett namnområdesomfångsobjekt. | 
| InsightsMetrics | Yes | Yes | Datainsamlingsinställningar gäller endast för mått som samlar in följande namnområden: container.azm.ms/kubestate, container.azm.ms/pv och container.azm.ms/gpu | 
Anteckning
Namnområdesfiltrering gäller inte för ama-logs-agentposter. Även om kube-system-namnområdet visas bland undantagna namnområden kommer poster som är associerade med ama-logs-agentcontainern fortfarande att matas in.
| Metrisk namnrymd | Intervall? | Namnområden? | Anmärkningar | 
|---|---|---|---|
| Insikter.container/noder | Yes | Nej | Noden är inte en resurs med namnområdesomfång | 
| Insights.container/poddar | Yes | Yes | |
| Insights.behållare/behållare | Yes | Yes | |
| Insights.container/persistentvolumes | Yes | Yes | 
Särskilda scenarier
Kontrollera referenserna nedan för konfigurationskrav för specifika scenarier.
- Om du använder en privat länk kan du läsa Aktivera privat länk för Kubernetes-övervakning i Azure Monitor.
- Information om hur du aktiverar containerloggning med nätverkssäkerhetsperimeter finns i Konfigurera Azure Monitor med nätverkssäkerhetsperimeter för att konfigurera Log Analytics-arbetsytan.
- Om du vill aktivera högpresterande läge följer du onboarding-processen i Aktivera högpresterande läge för övervakningstillägg. Du måste också konfigurera ConfigMap enligt beskrivningen i Uppdatera ConfigMap, och DCR-flödet måste ändras från Microsoft-ContainerLogV2tillMicrosoft-ContainerLogV2-HighScale.
Aktivera kontrollplansloggar
Kontrollplansloggar implementeras som resursloggar i Azure Monitor. Om du vill samla in loggarna skapar du en diagnostikinställning för klustret. Skicka dem till samma Log Analytics-arbetsyta som dina containerloggar.
Använd kommandot az monitor diagnostic-settings create för att skapa en diagnostikinställning med Azure CLI. I dokumentationen för det här kommandot finns beskrivningar av dess parametrar.
I följande exempel skapas en diagnostikinställning som skickar alla Kubernetes-kategorier till en Log Analytics-arbetsyta. Detta inkluderar resursspecifikt läge för att skicka loggarna till specifika tabeller som anges i Resursloggar som stöds för Microsoft.ContainerService/fleets.
az monitor diagnostic-settings create \
--name 'Collect control plane logs' \
--resource  /subscriptions/<subscription ID>/resourceGroups/<resource group name>/providers/Microsoft.ContainerService/managedClusters/<cluster-name> \
--workspace /subscriptions/<subscription ID>/resourcegroups/<resource group name>/providers/microsoft.operationalinsights/workspaces/<log analytics workspace name> \
--logs '[{"category": "karpenter-events","enabled": true},{"category": "kube-audit","enabled": true},
{"category": "kube-apiserver","enabled": true},{"category": "kube-audit-admin","enabled": true},{"category": "kube-controller-manager","enabled": true},{"category": "kube-scheduler","enabled": true},{"category": "cluster-autoscaler","enabled": true},{"category": "cloud-controller-manager","enabled": true},{"category": "guard","enabled": true},{"category": "csi-azuredisk-controller","enabled": true},{"category": "csi-azurefile-controller","enabled": true},{"category": "csi-snapshot-controller","enabled": true},{"category": "fleet-member-agent","enabled": true},{"category": "fleet-member-net-controller-manager","enabled": true},{"category": "fleet-mcs-controller-manager","enabled": true}]'
--metrics '[{"category": "AllMetrics","enabled": true}]' \
--export-to-resource-specific true
Aktivera Windows-statistik (förhandsversion)
Insamling av Windows-mått är aktiverat för AKS-kluster från och med version 6.4.0-main-02-22-2023-3ee44b9e av den hanterade Prometheus-tilläggscontainern. Genom att aktivera Azure Monitor Metrics-tillägget kan Windows DaemonSet-poddarna börja köras på dina nodpooler. Både Windows Server 2019 och Windows Server 2022 stöds. Följ de här stegen för att göra det möjligt för poddarna att samla in mått från dina Windows-nodpooler.
Anteckning
Det finns ingen cpu-/minnesgräns i windows-exporter-daemonset.yaml så det kan överetablera Windows-noderna. Mer information finns i Resursreservation
När du distribuerar arbetsbelastningar anger du resursminne och CPU-gränser för containrar. Detta subtraherar också från NodeAllocatable och hjälper den klusteromfattande schemaläggaren att avgöra vilka poddar som ska placera på vilka noder. Schemaläggning av poddar utan gränser kan överprovisionera Windows-noderna, och i extrema fall kan noderna bli ohälsosamma.
Installera Windows-exportör
Installera windows-exporter manuellt på AKS-noder för att få åtkomst till Windows-metrik genom att implementera windows-exporter-daemonset YAML-filen. Aktivera följande insamlare. För fler samlarobjekt, se Prometheus-exportör för Windows-mått.
- [defaults]
- container
- memory
- process
- cpu_info
Distribuera windows-exporter-daemonset YAML-filen. Om det finns några taints som tillämpas i noden måste du tillämpa lämpliga toleranser.
kubectl apply -f windows-exporter-daemonset.yaml
Aktivera Windows-mått
Ange värdena för windowsexporter och windowskubeproxy till true i din ConfigMap för mätinställningar och använd den på klustret. Se Anpassa samling Prometheus-mått från ditt Kubernetes-kluster med hjälp av ConfigMap.
Aktivera inspelningsregler
Aktivera de inspelningsregler som krävs för de färdiga instrumentpanelerna:
- Om du onboardar med CLI, inkludera alternativet --enable-windows-recording-rules.
- Om du registrerar med hjälp av en ARM-mall, Bicep eller Azure Policy anger du enableWindowsRecordingRulestilltruei parameterfilen.
- Om klustret redan har registrerats använder du den här ARM-mallen och den här parameterfilen för att skapa regelgrupperna. Detta lägger till de inspelningsregler som krävs och är inte en ARM-åtgärd i klustret och påverkar inte klustrets aktuella övervakningstillstånd.
Verifiera driftsättningen
Använd kommandoradsverktyget kubectl för att kontrollera att agenten har distribuerats korrekt.
Hanterad Prometheus
Kontrollera att DaemonSet har distribuerats korrekt i Linux-nodpoolerna
kubectl get ds ama-metrics-node --namespace=kube-system
Antalet poddar ska vara lika med antalet Linux-noder i klustret. Utdata bör likna följande exempel:
User@aksuser:~$ kubectl get ds ama-metrics-node --namespace=kube-system
NAME               DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
ama-metrics-node   1         1         1       1            1           <none>          10h
Kontrollera att Windows-noder har distribuerats korrekt
kubectl get ds ama-metrics-win-node --namespace=kube-system
Antalet poddar ska vara lika med antalet Windows-noder i klustret. Utdata bör likna följande exempel:
User@aksuser:~$ kubectl get ds ama-metrics-node --namespace=kube-system
NAME                   DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
ama-metrics-win-node   3         3         3       3            3           <none>          10h
Kontrollera att de två Replica Sets har blivit implementerade för Prometheus
kubectl get rs --namespace=kube-system
Utdata bör likna följande exempel:
User@aksuser:~$kubectl get rs --namespace=kube-system
NAME                            DESIRED   CURRENT   READY   AGE
ama-metrics-5c974985b8          1         1         1       11h
ama-metrics-ksm-5fcf8dffcd      1         1         1       11h
Containerloggning
Kontrollera att DaemonSets har distribuerats korrekt i Linux-nodpoolerna
kubectl get ds ama-logs --namespace=kube-system
Antalet poddar ska vara lika med antalet Linux-noder i klustret. Utdata bör likna följande exempel:
User@aksuser:~$ kubectl get ds ama-logs --namespace=kube-system
NAME       DESIRED   CURRENT   READY     UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
ama-logs   2         2         2         2            2           <none>          1d
Kontrollera att Windows-noder har distribuerats korrekt
kubectl get ds ama-logs-windows --namespace=kube-system
Antalet poddar ska vara lika med antalet Windows-noder i klustret. Utdata bör likna följande exempel:
User@aksuser:~$ kubectl get ds ama-logs-windows --namespace=kube-system
NAME                   DESIRED   CURRENT   READY     UP-TO-DATE   AVAILABLE   NODE SELECTOR     AGE
ama-logs-windows           2         2         2         2            2       <none>            1d
Verifiera distributionen av containerloggningslösningen
kubectl get deployment ama-logs-rs --namespace=kube-system
Utdata bör likna följande exempel:
User@aksuser:~$ kubectl get deployment ama-logs-rs --namespace=kube-system
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
ama-logs-rs   1/1     1            1           24d
Visa konfiguration med CLI
              aks show Använd kommandot för att ta reda på om lösningen är aktiverad, resurs-ID för Log Analytics-arbetsytan och sammanfattningsinformation om klustret.
az aks show --resource-group <resourceGroupofAKSCluster> --name <nameofAksCluster>
Kommandot returnerar JSON-formaterad information om lösningen. Avsnittet addonProfiles bör innehålla information om omsagent som i följande exempel:
"addonProfiles": {
    "omsagent": {
        "config": {
            "logAnalyticsWorkspaceResourceID": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/my-resource-group/providers/microsoft.operationalinsights/workspaces/my-workspace",
            "useAADAuth": "true"
        },
        "enabled": true,
        "identity": null
    },
}
Nästa steg
- Om du har problem med att försöka registrera dig kan du läsa felsökningsguiden.
- Lär dig hur du analyserar Kubernetes-övervakningsdata i Azure Portal Container Insights.
 
              
               
              
               
              
               
              
               
              
               
              
               
              
              