Konfigurera filtrering av containernätverksmått för Azure Kubernetes Service (AKS) (förhandsversion)

Den här artikeln visar hur du konfigurerar filtrering av containernätverksmått för Azure Kubernetes Service (AKS) med Cilium för att optimera datainsamling, minska lagringskostnaderna och fokusera på de mått som är mest relevanta för dina övervakningsbehov.

Konfigurera filtrering av containernätverksmått möjliggör dynamisk hantering av Hubble-måttens kardinalitet via Kubernetes anpassade resursdefinitioner (CRD). Med den här funktionen kan du dynamiskt kontrollera kardinalitet, dimensioner och mål för Hubble-mått utan att starta om Cilium-agenter eller Prometheus-servrar.

Förutsättningar

  • Den lägsta versionen av Azure CLI som krävs för att slutföra stegen i den här artikeln är 2.73.0. Du hittar din version genom att köra az --version i Azure CLI. Information om hur du installerar eller uppgraderar finns i Installera Azure CLI.

  • Ett AKS-kluster med Cilium-dataplanet och Advanced Container Networking Services aktiverat.

  • Kubernetes version 1.32 eller senare.

  • Filtrering av containernätverksmått fungerar specifikt med Cilium-dataplan.

  • Den lägsta versionen av aks-preview Azure CLI-tillägget för att slutföra stegen i den här artikeln är 18.0.0b2.

Installera Azure CLI-tillägget aks-preview

Installera eller uppdatera Azure CLI-förhandsgranskningstillägget genom att använda kommandot az extension add eller az extension update.

# Install the aks-preview extension
az extension add --name aks-preview
# Update the extension to make sure you have the latest version installed
az extension update --name aks-preview

Registrera funktionsflaggan AdvancedNetworkingDynamicMetricsPreview

  1. Registrera först funktionsflaggan AdvancedNetworkingDynamicMetricsPreview med hjälp az feature register av kommandot :
az feature register --namespace "Microsoft.ContainerService" --name "AdvancedNetworkingDynamicMetricsPreview"
  1. Verifiera lyckad registrering med hjälp az feature show av kommandot . Det tar några minuter innan registreringen har slutförts.
az feature show --namespace "Microsoft.ContainerService" --name "AdvancedNetworkingDynamicMetricsPreview"
  1. När funktionen visar Registrerad uppdaterar du registreringen av Microsoft.ContainerService resursleverantören med hjälp av az provider register kommandot.
az provider register --namespace Microsoft.ContainerService

Skapa ett nytt AKS-kluster med Cilium

Om du redan har ett befintligt kluster kan du hoppa över det här steget.

az aks create Använd kommandot med --enable-acns flaggan för att skapa ett nytt AKS-kluster som har alla avancerade funktioner för containernätverkstjänster. Dessa funktioner omfattar bland annat:

# Set environment variables
export RESOURCE_GROUP="cnm-testing-rg"
export CLUSTER_NAME="cnm-cilium-cluster"
export LOCATION="eastus2euap"  # Use canary region for preview features

# Create resource group
az group create --name $RESOURCE_GROUP --location $LOCATION

# Create AKS cluster with Cilium and ACNS enabled
az aks create \
    --resource-group $RESOURCE_GROUP \
    --name $CLUSTER_NAME \
    --location $LOCATION \
    --network-plugin azure \
    --network-dataplane cilium \
    --enable-acns \
    --enable-managed-identity \
    --generate-ssh-keys \
    --kubernetes-version 1.32

Hämta klusterautentiseringsuppgifter

Hämta dina autentiseringsuppgifter för az aks get-credentials klustret med hjälp av kommandot:

az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --overwrite-existing

Konfigurera anpassade resurser för måttfiltrering

Filtrering av containernätverksmått använder ContainerNetworkMetric CRD (Custom Resource Definition) för att definiera filtreringsregler. Endast en CRD kan finnas per kluster och det tar cirka 30 sekunder att stämma av ändringarna. Om CRD:en inte tillämpas samlas alla mått in.

apiVersion: acn.azure.com/v1alpha1
kind: ContainerNetworkMetric
metadata:
  name: : container-network-metric # Cluster scoped
spec:
  filters:
  - metric: flow
    includeFilters: # List of include filters
      - name: sample-filter # Filter name
        from:
          namespacedPod: # List of source namespace/pods. Prepend namespace with /
            - sample-namespace/sample-pod
          labelSelector: # Standard k8s label selector
            matchLabels:
              app: frontend
              k8s.io/namespace: sample-namespace
            matchExpressions:
              - key: environment
                operator: In
                values:
                  - production
                  - staging
          ip: # List of source IPs; can be CIDR
            - "192.168.1.10"
            - "10.0.0.1"
        to:
          namespacedPod:
            - sample-namespace2/sample-pod2
          labelSelector:
            matchLabels:
              app: backend
              k8s.io/namespace: sample-namespace2
            matchExpressions:
              - key: tier
                operator: NotIn
                values:
                  - dev
          ip:
            - "192.168.1.20"
            - "10.0.1.1"
        protocol: # List of protocols; can be tcp, udp, dns
          - tcp
          - udp
          - dns
        verdict: # List of verdicts; can be forwarded, dropped
          - forwarded
          - dropped
    metric: dns
    excludeFilters: # List of exclude filters
      - name: sample-filter # Filter name
        from:
          namespacedPod: # List of source namespace/pods. Prepend namespace with /
            - sample-namespace/sample-pod
          labelSelector: # Standard k8s label selector
            matchLabels:
              app: frontend
              k8s.io/namespace: sample-namespace

I följande tabell beskrivs fälten i den anpassade resursdefinitionen:

Fält Typ Description Krävs
filters.metric String Namnet på det mått som du vill använda filtret på. Detta är obligatoriskt. De värden som stöds är dns, flow, tcp, drop Mandatory
includeFilters eller excludeFilters []filter En lista över filter som definierar nätverksflöden som ska inkluderas. Varje filter anger källa, mål, protokoll och andra matchande kriterier. Du måste ha minst ett inkludera eller exkludera filter. Mandatory
filters.name String Namnet på filtret. Valfritt
filters.protocol []sträng De protokoll som ska matchas för det här filtret. Giltiga värden är tcp, udpoch dns. Eftersom det är en valfri parameter, om den inte har angetts, inkluderas loggar med alla protokoll. Valfritt
filters.verdict []sträng Domen över flödet som ska matchas. Giltiga värden är forwarded och dropped. Eftersom det är en valfri parameter, om den inte anges, inkluderas loggar med alla omdömen. Valfritt
filters.from Endpoint Anger källan för nätverksflödet. Kan innehålla IP-adresser, etikettväljare och namnområde/poddpar. Valfritt
Endpoint.ip []sträng Det kan vara en enskild IP-adress eller en CIDR. Valfritt
Endpoint.labelSelector Object En etikettväljare är en mekanism för att filtrera och fråga efter resurser baserat på etiketter, så att du kan identifiera specifika delmängder av resurser. En etikettväljare kan innehålla två komponenter: matchLabels och matchExpressions. Använd matchLabels för enkel matchning genom att ange ett nyckel/värde-par (till exempel {"app": "frontend"}). För mer avancerade kriterier använder matchExpressionsdu , där du definierar en etikettnyckel, en operator (till exempel In, NotIn, Existseller DoesNotExist) och en valfri lista med värden. Se till att villkoren i båda matchLabels och matchExpressions är uppfyllda, eftersom de kombineras logiskt av AND. Om inga villkor anges matchar väljaren alla resurser. Om du vill matcha ingen lämnar du väljaren null. Definiera etikettväljaren noggrant för att rikta in dig på rätt uppsättning resurser. Valfritt
Endpoint.namespacedPod []sträng En lista över namnrymds- och poddpar (formaterade som namespace/pod) för matchning av källan. name ska matcha RegEx-mönstret ^.+$. Valfritt
filters.to Endpoint Anger målet för nätverksflödet. Kan innehålla IP-adresser, etikettväljare eller namnområde/poddpar. Valfritt
Endpoint.ip []sträng Det kan vara en enskild IP-adress eller en CIDR. Valfritt
Endpoint.labelSelector Object En etikettväljare som matchar resurser baserat på deras etiketter. Valfritt
Endpoint.namespacedPod []sträng En lista över namnrymd och pod-par (formaterade som namespace/pod) som matchar målet. Valfritt

Använd den anpassade resursen ContainerNetworkMetric för att aktivera logginsamling i klustret:

kubectl apply -f <crd.yaml>

Rensa och återställa

Så här rensar du filtreringskonfigurationen:

# Delete the CRD
kubectl delete ContainerNetworkMetric container-network-metric

Exempel på filtreringskonfiguration

  1. Skapa en grundläggande filtreringskonfiguration som fokuserar på DNS-mått:
# basic-dns-filter.yaml
apiVersion: acn.azure.com/v1alpha1
kind: ContainerNetworkMetric
metadata:
  name: container-network-metric
spec:
  filters:
    - metric: dns  # Supported: dns, flow, tcp, drop
      excludeFilters:
        - from:
            namespacedPod: ["kube-system/coredns"]
  1. Konfigurera filtrering för TCP-mått med inkludera och exkludera filter:
# tcp-metrics-filter.yaml
apiVersion: acn.azure.com/v1alpha1
kind: ContainerNetworkMetric
metadata:
  name: container-network-metric
spec:
  filters:
    - metric: tcp
      includeFilters:
          - from:
            labelSelector:
              matchLabels:
                tier: "frontend"
      excludeFilters:
        - to:
            namespacedPod: ["kube-system/metrics-server"]
  1. Konfigurera filtrering för nätverksflödesmått:
# flow-metrics-filter.yaml
apiVersion: acn.azure.com/v1alpha1
kind: ContainerNetworkMetric
metadata:
  name: container-network-metric
spec:
  filters:
    - metric: flow
      includeFilters:
        - from:
            labelSelector:
              matchLabels:
                tier: "frontend"
        - to:
            labelSelector:
              matchLabels:
                tier: "backend"
      excludeFilters:
        - from:
            namespacedPod: ["default/test"]
  1. Konfigurera filtrering för borttagna paketmått:
# drop-metrics-filter.yaml
apiVersion: acn.azure.com/v1alpha1
kind: ContainerNetworkMetric
metadata:
  name: container-network-metric
spec:
  filters:
    - metric: drop
      excludeFilters:
        - from:
            namespacedPod: ["kube-system/"]
  1. Konfigurera filtrering för flera måtttyper i en enda CRD:
# multi-metrics-filter.yaml
apiVersion: acn.azure.com/v1alpha1
kind: ContainerNetworkMetric
metadata:
  name: container-network-metric
spec:
  filters:
    - metric: dns
      includeFilters:
        - protocol: ["dns"]
      excludeFilters:
        - from:
            namespacedPod: ["kube-system/*"]
    - metric: tcp
      includeFilters:
        - protocol: ["tcp"]
        - from:
            labelSelector:
              matchLabels:
                environment: "production"
    - metric: flow
      excludeFilters:
        - from:
            namespacedPod: ["default/debug-*"]
    - metric: drop
      includeFilters:
        - reason: ["Policy denied", "Invalid"]

Metodtips

  • Se till att du inte har motstridiga filter för att inkludera och exkludera på CRD.

  • Använd Kubernetes-etikettväljare för flexibel filtrering.

  • Verifiera alltid filtreringskonfigurationer under utveckling eller mellanlagring

  • Granska regelbundet filtrerade mått för att säkerställa att viktiga data inte går förlorade.

  • Kom ihåg att endast en CRD kan finnas per kluster.

Felsökning

Vanliga problem

Problem: CRD-konfigurationen tillämpas inte

Lösning: Kontrollera att funktionsflaggan är registrerad och att endast en CRD finns:

# Verify feature registration
az feature show --namespace "Microsoft.ContainerService" --name "AdvancedNetworkingDynamicMetricsPreview"

# Check existing CRDs
kubectl get ContainerNetworkMetric

Problem: Mätdata visas fortfarande när excludeFilters har tillämpats

Lösning: Kom ihåg att befintliga mått finns kvar i Prometheus. Du kan behöva vänta tills nya mått har genererats för att se filtreringseffekterna.

Begränsningar

  • Den här funktionen är särskilt utformad endast för Cilium-dataplan
  • Endast en ContainerNetworkMetric CRD kan finnas per kluster
  • Befintliga mått finns kvar i Prometheus; nya filtreringsregler gäller för nyligen genererade mått
  • Kräver Kubernetes version 1.32 eller senare