aks 集群上的 Azure 持久功能不起作用

0 docker .net-core azure-functions azure-aks

我创建了一个azure持久函数并将其放入docker容器中,一切都在docker桌面中运行,azure持久函数正在使用和MQ兔子触发器。这是代码:

        public async Task<List<string>> RunOrchestrator(
            [OrchestrationTrigger] IDurableOrchestrationContext context
            )
        {
            var job = context.GetInput<Job>();
            var outputs = new List<string>();

            try
            {
                job.JobCreationIdResult = await context.CallActivityAsync<string>("JobExecutor_CreateJobSimple", job);
            }
            catch (Exception ex)
            {
                _logger.ForContext<JobExecutorSimple>().Error(ex.Message, ex);                
                return outputs;
            }

            return outputs;
        }

        [FunctionName("JobExecutor_CreateJobSimple")]
        public async Task<string> CreateJob([ActivityTrigger] Job job)
        {
            _logger.ForContext<JobExecutorSimple>().Information($"result JobId: {job.MktJobId}");
            return "done";
        }
        
        [FunctionName("JobExecutor_RabbitMQStartSimple")]        
        public async Task RabbitMQStart(
            [RabbitMQTrigger("mkt-executor-q-local", ConnectionStringSetting = "mkt-Executor-RabbitMqConnection")] Job job,
            [DurableClient] IDurableOrchestrationClient starter)
        {            
            string instanceId = await starter.StartNewAsync("JobExecutorSimple", job);
            _logger.ForContext<JobExecutorSimple>().Information($"Started orchestration with ID = '{instanceId}'.");            
        } 
Run Code Online (Sandbox Code Playgroud)

没什么花哨的,将相同的图像部署到 aks 我收到以下日志:

[40m[32minfo[39m[22m[49m: Host.Startup[0]
      Job host started
[40m[32minfo[39m[22m[49m: Microsoft.Azure.WebJobs.Host.DrainModeManager[0]
      DrainMode mode enabled
[40m[32minfo[39m[22m[49m: Microsoft.Azure.WebJobs.Host.DrainModeManager[0]
      Calling StopAsync on the registered listeners
[40m[32minfo[39m[22m[49m: Host.Startup[0]
      Stopping the listener 'Microsoft.Azure.WebJobs.Extensions.DurableTask.DurableTaskListener' for function 'JobExecutorSimple'
[40m[32minfo[39m[22m[49m: Host.Startup[0]
      Stopped the listener 'Microsoft.Azure.WebJobs.Extensions.DurableTask.DurableTaskListener' for function 'JobExecutorSimple'
[40m[32minfo[39m[22m[49m: Host.Startup[0]
      Stopping the listener 'Microsoft.Azure.WebJobs.Extensions.DurableTask.DurableTaskListener' for function 'JobExecutor_CreateJobSimple'
[40m[32minfo[39m[22m[49m: Host.Triggers.DurableTask[0]
      Stopping task hub worker. IsGracefulStop: False. InstanceId: . Function: . HubName: SimpleFunction. AppName: . SlotName: . ExtensionVersion: 2.6.0. SequenceNumber: 2.
[40m[32minfo[39m[22m[49m: Host.Startup[0]
      Stopping the listener 'Microsoft.Azure.WebJobs.Extensions.RabbitMQ.RabbitMQListener' for function 'JobExecutor_RabbitMQStartSimple'
[40m[32minfo[39m[22m[49m: Host.Startup[0]
      Stopped the listener 'Microsoft.Azure.WebJobs.Extensions.RabbitMQ.RabbitMQListener' for function 'JobExecutor_RabbitMQStartSimple'
[40m[32minfo[39m[22m[49m: Host.Triggers.DurableTask[0]
      Task hub worker stopped. IsGracefulStop: False. Latency: 00:00:01.2084240. InstanceId: . Function: . HubName: SimpleFunction. AppName: . SlotName: . ExtensionVersion: 2.6.0. SequenceNumber: 3.
[40m[32minfo[39m[22m[49m: Host.Startup[0]
      Stopped the listener 'Microsoft.Azure.WebJobs.Extensions.DurableTask.DurableTaskListener' for function 'JobExecutor_CreateJobSimple'
[40m[32minfo[39m[22m[49m: Microsoft.Azure.WebJobs.Host.DrainModeManager[0]
      Call to StopAsync complete, registered listeners are now stopped
[40m[32minfo[39m[22m[49m: Host.General[337]
      Host lock lease acquired by instance ID '000000000000000000000000B7700D04'.
Run Code Online (Sandbox Code Playgroud)

基本上该函数不执行任何操作。

我遇到的第一个错误与无法释放租约有关,因此我必须在主机文件中将其关闭:

"extensions": {
    "durableTask": {
      "hubName": "SimpleFunction",
      "useAppLease": false
    }
  }
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以让 azure 持久函数在没有 KEDA 的情况下在 aks 中工作,或者它是强制性的?,我们真的不希望扩展。

小智 7

我\xe2\x80\x99 最近花了几周时间处理同样的问题,其中 DrainMode 会启动并阻止侦听器无缘无故地运行,并且仅在 AKS 上,我们无法在本地重新创建它。

\n

在我们的例子中,原因是应用程序启动时,基础映像设置了一个环境变量 ASPNETCORE_URLS 以绑定到端口 80。但是,在 AKS 中,我们在部署中设置了一个安全上下文,以不允许容器以 root 身份运行,并且只有 root 用户可以绑定到 < 1024 的端口。这导致了您共享的相同日志跟踪,其中耗尽模式启动并且侦听器停止,但没有记录发生这种情况的原因。

\n

我们的修复方法是在 dockerfile 中公开端口 8080 并将 ASPNETCORE_URLS 设置为 http://+:8080

\n