你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
本文介绍如何使用 Cilium 为 Azure Kubernetes 服务(AKS)配置容器网络指标筛选,以优化数据收集、降低存储成本,并专注于与监视需求最相关的指标。
配置容器网络指标筛选功能,使得可以通过 Kubernetes 自定义资源定义(CRDs)动态管理 Hubble 指标基数。 此功能允许动态控制 Hubble 指标的基数、维度和目标,而无需重启 Cilium 代理或 Prometheus 服务器。
先决条件
- 拥有有效订阅的 Azure 帐户。 如果没有帐户,请在开始之前创建 一个免费帐户 。
在 Azure Cloud Shell 中使用 Bash 环境。 有关详细信息,请参阅 Azure Cloud Shell 入门。
如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI。
如果使用的是本地安装,请使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅 使用 Azure CLI 向 Azure 进行身份验证。
出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展的详细信息,请参阅 使用和管理 Azure CLI 中的扩展。
运行az version命令,以查看已安装的版本和依赖库。 若要升级到最新版本,请运行az upgrade。
完成本文中的步骤所需的最低 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 add 或 az 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 功能标志
- 首先,使用
az feature register以下命令注册 AdvancedNetworkingDynamicMetricsPreview 功能标志:
az feature register --namespace "Microsoft.ContainerService" --name "AdvancedNetworkingDynamicMetricsPreview"
- 使用
az feature show命令验证注册是否成功。 注册需要几分钟才能完成。
az feature show --namespace "Microsoft.ContainerService" --name "AdvancedNetworkingDynamicMetricsPreview"
- 当功能显示“已注册”时,使用
Microsoft.ContainerService命令刷新资源提供程序的az provider register注册。
az provider register --namespace Microsoft.ContainerService
使用 Cilium 创建新的 AKS 群集
如果已有现有群集,可以跳过此步骤。
使用 az aks create 命令和 --enable-acns 参数来创建一个具有所有高级容器网络服务功能的新 AKS 集群。 这些功能包括:
# 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 | 要应用筛选器的指标的名称。 必须设置此项。 支持的值为 dns, flow, tcpdrop |
强制的 |
includeFilters 或 excludeFilters |
[]过滤器 | 定义要包含的网络流的筛选器列表。 每个筛选器指定源、目标、协议和其他匹配条件。 必须至少有一个筛选器,用于包含或排除。 | 强制的 |
filters.name |
String | 筛选器的名称。 | 可选 |
filters.protocol |
[]字符串 | 要与此过滤器匹配的协议。 有效值为:tcp、udp 和 dns。 因为它是一个可选参数,如果未指定,则包含所有协议的日志。 |
可选 |
filters.verdict |
[]字符串 | 要匹配的流的裁定。 有效值为 forwarded 和 dropped。 如果未指定,因为它是一个可选参数,则日志将包含所有结果。 |
可选 |
filters.from |
端点 | 指定网络流的源。 可以包括 IP 地址、标签选择器和命名空间/Pod 对。 | 可选 |
Endpoint.ip |
[]字符串 | 它可以是单个 IP 或 CIDR。 | 可选 |
Endpoint.labelSelector |
物体 | 标签选择器是一种基于标签筛选和查询资源的机制,因此可以识别特定的资源子集。 标签选择器可以包括两个组件: matchLabels 和 matchExpressions。 使用matchLabels通过指定一个键/值对(例如{"app": "frontend"})进行简单匹配。 对于更高级的条件,请使用 matchExpressions,其中定义标签键、运算符(如 In、NotIn、Exists 或 DoesNotExist),以及可选的值列表。 确保 matchLabels 和 matchExpressions 这两个条件同时满足,因为它们通过 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
示例筛选配置
- 创建侧重于 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"]
- 为 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"]
- 为网络流指标配置筛选:
# 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"]
- 为丢弃数据包指标配置过滤条件:
# 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/"]
- 在单个 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 数据平面而设计
- 每个集群只能存在一个
ContainerNetworkMetricCRD - Prometheus 中保留预先存在的指标;新筛选规则适用于新生成的指标
- 需要 Kubernetes 版本 1.32 或更高版本
相关内容
- 若要了解容器网络指标功能,请参阅 容器网络指标概述。
- 若要使用高级容器网络服务创建 AKS 群集,请参阅 设置 AKS 的容器网络可观测性。
- 获取有关 AKS 的高级容器网络服务的详细信息。