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

启用了 Azure Arc 的开放式服务网格

Open Service Mesh (OSM) 是一种轻型、可扩展的云原生服务网格,可让用户统一地管理、保护和获取高度动态微服务环境现成的可观测性功能。

OSM 在 Kubernetes 上运行基于 Envoy 的控制平面,可以使用 SMI API 进行配置,并通过将 Envoy 代理作为挎斗容器注入到每个应用程序实例旁边来运行。 详细了解 Open Service Mesh 实现的服务网格方案。

已启用 Azure Arc 的 OSM 的所有组件都部署在可用性区域中,使其区域冗余。

安装选项和要求

已启用 Azure Arc 的 Open Service Mesh 可以通过 Azure 门户、Azure CLI、ARM 模板或内置 Azure 策略进行部署。

先决条件

  • 确保满足此处列出的群集扩展的所有常见先决条件。
  • 使用 az k8s-extension CLI 扩展版本 >= v1.0.4

当前的支持限制

  • 在一个已连接到 Azure Arc 的 Kubernetes 群集上,只能部署一个 Open Service Mesh 实例。
  • 支持适用于已启用 Arc 的 Service Fabric 网格的两个最近发布的次要版本。 可在此处获取最新版本。 受支持的发行版本附有注释。 忽略与中间版本关联的标记。
  • 目前支持以下 Kubernetes 发行版:
    • AKS(Azure Kubernetes 服务)引擎
    • Azure Stack HCI 上的 AKS 群集
    • Azure Arc 启用的 AKS
    • Cluster API Azure
    • Google Kubernetes Engine
    • Canonical Kubernetes Distribution
    • Rancher Kubernetes 引擎
    • OpenShift Kubernetes Distribution
    • Amazon Elastic Kubernetes Service
    • VMware Tanzu Kubernetes 网格
  • 在预览版中,可以将 Azure Monitor 与已启用 Azure Arc 的 Open Service Mesh 相集成,但支持将受到限制

使用 Azure 门户进行基本安装

要使用 Azure 门户进行部署,请在拥有连接了 Arc 的群集后,转到群集的“Open Service Mesh”部分。

位于启用 Arc 的 Kubernetes 群集设置下的 Open Service Mesh

选择“安装扩展程序”按钮以部署最新版本的扩展程序。

或者,也可以使用下面捕获的 CLI 体验。 若要了解大规模载入,请阅读本文中关于使用 ARM 模板Azure Policy 进行部署的详细信息。

使用 Azure CLI 进行基本安装

以下步骤假定你已有一个群集,其中包含连接到 Azure Arc 的受支持的 Kubernetes 分发。确保 KUBECONFIG 环境变量指向启用了 Arc 的 Kubernetes 群集的 kubeconfig。

设置环境变量:

export CLUSTER_NAME=<arc-cluster-name>
export RESOURCE_GROUP=<resource-group-name>

如果使用 OpenShift 群集,请跳到 OpenShift 安装步骤

创建扩展:

注意

要固定特定版本的 OSM,请将--version x.y.z标志添加到create命令。 请注意,这会将 auto-upgrade-minor-version 的值设置为 false。

az k8s-extension create --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --cluster-type connectedClusters --extension-type Microsoft.openservicemesh --scope cluster --name osm

此时会看到与下例类似的输出。 将实际 OSM Helm 图表部署到群集可能需要 3-5 分钟。 在进行此部署之前,installState 将保持 Pending 状态。

{
  "autoUpgradeMinorVersion": true,
  "configurationSettings": {},
  "creationTime": "2021-04-29T17:50:11.4116524+00:00",
  "errorInfo": {
    "code": null,
    "message": null
  },
  "extensionType": "microsoft.openservicemesh",
  "id": "/subscriptions/<subscription-id>/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Kubernetes/connectedClusters/$CLUSTER_NAME/providers/Microsoft.KubernetesConfiguration/extensions/osm",
  "identity": null,
  "installState": "Pending",
  "lastModifiedTime": "2021-04-29T17:50:11.4116525+00:00",
  "lastStatusTime": null,
  "location": null,
  "name": "osm",
  "releaseTrain": "stable",
  "resourceGroup": "$RESOURCE_GROUP",
  "scope": {
    "cluster": {
      "releaseNamespace": "arc-osm-system"
    },
    "namespace": null
  },
  "statuses": [],
  "type": "Microsoft.KubernetesConfiguration/extensions",
  "version": "x.y.z"
}

接下来,验证安装

自定义安装

以下各节介绍了已启用 Azure Arc 的 OSM 的某些自定义安装。 自定义安装需要在 JSON 文件中设置 OSM 值并将其传递到 k8s-extension create CLI 命令中。

在 OpenShift 群集上安装 OSM

  1. 将以下内容复制并保存到 JSON 文件中。 如果已创建配置设置文件,请将以下行添加到现有文件,以保留以前的更改。

    {
        "osm.osm.enablePrivilegedInitContainer": "true"
    }
    
  2. 用自定义值安装 OSM

  3. 将特权安全上下文约束添加到网格中应用程序的每个服务帐户。

    oc adm policy add-scc-to-user privileged -z <service account name> -n <service account namespace>
    

将实际 OSM Helm 图表部署到群集可能需要 3-5 分钟。 在进行此部署之前,installState 将保持 Pending 状态。

为确保不会将特权 init 容器设置还原为默认设置,请在所有后续 az k8s-extension create 命令中传入 "osm.osm.enablePrivilegedInitContainer" : "true" 配置设置。

在安装时启用高可用性功能

OSM 的控制平面组件在构建时考虑了高可用性和容错。 本部分介绍如何在安装过程中启用水平 Pod 自动缩放 (HPA) 和 Pod 中断预算 (PDB)。 详细了解 OSM 上高可用性的设计注意事项

水平 Pod 自动缩放 (HPA)

HPA 根据用户定义的平均目标 CPU 使用率 (%) 和平均目标内存利用率 (%) 自动增加或减少控制平面 Pod。 若要在安装期间在 OSM 控制平面 Pod 上启用 HPA 并设置适用的值,请创建或追加到现有的 JSON 设置文件(如下所示),并为每个要启用 HPA 的控制平面 pod(osmControllerinjector)重复键/值对。

{
  "osm.osm.<control_plane_pod>.autoScale.enable" : "true",
  "osm.osm.<control_plane_pod>.autoScale.minReplicas" : "<allowed values: 1-10>",
  "osm.osm.<control_plane_pod>.autoScale.maxReplicas" : "<allowed values: 1-10>",
  "osm.osm.<control_plane_pod>.autoScale.cpu.targetAverageUtilization" : "<allowed values 0-100>",
  "osm.osm.<control_plane_pod>.autoScale.memory.targetAverageUtilization" : "<allowed values 0-100>"
}

现在,用自定义值安装 OSM

Pod 中断预算 (PDB)

为了防止在计划中断期间发生中断,控制平面 Pod osm-controllerosm-injector 具有 PDB,可确保始终至少有 1 个对应于每个控制平面应用程序的 Pod。

若要启用 PDB,请为每个所需的控制平面 pod(osmControllerinjector)创建或追加到现有 JSON 设置文件,如下所示:

{
  "osm.osm.<control_plane_pod>.enablePodDisruptionBudget" : "true"
}

现在,用自定义值安装 OSM

安装带有 cert-manager 的 OSM 以便管理证书

cert-manager 是一种提供程序,可用于将签名证书颁发给 OSM,而无需在 Kubernetes 中存储私钥。 有关详细信息,请参阅 OSM 的 cert-manager 文档演示

注意

请谨慎使用 OSM GitHub 文档中提供的命令。 请确保在命令中使用正确的命名空间或使用标志 --osm-namespace arc-osm-system 指定命名空间。

若要使用证书管理器作为证书提供程序安装 OSM,请创建或追加到现有的 JSON 设置文件,将 certificateProvider.kind 值设置为证书管理器,如下所示。 要改变 OSM 文档中指定的默认 cert-manager 值,还应加入并更新后续 certmanager.issuer 行。

{
  "osm.osm.certificateProvider.kind" : "cert-manager",
  "osm.osm.certmanager.issuerName" : "<issuer name>",
  "osm.osm.certmanager.issuerKind" : "<issuer kind>",
  "osm.osm.certmanager.issuerGroup" : "<issuer group>"
}

现在,用自定义值安装 OSM

安装带 Contour 的 OSM 以实现 Ingress

OSM 提供了多个选项,用于在外部使用 Ingress 公开网格服务。 OSM 可以使用 Contour,它可与在网格外部安装的入口控制器一同工作,并支持使用证书进行预配以参与网格。 有关详细信息,请参阅 OSM 的 Ingress 文档演示

注意

请谨慎使用 OSM GitHub 文档中提供的命令。 请确保在命令中使用正确的命名空间或使用标志 --osm-namespace arc-osm-system 指定命名空间。 若要设置在 OSM 安装期间配置 Contour 所需的值,请向 JSON 设置文件追加以下内容:

{
  "osm.osm.osmNamespace" : "arc-osm-system",
  "osm.contour.enabled" : "true",
  "osm.contour.configInline.tls.envoy-client-certificate.name" : "osm-contour-envoy-client-cert", 
  "osm.contour.configInline.tls.envoy-client-certificate.namespace" : "arc-osm-system"
}

在 OSM 安装过程中设置值

需将需要在 OSM 安装过程中设置的任何值保存到单个 JSON 文件中,并通过 Azure CLI 安装命令加以传入。

创建具有适用值的 JSON 文件(如“自定义安装”部分所述)后,请将文件路径设置为环境变量:

export SETTINGS_FILE=<json-file-path>

运行 az k8s-extension create 命令以创建 OSM 扩展,并使用 --configuration-settings-file 标记传入设置文件:

az k8s-extension create --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --cluster-type connectedClusters --extension-type Microsoft.openservicemesh --scope cluster --name osm --configuration-settings-file $SETTINGS_FILE

使用 ARM 模板安装已启用 Azure Arc 的 OSM

将群集连接到 Azure Arc 后,创建采用以下格式的 JSON 文件,并确保更新<cluster-name><osm-arc-version>值:

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "ConnectedClusterName": {
            "defaultValue": "<cluster-name>",
            "type": "String",
            "metadata": {
                "description": "The Connected Cluster name."
            }
        },
        "ExtensionInstanceName": {
            "defaultValue": "osm",
            "type": "String",
            "metadata": {
                "description": "The extension instance name."
            }
        },
        "ExtensionVersion": {
            "defaultValue": "<osm-arc-version>",
            "type": "String",
            "metadata": {
                "description": "The extension type version."
            }
        },
        "ExtensionType": {
            "defaultValue": "Microsoft.openservicemesh",
            "type": "String",
            "metadata": {
                "description": "The extension type."
            }
        },
        "ReleaseTrain": {
            "defaultValue": "Stable",
            "type": "String",
            "metadata": {
                "description": "The release train."
            }
        }
    },
    "functions": [],
    "resources": [
        {
            "type": "Microsoft.KubernetesConfiguration/extensions",
            "apiVersion": "2020-07-01-preview",
            "name": "[parameters('ExtensionInstanceName')]",
            "properties": {
                "extensionType": "[parameters('ExtensionType')]",
                "releaseTrain": "[parameters('ReleaseTrain')]",
                "version": "[parameters('ExtensionVersion')]"
            },
            "scope": "[concat('Microsoft.Kubernetes/connectedClusters/', parameters('ConnectedClusterName'))]"
        }
    ]
}

设置环境变量:

export TEMPLATE_FILE_NAME=<template-file-path>
export DEPLOYMENT_NAME=<desired-deployment-name>

运行以下命令以安装 OSM 扩展:

az deployment group create --name $DEPLOYMENT_NAME --resource-group $RESOURCE_GROUP --template-file $TEMPLATE_FILE_NAME

现在,应该可以查看 OSM 资源并在群集中使用 OSM 扩展。

使用内置策略安装已启用 Azure Arc 的 OSM

在 Azure 门户的Kubernetes类别下,有一个内置策略:已启用 Azure Arc 的 Kubernetes 群集应安装 Open Service Mesh 扩展。 可以在订阅或资源组的范围内分配此策略。

此策略的默认操作为“如果不存在则部署”。 但是,可以选择通过在分配期间更改参数来审核群集的扩展安装。 系统还会提示你指定要安装的版本(v1.0.0-1 或更高版本)作为参数。

验证安装

运行以下命令。

az k8s-extension show --cluster-type connectedClusters --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --name osm

JSON 输出应如以下所示:

{
  "autoUpgradeMinorVersion": true,
  "configurationSettings": {},
  "creationTime": "2021-04-29T19:22:00.7649729+00:00",
  "errorInfo": {
    "code": null,
    "message": null
  },
  "extensionType": "microsoft.openservicemesh",
  "id": "/subscriptions/<subscription-id>/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Kubernetes/connectedClusters/$CLUSTER_NAME/providers/Microsoft.KubernetesConfiguration/extensions/osm",
  "identity": null,
  "installState": "Installed",
  "lastModifiedTime": "2021-04-29T19:22:00.7649731+00:00",
  "lastStatusTime": "2021-04-29T19:23:27.642+00:00",
  "location": null,
  "name": "osm",
  "releaseTrain": "stable",
  "resourceGroup": "$RESOURCE_GROUP",
  "scope": {
    "cluster": {
      "releaseNamespace": "arc-osm-system"
    },
    "namespace": null
  },
  "statuses": [],
  "type": "Microsoft.KubernetesConfiguration/extensions",
  "version": "x.y.z"
}

有关可用于验证群集上的 Open Service Mesh (OSM) 扩展组件的部署并对其进行故障排除的更多命令,请参阅故障排除指南

OSM 控制器配置

OSM 在arc-osm-system命名空间中部署 MeshConfig 资源osm-mesh-config作为其控制平面的一部分。 此 MeshConfig 的目的是使网格所有者/操作员能够根据其需求更新某些网格配置。 要查看默认值,请使用以下命令。

kubectl describe meshconfig osm-mesh-config -n arc-osm-system

输出显示默认值:

  Certificate:
    Cert Key Bit Size:               2048
    Service Cert Validity Duration:  24h
  Feature Flags:
    Enable Async Proxy Service Mapping:  false
    Enable Egress Policy:                true
    Enable Envoy Active Health Checks:   false
    Enable Ingress Backend Policy:       true
    Enable Multicluster Mode:            false
    Enable Retry Policy:                 false
    Enable Snapshot Cache Mode:          false
    Enable WASM Stats:                   true
  Observability:
    Enable Debug Server:  false
    Osm Log Level:        info
    Tracing:
      Enable:  false
  Sidecar:
    Config Resync Interval:            0s
    Enable Privileged Init Container:  false
    Log Level:                         error
    Resources:
  Traffic:
    Enable Egress:                          false
    Enable Permissive Traffic Policy Mode:  true
    Inbound External Authorization:
      Enable:              false
      Failure Mode Allow:  false
      Stat Prefix:         inboundExtAuthz
      Timeout:             1s
    Inbound Port Exclusion List:
    Outbound IP Range Exclusion List:
    Outbound Port Exclusion List:

有关详细信息,请参阅 Config API 参考。 请注意,spec.traffic.enablePermissiveTrafficPolicyMode 设置为 true。 当 OSM 处于宽松流量策略模式时,系统会绕过 SMI 流量策略强制执行。 在此模式下,OSM 会自动发现属于服务网格一部分的服务,并在每个 Envoy 代理挎斗上对流量策略规则进行编程,以便能够与这些服务通信。

通过在群集的 Open Service Mesh 部分中选择“编辑配置”,也可以在 Azure 门户中查看 osm-mesh-config

位于 Open Service Mesh 部分顶部的“编辑配置”按钮

对 OSM 控制器配置进行更改

注意

MeshConfig osm-mesh-config 中的值在升级过程中保持不变。

可以使用 kubectl patch 命令对 osm-mesh-config 进行更改。 在以下示例中,宽松流量策略模式更改为了 false。

kubectl patch meshconfig osm-mesh-config -n arc-osm-system -p '{"spec":{"traffic":{"enablePermissiveTrafficPolicyMode":false}}}' --type=merge

如果使用了不正确的值,则 MeshConfig CRD 上的验证将阻止更改并显示一条错误消息,说明值无效的原因。 例如,此命令显示了将 enableEgress 修补为非布尔值时会发生的情况:

kubectl patch meshconfig osm-mesh-config -n arc-osm-system -p '{"spec":{"traffic":{"enableEgress":"no"}}}'  --type=merge
# Validations on the CRD will deny this change
The MeshConfig "osm-mesh-config" is invalid: spec.traffic.enableEgress: Invalid value: "string": spec.traffic.enableEgress in body must be of type boolean: "string"

或者,要在 Azure 门户中编辑 osm-mesh-config,可在群集的 Open Service Mesh 部分中选择“编辑配置”。

Open Service Mesh 部分的“编辑配置”按钮

使用支持 Azure Arc 的 OSM

若要开始使用 OSM 功能,首先需要将应用程序命名空间加入服务网格。 从OSM GitHub 版本页下载 OSM CLI。 将命名空间添加到网格后,可以配置 SMI 策略以实现所需的 OSM 功能。

将命名空间加入服务网格

运行以下命令将命名空间添加到网格:

osm namespace add <namespace_name>

也可通过在群集的 Open Service Mesh 部分中选择“+添加”,从 Azure 门户网站上加载命名空间。

位于 Open Service Mesh 部分顶部的“+ 添加”按钮

有关载入服务的详细信息,请参阅Open Service Mesh 文档

为 OSM 配置服务网格接口 (SMI) 策略

可以从某个示例应用程序着手,或者使用测试环境来试用 SMI 策略。

注意

如果使用示例应用程序,请确保其版本与群集上安装的 OSM 扩展的版本匹配。 例如,如果使用的是 OSM 扩展 v1.0.0,请使用 OSM 上游存储库的 release-v1.0 分支中的 bookstore 清单。

配置自己的 Jaeger、Prometheus 和 Grafana 实例

OSM 扩展不会安装附加产品,如 JaegerPrometheusGrafanaFlagger。 你可以改为将 OSM 与自己的正在运行的工具实例集成。 若要与你自己的实例集成,请查看以下文档:

注意

请谨慎使用 OSM GitHub 文档中提供的命令。 对 osm-mesh-config 进行更改时,请确保使用正确的命名空间名称 arc-osm-system

使用 Azure Monitor 和 Applications Insights 监视应用程序(预览版)

Azure Monitor 和 Azure Application Insights 都提供用于收集、分析和处理来自云环境与本地环境的遥测数据的综合解决方案,可帮助你将应用程序和服务的可用性和性能最大化。 已启用 Azure Arc 的 Open Service Mesh 已深入集成到这两个 Azure 服务中。 此集成提供无缝的 Azure 体验,用于查看和响应 OSM 指标提供的关键 KPI。

重要

已启用 Azure Arc 的 Kubernetes 预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 客户支持部门会尽力为已启用 Azure Arc 的 Kubernetes 预览功能提供部分支持。

按照以下步骤允许 Azure Monitor 抓取 prometheus 终结点以收集应用程序指标。

  1. 遵循此处可用的指南,确保要监视的应用程序命名空间已加入到网格。

  2. 公开应用程序命名空间的 prometheus 终结点。

    osm metrics enable --namespace <namespace1>
    osm metrics enable --namespace <namespace2>
    
  3. 参考此处提供的指导安装 Azure Monitor 扩展。

  4. kube-system 命名空间中创建一个 Configmap,让 Azure Monitor 可以监视命名空间。 例如,使用以下内容创建 container-azm-ms-osmconfig.yaml 来监视 <namespace1><namespace2>

    kind: ConfigMap
    apiVersion: v1
    data:
      schema-version: v1
      config-version: ver1
      osm-metric-collection-configuration: |-
        # OSM metric collection settings
        [osm_metric_collection_configuration]
          [osm_metric_collection_configuration.settings]
              # Namespaces to monitor
              monitor_namespaces = ["<namespace1>", "<namespace2>"]
    metadata:
      name: container-azm-ms-osmconfig
      namespace: kube-system
    
  5. 运行以下 kubectl 命令

    kubectl apply -f container-azm-ms-osmconfig.yaml
    

最长可能需要在 15 分钟后,指标才会显示在 Log Analytics 中。 可以尝试查询 InsightsMetrics 表。

InsightsMetrics
| where Name contains "envoy"
| extend t=parse_json(Tags)
| where t.app == "namespace1"
  1. 使用此链接访问已连接到 Arc 的 Kubernetes 群集。
  2. 转到 Azure Monitor,导航到“报告”选项卡以访问 OSM 工作簿。
  3. 选择时间范围和命名空间以限定服务的范围。

OSM 工作簿

“请求”选项卡

请求选项卡显示通过 OSM 中的服务间通信发送的所有 HTTP 请求的摘要。

  • 可以通过在网格中选择服务来查看所有服务。
  • 可以查看请求总数、请求错误率和 P90 延迟。
  • 可以向下钻取到目标,并查看 HTTP 错误/成功代码、成功率、Pod 资源利用率和以不同百分位表示的延迟的趋势。

“连接”选项卡

连接选项卡显示 Open Service Mesh 中服务间所有连接的摘要。

  • 出站连接:源与目标服务之间的连接总数。
  • 出站活动连接:所选时间范围内源与目标之间的活动连接的上次计数。
  • 出站失败连接:源与目标服务之间的失败连接总数。

升级到指定版本的 OSM

在升级期间,控制平面可能会停机一段时间。 数据平面仅在 CRD 升级期间受影响。

支持的升级

OSM 扩展可以在次要版本和主要版本之间手动升级。 然而,自动升级(如果启用)仅适用于次要版本。

手动升级到指定 OSM 版本

以下命令可将 OSM-Arc 扩展升级到指定版本:

az k8s-extension update --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --cluster-type connectedClusters --release-train stable --name osm --version x.y.z

启用自动升级

如果未默认启用自动升级,可以运行以下命令来启用它们。 通过运行在验证安装步骤详述的 az k8s-extension show 命令来验证 --auto-upgrade-minor-version 的当前值。

az k8s-extension update --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --cluster-type connectedClusters --release-train stable --name osm --auto-upgrade-minor-version true

卸载启用了 Azure Arc 的 OSM

请使用以下命令:

az k8s-extension delete --cluster-type connectedClusters --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --name osm -y

验证是否已删除扩展实例:

az k8s-extension list --cluster-type connectedClusters --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP

此输出不应包含 OSM。 如果群集上未安装任何其他扩展,则输出只是一个空数组。

使用 az k8s-extension 命令删除 OSM 扩展时,将不会删除 arc-osm-system 命名空间,该命名空间中的实际资源(例如变异 Webhook 配置和 osm-controller Pod)将在大约 10 分钟后才会删除。

注意

使用 az k8s-extension CLI 卸载 Arc 管理的 OSM 组件。Arc 不支持使用 OSM CLI 进行卸载,此操作可能导致不利的行为。

后续步骤