Sdílet prostřednictvím


Nastavení pozorovatelnosti služby Container Network pro Azure Kubernetes Service (AKS) – Azure managed Prometheus a Grafana

V tomto článku se dozvíte, jak nastavit pozorovatelnost služby Container Network pro Azure Kubernetes Service (AKS) pomocí spravovaných prometheus a Grafana a BYO Prometheus a Grafana a vizualizovat sešrotované metriky.

Pozorovatelnost kontejnerové sítě můžete použít ke shromažďování dat 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. Pozorovatelnost služby Container Network také nabízí možnost povolit Hubble. Tyto funkce jsou podporovány jak pro shluky Cilium, tak i pro clustery bez Cilium.

Pozorovatelnost služby Container Network je jednou z funkcí služby 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)?.

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.

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

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

Povolení pokročilých síťových služeb kontejnerů

Abyste mohli pokračovat, musíte mít cluster AKS s povolenou službou Advanced Container Networking Services .

Příkaz az aks create s příznakem --enable-acnsAdvanced Container Networking Services vytvoří nový cluster AKS se všemi funkcemi Advanced Container Networking Services. Mezi tyto funkce patří:

  • Pozorovatelnost služby Container Network: Poskytuje přehled o síťovém provozu. Další informace najdete v tématu Pozorovatelnost služby Container Network.

  • Zabezpečení sítě kontejnerů: Nabízí funkce zabezpečení, jako je filtrování plně kvalifikovaných názvů domén. Další informace najdete v tématu Container Network Security.

Poznámka:

Clustery s rovinou dat Cilium podporují zabezpečení Container Network Observability a Container Network počínaje Kubernetes verze 1.29.

# 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 \
    --location eastus \
    --max-pods 250 \
    --network-plugin azure \
    --network-plugin-mode overlay \
    --network-dataplane cilium \
    --node-count 2 \
    --pod-cidr 192.168.0.0/16 \
    --kubernetes-version 1.29 \
    --enable-acns

Povolení pokročilých služeb Container Networking Services v existujícím clusteru

Příkaz az aks update s příznakem --enable-acnsAdvanced Container Networking Services aktualizuje existující cluster AKS se všemi funkcemi Advanced Container Networking Services, které zahrnují pozorovatelnost služby Container Network a funkci Zabezpečení sítě kontejnerů.

Poznámka:

Pouze clustery s rovinou dat Cilium podporují funkce zabezpečení kontejnerové sítě služby Advanced Container Networking Services.

az aks update \
    --resource-group $RESOURCE_GROUP \
    --name $CLUSTER_NAME \
    --enable-acns

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

Jakmile pomocí příkazu získáte 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

Pokud používáte BYO Prometheus a Grafana, přeskočte tuto část.

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 Azure Managed 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ění ID prostředků Azure Managed 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

Vizualizace s využitím Azure Managed Grafana

Tento krok přeskočte, pokud používáte BYO Grafana

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ů (obor názvů): zobrazuje toky paketů L4/L7 do/z zadaného oboru názvů (tj. pody v oboru názvů).
    • Toky podů (úloha): Zobrazuje toky paketů L4/L7 do/z zadané úlohy (např. pody nasazení nebo démona).

Vizualizace pomocí FUNKCE BYO Grafana

Pokud používáte Grafana spravovanou v Azure, tento krok přeskočte.

  1. Do stávající konfigurace Prometheus přidejte následující úlohu výstřižku a restartujte server Prometheus:

    - job_name: networkobservability-hubble
      kubernetes_sd_configs:
        - role: pod
      relabel_configs:
        - target_label: cluster
          replacement: myAKSCluster
          action: replace
        - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_pod_label_k8s_app]
          regex: kube-system;(retina|cilium)
          action: keep
        - source_labels: [__address__]
          action: replace
          regex: ([^:]+)(?::\d+)?
          replacement: $1:9965
          target_label: __address__
        - source_labels: [__meta_kubernetes_pod_node_name]
          target_label: instance
          action: replace
      metric_relabel_configs:
        - source_labels: [__name__]
          regex: '|hubble_dns_queries_total|hubble_dns_responses_total|hubble_drop_total|hubble_tcp_flags_total' # if desired, add |hubble_flows_processed_total
          action: keep
    
  2. V cílech prometheus ověřte, že jsou k dispozici síťové pody .

  3. Přihlaste se k Grafana a naimportujte následující ukázkové řídicí panely pomocí následujících ID:

    • Clustery: Zobrazuje metriky na úrovni uzlu pro vaše clustery. (ID: 18814)
    • DNS (cluster): Zobrazuje metriky DNS v clusteru nebo výběru uzlů.( ID: 20925)
    • DNS (Úloha): Zobrazuje metriky DNS pro zadanou úlohu (např. pody daemonSet nebo nasazení, jako je CoreDNS). (ID: [20926] https://grafana.com/grafana/dashboards/20926-kubernetes-networking-dns-workload/)
    • Poklesy (úloha): Ukazuje poklesy zadané úlohy (např. pody nasazení nebo démona).( ID: 20927).
    • Toky podů (obor názvů): zobrazuje toky paketů L4/L7 do/z zadaného oboru názvů (tj. pody v oboru názvů). (ID: 20928)
    • Toky podů (úloha): Zobrazuje toky paketů L4/L7 do/z zadané úlohy (např. pody nasazení nebo démona).( ID: 20929)

    Poznámka:

    • V závislosti na nastavení instancí Prometheus/Grafana můžou některé panely řídicích panelů vyžadovat úpravy, aby se zobrazila všechna data.
    • 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=v1.16.3
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:
          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 zjistili, jak nainstalovat a povolit pozorovatelnost služby Container Network pro cluster AKS.