Delen via


Geavanceerde netwerkobserveerbaarheid instellen voor Azure Kubernetes Service (AKS) (preview)

In dit artikel leest u hoe u Advanced Network Observability for Azure Kubernetes Service (AKS) instelt en bring your own (BYO) Prometheus en Grafana gebruikt om de metrische gegevens te visualiseren.

U kunt Advanced Network Observability gebruiken om gegevens over de netwerkverkeersgegevens in uw AKS-clusters te verzamelen. 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. Advanced Network Observability biedt ook de mogelijkheid om Hubble in te schakelen. Deze mogelijkheden worden ondersteund voor zowel Cilium- als niet-Cilium-clusters.

Advanced 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)?

Belangrijk

Geavanceerde netwerkobserveerbaarheid is momenteel beschikbaar als PREVIEW-versie. Raadpleeg de Aanvullende voorwaarden voor Microsoft Azure-previews voor juridische voorwaarden die van toepassing zijn op Azure-functies die in bèta of preview zijn of die anders nog niet algemeen beschikbaar zijn.

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.

aks-preview De Azure CLI-extensie 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

AdvancedNetworkingPreview De functievlag registreren

Registreer de AdvancedNetworkingPreview functievlag met behulp van de az feature register opdracht.

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

Controleer of de registratie is geslaagd met behulp van de az feature show opdracht. Het duurt enkele minuten voordat de registratie is voltooid.

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

Nadat de functie is weergegeven Registered, vernieuwt u de registratie van de Microsoft.ContainerService resourceprovider met behulp van de az provider register opdracht.

Een brongroep maken

Een resourcegroep is een logische container waarin Azure-resources worden geïmplementeerd en beheerd. Maak een resourcegroep met behulp van de az group create opdracht.

# 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

Een AKS-cluster maken met Geavanceerde netwerkobserveerbaarheid

Maak een AKS-cluster met Advanced Network Observability met een niet-Cilium-gegevensvlak met behulp van de az aks create opdracht en de --enable-advanced-networking-observability vlag.

# 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

Geavanceerde netwerkobserveerbaarheid inschakelen op een bestaand cluster

Schakel Advanced Network Observability in op een bestaand cluster met behulp van de az aks update opdracht.

Notitie

Clusters met het Cilium-gegevensvlak ondersteunen Geavanceerde waarneembaarheid vanaf Kubernetes versie 1.29.

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

Clusterreferenties ophalen

Haal uw clusterreferenties op met behulp van de az aks get-credentials opdracht.

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

Visualisatie met Grafana

  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.
  4. Installeer Hubble CLI voor toegang tot de gegevens die worden verzameld met behulp van de volgende opdrachten:

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

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. Stel port forwarding in voor 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 relay service opdracht.

    hubble relay service 
    

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:
          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. Pas het hubble-ui.yaml-manifest toe op uw cluster met behulp van de volgende opdracht

    kubectl apply -f hubble-ui.yaml
    
  3. Stel de service beschikbaar door port forwarding in te stellen met behulp van de kubectl port-forward opdracht.

    kubectl 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 Advanced Network Observability voor uw AKS-cluster installeert en inschakelt.