本文介绍如何使用 Cilium 为 Azure Kubernetes 服务(AKS)配置容器网络指标筛选,以优化数据收集、降低存储成本,并专注于与监视需求最相关的指标。
配置容器网络指标筛选功能,使得可以通过 Kubernetes 自定义资源定义(CRDs)动态管理 Hubble 指标基数。 此功能允许动态控制 Hubble 指标的基数、维度和目标,而无需重启 Cilium 代理或 Prometheus 服务器。
先决条件
- 拥有有效订阅的 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.85.0。 若要查找版本,请在 Azure CLI 中运行
az --version。 若要安装或升级,请参阅安装 Azure CLI。启用了 Cilium 数据平面和 高级容器网络服务的 AKS 群集。
Kubernetes 版本 1.32 或更高版本。
容器网络指标筛选特别适用于 Cilium 数据平面。
完成本文中的步骤的
aks-previewAzure CLI 扩展的最低版本为20.0.0b4。
安装 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
使用 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="chinanorth3" # 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.33
获取群集凭据
使用 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 |
字符串 | 要应用筛选器的指标的名称。 必须设置此项。 支持的值为 dns, flow, tcpdrop |
强制的 |
includeFilters 或 excludeFilters |
[]过滤器 | 定义要包含的网络流的筛选器列表。 每个筛选器指定源、目标、协议和其他匹配条件。 必须至少有一个筛选器,用于包含或排除。 | 强制的 |
filters.name |
字符串 | 筛选器的名称。 | Optional |
filters.protocol |
[]字符串 | 要与此过滤器匹配的协议。 有效值为:tcp、udp 和 dns。 因为它是一个可选参数,如果未指定,则包含所有协议的日志。 |
Optional |
filters.verdict |
[]字符串 | 要匹配的流的裁定。 有效值为 forwarded 和 dropped。 如果未指定,因为它是一个可选参数,则日志将包含所有结果。 |
Optional |
filters.from |
终结点 | 指定网络流的源。 可以包括 IP 地址、标签选择器和命名空间/Pod 对。 | Optional |
Endpoint.ip |
[]字符串 | 它可以是单个 IP 或 CIDR。 | Optional |
Endpoint.labelSelector |
对象 | 标签选择器是一种基于标签筛选和查询资源的机制,因此可以识别特定的资源子集。 标签选择器可以包括两个组件: matchLabels 和 matchExpressions。 使用matchLabels通过指定一个键/值对(例如{"app": "frontend"})进行简单匹配。 对于更高级的条件,请使用 matchExpressions,其中定义标签键、运算符(如 In、NotIn、Exists 或 DoesNotExist),以及可选的值列表。 确保 matchLabels 和 matchExpressions 这两个条件同时满足,因为它们通过 AND 逻辑组合在一起。 如果未指定任何条件,选择器将匹配所有资源。 若要匹配无,请将选择器保留为空。 请仔细定义标签选择器,以定位正确的资源集。 |
Optional |
Endpoint.namespacedPod |
[]字符串 | 用于匹配源的命名空间和 Pod 对的列表(格式为 namespace/pod)。
name 应与正则表达式模式 ^.+$匹配。 |
Optional |
filters.to |
终结点 | 指定网络流的目标。 可以包括 IP 地址、标签选择器或命名空间/Pod 对。 | Optional |
Endpoint.ip |
[]字符串 | 它可以是单个 IP 或 CIDR。 | Optional |
Endpoint.labelSelector |
对象 | 标签选择器,用于根据资源标签匹配资源。 | Optional |
Endpoint.namespacedPod |
[]字符串 | 命名空间和 Pod 对的列表(格式设置为 namespace/pod)以匹配目标。 |
Optional |
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。
故障排除
常见问题
问题:未应用 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 的高级容器网络服务的详细信息。