配置适用于 Azure Kubernetes 服务 (AKS) 的容器网络可观测性 - Azure 托管 Prometheus 和 Grafana

本文介绍如何为 Azure Kubernetes 服务 (AKS) 配置容器网络可观测性,方法包括使用托管的 Prometheus 和 Grafana,以及自带 (BYO) 的 Prometheus 和 Grafana,并可视化抓取到的指标

可以使用容器网络可观测性收集有关 AKS 群集的网络流量数据。 它提供了一个用于监控应用程序和网络健康状况的集中式平台。 目前,可使用 Prometheus 存储指标并使用 Grafana 可视化它们。 容器网络可观测性还提供启用 Hubble 的功能。 Cilium 和非 Cilium 群集都支持这些功能。

容器网络可观测性是高级容器网络服务的功能之一。 有关 Azure Kubernetes 服务的高级容器网络服务(AKS),请参阅 什么是适用于 Azure Kubernetes 服务的高级容器网络服务(AKS)?

Important

2025 年 11 月 30 日开始,Azure Kubernetes 服务(AKS)不再支持或提供 Azure Linux 2.0 安全更新。 Azure Linux 2.0 节点镜像冻结在 202512.06.0 版本。 从 2026 年 3 月 31 日开始,将删除节点映像,并且无法缩放节点池。 迁移到受支持的 Azure Linux 版本,方法是将节点池升级到受支持的 Kubernetes 版本或迁移到 osSku AzureLinux3。 有关详细信息,请参阅 GitHub 退役问题 Azure 更新退役公告。 若要随时了解公告和更新,请按照 AKS 发行说明进行操作。

先决条件

  • 具有活动订阅的 Azure 帐户。 如果没有订阅,请在开始之前创建一个试用帐户
  • 如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI

    • 如果使用本地安装,请使用 az login 命令登录到Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录

    • 出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用 Azure CLI 的扩展

    • 运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade

  • 本文中的步骤所需的 Azure CLI 最低版本为 2.56.0。 运行 az --version 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI

启用高级容器网络服务

若要继续,必须有一个启用了高级容器网络服务的 AKS 群集。

具有高级容器网络服务标志 az aks create--enable-acns 命令创建一个新的 AKS 群集,它具有所有高级容器网络服务功能。 这些功能包括:

  • 容器网络可观测性:提供对您的网络流量的洞察。 若要了解详细信息,请访问容器网络可观测性

  • 容器网络安全:提供 FQDN 筛选等安全功能。 若要了解详细信息,请访问容器网络安全

注意

从 Kubernetes 版本 1.29 开始,具有 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 \
    --location chinanorth3 \
    --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

在现有群集上启用高级容器网络服务

使用az aks update命令以及高级容器网络服务标志--enable-acns,可以将现有的 AKS 群集中所有高级容器网络服务功能更新,其中包括容器网络可观测性容器网络安全功能。

注意

只有具有 Cilium 数据平面的群集才支持高级容器网络服务的容器网络安全功能。

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

获取群集凭据

使用 az aks get-credentials 命令获取群集凭据后。

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

Azure 托管 Prometheus 和 Grafana

如果使用 BYO Prometheus 和 Grafana,请跳过本部分

使用以下示例为 AKS 群集安装并启用 Prometheus 和 Grafana。

创建 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 chinanorth3 \
    --properties '{}'

创建 Azure 托管 Grafana 实例

使用 az grafana create 创建 Grafana 实例。 Grafana 实例的名称必须唯一。

# 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 

将 Azure 托管 Grafana 和 Azure Monitor 资源 ID 放在变量中

使用 az grafana show 将 Grafana 资源 ID 放在变量中。 使用 az resource show 将 Azure Monitor 资源 ID 放在变量中。 将 myGrafana 替换为 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)

使用 az aks update 将 Azure Monitor 和 Grafana 资源链接到 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

可视化

使用 Azure 托管 Grafana 实现可视化

如果使用 BYO Grafana,请跳过此步骤

注意

由于大规模集群中的指标基数较高,因此默认情况下不会抓取 hubble_flows_processed_total 指标。 因此,Pods Flows 仪表板中存在数据缺失的面板。 若要启用此指标并填充缺失的数据,需要修改 ama-metrics-settings-configmap。 具体而言,更新 default-targets-metrics-keep-list 部分内容。 按照以下步骤更新 ConfigMap:

  1. 获取最新的 ama-metrics-settings-configmap。(https://github.com/Azure/prometheus-collector/blob/main/otelcollector/configmaps/ama-metrics-settings-configmap.yaml
  2. 定位到 networkobservabilityHubble = ""
  3. 将其更改为 networkobservabilityHubble = “hubble.*”
  4. 现在,Pod 流指标应填充。

若要详细了解最小化摄取,请参阅最小化摄取文档


  1. 使用 kubectl get pods 命令确保 Azure Monitor Pod 正在运行。

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

    输出应类似于以下示例输出:

    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. 我们已创建示例仪表板。 可以在“Dashboards > Azure Managed Prometheus”文件夹下找到它们。 它们的名称类似于“Kubernetes/Networking/<name>。 仪表板套件包括:

    • 群集:显示群集的节点级指标。
    • DNS(群集):显示群集上的 DNS 指标或节点选择。
    • DNS(工作负荷): 显示指定工作负荷的 DNS 指标(例如,DaemonSet 的 Pod 或部署(例如 CoreDNS)。
    • 丢包(工作负载): 显示指定工作负载(例如部署或 DaemonSet 的 Pod)的丢包情况。
    • Pod 流(命名空间):显示传入/传出指定命名空间(即命名空间中的 Pod)的 L4/L7 数据包流。
    • Pod 流(工作负载):显示传入/传送出指定工作负载(例如部署或 DaemonSet 的 Pod)的第 4 层/第 7 层数据包流

使用 BYO Grafana 进行可视化

如果使用 Azure 托管 Grafana,请跳过此步骤

  1. 将以下抓取作业添加到现有 Prometheus 配置,并重启 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. 在 Prometheus 的“目标”中,验证 network-obs-pods 是否存在。

  3. 登录到 Grafana 并使用以下 ID 导入以下示例仪表板:

    • 群集:显示群集的节点级指标。 (ID 18814)
    • DNS(群集):显示群集上的 DNS 指标或节点选择。(ID 20925)
    • DNS(工作负荷): 显示指定工作负荷的 DNS 指标(例如,DaemonSet 的 Pod 或部署(例如 CoreDNS)。 (ID [20926] https://grafana.com/grafana/dashboards/20926-kubernetes-networking-dns-workload/)
    • 丢弃(工作负载):显示传入/传出指定工作负载(例如部署或 DaemonSet 的 Pod)的丢弃。(ID: 20927)
    • Pod 流(命名空间):显示传入/传出指定命名空间(即命名空间中的 Pod)的 L4/L7 数据包流。 (ID 20928)
    • Pod 流(工作负载):显示传入/传送出指定工作负载(例如部署或 DaemonSet 的 Pod)的第 4 层/第 7 层数据包流。 (ID: 20929

清理资源

如果不打算使用此应用程序,请使用 az group delete 命令删除本文中创建的其他资源。

  az group delete --name $RESOURCE_GROUP

后续步骤

本操作指南文章介绍了如何为 AKS 群集安装和启用容器网络可观测性。