以下是使用 Azure CLI 创建和配置 Azure Monitor 边缘管道所需组件时需要执行的步骤。
边缘管道扩展
以下命令将边缘管道扩展添加到已启用 Arc 的 Kubernetes 群集。
az k8s-extension create --name <pipeline-extension-name> --extension-type microsoft.monitor.pipelinecontroller --scope cluster --cluster-name <cluster-name> --resource-group <resource-group> --cluster-type connectedClusters --release-train Preview
## Example
az k8s-extension create --name my-pipe --extension-type microsoft.monitor.pipelinecontroller --scope cluster --cluster-name my-cluster --resource-group my-resource-group --cluster-type connectedClusters --release-train Preview
自定义位置
以下 ARM 模板为已启用 Arc 的 Kubernetes 群集创建自定义位置。
az customlocation create --name <custom-location-name> --resource-group <resource-group-name> --namespace <name of namespace> --host-resource-id <connectedClusterId> --cluster-extension-ids <extensionId>
## Example
az customlocation create --name my-cluster-custom-location --resource-group my-resource-group --namespace my-cluster-custom-location --host-resource-id /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-resource-group/providers/Microsoft.Kubernetes/connectedClusters/my-cluster --cluster-extension-ids /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-resource-group/providers/Microsoft.Kubernetes/connectedClusters/my-cluster/providers/Microsoft.KubernetesConfiguration/extensions/my-cluster
DCE
以下 ARM 模板可创建将边缘管道连接到云管道所需的数据收集终结点 (DCE)。 如果你在同一区域已有 DCE,则可以使用现有的 DCE。 在部署模板之前,替换下表中的属性。
az monitor data-collection endpoint create -g "myResourceGroup" -l "eastus2euap" --name "myCollectionEndpoint" --public-network-access "Enabled"
## Example
az monitor data-collection endpoint create --name strato-06-dce --resource-group strato --public-network-access "Enabled"
DCR
DCR 存储在 Azure Monitor 中,并定义从边缘管道接收数据后如何处理数据。 边缘管道配置指定了 DCR 的 immutable ID
,以及 DCR 中将处理数据的 stream
。 创建 DCR 时会自动生成 immutable ID
。
在运行 CLI 命令创建 DCR 之前,替换以下模板中的属性并将其保存在 json 文件中。 有关 DCR 结构的详细信息,请参阅 Azure Monitor 中的数据收集规则的结构。
参数 |
说明 |
name |
DCR 的名称。 该名称对于订阅必须是唯一的。 |
location |
DCR 的位置。 该位置必须与 DCE 的位置一致。 |
dataCollectionEndpointId |
DCE 的资源 ID。 |
streamDeclarations |
要接收的数据的架构。 管道配置中的每个数据流都需要一个流。 该名称在 DCR 中必须是唯一的,并且必须以 Custom- 开头。 下面示例中的 column 部分应用于 OLTP 和 Syslog 数据流。 如果目标表的架构不同,则可以使用 transformKql 参数中定义的转换来修改它。 |
destinations |
添加附加部分以将数据发送到多个工作区。 |
- name |
在 dataFlows 部分中引用的目标的名称。 该名称对于 DCR 必须是唯一的。 |
- workspaceResourceId |
Log Analytics 工作区的资源 ID。 |
- workspaceId |
Log Analytics 工作区的工作区 ID。 |
dataFlows |
匹配流和目标。 每个流/目标组合一个条目。 |
- streams |
一个或多个流(在 streamDeclarations 中定义)。 如果多个流被发送到同一目标,则可以包含多个流。 |
- destinations |
一个或多个目标(在 destinations 中定义)。 如果多个目标被发送到同一目标,则可以包含多个目标。 |
- transformKql |
在将数据发送到目的地之前应用于数据的转换。 使用 source 在不进行任何更改的情况下发送数据。 转换的输出必须与目标表的架构相匹配。 有关转询的详细信息,请参阅 Azure Monitor 中的数据收集转换。 |
- outputStream |
在 Log Analytics 工作区中指定目标表。 该表必须已存在于工作区中。 对于自定义表,请在表名称中添加 Custom- 前缀。 边缘管道当前不支持内置表。 |
{
"properties": {
"dataCollectionEndpointId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-resource-group/providers/Microsoft.Insights/dataCollectionEndpoints/my-dce",
"streamDeclarations": {
"Custom-OTLP": {
"columns": [
{
"name": "Body",
"type": "string"
},
{
"name": "TimeGenerated",
"type": "datetime"
},
{
"name": "SeverityText",
"type": "string"
}
]
},
"Custom-Syslog": {
"columns": [
{
"name": "Body",
"type": "string"
},
{
"name": "TimeGenerated",
"type": "datetime"
},
{
"name": "SeverityText",
"type": "string"
}
]
}
},
"dataSources": {},
"destinations": {
"logAnalytics": [
{
"name": "LogAnayticsWorkspace01",
"workspaceResourceId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-resource-group/providers/Microsoft.OperationalInsights/workspaces/my-workspace",
"workspaceId": "00000000-0000-0000-0000-000000000000"
}
]
},
"dataFlows": [
{
"streams": [
"Custom-OTLP"
],
"destinations": [
"LogAnayticsWorkspace01"
],
"transformKql": "source",
"outputStream": "Custom-OTelLogs_CL"
},
{
"streams": [
"Custom-Syslog"
],
"destinations": [
"LogAnayticsWorkspace01"
],
"transformKql": "source",
"outputStream": "Custom-Syslog_CL"
}
]
}
}
使用以下命令安装 DCR:
az monitor data-collection rule create --name 'myDCRName' --location <location> --resource-group <resource-group> --rule-file '<dcr-file-path.json>'
## Example
az monitor data-collection rule create --name my-pipeline-dcr --location westus2 --resource-group 'my-resource-group' --rule-file 'C:\MyDCR.json'
DCR 访问
已启用 Arc 的 Kubernetes 群集必须有权访问 DCR 才能将数据发送到云管道。 使用以下命令检索群集的系统分配标识的对象 ID。
az k8s-extension show --name <extension-name> --cluster-name <cluster-name> --resource-group <resource-group> --cluster-type connectedClusters --query "identity.principalId" -o tsv
## Example:
az k8s-extension show --name my-pipeline-extension --cluster-name my-cluster --resource-group my-resource-group --cluster-type connectedClusters --query "identity.principalId" -o tsv
使用此命令的输出作为以下命令的输入,为 Azure Monitor 管道授予将其遥测数据发送到 DCR 的权限。
az role assignment create --assignee "<extension principal ID>" --role "Monitoring Metrics Publisher" --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Insights/dataCollectionRules/<dcr-name>"
## Example:
az role assignment create --assignee "00000000-0000-0000-0000-000000000000" --role "Monitoring Metrics Publisher" --scope "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-resource-group/providers/Microsoft.Insights/dataCollectionRules/my-dcr"
边缘管道配置
边缘管道配置定义了边缘管道实例的详细信息,并部署接收遥测数据和将其发送到云所需的数据流。
在部署模板之前,替换下表中的属性。
properties |
说明 |
常规 |
|
name |
管道实例的名称。 该名称在订阅中必须是唯一的。 |
location |
管道实例的位置。 |
extendedLocation |
|
接收器 |
每个接收器一个条目。 每个条目指定正在接收的数据类型、将侦听的端口以及将在配置的 pipelines 部分中使用的唯一名称。 |
type |
接收数据的类型。 当前选项为 OTLP 和 Syslog 。 |
name |
service 部分中引用的接收器的名称。 该名称对于管道实例必须是唯一的。 |
endpoint |
接收器侦听的地址和端口。 所有地址均使用 0.0.0.0 。 |
Processors |
保留供将来使用。 |
导出器 |
每个目标一个条目。 |
type |
当前仅支持 AzureMonitorWorkspaceLogs 类型。 |
name |
该名称对于管道实例必须是唯一的。 该名称用于配置的 pipelines 部分。 |
dataCollectionEndpointUrl |
边缘管道将向其中发送数据的 DCE 的 URL。 可以通过导航到 DCE 并复制日志引入值在 Azure 门户中找到它。 |
dataCollectionRule |
定义云管道中的数据收集的 DCR 的不可变 ID。 从 Azure 门户中 DCR 的 JSON 视图中,复制“常规”部分中不可变 ID 的值。 |
- stream |
DCR 中将接受数据的流的名称。 |
- maxStorageUsage |
缓存的容量。 达到此容量的 80% 时,将删除最早的数据,以便为更多数据腾出空间。 |
- retentionPeriod |
保留期(以分钟为单位)。 在此时间之后数据将被删除。 |
- schema |
要发送到云管道的数据的模式。 这必须与 DCR 中的流中定义的架构相匹配。 示例中使用的架构对于 Syslog 和 OTLP 均有效。 |
服务 |
每个管道实例一个条目。 建议每个管道扩展仅使用一个实例。 |
管道 |
每个数据流一个条目。 每个条目都将 receiver 与 exporter 相匹配。 |
name |
管道的唯一名称。 |
receivers |
用于侦听要接收的数据的一个或多个接收器。 |
processors |
保留供将来使用。 |
exporters |
用于将数据发送到云管道的一个或多个导出器。 |
persistence |
用于缓存的永久性卷的名称。 如果你不想启用缓存,请删除此参数。 |
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"metadata": {
"description": "This template deploys an edge pipeline for azure monitor."
},
"resources": [
{
"type": "Microsoft.monitor/pipelineGroups",
"location": "eastus",
"apiVersion": "2023-10-01-preview",
"name": "my-pipeline-group-name",
"extendedLocation": {
"name": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-resource-group/providers/Microsoft.ExtendedLocation/customLocations/my-custom-location",
"type": "CustomLocation"
},
"properties": {
"receivers": [
{
"type": "OTLP",
"name": "receiver-OTLP",
"otlp": {
"endpoint": "0.0.0.0:4317"
}
},
{
"type": "Syslog",
"name": "receiver-Syslog",
"syslog": {
"endpoint": "0.0.0.0:514"
}
}
],
"processors": [],
"exporters": [
{
"type": "AzureMonitorWorkspaceLogs",
"name": "exporter-log-analytics-workspace",
"azureMonitorWorkspaceLogs": {
"api": {
"dataCollectionEndpointUrl": "https://my-dce-4agr.eastus-1.ingest.monitor.azure.com",
"dataCollectionRule": "dcr-00000000000000000000000000000000",
"stream": "Custom-OTLP",
"schema": {
"recordMap": [
{
"from": "body",
"to": "Body"
},
{
"from": "severity_text",
"to": "SeverityText"
},
{
"from": "time_unix_nano",
"to": "TimeGenerated"
}
]
}
},
"cache": {
"maxStorageUsage": 10000,
"retentionPeriod": 60
}
}
}
],
"service": {
"pipelines": [
{
"name": "DefaultOTLPLogs",
"receivers": [
"receiver-OTLP"
],
"processors": [],
"exporters": [
"exporter-log-analytics-workspace"
],
"type": "logs"
},
{
"name": "DefaultSyslogs",
"receivers": [
"receiver-Syslog"
],
"processors": [],
"exporters": [
"exporter-log-analytics-workspace"
],
"type": "logs"
}
],
"persistence": {
"persistentVolumeName": "my-persistent-volume"
}
},
"networkingConfigurations": [
{
"externalNetworkingMode": "LoadBalancerOnly",
"routes": [
{
"receiver": "receiver-OTLP"
},
{
"receiver": "receiver-Syslog"
}
]
}
]
}
}
]
}
使用以下命令安装模板:
az deployment group create --resource-group <resource-group-name> --template-file <path-to-template>
## Example
az deployment group create --resource-group my-resource-group --template-file C:\MyPipelineConfig.json
可以使用如下所示的单个 ARM 模板部署 Azure Monitor 边缘管道的所有必需组件。 使用适合环境的特定值编辑参数文件。 下面描述了模板的每个部分,包括使用前必须修改的部分。
组件 |
类型 |
说明 |
Log Analytics 工作区 |
Microsoft.OperationalInsights/workspaces |
如果使用现有 Log Analytics 工作区,请删除此部分。 唯一必需参数是工作区名称。 将自动创建其他组件所需的工作区的不可变 ID。 |
数据收集终结点 (DCE) |
Microsoft.Insights/dataCollectionEndpoints |
如果使用现有的 DCE,请删除此部分。 唯一必需参数是 DCE 名称。 将自动创建其他组件所需的 DCE 日志引入 URL。 |
边缘管道扩展 |
Microsoft.KubernetesConfiguration/extensions |
唯一必需参数是管道扩展名称。 |
自定义位置 |
Microsoft.ExtendedLocation/customLocations |
用于创建自定义的已启用 Arc 的 Kubernetes 群集的自定义位置 |
边缘管道实例 |
Microsoft.monitor/pipelineGroups |
边缘管道实例,包括侦听器、导出器和数据流的配置。 部署模板之前,必须修改管道实例的属性。 |
数据收集规则 (DCR) |
Microsoft.Insights/dataCollectionRules |
唯一必需参数是 DCR 名称,但在部署模板之前,必须先修改 DCR 的属性。 |
模板文件
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "string"
},
"clusterId": {
"type": "string"
},
"clusterExtensionIds": {
"type": "array"
},
"customLocationName": {
"type": "string"
},
"cachePersistentVolume": {
"type": "string"
},
"cacheMaxStorageUsage": {
"type": "int"
},
"cacheRetentionPeriod": {
"type": "int"
},
"dceName": {
"type": "string"
},
"dcrName": {
"type": "string"
},
"logAnalyticsWorkspaceName": {
"type": "string"
},
"pipelineExtensionName": {
"type": "string"
},
"pipelineGroupName": {
"type": "string"
},
"tagsByResource": {
"type": "object",
"defaultValue": {}
}
},
"resources": [
{
"type": "Microsoft.OperationalInsights/workspaces",
"name": "[parameters('logAnalyticsWorkspaceName')]",
"location": "[parameters('location')]",
"apiVersion": "2017-03-15-preview",
"tags": "[ if(contains(parameters('tagsByResource'), 'Microsoft.OperationalInsights/workspaces'), parameters('tagsByResource')['Microsoft.OperationalInsights/workspaces'], json('{}')) ]",
"properties": {
"sku": {
"name": "pergb2018"
}
}
},
{
"type": "Microsoft.Insights/dataCollectionEndpoints",
"name": "[parameters('dceName')]",
"location": "[parameters('location')]",
"apiVersion": "2021-04-01",
"tags": "[ if(contains(parameters('tagsByResource'), 'Microsoft.Insights/dataCollectionEndpoints'), parameters('tagsByResource')['Microsoft.Insights/dataCollectionEndpoints'], json('{}')) ]",
"properties": {
"configurationAccess": {},
"logsIngestion": {},
"networkAcls": {
"publicNetworkAccess": "Enabled"
}
}
},
{
"type": "Microsoft.Insights/dataCollectionRules",
"name": "[parameters('dcrName')]",
"location": "[parameters('location')]",
"apiVersion": "2021-09-01-preview",
"dependsOn": [
"[resourceId('Microsoft.OperationalInsights/workspaces', 'DefaultWorkspace-westus2')]",
"[resourceId('Microsoft.Insights/dataCollectionEndpoints', 'Aep-mytestpl-ZZPXiU05tJ')]"
],
"tags": "[ if(contains(parameters('tagsByResource'), 'Microsoft.Insights/dataCollectionRules'), parameters('tagsByResource')['Microsoft.Insights/dataCollectionRules'], json('{}')) ]",
"properties": {
"dataCollectionEndpointId": "[resourceId('Microsoft.Insights/dataCollectionEndpoints', 'Aep-mytestpl-ZZPXiU05tJ')]",
"streamDeclarations": {
"Custom-OTLP": {
"columns": [
{
"name": "Body",
"type": "string"
},
{
"name": "TimeGenerated",
"type": "datetime"
},
{
"name": "SeverityText",
"type": "string"
}
]
},
"Custom-Syslog": {
"columns": [
{
"name": "Body",
"type": "string"
},
{
"name": "TimeGenerated",
"type": "datetime"
},
{
"name": "SeverityText",
"type": "string"
}
]
}
},
"dataSources": {},
"destinations": {
"logAnalytics": [
{
"name": "DefaultWorkspace-westus2",
"workspaceResourceId": "[resourceId('Microsoft.OperationalInsights/workspaces', 'DefaultWorkspace-westus2')]",
"workspaceId": "[reference(resourceId('Microsoft.OperationalInsights/workspaces', 'DefaultWorkspace-westus2'))].customerId"
}
]
},
"dataFlows": [
{
"streams": [
"Custom-OTLP"
],
"destinations": [
"localDest-DefaultWorkspace-westus2"
],
"transformKql": "source",
"outputStream": "Custom-OTelLogs_CL"
},
{
"streams": [
"Custom-Syslog"
],
"destinations": [
"DefaultWorkspace-westus2"
],
"transformKql": "source",
"outputStream": "Custom-Syslog_CL"
}
]
}
},
{
"type": "Microsoft.KubernetesConfiguration/extensions",
"apiVersion": "2022-11-01",
"name": "[parameters('pipelineExtensionName')]",
"scope": "[parameters('clusterId')]",
"tags": "[ if(contains(parameters('tagsByResource'), 'Microsoft.KubernetesConfiguration/extensions'), parameters('tagsByResource')['Microsoft.KubernetesConfiguration/extensions'], json('{}')) ]",
"identity": {
"type": "SystemAssigned"
},
"properties": {
"aksAssignedIdentity": {
"type": "SystemAssigned"
},
"autoUpgradeMinorVersion": false,
"extensionType": "microsoft.monitor.pipelinecontroller",
"releaseTrain": "preview",
"scope": {
"cluster": {
"releaseNamespace": "my-strato-ns"
}
},
"version": "0.37.3-privatepreview"
}
},
{
"type": "Microsoft.ExtendedLocation/customLocations",
"apiVersion": "2021-08-15",
"name": "[parameters('customLocationName')]",
"location": "[parameters('location')]",
"tags": "[ if(contains(parameters('tagsByResource'), 'Microsoft.ExtendedLocation/customLocations'), parameters('tagsByResource')['Microsoft.ExtendedLocation/customLocations'], json('{}')) ]",
"dependsOn": [
"[parameters('pipelineExtensionName')]"
],
"properties": {
"hostResourceId": "[parameters('clusterId')]",
"namespace": "[toLower(parameters('customLocationName'))]",
"clusterExtensionIds": "[parameters('clusterExtensionIds')]",
"hostType": "Kubernetes"
}
},
{
"type": "Microsoft.monitor/pipelineGroups",
"location": "[parameters('location')]",
"apiVersion": "2023-10-01-preview",
"name": "[parameters('pipelineGroupName')]",
"tags": "[ if(contains(parameters('tagsByResource'), 'Microsoft.monitor/pipelineGroups'), parameters('tagsByResource')['Microsoft.monitor/pipelineGroups'], json('{}')) ]",
"dependsOn": [
"[parameters('customLocationName')]",
"[resourceId('Microsoft.Insights/dataCollectionRules','Aep-mytestpl-ZZPXiU05tJ')]"
],
"extendedLocation": {
"name": "[resourceId('Microsoft.ExtendedLocation/customLocations', parameters('customLocationName'))]",
"type": "CustomLocation"
},
"properties": {
"receivers": [
{
"type": "OTLP",
"name": "receiver-OTLP-4317",
"otlp": {
"endpoint": "0.0.0.0:4317"
}
},
{
"type": "Syslog",
"name": "receiver-Syslog-514",
"syslog": {
"endpoint": "0.0.0.0:514"
}
}
],
"processors": [],
"exporters": [
{
"type": "AzureMonitorWorkspaceLogs",
"name": "exporter-lu7mbr90",
"azureMonitorWorkspaceLogs": {
"api": {
"dataCollectionEndpointUrl": "[reference(resourceId('Microsoft.Insights/dataCollectionEndpoints','Aep-mytestpl-ZZPXiU05tJ')).logsIngestion.endpoint]",
"stream": "Custom-DefaultAEPOTelLogs_CL-FqXSu6GfRF",
"dataCollectionRule": "[reference(resourceId('Microsoft.Insights/dataCollectionRules', 'Aep-mytestpl-ZZPXiU05tJ')).immutableId]",
"cache": {
"maxStorageUsage": "[parameters('cacheMaxStorageUsage')]",
"retentionPeriod": "[parameters('cacheRetentionPeriod')]"
},
"schema": {
"recordMap": [
{
"from": "body",
"to": "Body"
},
{
"from": "severity_text",
"to": "SeverityText"
},
{
"from": "time_unix_nano",
"to": "TimeGenerated"
}
]
}
}
}
}
],
"service": {
"pipelines": [
{
"name": "DefaultOTLPLogs",
"receivers": [
"receiver-OTLP"
],
"processors": [],
"exporters": [
"exporter-lu7mbr90"
]
}
],
"persistence": {
"persistentVolume": "[parameters('cachePersistentVolume')]"
}
}
}
}
],
"outputs": {}
}
示例参数文件
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"value": "eastus"
},
"clusterId": {
"value": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-resource-group/providers/Microsoft.Kubernetes/connectedClusters/my-arc-cluster"
},
"clusterExtensionIds": {
"value": ["/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-resource-group/providers/Microsoft.KubernetesConfiguration/extensions/my-pipeline-extension"]
},
"customLocationName": {
"value": "my-custom-location"
},
"dceName": {
"value": "my-dce"
},
"dcrName": {
"value": "my-dcr"
},
"logAnalyticsWorkspaceName": {
"value": "my-workspace"
},
"pipelineExtensionName": {
"value": "my-pipeline-extension"
},
"pipelineGroupName": {
"value": "my-pipeline-group"
},
"tagsByResource": {
"value": {}
}
}
}