Nastavení rozšířené pozorovatelnosti sítě pro Službu Azure Kubernetes Service (AKS) – Azure managed Prometheus a Grafana (Preview)

V tomto článku se dozvíte, jak nastavit rozšířenou pozorovatelnost sítě pro Službu Azure Kubernetes Service (AKS) pomocí spravovaného nástroje Prometheus a Grafana k vizualizaci sešrotovaných metrik.

Pomocí rozšířené pozorovatelnosti sítě můžete shromažďovat data o síťovém provozu clusterů AKS. Umožňuje centralizovanou platformu pro monitorování stavu aplikace a sítě. V současné době se metriky ukládají v systému Prometheus a Grafana k jejich vizualizaci. Advanced Network Observability také nabízí možnost povolit Hubble. Tyto funkce jsou podporovány jak pro shluky Cilium, tak i pro clustery bez Cilium.

Advanced Network Observability je jednou z funkcí Advanced Container Networking Services. Další informace o Advanced Container Networking Services pro Azure Kubernetes Service (AKS) najdete v tématu Co je Advanced Container Networking Services pro Azure Kubernetes Service (AKS)?.

Důležité

Rozšířená pozorovatelnost sítě je v současné době ve verzi PREVIEW. Právní podmínky, které platí pro funkce Azure, které jsou ve verzi beta, verzi Preview nebo které zatím nejsou veřejně dostupné, najdete v Dodatečných podmínkách použití pro Microsoft Azure verze Preview.

Požadavky

  • Účet Azure s aktivním předplatným. Pokud ho nemáte, vytvořte si bezplatný účet před tím, než začnete.
  • Minimální verze Azure CLI vyžadovaná pro kroky v tomto článku je 2.56.0. Verzi zjistíte spuštěním příkazu az --version. Pokud potřebujete instalaci nebo upgrade, přečtěte si téma Instalace Azure CLI.

aks-preview Instalace rozšíření Azure CLI

Nainstalujte nebo aktualizujte rozšíření Azure CLI ve verzi Preview pomocí az extension add příkazu nebo az extension update příkazu.

# 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

Registrace příznaku AdvancedNetworkingPreview funkce

az feature register --namespace "Microsoft.ContainerService" --name "AdvancedNetworkingPreview" Pomocí příkazu zaregistrujte příznak az feature register funkce.

az feature register --namespace "Microsoft.ContainerService" --name "AdvancedNetworkingPreview"

Pomocí příkazu ověřte úspěšnou az feature show registraci. Dokončení registrace trvá několik minut.

az feature show --namespace "Microsoft.ContainerService" --name "AdvancedNetworkingPreview"

Jakmile se tato funkce zobrazí Registered, aktualizujte registraci Microsoft.ContainerService poskytovatele prostředků pomocí az provider register příkazu.

Vytvoření skupiny zdrojů

Skupina prostředků je logický kontejner, ve kterém se nasazují a spravují prostředky Azure. Pomocí příkazu vytvořte skupinu az group create prostředků.

# Set environment variables for the resource group name and location. Make sure to replace the placeholders with your own values.
export RESOURCE_GROUP="<resource-group-name>"
export LOCATION="<azure-region>"

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

Vytvoření clusteru AKS s pokročilým sledováním sítě

Pomocí příkazu a --enable-advanced-networking-observability příznaku vytvořte cluster AKS s rozšířenou pozorovatelnostmi sítě s rovinou dat az aks create mimo Cilium.

# Set an environment variable for the AKS cluster name. Make sure to replace the placeholder with your own value.
export CLUSTER_NAME="<aks-cluster-name>"

# Create an AKS cluster
az aks create \
    --name $CLUSTER_NAME \
    --resource-group $RESOURCE_GROUP \
    --generate-ssh-keys \
    --network-plugin azure \
    --network-plugin-mode overlay \
    --pod-cidr 192.168.0.0/16 \
    --enable-advanced-network-observability

Povolení rozšířené pozorovatelnosti sítě v existujícím clusteru

Pomocí příkazu povolte rozšířenou pozorovatelnost sítě v existujícím clusteru az aks update .

Poznámka:

Clustery s rovinou dat Cilium podporují pokročilou pozorovatelnost sítě počínaje Kubernetes verze 1.29.

az aks update \
    --resource-group $RESOURCE_GROUP \
    --name $CLUSTER_NAME \
    --enable-advanced-network-observability

Získání přihlašovacích údajů clusteru

Pomocí příkazu získejte přihlašovací údaje ke clusteru az aks get-credentials .

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

Azure managed Prometheus a Grafana

Pomocí následujícího příkladu nainstalujte a povolte Prometheus a Grafana pro cluster AKS.

Vytvoření prostředku Azure Monitoru

#Set an environment variable for the Grafana name. Make sure to replace the placeholder with your own value.
export AZURE_MONITOR_NAME="<azure-monitor-name>"

# Create Azure monitor resource
az resource create \
    --resource-group $RESOURCE_GROUP \
    --namespace microsoft.monitor \
    --resource-type accounts \
    --name $AZURE_MONITOR_NAME \
    --location eastus \
    --properties '{}'

Vytvoření instance Grafana

K vytvoření instance Grafany použijte příkaz az grafana create . Název instance Grafana musí být jedinečný.

# Set an environment variable for the Grafana name. Make sure to replace the placeholder with your own value.
export GRAFANA_NAME="<grafana-name>"

# Create Grafana instance
az grafana create \
    --name $GRAFANA_NAME \
    --resource-group $RESOURCE_GROUP 

Umístěte ID prostředků Grafana a Azure Monitoru do proměnných.

Pomocí příkazu az grafana show umístěte ID prostředku Grafana do proměnné. Pomocí příkazu az resource show umístěte ID prostředku služby Azure Monitor do proměnné. Nahraďte myGrafana názvem vaší instance Grafana.

grafanaId=$(az grafana show \
                --name $GRAFANA_NAME \
                --resource-group $RESOURCE_GROUP \
                --query id \
                --output tsv)
azuremonitorId=$(az resource show \
                    --resource-group $RESOURCE_GROUP \
                    --name $AZURE_MONITOR_NAME \
                    --resource-type "Microsoft.Monitor/accounts" \
                    --query id \
                    --output tsv)

Pomocí příkazu az aks update propojte prostředky Azure Monitoru a Grafany s clusterem AKS.

az aks update \
    --name $CLUSTER_NAME \
    --resource-group $RESOURCE_GROUP \
    --enable-azure-monitor-metrics \
    --azure-monitor-workspace-resource-id $azuremonitorId \
    --grafana-resource-id $grafanaId

Vizualizace s využitím Grafany

Poznámka:

Metrika hubble_flows_processed_total se ve výchozím nastavení nešrotuje kvůli vysoké kardinalitě metrik ve velkých clusterech. Z tohoto důvodu mají řídicí panely Toky podů panely s chybějícími daty. Pokud to chcete změnit, můžete upravit nastavení metrik ama tak, aby zahrnovala hubble_flows_processed_total seznam udržování metrik. Informace o tom, jak to udělat, najdete v tématu Minimální příjem dat.

  1. Pomocí příkazu se ujistěte, že pody služby Azure Monitor běží kubectl get pods .

    kubectl get pods -o wide -n kube-system | grep ama-
    

    Výstup by měl vypadat podobně jako v následujícím příkladu výstupu:

    ama-metrics-5bc6c6d948-zkgc9          2/2     Running   0 (21h ago)   26h
    ama-metrics-ksm-556d86b5dc-2ndkv      1/1     Running   0 (26h ago)   26h
    ama-metrics-node-lbwcj                2/2     Running   0 (21h ago)   26h
    ama-metrics-node-rzkzn                2/2     Running   0 (21h ago)   26h
    ama-metrics-win-node-gqnkw            2/2     Running   0 (26h ago)   26h
    ama-metrics-win-node-tkrm8            2/2     Running   0 (26h ago)   26h
    
  2. Vytvořili jsme ukázkové řídicí panely. Najdete je ve složce Prometheus spravované pomocí řídicích panelů > Azure. Mají názvy jako Kubernetes / Sítě / <name>. Sada řídicích panelů zahrnuje:

    • Clustery: Zobrazuje metriky na úrovni uzlu pro vaše clustery.
    • DNS (cluster): Zobrazuje metriky DNS v clusteru nebo výběru uzlů.
    • DNS (Úloha): Zobrazuje metriky DNS pro zadanou úlohu (např. pody daemonSet nebo nasazení, jako je CoreDNS).
    • Poklesy (úloha): ukazuje poklesy zadané úlohy (např. pody nasazení nebo daemonSet).
    • Toky podů (Namespace): zobrazuje toky paketů L4/L7 do/ze zadaného oboru názvů (tj. pody v Namespace).
    • Toky podů (úloha): Zobrazuje toky paketů L4/L7 do/z zadané úlohy (např. pody nasazení nebo démona).

Poznámka:

  • Rovina dat Cilium v současné době nepodporuje metriky a řídicí panely DNS.

Instalace Rozhraní příkazového řádku Hubble

Nainstalujte Rozhraní příkazového řádku Hubble pro přístup k datům, která shromažďuje, pomocí následujících příkazů:

# Set environment variables
export HUBBLE_VERSION=v0.11.0
export HUBBLE_ARCH=amd64

#Install Hubble CLI
if [ "$(uname -m)" = "aarch64" ]; then HUBBLE_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/hubble/releases/download/$HUBBLE_VERSION/hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum}
sha256sum --check hubble-linux-${HUBBLE_ARCH}.tar.gz.sha256sum
sudo tar xzvfC hubble-linux-${HUBBLE_ARCH}.tar.gz /usr/local/bin
rm hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum}

Vizualizace toků Hubble

  1. Pomocí příkazu se ujistěte, že jsou pody Hubble spuštěné kubectl get pods .

    kubectl get pods -o wide -n kube-system -l k8s-app=hubble-relay
    

    Výstup by měl vypadat podobně jako v následujícím příkladu výstupu:

    hubble-relay-7ddd887cdb-h6khj     1/1  Running     0       23h 
    
  2. Port forward Hubble Relay pomocí kubectl port-forward příkazu.

    kubectl port-forward -n kube-system svc/hubble-relay --address 127.0.0.1 4245:443
    
  3. Vzájemné tls (mTLS) zajišťuje zabezpečení serveru Hubble Relay. Pokud chcete klientovi Hubble povolit načítání toků, musíte získat příslušné certifikáty a nakonfigurovat s nimi klienta. Certifikáty použijte pomocí následujících příkazů:

    #!/usr/bin/env bash
    
    set -euo pipefail
    set -x
    
    # Directory where certificates will be stored
    CERT_DIR="$(pwd)/.certs"
    mkdir -p "$CERT_DIR"
    
    declare -A CERT_FILES=(
      ["tls.crt"]="tls-client-cert-file"
      ["tls.key"]="tls-client-key-file"
      ["ca.crt"]="tls-ca-cert-files"
    )
    
    for FILE in "${!CERT_FILES[@]}"; do
      KEY="${CERT_FILES[$FILE]}"
      JSONPATH="{.data['${FILE//./\\.}']}"
    
      # Retrieve the secret and decode it
      kubectl get secret hubble-relay-client-certs -n kube-system \
        -o jsonpath="${JSONPATH}" | \
        base64 -d > "$CERT_DIR/$FILE"
    
      # Set the appropriate hubble CLI config
      hubble config set "$KEY" "$CERT_DIR/$FILE"
    done
    
    hubble config set tls true
    hubble config set tls-server-name instance.hubble-relay.cilium.io
    
  4. Pomocí následujícího kubectl get secrets příkazu ověřte, že se tajné kódy vygenerovaly:

    kubectl get secrets -n kube-system | grep hubble-
    

    Výstup by měl vypadat podobně jako v následujícím příkladu výstupu:

    kube-system     hubble-relay-client-certs     kubernetes.io/tls     3     9d
    
    kube-system     hubble-relay-server-certs     kubernetes.io/tls     3     9d
    
    kube-system     hubble-server-certs           kubernetes.io/tls     3     9d    
    
  5. Pomocí příkazu se ujistěte, že pod Hubble Relay běží hubble observe .

    hubble observe --pod hubble-relay-7ddd887cdb-h6khj
    

Vizualizace pomocí uživatelského rozhraní Hubble

  1. Pokud chcete použít uživatelské rozhraní Hubble, uložte následující položky do hubble-ui.yaml.

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: hubble-ui
      namespace: kube-system
    ---
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: hubble-ui
      labels:
        app.kubernetes.io/part-of: retina
    rules:
      - apiGroups:
          - networking.k8s.io
        resources:
          - networkpolicies
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - ""
        resources:
          - componentstatuses
          - endpoints
          - namespaces
          - nodes
          - pods
          - services
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - apiextensions.k8s.io
        resources:
          - customresourcedefinitions
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - cilium.io
        resources:
          - "*"
        verbs:
          - get
          - list
          - watch
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: hubble-ui
      labels:
        app.kubernetes.io/part-of: retina
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: hubble-ui
    subjects:
      - kind: ServiceAccount
        name: hubble-ui
        namespace: kube-system
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: hubble-ui-nginx
      namespace: kube-system
    data:
      nginx.conf: |
        server {
            listen       8081;
            server_name  localhost;
            root /app;
            index index.html;
            client_max_body_size 1G;
            location / {
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                # CORS
                add_header Access-Control-Allow-Methods "GET, POST, PUT, HEAD, DELETE, OPTIONS";
                add_header Access-Control-Allow-Origin *;
                add_header Access-Control-Max-Age 1728000;
                add_header Access-Control-Expose-Headers content-length,grpc-status,grpc-message;
                add_header Access-Control-Allow-Headers range,keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout;
                if ($request_method = OPTIONS) {
                    return 204;
                }
                # /CORS
                location /api {
                    proxy_http_version 1.1;
                    proxy_pass_request_headers on;
                    proxy_hide_header Access-Control-Allow-Origin;
                    proxy_pass http://127.0.0.1:8090;
                }
                location / {
                    try_files $uri $uri/ /index.html /index.html;
                }
                # Liveness probe
                location /healthz {
                    access_log off;
                    add_header Content-Type text/plain;
                    return 200 'ok';
                }
            }
        }
    ---
    kind: Deployment
    apiVersion: apps/v1
    metadata:
      name: hubble-ui
      namespace: kube-system
      labels:
        k8s-app: hubble-ui
        app.kubernetes.io/name: hubble-ui
        app.kubernetes.io/part-of: retina
    spec:
      replicas: 1
      selector:
        matchLabels:
          k8s-app: hubble-ui
      template:
        metadata:
          labels:
            k8s-app: hubble-ui
            app.kubernetes.io/name: hubble-ui
            app.kubernetes.io/part-of: retina
        spec:
          serviceAccount: hibble-ui
          serviceAccountName: hubble-ui
          automountServiceAccountToken: true
          containers:
          - name: frontend
            image: mcr.microsoft.com/oss/cilium/hubble-ui:v0.12.2   
            imagePullPolicy: Always
            ports:
            - name: http
              containerPort: 8081
            livenessProbe:
              httpGet:
                path: /healthz
                port: 8081
            readinessProbe:
              httpGet:
                path: /
                port: 8081
            resources: {}
            volumeMounts:
            - name: hubble-ui-nginx-conf
              mountPath: /etc/nginx/conf.d/default.conf
              subPath: nginx.conf
            - name: tmp-dir
              mountPath: /tmp
            terminationMessagePolicy: FallbackToLogsOnError
            securityContext: {}
          - name: backend
            image: mcr.microsoft.com/oss/cilium/hubble-ui-backend:v0.12.2
            imagePullPolicy: Always
            env:
            - name: EVENTS_SERVER_PORT
              value: "8090"
            - name: FLOWS_API_ADDR
              value: "hubble-relay:443"
            - name: TLS_TO_RELAY_ENABLED
              value: "true"
            - name: TLS_RELAY_SERVER_NAME
              value: ui.hubble-relay.cilium.io
            - name: TLS_RELAY_CA_CERT_FILES
              value: /var/lib/hubble-ui/certs/hubble-relay-ca.crt
            - name: TLS_RELAY_CLIENT_CERT_FILE
              value: /var/lib/hubble-ui/certs/client.crt
            - name: TLS_RELAY_CLIENT_KEY_FILE
              value: /var/lib/hubble-ui/certs/client.key
            livenessProbe:
              httpGet:
                path: /healthz
                port: 8090
            readinessProbe:
              httpGet:
                path: /healthz
                port: 8090
            ports:
            - name: grpc
              containerPort: 8090
            resources: {}
            volumeMounts:
            - name: hubble-ui-client-certs
              mountPath: /var/lib/hubble-ui/certs
              readOnly: true
            terminationMessagePolicy: FallbackToLogsOnError
            securityContext: {}
          nodeSelector:
            kubernetes.io/os: linux 
          volumes:
          - configMap:
              defaultMode: 420
              name: hubble-ui-nginx
            name: hubble-ui-nginx-conf
          - emptyDir: {}
            name: tmp-dir
          - name: hubble-ui-client-certs
            projected:
              defaultMode: 0400
              sources:
              - secret:
                  name: hubble-relay-client-certs
                  items:
                    - key: tls.crt
                      path: client.crt
                    - key: tls.key
                      path: client.key
                    - key: ca.crt
                      path: hubble-relay-ca.crt
    ---
    kind: Service
    apiVersion: v1
    metadata:
      name: hubble-ui
      namespace: kube-system
      labels:
        k8s-app: hubble-ui
        app.kubernetes.io/name: hubble-ui
        app.kubernetes.io/part-of: retina
    spec:
      type: ClusterIP
      selector:
        k8s-app: hubble-ui
      ports:
        - name: http
          port: 80
          targetPort: 8081
    
  2. Použití manifestu hubble-ui.yaml v clusteru pomocí následujícího příkazu

    kubectl apply -f hubble-ui.yaml
    
  3. Nastavte přesměrování portů pro uživatelské rozhraní Hubble pomocí kubectl port-forward příkazu.

    kubectl -n kube-system port-forward svc/hubble-ui 12000:80
    
  4. Přejděte do uživatelského rozhraní Hubble zadáním http://localhost:12000/ do webového prohlížeče.


Vyčištění prostředků

Pokud nemáte v plánu používat tuto aplikaci, pomocí příkazu odstraňte další prostředky, které jste vytvořili v tomto článku az group delete .

  az group delete --name $RESOURCE_GROUP

Další kroky

V tomto článku s postupy jste se naučili, jak nainstalovat a povolit advanced network observability pro cluster AKS.