Delen via


Waarneembaarheid van containernetwerk instellen voor Azure Kubernetes Service (AKS) - Door Azure beheerde Prometheus en Grafana

In dit artikel leest u hoe u Container Network Observability instelt voor Azure Kubernetes Service (AKS) met managed Prometheus en Grafana en BYO Prometheus en Grafana en om de geroote metrische gegevens te visualiseren

U kunt Container Network Observability gebruiken om gegevens te verzamelen over het netwerkverkeer van uw AKS-clusters. Het maakt een gecentraliseerd platform mogelijk voor het bewaken van de toepassing en netwerkstatus. Op dit moment worden metrische gegevens opgeslagen in Prometheus en Grafana om ze te visualiseren. Container Network Observability biedt ook de mogelijkheid om Hubble in te schakelen. Deze mogelijkheden worden ondersteund voor zowel Cilium- als niet-Cilium-clusters.

Container Network Observability is een van de functies van Advanced Container Networking Services. Zie Wat is Advanced Container Networking Services (AKS) voor Azure Kubernetes Service (AKS) voor meer informatie over Advanced Container Networking Services (AKS)?

Vereisten

  • De minimale versie van Azure CLI die is vereist voor de stappen in dit artikel is 2.56.0. Voer az --version uit om de versie te bekijken. Als u Azure CLI 2.0 wilt installeren of upgraden, raadpleegt u Azure CLI 2.0 installeren.

De Azure CLI-extensie aks-preview installeren

Installeer of werk de Preview-extensie van Azure CLI bij met behulp van de az extension add of az extension update opdracht.

# 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

Geavanceerde containernetwerkservices inschakelen

Als u wilt doorgaan, moet u een AKS-cluster hebben waarvoor Advanced Container Networking Services is ingeschakeld.

Met az aks create de opdracht met de vlag Advanced Container Networking Services maakt --enable-acnsu een nieuw AKS-cluster met alle functies van Advanced Container Networking Services. Deze functies omvatten:

Notitie

Clusters met het Cilium-gegevensvlak ondersteunen Container Network Observability en Container Network Security vanaf Kubernetes versie 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

Advanced Container Networking Services inschakelen op een bestaand cluster

Met az aks update de opdracht met de vlag Advanced Container Networking Services wordt --enable-acnseen bestaand AKS-cluster bijgewerkt met alle functies van Advanced Container Networking Services, waaronder Waarneembaarheid van containernetwerk en de functie Container Network Security .

Notitie

Alleen clusters met het Cilium-gegevensvlak ondersteunen containernetwerkbeveiligingsfuncties van Advanced Container Networking Services.

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

Clusterreferenties ophalen

Zodra u de clusterreferenties hebt opgehaald met behulp van de az aks get-credentials opdracht.

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

Door Azure beheerde Prometheus en Grafana

Sla deze sectie over als u BYO Prometheus en Grafana gebruikt

Gebruik het volgende voorbeeld om Prometheus en Grafana te installeren en in te schakelen voor uw AKS-cluster.

Azure Monitor-resource maken

#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 '{}'

Azure Managed Grafana-exemplaar maken

Gebruik az grafana create om een Grafana-exemplaar te maken. De naam van het Grafana-exemplaar moet uniek zijn.

# 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 

De resource-id's van Azure Managed Grafana en Azure Monitor in variabelen plaatsen

Gebruik az grafana show om de Grafana-resource-id in een variabele te plaatsen. Gebruik az resource show om de Azure Monitor-resource-id in een variabele te plaatsen. Vervang myGrafana door de naam van uw Grafana-exemplaar.

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)

Gebruik az aks update om de Azure Monitor- en Grafana-resources te koppelen aan uw AKS-cluster.

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

Visualisatie

Visualisatie met Azure Managed Grafana

Sla deze stap over als u BYO Grafana gebruikt

Notitie

De hubble_flows_processed_total metrische waarde wordt niet standaard afgeschraapt vanwege een hoge metrische kardinaliteit in grootschalige clusters. Hierdoor bevatten de Pods Flows-dashboards deelvensters met ontbrekende gegevens. Als u dit wilt wijzigen, kunt u de instellingen voor metrische gegevens van ama wijzigen zodat deze worden opgenomen hubble_flows_processed_total in de lijst met metrische gegevens. Als u wilt weten hoe u dit doet, raadpleegt u de minimale opname-verdubbeling.

  1. Zorg ervoor dat de Azure Monitor-pods worden uitgevoerd met behulp van de kubectl get pods opdracht.

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

    De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer:

    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. We hebben voorbeelddashboards gemaakt. Ze zijn te vinden in de map Dashboards > Azure Managed Prometheus . Ze hebben namen zoals 'Kubernetes / Netwerken / <name>'. De suite met dashboards omvat:

    • Clusters: toont metrische gegevens op knooppuntniveau voor uw clusters.
    • DNS (Cluster): toont metrische DNS-gegevens in een cluster of selectie van knooppunten.
    • DNS (workload): toont metrische DNS-gegevens voor de opgegeven workload (bijvoorbeeld pods van een DaemonSet of implementatie, zoals CoreDNS).
    • Druppels (workload): toont dalingen naar/van de opgegeven werkbelasting (bijvoorbeeld pods van een implementatie of DaemonSet).
    • Pod-stromen (naamruimte): toont L4/L7-pakketstromen naar/van de opgegeven naamruimte (dat wil bijvoorbeeld Pods in de naamruimte).
    • Pod-stromen (workload): toont L4/L7-pakketstromen naar/van de opgegeven workload (bijvoorbeeld Pods van een implementatie of DaemonSet).

Visualisatie met BYO Grafana

Sla deze stap over als u azure managed Grafana gebruikt

  1. Voeg de volgende scrape-taak toe aan uw bestaande Prometheus-configuratie en start de Prometheus-server opnieuw op:

    - 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. Controleer in Doelen van Prometheus of de netwerk-obs-pods aanwezig zijn.

  3. Meld u aan bij Grafana en importeer de volgende voorbeelddashboards met behulp van de volgende id's:

    • Clusters: toont metrische gegevens op knooppuntniveau voor uw clusters. (Id: 18814)
    • DNS (Cluster): toont metrische DNS-gegevens op een cluster of selectie van knooppunten.( Id: 20925)
    • DNS (workload): toont metrische DNS-gegevens voor de opgegeven workload (bijvoorbeeld pods van een DaemonSet of implementatie, zoals CoreDNS). (Id: [20926] https://grafana.com/grafana/dashboards/20926-kubernetes-networking-dns-workload/)
    • Druppels (workload): toont dalingen naar/van de opgegeven werkbelasting (bijvoorbeeld pods van een implementatie of DaemonSet).( Id: 20927).
    • Pod-stromen (naamruimte): toont L4/L7-pakketstromen naar/van de opgegeven naamruimte (dat wil bijvoorbeeld Pods in de naamruimte). (Id: 20928)
    • Pod-stromen (workload): toont L4/L7-pakketstromen naar/van de opgegeven workload (bijvoorbeeld Pods van een implementatie of DaemonSet).( Id: 20929)

    Notitie

    • Afhankelijk van de instellingen van uw Prometheus-/Grafana-exemplaren zijn voor sommige dashboardpanelen mogelijk aanpassingen vereist om alle gegevens weer te geven.
    • Cilium biedt momenteel geen ondersteuning voor DNS-metrische gegevens/dashboards.

Hubble CLI installeren

Installeer de Hubble CLI voor toegang tot de gegevens die worden verzameld met behulp van de volgende opdrachten:

# 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}

De Hubble-stromen visualiseren

  1. Zorg ervoor dat de Hubble-pods worden uitgevoerd met behulp van de kubectl get pods opdracht.

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

    De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer:

    hubble-relay-7ddd887cdb-h6khj     1/1  Running     0       23h 
    
  2. Port forward Hubble Relay met behulp van de kubectl port-forward opdracht.

    kubectl port-forward -n kube-system svc/hubble-relay --address 127.0.0.1 4245:443
    
  3. Wederzijdse TLS (mTLS) zorgt voor de beveiliging van de Hubble Relay-server. Als u wilt dat de Hubble-client stromen kan ophalen, moet u de juiste certificaten ophalen en de client ermee configureren. Pas de certificaten toe met behulp van de volgende opdrachten:

    #!/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. Controleer of de geheimen zijn gegenereerd met behulp van de volgende kubectl get secrets opdracht:

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

    De uitvoer moet er ongeveer uitzien als in de volgende voorbeelduitvoer:

    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. Zorg ervoor dat de Hubble Relay-pod wordt uitgevoerd met behulp van de hubble observe opdracht.

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

Visualiseren met behulp van Hubble UI

  1. Als u de Hubble-gebruikersinterface wilt gebruiken, slaat u het volgende op in 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. Pas het hubble-ui.yaml-manifest toe op uw cluster met behulp van de volgende opdracht

    kubectl apply -f hubble-ui.yaml
    
  3. Stel port forwarding in voor de Hubble-gebruikersinterface met behulp van de kubectl port-forward opdracht.

    kubectl -n kube-system port-forward svc/hubble-ui 12000:80
    
  4. Access Hubble UI door in uw webbrowser in te voeren http://localhost:12000/ .


Resources opschonen

Als u van plan bent om deze toepassing te gebruiken, verwijdert u de andere resources die u in dit artikel hebt gemaakt met behulp van de az group delete opdracht.

  az group delete --name $RESOURCE_GROUP

Volgende stappen

In dit artikel hebt u geleerd hoe u Container Network Observability voor uw AKS-cluster installeert en inschakelt.