将 Teams 应用部署到容器服务

可以将 Teams 机器人或选项卡应用部署到 Azure 容器应用、Azure Kubernetes 服务 (AKS) 或本地 Kubernetes 群集。

先决条件

下载 示例 Teams 机器人示例 Teams 选项卡应用,为 Azure 容器应用开发提供随时可用的体验。 可以进行一些配置更改,并将其部署到 AKS 或本地 Kubernetes 群集。

在开始之前,请确保具有以下工具:

  • Azure AD 帐户。

  • 适用于 Azure 容器应用或 AKS 部署的 Azure 命令行接口 (CLI) 。

注意

本文中的命令基于 Git Bash。 如果使用任何其他接口,请根据需要更新命令。

部署到 Azure 容器应用

Azure 容器应用是一项完全托管的服务,可用于在云中运行容器化应用程序。 如果你不需要直接访问所有本机 Kubernetes API 和群集管理,并且你更喜欢基于最佳做法的完全托管体验,则这是一个理想的选择。

借助示例应用程序,可以在 Teams 工具包中运行预配和部署命令。 Teams 工具包为你创建 Azure 容器注册表和 Azure 容器应用,并将应用构造为容器映像,并将其部署到 Azure 容器应用。

provision 命令创建并配置以下资源:

  • 具有选项卡或机器人功能的 Teams 应用。
  • 用于托管容器映像的 Azure 容器注册表。
  • 用于托管应用的 Azure 容器应用环境和 Azure 容器应用。
  • 用于身份验证的Microsoft Entra 应用。

在示例 Teams 机器人中 provision ,命令还会创建一个 Azure 机器人服务来引导 Teams 客户端和 Azure 容器应用。

deploy 命令执行以下操作:

  • 将应用生成到容器映像中。
  • 将容器映像推送到 Azure 容器注册表。
  • 将映像部署到 Azure 容器应用。

将 Teams 机器人部署到 Azure Kubernetes 服务

AKS 是 Azure 提供的托管容器业务流程服务。 使用 AKS,可以在 Azure 中完全管理 Kubernetes 体验。

体系结构

屏幕截图显示 Teams 机器人到 Azure Kubernetes 服务体系结构。

Teams 后端服务器通过 Azure 机器人服务与机器人交互。 此服务要求机器人可以通过公共 HTTPS 终结点进行访问。 若要进行设置,请在 Kubernetes 群集上部署入口控制器,并使用 TLS 证书对其进行保护。

可以使用 Microsoft Entra ID 通过 Azure 机器人服务对机器人进行身份验证。 创建包含应用 ID 和密码的 Kubernetes 机密,并将该机密集成到容器的运行时配置中。

在 AKS 上使用 HTTPS 设置入口

  1. 确保 AKS 已连接到托管容器映像的 Azure 容器注册表。 有关详细信息,请参阅 使用 Azure CLI

  2. 运行以下命令以安装入口控制器和证书管理器:

    NAMESPACE=teams-bot
    
    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    helm repo update
    helm install ingress-nginx ingress-nginx/ingress-nginx --create-namespace --namespace $NAMESPACE \
        --set controller.nodeSelector."kubernetes\.io/os"=linux  \
        --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux  \
        --set controller.healthStatus=true \
        --set controller.service.externalTrafficPolicy=Local \
        --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz 
    
    helm repo add jetstack https://charts.jetstack.io
    helm repo update
    helm install cert-manager jetstack/cert-manager --namespace $NAMESPACE --set installCRDs=true --set nodeSelector."kubernetes\.io/os"=linux
    

    注意

    还可以按照 创建非托管入口控制器 中的说明操作, 并将 TLS 与 Let's encrypt certificate 配合使用 ,在 Kubernetes 群集上设置入口和 TLS 证书。

  3. 运行以下命令以更新入口公共 IP 的 DNS 并获取入口终结点:

    > kubectl get services --namespace $NAMESPACE -w ingress-nginx-controller
    
    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
    ingress-nginx-controller LoadBalancer $CLUSTER_IP $EXTERNAL_IP 80:32514/TCP,443:32226/TCP
    
    > PUBLICIPID=$(az network public-ip list --query "[?ipAddress!=null]|[?contains(ipAddress, '$EXTERNAL_IP')].[id]" --output tsv)
    > az network public-ip update --ids $PUBLICIPID --dns-name $DNSLABEL
    > az network public-ip show --ids $PUBLICIPID --query "[dnsSettings.fqdn]" --output tsv
    
    $DNSLABEL.$REGION.cloudapp.azure.com
    

使用 Teams 工具包预配资源

可以使用 provision Teams 工具包中的 命令创建具有机器人功能的 Teams 应用,合并 Azure 机器人服务,并添加Microsoft Entra ID 进行身份验证。

若要使用 Teams 工具包预配资源,请执行以下步骤:

  1. 打开之前下载的示例应用。

  2. 转到 文件, env/.env.${envName} 并使用 FQDN 更新 BOT_DOMAIN 值。

  3. 转到 teamsapp.yml 文件并更新以下 arm/deploy 操作,以确保 Teams 工具包在执行 provision 命令期间预配 Azure 机器人服务:

    - uses: arm/deploy 
      with:
        subscriptionId: ${{AZURE_SUBSCRIPTION_ID}} 
        resourceGroupName: ${{AZURE_RESOURCE_GROUP_NAME}} 
        templates:
          - path: ./infra/botRegistration/azurebot.bicep
            parameters: ./infra/botRegistration/azurebot.parameters.json
            deploymentName: Create-resources-for-bot
        bicepCliVersion: v0.9.1
    
  4. provision在 Teams 工具包中运行 命令。

  5. 预配后,在 文件中env/.env.${envName}找到 ,在 文件中找到BOT_ID加密SECRET_BOT_PASSWORDenv/.env.${envName}.user 。 获取 的实际值 BOT_PASSWORD。 选择“解密机密”批注。

  6. 若要创建包含 和 BOT_PASSWORDBOT_ID Kubernetes 机密,请在文件中保存密钥值对./deploy/.env.dev-secrets,并执行以下命令来预配机密:

    kubectl create secret generic dev-secrets --from-env-file ./deploy/.env.dev-secrets -n $NAMESPACE
    

应用部署

此示例包含部署文件 deploy/sso-bot.yaml,供你参考。

  1. 更新以下占位符:

    1. <image>:更新映像。 例如,myacr.azurecr.io/sso-bot:latest

    2. <hostname>:更新入口 FQDN。

  2. 若要应用 deploy/tab.yaml,请运行以下命令:

    kubectl apply -f deploy/sso-bot.yaml -n $NAMESPACE
    
  3. 转到 Visual Studio Code。

  4. “运行和调试” 面板中,选择“ 启动远程” 配置。

  5. 若要预览 AKS 上部署的 Teams 机器人应用程序,请选择“ 开始调试” (F5)

将 Teams 机器人部署到本地 Kubernetes 群集

可以按照用于在 AKS 上部署 Teams 机器人的类似步骤,将 Teams 机器人部署到个人 Kubernetes 群集或不同云服务中的 Kubernetes 服务。

体系结构

屏幕截图显示了本地 kubernetes 群集体系结构。

Teams 后端服务器通过 Azure 机器人服务与机器人交互。 此服务要求机器人可以通过公共 HTTPS 终结点进行访问。 若要进行设置,请在 Kubernetes 群集上部署入口控制器,并使用 TLS 证书对其进行保护。

可以使用 Microsoft Entra ID 通过 Azure 机器人服务对机器人进行身份验证。 创建包含应用 ID 和密码的 Kubernetes 机密,并将该机密集成到容器的运行时配置中。

使用 Teams 工具包预配资源

可以使用 provision Teams 工具包中的 命令创建具有机器人功能的 Teams 应用,合并 Azure 机器人服务,并添加Microsoft Entra ID 进行身份验证。

若要使用 Teams 工具包预配资源,请执行以下步骤:

  1. 打开之前下载的示例应用。

  2. 转到 文件, env/.env.${envName} 并使用 FQDN 更新 BOT_DOMAIN 值。

  3. 转到 teamsapp.yml 文件并更新以下 arm/deploy 操作,以确保 Teams 工具包在执行 provision 命令期间预配 Azure 机器人服务:

    - uses: arm/deploy 
      with:
        subscriptionId: ${{AZURE_SUBSCRIPTION_ID}} 
        resourceGroupName: ${{AZURE_RESOURCE_GROUP_NAME}} 
        templates:
          - path: ./infra/botRegistration/azurebot.bicep
            parameters: ./infra/botRegistration/azurebot.parameters.json
            deploymentName: Create-resources-for-bot
        bicepCliVersion: v0.9.1
    
  4. teamsapp.yml在 文件中,在botFramework/create预配阶段更新操作。 此操作使 Teams 工具包能够创建具有相应消息传送终结点的机器人注册。

    注意

    建议使用 Azure 机器人服务进行通道。 如果没有 Azure 帐户,并且无法创建 Azure 机器人服务,则可以创建机器人注册。

    - uses: botFramework/create
        with:
        botId: ${{BOT_ID}}
        name: <Bot display name>
        messagingEndpoint: https://${{BOT_DOMAIN}}/api/messages
        description: ""
        channels:
            - name: msteams
    

    可以删除文件中teamsapp.yml的操作arm/deploy,因为我们不需要任何 Azure 资源。

  5. provision在 Teams 工具包中运行 命令。

  6. 预配后,在 env/.env.${envName} 文件中找到 ,在 文件中找到BOT_ID加密SECRET_BOT_PASSWORDenv/.env.${envName}.user 。 获取 的实际值 BOT_PASSWORD。 选择“解密机密”批注。

  7. 若要创建包含 和 BOT_PASSWORDBOT_ID Kubernetes 机密,请在文件中保存密钥值对./deploy/.env.dev-secrets,并执行以下命令来预配机密:

    kubectl create secret generic dev-secrets --from-env-file ./deploy/.env.dev-secrets -n $NAMESPACE
    

应用部署

此示例包含部署文件 deploy/sso-bot.yaml,供你参考。

  1. 更新以下占位符:

    1. <image>:更新映像。 例如,myacr.azurecr.io/sso-bot:latest

    2. <hostname>:更新入口 FQDN。

  2. 若要应用 deploy/tab.yaml,请运行以下命令:

    kubectl apply -f deploy/sso-bot.yaml -n $NAMESPACE
    
  3. 转到 Visual Studio Code。

  4. “运行和调试” 面板中,选择“ 启动远程” 配置。

  5. 若要预览 AKS 上部署的 Teams 机器人应用程序,请选择“ 开始调试” (F5)

将 Teams 选项卡应用部署到 Kubernetes

AKS 充当 Azure 提供的托管容器业务流程服务。 使用 AKS,可以在 Azure 中完全管理 Kubernetes 体验。

将 Teams 选项卡应用部署到 AKS 类似于将 Web 应用部署到 AKS。 但是,由于 Teams 选项卡应用需要 HTTPS 连接,你需要拥有域并在 AKS 中设置 TLS 入口。

还可以将 Teams 选项卡应用部署到个人 Kubernetes 群集或不同云平台上的 Kubernetes 服务。 这涉及到类似于在 Azure Kubernetes 服务上部署时使用的步骤。

在 AKS 上使用 HTTPS 设置入口

  1. 确保 AKS 已连接到托管容器映像的 Azure 容器注册表。 有关详细信息,请参阅 Azure CLI

  2. 运行以下命令以安装入口控制器和证书管理器:

    NAMESPACE=teams-tab
    
    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    helm repo update
    helm install ingress-nginx ingress-nginx/ingress-nginx --create-namespace --namespace $NAMESPACE \
        --set controller.nodeSelector."kubernetes\.io/os"=linux  \
        --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux  \
        --set controller.healthStatus=true \
        --set controller.service.externalTrafficPolicy=Local \
        --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz 
    
    helm repo add jetstack https://charts.jetstack.io
    helm repo update
    helm install cert-manager jetstack/cert-manager --namespace $NAMESPACE --set installCRDs=true --set nodeSelector."kubernetes\.io/os"=linux
    

    注意

    还可以按照 创建非托管入口控制器 中的说明操作, 并将 TLS 与 Let's encrypt certificate 配合使用 ,在 Kubernetes 群集上设置入口和 TLS 证书。

  3. 运行以下命令以更新入口公共 IP 的 DNS 并获取入口终结点:

    > kubectl get services --namespace $NAMESPACE -w ingress-nginx-controller
    
    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
    ingress-nginx-controller LoadBalancer $CLUSTER_IP $EXTERNAL_IP 80:32514/TCP,443:32226/TCP
    
    > PUBLICIPID=$(az network public-ip list --query "[?ipAddress!=null]|[?contains(ipAddress, '$EXTERNAL_IP')].[id]" --output tsv)
    > az network public-ip update --ids $PUBLICIPID --dns-name $DNSLABEL
    > az network public-ip show --ids $PUBLICIPID --query "[dnsSettings.fqdn]" --output tsv
    
    $DNSLABEL.$REGION.cloudapp.azure.com
    

使用 Teams 工具包预配资源

可以使用 provision Teams 工具包中的 命令创建具有选项卡功能的 Teams 应用,合并 Azure 机器人服务,并添加Microsoft Entra ID 进行身份验证。

若要使用 Teams 工具包预配资源,请执行以下步骤:

  1. 打开之前下载的示例应用。

  2. 转到 文件, env/.env.${envName} 并使用 FQDN 更新 TAB_DOMAIN 值。

  3. 转到 teamsapp.yml 文件并删除操作 arm/deploy ,因为不需要其他 Azure 资源。

  4. provision在 Teams 工具包中运行 命令。

  5. 使用 Teams 工具包创建Microsoft Entra ID,你可能希望将其设置为应用环境变量。

  6. 预配后,在 env/.env.${envName} 文件中找到 ,在 文件中找到AAD_APP_CLIENT_ID加密SECRET_AAD_APP_CLIENT_SECRETenv/.env.${envName}.user

  7. 获取 的实际值 SECRET_AAD_APP_CLIENT_SECRET。 选择“解密机密”批注。

应用部署

此示例包含部署文件 deploy/tab.yaml,供你参考。

  1. 更新以下占位符:

    1. <tab-image>:更新映像。 例如,myacr.azurecr.io/tab:latest

    2. <api-image>:更新 API 映像。 如果没有 API,请删除服务并从 hello-world-apiyaml 文件进行部署。

    3. <hostname>:更新入口 FQDN。

  2. 若要应用 deploy/tab.yaml,请运行以下命令:

    kubectl apply -f deploy/tab.yaml -n $NAMESPACE
    
  3. 转到 Visual Studio Code。

  4. “运行和调试” 面板中,选择“ 启动远程” 配置。

  5. 若要预览 AKS 上部署的 Teams 机器人应用程序,请选择“ 开始调试” (F5)