你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

为 Azure Kubernetes 服务(AKS)配置容器网络指标筛选(预览版)

本文介绍如何使用 Cilium 为 Azure Kubernetes 服务(AKS)配置容器网络指标筛选,以优化数据收集、降低存储成本,并专注于与监视需求最相关的指标。

配置容器网络指标筛选功能,使得可以通过 Kubernetes 自定义资源定义(CRDs)动态管理 Hubble 指标基数。 此功能允许动态控制 Hubble 指标的基数、维度和目标,而无需重启 Cilium 代理或 Prometheus 服务器。

先决条件

  • 拥有有效订阅的 Azure 帐户。 如果没有帐户,请在开始之前创建 一个免费帐户
  • 完成本文中的步骤所需的最低 Azure CLI 版本为 2.73.0。 若要查找版本,请在 Azure CLI 中运行 az --version 。 若要安装或升级,请参阅安装 Azure CLI

  • 启用了 Cilium 数据平面和高级容器网络服务的 AKS 群集。

  • Kubernetes 版本 1.32 或更高版本。

  • 容器网络指标筛选特别适用于 Cilium 数据平面。

  • 完成本文步骤所需的最低版本 Azure CLI 扩展是 aks-preview

安装 aks-preview Azure CLI 扩展

使用 az extension addaz extension update 命令安装或更新 Azure CLI 预览扩展。

# 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

注册 AdvancedNetworkingDynamicMetricsPreview 功能标志

  1. 首先,使用 az feature register 以下命令注册 AdvancedNetworkingDynamicMetricsPreview 功能标志:
az feature register --namespace "Microsoft.ContainerService" --name "AdvancedNetworkingDynamicMetricsPreview"
  1. 使用 az feature show 命令验证注册是否成功。 注册需要几分钟才能完成。
az feature show --namespace "Microsoft.ContainerService" --name "AdvancedNetworkingDynamicMetricsPreview"
  1. 当功能显示“已注册”时,使用Microsoft.ContainerService命令刷新资源提供程序的az provider register注册。
az provider register --namespace Microsoft.ContainerService

使用 Cilium 创建新的 AKS 群集

如果已有现有群集,可以跳过此步骤。

使用 az aks create 命令和 --enable-acns 参数来创建一个具有所有高级容器网络服务功能的新 AKS 集群。 这些功能包括:

  • 容器网络可观测性: 提供有关网络流量的见解。 若要了解详细信息,请参阅 容器网络可观测性

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

# Set environment variables
export RESOURCE_GROUP="cnm-testing-rg"
export CLUSTER_NAME="cnm-cilium-cluster"
export LOCATION="eastus2euap"  # Use canary region for preview features

# Create resource group
az group create --name $RESOURCE_GROUP --location $LOCATION

# Create AKS cluster with Cilium and ACNS enabled
az aks create \
    --resource-group $RESOURCE_GROUP \
    --name $CLUSTER_NAME \
    --location $LOCATION \
    --network-plugin azure \
    --network-dataplane cilium \
    --enable-acns \
    --enable-managed-identity \
    --generate-ssh-keys \
    --kubernetes-version 1.32

获取群集凭据

使用 az aks get-credentials 以下命令获取群集凭据:

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

为指标筛选配置自定义资源

容器网络指标筛选使用 ContainerNetworkMetric 自定义资源定义(CRD)来定义筛选规则。 每个群集只能存在一个 CRD,更改大约需要 30 秒才能协调。 如果未应用 CRD,将收集所有指标。

apiVersion: acn.azure.com/v1alpha1
kind: ContainerNetworkMetric
metadata:
  name: : container-network-metric # Cluster scoped
spec:
  filters:
  - metric: flow
    includeFilters: # List of include filters
      - name: sample-filter # Filter name
        from:
          namespacedPod: # List of source namespace/pods. Prepend namespace with /
            - sample-namespace/sample-pod
          labelSelector: # Standard k8s label selector
            matchLabels:
              app: frontend
              k8s.io/namespace: sample-namespace
            matchExpressions:
              - key: environment
                operator: In
                values:
                  - production
                  - staging
          ip: # List of source IPs; can be CIDR
            - "192.168.1.10"
            - "10.0.0.1"
        to:
          namespacedPod:
            - sample-namespace2/sample-pod2
          labelSelector:
            matchLabels:
              app: backend
              k8s.io/namespace: sample-namespace2
            matchExpressions:
              - key: tier
                operator: NotIn
                values:
                  - dev
          ip:
            - "192.168.1.20"
            - "10.0.1.1"
        protocol: # List of protocols; can be tcp, udp, dns
          - tcp
          - udp
          - dns
        verdict: # List of verdicts; can be forwarded, dropped
          - forwarded
          - dropped
    metric: dns
    excludeFilters: # List of exclude filters
      - name: sample-filter # Filter name
        from:
          namespacedPod: # List of source namespace/pods. Prepend namespace with /
            - sample-namespace/sample-pod
          labelSelector: # Standard k8s label selector
            matchLabels:
              app: frontend
              k8s.io/namespace: sample-namespace

下表描述了自定义资源定义中的字段:

字段 类型 Description 必选
filters.metric String 要应用筛选器的指标的名称。 必须设置此项。 支持的值为 dnsflowtcpdrop 强制的
includeFiltersexcludeFilters []过滤器 定义要包含的网络流的筛选器列表。 每个筛选器指定源、目标、协议和其他匹配条件。 必须至少有一个筛选器,用于包含或排除。 强制的
filters.name String 筛选器的名称。 可选
filters.protocol []字符串 要与此过滤器匹配的协议。 有效值为:tcpudpdns。 因为它是一个可选参数,如果未指定,则包含所有协议的日志。 可选
filters.verdict []字符串 要匹配的流的裁定。 有效值为 forwardeddropped。 如果未指定,因为它是一个可选参数,则日志将包含所有结果。 可选
filters.from 端点 指定网络流的源。 可以包括 IP 地址、标签选择器和命名空间/Pod 对。 可选
Endpoint.ip []字符串 它可以是单个 IP 或 CIDR。 可选
Endpoint.labelSelector 物体 标签选择器是一种基于标签筛选和查询资源的机制,因此可以识别特定的资源子集。 标签选择器可以包括两个组件: matchLabelsmatchExpressions。 使用matchLabels通过指定一个键/值对(例如{"app": "frontend"})进行简单匹配。 对于更高级的条件,请使用 matchExpressions,其中定义标签键、运算符(如 InNotInExistsDoesNotExist),以及可选的值列表。 确保 matchLabelsmatchExpressions 这两个条件同时满足,因为它们通过 AND 逻辑组合在一起。 如果未指定任何条件,选择器将匹配所有资源。 若要匹配无,请将选择器保留为空。 请仔细定义标签选择器,以定位正确的资源集。 可选
Endpoint.namespacedPod []字符串 用于匹配源的命名空间和 Pod 对的列表(格式为 namespace/pod)。 name 应与正则表达式模式 ^.+$匹配。 可选
filters.to 端点 指定网络流的目标。 可以包括 IP 地址、标签选择器或命名空间/Pod 对。 可选
Endpoint.ip []字符串 它可以是单个 IP 或 CIDR。 可选
Endpoint.labelSelector 物体 标签选择器,用于根据资源标签匹配资源。 可选
Endpoint.namespacedPod []字符串 命名空间和 Pod 对的列表(格式设置为 namespace/pod)以匹配目标。 可选

ContainerNetworkMetric应用自定义资源以在群集上启用日志收集:

kubectl apply -f <crd.yaml>

清理和重置

清理筛选配置:

# Delete the CRD
kubectl delete ContainerNetworkMetric container-network-metric

示例筛选配置

  1. 创建侧重于 DNS 指标的基本筛选配置:
# basic-dns-filter.yaml
apiVersion: acn.azure.com/v1alpha1
kind: ContainerNetworkMetric
metadata:
  name: container-network-metric
spec:
  filters:
    - metric: dns  # Supported: dns, flow, tcp, drop
      excludeFilters:
        - from:
            namespacedPod: ["kube-system/coredns"]
  1. 为 TCP 指标配置包含和排除筛选器:
# tcp-metrics-filter.yaml
apiVersion: acn.azure.com/v1alpha1
kind: ContainerNetworkMetric
metadata:
  name: container-network-metric
spec:
  filters:
    - metric: tcp
      includeFilters:
          - from:
            labelSelector:
              matchLabels:
                tier: "frontend"
      excludeFilters:
        - to:
            namespacedPod: ["kube-system/metrics-server"]
  1. 为网络流指标配置筛选:
# flow-metrics-filter.yaml
apiVersion: acn.azure.com/v1alpha1
kind: ContainerNetworkMetric
metadata:
  name: container-network-metric
spec:
  filters:
    - metric: flow
      includeFilters:
        - from:
            labelSelector:
              matchLabels:
                tier: "frontend"
        - to:
            labelSelector:
              matchLabels:
                tier: "backend"
      excludeFilters:
        - from:
            namespacedPod: ["default/test"]
  1. 为丢弃数据包指标配置过滤条件:
# drop-metrics-filter.yaml
apiVersion: acn.azure.com/v1alpha1
kind: ContainerNetworkMetric
metadata:
  name: container-network-metric
spec:
  filters:
    - metric: drop
      excludeFilters:
        - from:
            namespacedPod: ["kube-system/"]
  1. 在单个 CRD 中为多个指标类型配置筛选:
# multi-metrics-filter.yaml
apiVersion: acn.azure.com/v1alpha1
kind: ContainerNetworkMetric
metadata:
  name: container-network-metric
spec:
  filters:
    - metric: dns
      includeFilters:
        - protocol: ["dns"]
      excludeFilters:
        - from:
            namespacedPod: ["kube-system/*"]
    - metric: tcp
      includeFilters:
        - protocol: ["tcp"]
        - from:
            labelSelector:
              matchLabels:
                environment: "production"
    - metric: flow
      excludeFilters:
        - from:
            namespacedPod: ["default/debug-*"]
    - metric: drop
      includeFilters:
        - reason: ["Policy denied", "Invalid"]

最佳做法

  • 请确保在 CRD 上没有冲突的包含和排除筛选器。

  • 利用 Kubernetes 标签选择器进行灵活筛选。

  • 始终验证开发或过渡中的筛选配置

  • 定期查看筛选的指标,以确保重要数据不会丢失。

  • 请记住,每个群集只能存在一个 CRD。

Troubleshooting

常见问题

问题:未应用 CRD 配置

解决方案:检查是否已注册功能标志,并且只有一个 CRD 存在:

# Verify feature registration
az feature show --namespace "Microsoft.ContainerService" --name "AdvancedNetworkingDynamicMetricsPreview"

# Check existing CRDs
kubectl get ContainerNetworkMetric

问题:应用排除过滤器 (excludeFilters) 后仍显示指标

解决方案:请记住,预先存在的指标保留在 Prometheus 中。 可能需要等待生成新指标才能查看筛选效果。

局限性

  • 此功能仅专为 Cilium 数据平面而设计
  • 每个集群只能存在一个 ContainerNetworkMetric CRD
  • Prometheus 中保留预先存在的指标;新筛选规则适用于新生成的指标
  • 需要 Kubernetes 版本 1.32 或更高版本