Bagikan melalui


Menyiapkan Container Network Observability untuk Azure Kubernetes Service (AKS) - Prometheus dan Grafana terkelola Azure

Artikel ini menunjukkan kepada Anda cara menyiapkan Container Network Observability untuk Azure Kubernetes Service (AKS) menggunakan Prometheus Terkelola dan Grafana dan BYO Prometheus dan Grafana dan untuk memvisualisasikan metrik tergores

Anda dapat menggunakan Container Network Observability untuk mengumpulkan data tentang lalu lintas jaringan kluster AKS Anda. Ini memungkinkan platform terpusat untuk memantau aplikasi dan kesehatan jaringan. Saat ini, metrik disimpan di Prometheus dan Grafana dapat digunakan untuk memvisualisasikannya. Container Network Observability juga menawarkan kemampuan untuk mengaktifkan Hubble. Kemampuan ini didukung untuk kluster Cilium dan non-Cilium.

Container Network Observability adalah salah satu fitur Layanan Jaringan Kontainer Tingkat Lanjut. Untuk informasi selengkapnya tentang Layanan Jaringan Kontainer Tingkat Lanjut untuk Azure Kubernetes Service (AKS), lihat Apa itu Layanan Jaringan Kontainer Tingkat Lanjut untuk Azure Kubernetes Service (AKS)?.

Prasyarat

  • Akun Azure dengan langganan aktif. Jika Anda tidak memilikinya, buat akun gratis sebelum memulai.
  • Versi minimum Azure CLI yang diperlukan untuk langkah-langkah dalam artikel ini adalah 2.56.0. Jalankan az --version untuk menemukan versinya. Jika Anda perlu memasang atau meningkatkan, lihat Memasang Azure CLI.

Menginstal ekstensi Azure CLI pratinjau aks

Instal atau perbarui ekstensi pratinjau Azure CLI menggunakan az extension add perintah atau 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

Aktifkan Layanan Jaringan Kontainer Tingkat Lanjut

Untuk melanjutkan, Anda harus mengaktifkan kluster AKS dengan Advanced Container Networking Services .

az aks create Perintah dengan bendera Layanan Jaringan Kontainer Tingkat Lanjut, --enable-acns, membuat kluster AKS baru dengan semua fitur Layanan Jaringan Kontainer Tingkat Lanjut. Fitur-fitur ini mencakup:

  • Observabilitas Jaringan Kontainer: Memberikan wawasan tentang lalu lintas jaringan Anda. Untuk mempelajari lebih lanjut, kunjungi Observabilitas Jaringan Kontainer.

  • Keamanan Jaringan Kontainer: Menawarkan fitur keamanan seperti pemfilteran FQDN. Untuk mempelajari lebih lanjut, kunjungi Keamanan Jaringan Kontainer.

Catatan

Kluster dengan sarana data Cilium mendukung Container Network Observability dan keamanan Container Network yang dimulai dengan Kubernetes versi 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

Mengaktifkan Layanan Jaringan Kontainer Tingkat Lanjut pada kluster yang ada

az aks update Perintah dengan bendera Layanan Jaringan Kontainer Tingkat Lanjut, --enable-acns, memperbarui kluster AKS yang ada dengan semua fitur Layanan Jaringan Kontainer Tingkat Lanjut yang mencakup Pengamatan Jaringan Kontainer dan fitur Keamanan Jaringan Kontainer.

Catatan

Hanya kluster dengan sarana data Cilium yang mendukung fitur Keamanan Jaringan Kontainer dari Layanan Jaringan Kontainer Tingkat Lanjut.

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

Mendapatkan kredensial kluster

Setelah Anda memiliki Dapatkan kredensial kluster Anda menggunakan az aks get-credentials perintah .

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

Prometheus dan Grafana terkelola Azure

Lewati Bagian ini jika menggunakan BYO Prometheus dan Grafana

Gunakan contoh berikut untuk menginstal dan mengaktifkan Prometheus dan Grafana untuk kluster AKS Anda.

Buat sumber daya Azure Monitor

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

Membuat instans Azure Managed Grafana

Gunakan az grafana create untuk membuat instans Grafana. Nama instans Grafana harus unik.

# 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 

Tempatkan ID sumber daya Azure Managed Grafana dan Azure Monitor dalam variabel

Gunakan az grafana show untuk menempatkan ID sumber daya Grafana dalam variabel. Gunakan az resource show untuk menempatkan ID sumber daya Azure Monitor dalam variabel. Ganti myGrafana dengan nama instans Grafana Anda.

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)

Gunakan pembaruan az aks untuk menautkan sumber daya Azure Monitor dan Grafana ke kluster AKS Anda.

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

Visualisasi

Visualisasi menggunakan Azure Managed Grafana

Lewati langkah ini jika menggunakan BYO Grafana

Catatan

hubble_flows_processed_total Metrik tidak diekstraksi secara default karena kardinalitas metrik tinggi dalam kluster skala besar. Karena itu, dasbor Alur Pod memiliki panel dengan data yang hilang. Untuk mengubah ini, Anda dapat mengubah pengaturan metrik ama untuk disertakan hubble_flows_processed_total dalam daftar penyimpanan metrik. Untuk mempelajari cara melakukannya, lihat Doumentasi Penyerapan Minimal.

  1. Pastikan pod Azure Monitor berjalan menggunakan kubectl get pods perintah .

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

    Output Anda akan terlihat mirip dengan contoh output berikut:

    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. Kami telah membuat dasbor sampel. Mereka dapat ditemukan di bawah folder Dasbor > Azure Managed Prometheus . Mereka memiliki nama seperti "Kubernetes / Networking / <name>". Rangkaian dasbor meliputi:

    • Kluster: menunjukkan metrik tingkat node untuk kluster Anda.
    • DNS (Kluster): memperlihatkan metrik DNS pada kluster atau pilihan Simpul.
    • DNS (Beban Kerja): menunjukkan metrik DNS untuk beban kerja yang ditentukan (misalnya Pod DaemonSet atau Penyebaran seperti CoreDNS).
    • Drop (Beban Kerja): menunjukkan penurunan ke/dari beban kerja yang ditentukan (misalnya Pod dari Deployment atau DaemonSet).
    • Aliran Pod (Namespace): menunjukkan alur paket L4/L7 ke/dari namespace yang ditentukan (yaitu Pod di Namespace).
    • Alur Pod (Beban Kerja): menunjukkan alur paket L4/L7 ke/dari beban kerja yang ditentukan (misalnya Pod dari Deployment atau DaemonSet).

Visualisasi menggunakan BYO Grafana

Lewati langkah ini jika menggunakan Grafana terkelola Azure

  1. Tambahkan pekerjaan scrape berikut ke konfigurasi Prometheus yang ada dan mulai ulang server Prometheus Anda:

    - 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. Dalam Target Prometheus, verifikasi bahwa ada network-obs-pods .

  3. Masuk ke Grafana dan impor contoh dasbor berikut menggunakan ID berikut:

    • Kluster: menunjukkan metrik tingkat node untuk kluster Anda. (ID: 18814)
    • DNS (Kluster): memperlihatkan metrik DNS pada kluster atau pemilihan Node.( ID: 20925)
    • DNS (Beban Kerja): menunjukkan metrik DNS untuk beban kerja yang ditentukan (misalnya Pod DaemonSet atau Penyebaran seperti CoreDNS). (ID: [20926] https://grafana.com/grafana/dashboards/20926-kubernetes-networking-dns-workload/)
    • Drop (Beban Kerja): menunjukkan penurunan ke/dari beban kerja yang ditentukan (misalnya Pod dari Deployment atau DaemonSet).( ID: 20927).
    • Aliran Pod (Namespace): menunjukkan alur paket L4/L7 ke/dari namespace yang ditentukan (yaitu Pod di Namespace). (ID: 20928)
    • Alur Pod (Beban Kerja): menunjukkan alur paket L4/L7 ke/dari beban kerja yang ditentukan (misalnya Pod dari Deployment atau DaemonSet).( ID: 20929)

    Catatan

    • Bergantung pada pengaturan instans Prometheus/Grafana Anda, beberapa panel dasbor mungkin memerlukan penyesatan untuk menampilkan semua data.
    • Cilium saat ini tidak mendukung metrik/dasbor DNS.

Menginstal Hubble CLI

Instal Hubble CLI untuk mengakses data yang dikumpulkannya menggunakan perintah berikut:

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

Memvisualisasikan Alur Hubble

  1. Pastikan pod Hubble berjalan menggunakan kubectl get pods perintah .

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

    Output Anda akan terlihat mirip dengan contoh output berikut:

    hubble-relay-7ddd887cdb-h6khj     1/1  Running     0       23h 
    
  2. Port forward Hubble Relay menggunakan kubectl port-forward perintah .

    kubectl port-forward -n kube-system svc/hubble-relay --address 127.0.0.1 4245:443
    
  3. Mutual TLS (mTLS) memastikan keamanan server Hubble Relay. Untuk mengaktifkan klien Hubble untuk mengambil alur, Anda perlu mendapatkan sertifikat yang sesuai dan mengonfigurasi klien dengannya. Terapkan sertifikat menggunakan perintah berikut:

    #!/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. Verifikasi bahwa rahasia dihasilkan menggunakan perintah berikut kubectl get secrets :

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

    Output Anda akan terlihat mirip dengan contoh output berikut:

    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. Pastikan pod Hubble Relay berjalan menggunakan hubble observe perintah .

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

Memvisualisasikan menggunakan Hubble UI

  1. Untuk menggunakan Hubble UI, simpan yang berikut ini ke 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. Terapkan manifes hubble-ui.yaml ke kluster Anda, menggunakan perintah berikut

    kubectl apply -f hubble-ui.yaml
    
  3. Siapkan penerusan port untuk UI Hubble menggunakan kubectl port-forward perintah .

    kubectl -n kube-system port-forward svc/hubble-ui 12000:80
    
  4. Akses Hubble UI dengan memasukkan http://localhost:12000/ ke browser web Anda.


Membersihkan sumber daya

Jika Anda tidak berencana menggunakan aplikasi ini, hapus sumber daya lain yang Anda buat dalam artikel ini menggunakan az group delete perintah .

  az group delete --name $RESOURCE_GROUP

Langkah berikutnya

Dalam artikel panduan ini, Anda mempelajari cara menginstal dan mengaktifkan Container Network Observability untuk kluster AKS Anda.