将 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 机器人服务与机器人交互。 此服务要求机器人可以通过公共 HTTPS 终结点进行访问。 若要进行设置,请在 Kubernetes 群集上部署入口控制器,并使用 TLS 证书对其进行保护。
可以使用 Microsoft Entra ID 通过 Azure 机器人服务对机器人进行身份验证。 创建包含应用 ID 和密码的 Kubernetes 机密,并将该机密集成到容器的运行时配置中。
在 AKS 上使用 HTTPS 设置入口
确保 AKS 已连接到托管容器映像的 Azure 容器注册表。 有关详细信息,请参阅 使用 Azure CLI。
运行以下命令以安装入口控制器和证书管理器:
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 证书。
运行以下命令以更新入口公共 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 工具包预配资源,请执行以下步骤:
打开之前下载的示例应用。
转到 文件,
env/.env.${envName}
并使用 FQDN 更新BOT_DOMAIN
值。转到
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
provision
在 Teams 工具包中运行 命令。预配后,在 文件中
env/.env.${envName}
找到 ,在 文件中找到BOT_ID
加密SECRET_BOT_PASSWORD
的env/.env.${envName}.user
。 获取 的实际值BOT_PASSWORD
。 选择“解密机密”批注。若要创建包含 和
BOT_PASSWORD
的BOT_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
,供你参考。
更新以下占位符:
<image>
:更新映像。 例如,myacr.azurecr.io/sso-bot:latest
。<hostname>
:更新入口 FQDN。
若要应用
deploy/tab.yaml
,请运行以下命令:kubectl apply -f deploy/sso-bot.yaml -n $NAMESPACE
转到 Visual Studio Code。
在 “运行和调试” 面板中,选择“ 启动远程” 配置。
若要预览 AKS 上部署的 Teams 机器人应用程序,请选择“ 开始调试” (F5) 。
将 Teams 机器人部署到本地 Kubernetes 群集
可以按照用于在 AKS 上部署 Teams 机器人的类似步骤,将 Teams 机器人部署到个人 Kubernetes 群集或不同云服务中的 Kubernetes 服务。
体系结构
Teams 后端服务器通过 Azure 机器人服务与机器人交互。 此服务要求机器人可以通过公共 HTTPS 终结点进行访问。 若要进行设置,请在 Kubernetes 群集上部署入口控制器,并使用 TLS 证书对其进行保护。
可以使用 Microsoft Entra ID 通过 Azure 机器人服务对机器人进行身份验证。 创建包含应用 ID 和密码的 Kubernetes 机密,并将该机密集成到容器的运行时配置中。
使用 Teams 工具包预配资源
可以使用 provision
Teams 工具包中的 命令创建具有机器人功能的 Teams 应用,合并 Azure 机器人服务,并添加Microsoft Entra ID 进行身份验证。
若要使用 Teams 工具包预配资源,请执行以下步骤:
打开之前下载的示例应用。
转到 文件,
env/.env.${envName}
并使用 FQDN 更新BOT_DOMAIN
值。转到
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
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 资源。provision
在 Teams 工具包中运行 命令。预配后,在
env/.env.${envName}
文件中找到 ,在 文件中找到BOT_ID
加密SECRET_BOT_PASSWORD
的env/.env.${envName}.user
。 获取 的实际值BOT_PASSWORD
。 选择“解密机密”批注。若要创建包含 和
BOT_PASSWORD
的BOT_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
,供你参考。
更新以下占位符:
<image>
:更新映像。 例如,myacr.azurecr.io/sso-bot:latest
。<hostname>
:更新入口 FQDN。
若要应用
deploy/tab.yaml
,请运行以下命令:kubectl apply -f deploy/sso-bot.yaml -n $NAMESPACE
转到 Visual Studio Code。
在 “运行和调试” 面板中,选择“ 启动远程” 配置。
若要预览 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 设置入口
确保 AKS 已连接到托管容器映像的 Azure 容器注册表。 有关详细信息,请参阅 Azure CLI。
运行以下命令以安装入口控制器和证书管理器:
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 证书。
运行以下命令以更新入口公共 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 工具包预配资源,请执行以下步骤:
打开之前下载的示例应用。
转到 文件,
env/.env.${envName}
并使用 FQDN 更新TAB_DOMAIN
值。转到
teamsapp.yml
文件并删除操作arm/deploy
,因为不需要其他 Azure 资源。provision
在 Teams 工具包中运行 命令。使用 Teams 工具包创建Microsoft Entra ID,你可能希望将其设置为应用环境变量。
预配后,在
env/.env.${envName}
文件中找到 ,在 文件中找到AAD_APP_CLIENT_ID
加密SECRET_AAD_APP_CLIENT_SECRET
的env/.env.${envName}.user
。获取 的实际值
SECRET_AAD_APP_CLIENT_SECRET
。 选择“解密机密”批注。
应用部署
此示例包含部署文件 deploy/tab.yaml
,供你参考。
更新以下占位符:
<tab-image>
:更新映像。 例如,myacr.azurecr.io/tab:latest
。<api-image>
:更新 API 映像。 如果没有 API,请删除服务并从hello-world-api
yaml 文件进行部署。<hostname>
:更新入口 FQDN。
若要应用
deploy/tab.yaml
,请运行以下命令:kubectl apply -f deploy/tab.yaml -n $NAMESPACE
转到 Visual Studio Code。
在 “运行和调试” 面板中,选择“ 启动远程” 配置。
若要预览 AKS 上部署的 Teams 机器人应用程序,请选择“ 开始调试” (F5) 。