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

在级别 4 群集上配置 Azure IoT 分层网络管理(预览版)

Azure IoT 分层网络管理(预览版)是一个支持 Azure IoT 操作的组件。 但是,需要将其单独部署到顶层网络层,以支持下层中的 Azure IoT 操作。 在网络层的顶层(通常是 ISA-95 网络体系结构的第 4 级),群集和分层网络管理服务可以直接访问 Internet。 设置完成后,分层网络管理(预览版)服务已准备好接收子层的网络流量并将其转发到 Azure Arc。

先决条件

满足在系统上单独部署分层网络管理的以下最低要求。

在第 4 级中设置 Kubernetes 群集

若要仅设置分层网络管理,则先决条件比 Azure IoT 操作部署更简单。 满不满足准备 Kubernetes 群集中的 Azure IoT 操作一般要求均可。

Microsoft 已验证用于设置 AKS 边缘软件包K3S Kubernetes 群集的以下步骤。

准备 Ubuntu 计算机

  1. Ubuntu 22.04 LTS 是推荐的主机版本。

  2. 安装 Helm 3.8.0 或更高版本。

  3. 安装 Kubectl

  4. 安装 Azure CLI。 如果计划远程访问级别 3 群集,可以直接将 Azure CLI 安装到级别 4 计算机或其他开发人员/jumpbox 计算机上。 如果选择远程访问 Kubernetes 群集以保持群集主机干净,那么对于本文中的其余步骤,请从开发人员计算机中运行 kubectl 和 az 相关命令。

    • 安装 Azure CLI。 按照在 Linux 上安装 Azure CLI 中的步骤操作。

    • 安装 connectedk8s 和其他扩展。

      az extension add --name connectedk8s
      az extension add --name k8s-extension
      

创建 K3S 群集

  1. 使用以下命令安装 K3S:

    curl -sfL https://get.k3s.io | sh -s - --disable=traefik --write-kubeconfig-mode 644
    

    有关更多详细信息,请参阅 K3s 快速入门指南

    重要

    请务必使用 --disable=traefik 参数禁用 traefik。 否则,在后续步骤中尝试为分层网络管理服务分配公共 IP 时可能会遇到问题。

  2. 将 K3s 配置 yaml 文件复制到 .kube/config

    mkdir ~/.kube
    cp ~/.kube/config ~/.kube/config.back
    sudo KUBECONFIG=~/.kube/config:/etc/rancher/k3s/k3s.yaml kubectl config view --flatten > ~/.kube/merged
    mv ~/.kube/merged ~/.kube/config
    chmod  0600 ~/.kube/config
    export KUBECONFIG=~/.kube/config
    #switch to k3s context
    kubectl config use-context default
    

通过 Arc 启用群集

  1. 使用 Azure CLI 登录。 为了避免以后出现权限问题,请务必使用浏览器窗口以交互方式登录:

    az login
    
  2. 设置用于设置步骤的环境变量。 将<>中的值替换为所选的有效值或名称。 根据提供的名称创建 CLUSTER_NAMERESOURCE_GROUP。 有关选择 LOCATION 的信息,请参阅 Azure IoT 操作支持的区域

    # Id of the subscription where your resource group and Arc-enabled cluster will be created
    $SUBSCRIPTION_ID = "<subscription-id>"
    # Azure region where the created resource group will be located
    $LOCATION = "<region>"
    # Name of a new resource group to create which will hold the Arc-enabled cluster and Azure IoT Operations resources
    $RESOURCE_GROUP = "<resource-group-name>"
    # Name of the Arc-enabled cluster to create in your resource group
    $CLUSTER_NAME = "<cluster-name>"
    
  3. 为所有命令设置 Azure 订阅上下文:

    az account set -s $SUBSCRIPTION_ID
    
  4. 在订阅中注册所需的资源提供程序:

    注意

    对于每个订阅,只需运行此步骤一次。 若要注册资源提供程序,你需要有执行 /register/action 操作的权限,该权限包含在订阅“参与者”和“所有者”角色中。 有关详细信息,请参阅 Azure 资源提供程序和类型

    az provider register -n "Microsoft.ExtendedLocation"
    az provider register -n "Microsoft.Kubernetes"
    az provider register -n "Microsoft.KubernetesConfiguration"
    
  5. 使用az group create命令在 Azure 订阅中创建资源组以存储所有资源:

    az group create --location $LOCATION --resource-group $RESOURCE_GROUP --subscription $SUBSCRIPTION_ID
    
  6. 使用az connectedk8s connect命令连接到已启用 Arc 的 Kubernetes 群集,并在上一步中创建的资源组中对其进行管理:

    az connectedk8s connect -n $CLUSTER_NAME -l $LOCATION -g $RESOURCE_GROUP --subscription $SUBSCRIPTION_ID
    

将分层网络管理服务部署到群集

一旦 Kubernetes 群集启用了 Arc,即可将分层网络管理服务部署到群集。

安装分层网络管理操作员

  1. 运行以下命令: 将占位符 <RESOURCE GROUP><CLUSTER NAME> 替换为前面步骤中的 Arc 加入信息。

    az login
    
    az k8s-extension create --resource-group <RESOURCE GROUP> --name kind-lnm-extension --cluster-type connectedClusters --cluster-name <CLUSTER NAME> --auto-upgrade false --extension-type Microsoft.IoTOperations.LayeredNetworkManagement --version 0.1.0-preview --release-train preview
    
  2. 使用 kubectl 命令验证分层网络管理操作员是否正在运行。

    kubectl get pods
    
    NAME                                   READY   STATUS    RESTARTS   AGE
    azedge-lnm-operator-598cc495c-5428j   1/1     Running   0          28h
    

配置分层网络管理服务

创建分层网络管理自定义资源。

  1. 按指定创建 lnm-cr.yaml 文件:

    • 若要调试或试验,可以将 loglevel 参数的值更改为 debug
    • 有关终结点的更多详情,请参阅 Azure IoT 操作终结点
    apiVersion: layerednetworkmgmt.iotoperations.azure.com/v1beta1
    kind: Lnm
    metadata:
      name: level4
      namespace: default
    spec:
      image:
        pullPolicy: IfNotPresent
        repository: mcr.microsoft.com/oss/envoyproxy/envoy-distroless
        tag: v1.27.0
      replicas: 1
      logLevel: "debug"
      openTelemetryMetricsCollectorAddr: "http://aio-otel-collector.azure-iot-operations.svc.cluster.local:4317"
      level: 4
      allowList:
        enableArcDomains: true
        domains:
        - destinationUrl: "management.azure.com"
          destinationType: external
        - destinationUrl: "*.dp.kubernetesconfiguration.azure.com"
          destinationType: external
        - destinationUrl: "login.microsoftonline.com"
          destinationType: external
        - destinationUrl: "*.login.microsoft.com"
          destinationType: external
        - destinationUrl: "login.windows.net"
          destinationType: external
        - destinationUrl: "mcr.microsoft.com"
          destinationType: external
        - destinationUrl: "*.data.mcr.microsoft.com"
          destinationType: external
        - destinationUrl: "gbl.his.arc.azure.com"
          destinationType: external
        - destinationUrl: "*.his.arc.azure.com"
          destinationType: external
        - destinationUrl: "k8connecthelm.azureedge.net"
          destinationType: external
        - destinationUrl: "guestnotificationservice.azure.com"
          destinationType: external
        - destinationUrl: "*.guestnotificationservice.azure.com"
          destinationType: external
        - destinationUrl: "sts.windows.net"
          destinationType: external
        - destinationUrl: "k8sconnectcsp.azureedge.net"
          destinationType: external
        - destinationUrl: "*.servicebus.windows.net"
          destinationType: external
        - destinationUrl: "graph.microsoft.com"
          destinationType: external
        - destinationUrl: "*.arc.azure.net"
          destinationType: external
        - destinationUrl: "*.obo.arc.azure.com"
          destinationType: external
        - destinationUrl: "linuxgeneva-microsoft.azurecr.io"
          destinationType: external
        - destinationUrl: "graph.windows.net"
          destinationType: external
        - destinationUrl: "*.azurecr.io"
          destinationType: external
        - destinationUrl: "*.blob.core.windows.net"
          destinationType: external
        - destinationUrl: "*.vault.azure.net"
          destinationType: external
        - destinationUrl: "*.blob.storage.azure.net"
          destinationType: external
        sourceIpRange:
        - addressPrefix: "0.0.0.0"
          prefixLen: 0
    
  2. 创建自定义资源以创建分层网络管理实例。

    kubectl apply -f lnm-cr.yaml
    
  3. 查看分层网络管理 Kubernetes 服务:

    kubectl get services
    
    NAME           TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)                                      AGE
    lnm-level-4   LoadBalancer   10.43.91.54   192.168.0.4   80:30530/TCP,443:31117/TCP,10000:31914/TCP   95s
    

为 AKS 边缘软件包添加 iptables 配置

重要

仅当在 AKS 边缘软件包群集中托管分层网络管理时,此步骤才适用。

分层网络管理部署创建 LoadBalancer 类型的 Kubernetes 服务。 若要确保可从 Kubernetes 群集外部访问该服务,需要将基础 Windows 主机的端口映射到分层网络管理服务上的相应端口。

netsh interface portproxy add v4tov4 listenport=443 listenaddress=0.0.0.0 connectport=443 connectaddress=192.168.0.4
netsh interface portproxy add v4tov4 listenport=10000 listenaddress=0.0.0.0 connectport=10000 connectaddress=192.168.0.4

成功运行这些命令后,Windows 主机上端口 443 和 10000 上收到的流量将路由到 Kubernetes 服务。 为子级网络层配置自定义 DNS 时,会将网络流量定向到此 Windows 主机的 IP,然后定向到其上运行的分层网络管理服务。