你当前正在访问 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”部分。

Open Service Mesh located under Settings for Arc enabled Kubernetes cluster

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

或者,也可以使用下面捕获的 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

Edit configuration button located on top of the Open Service Mesh section

对 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 部分中选择“编辑配置”。

Edit configuration button in the Open Service Mesh section

使用支持 Azure Arc 的 OSM

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

将命名空间加入服务网格

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

osm namespace add <namespace_name>

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

+Add button located on top of the Open Service Mesh section

有关载入服务的详细信息,请参阅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 workbook

“请求”选项卡

请求选项卡显示通过 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 进行卸载,此操作可能导致不利的行为。

后续步骤