【问题标题】:Run Azure Function Service Bus Trigger in Docker Container locally and K8S在本地和 K8S 中运行 Docker 容器中的 Azure Function Service Bus Trigger
【发布时间】:2021-01-12 23:31:17
【问题描述】:

这可能是一件简单的事情,但我正在努力弄清楚如何在 Azure Functions 3.0 下,在 docker 容器中运行服务总线触发器(或任何后台任务触发器),以便在本地运行(对于测试)并最终在 K8S 中。

我发现的大多数示例(包括来自 MS 的)似乎都使用了简单的 HTTP 触发器。虽然我使用的是已编译的 C# 函数,但我发现了一个用于服务总线的 python 示例,但目前还不清楚您是如何在本地容器中运行函数一次以进行测试或在无 AKS环境。我发现的示例没有引用此步骤 - 它似乎是“魔术”。

我使用了 func init --docker-only --csharp 来修补这个 docker 文件:

FROM mcr.microsoft.com/azure-functions/dotnet:3.0

COPY bin/Release/netcoreapp3.1/publish/bin/ /home/site/wwwroot
ENV AzureWebJobsScriptRoot=/home/site/wwwroot

但这并没有告诉我我需要如何启动 azure 函数。 azure 函数基础 docker 镜像不包含 func 工具,因此我可以在 dockerfile 中调用 func xxxxxx 来启动函数。

我期待类似 ENTRYPOINT 之类的东西,我将其用于普通 Web api 或其他一些步骤来调用 BASH 命令来启动 azure 函数,但由“func”创建的默认 dockerfile 不包括此。

我认为这并不重要,但最终我们将在本地 K8S 部署上运行这些以进行开发测试 - 它们可能永远不会真正在 AKS 本身中运行。

【问题讨论】:

  • 最终它是神奇的,因为它正在工作。关键是将 ENV AzureFunctionsJobHost__Logging__Console__IsEnabled=true 添加到 docker 文件中。然后它会写出它执行的主机的日志记录,然后您可以看到正在启动的功能。

标签: docker azure-functions


【解决方案1】:

我正在努力让它也能正常工作,但给我带来最多问题的一件事是连接字符串。 这些是通过环境变量给出的。

对于服务总线,真正了解何时使用命名空间字符串以及何时使用队列/主题之一。

如果你想了解更多关于 k8s 中 azure 函数的文档,请查看 KEDA 包。

【讨论】:

  • 最后,我们放弃了,因为它们在 docker 容器中不能很好地工作,除非您准备将连接字符串作为单个值传递。在我们的例子中,我们希望将模板连接字符串传递给容器,然后从密钥库中提取安全凭证以在运行时更新模板。服务总线的 Azure 函数框架不能以这种方式工作 - 它要求连接字符串在容器启动时完成。最后,我们将它重新编写为托管服务。它更容易配置,而且我们并没有因为 azure 函数而损失太多
  • 我们现在正在尝试,将使用密钥库连接来处理它。托管服务是您的服务的一个选项,可以一直运行,是这种情况还是您以不同的方式使其扩展?
  • 我们最终选择了托管服务。我们必须自己添加额外的代码来连接到服务总线,但坦率地说,这使得许多其他配置问题也消失了,因为我们拥有完全的控制权。回想起来,我真的不认为容器中的 Azure Functions 值得麻烦——在 pod 中运行一个简单的服务可以让我们做我们想做的事,而不必与 Functions 框架作斗争,而且无论如何我们都拥有 KEDA 的优势。跨度>
【解决方案2】:

确保您将以下内容作为环境变量传递:

  • “ServiceBusConnection”(ConnectionString) 或“ServiceBusConnection__fullyQualifiedNamespace”,如果您使用的是托管身份。
  • “AzureWebJobsStorage”或“AzureWebJobsStorage__accountName”(如果您使用托管标识)。

使用基于身份的连接而不是带有触发器和绑定的秘密的文档:https://docs.microsoft.com/en-us/azure/azure-functions/functions-identity-based-connections-tutorial-2

【讨论】:

    【解决方案3】:

    我最近发现的另一个问题是,因为我在 Azure Functions 项目中安装了以下 NuGet 包,所以这些函数永远不会被触发,并且日志中也不会显示任何错误的输出。 在我删除包和启动中的调用后,一切都开始正常工作了。

    不要添加这个包:

    Microsoft.ApplicationInsights.Kubernetes
    

    【讨论】:

    • 为什么这会阻止函数的启动?
    猜你喜欢
    • 2022-12-27
    • 2020-02-27
    • 2022-08-17
    • 2023-02-01
    • 2021-02-25
    • 2022-01-22
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多