将Consul与Azure App Services结合使用

Gio*_*lbo 7 azure azure-web-sites consul

我希望所有Azure Web应用程序服务以及Azure以外的资源都集中在一个地方。领事的关键价值存储似乎很合适(如果有其他更好的选择,我很高兴听到其他建议)。根据我对Consul的有限了解,每个节点都需要运行一个代理才能访问键值存储。

它是否正确?如果是这样,我该怎么做,是否可以通过Azure中的连续webjob进行?如果没有,如何在没有代理的情况下访问KV商店?

Eug*_*kov 5

看来我们将完全无法与Azure App Service(又名Web Apps)一起使用领事。

这是我尝试过的。

1.天真的方法-担任WebJob领事

由于网络限制,尝试连接到任何本地主机端口时,属于应用程序服务(Web App)本身的进程未产生的内容将以以下异常结束。

尝试以访问权限127.0.0.1:8500禁止的方式访问套接字。

来自文档的参考:

https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox#networking-restrictions注意事项

可以通过Internet访问应用程序的唯一方法是通过已公开的HTTP(80)和HTTPS(443)TCP端口;否则,无法访问Internet。应用程序可能不会在其他端口上侦听来自Internet的数据包。但是,应用程序可以创建一个套接字,该套接字可以侦听来自沙箱中的连接。例如,同一应用程序中的两个进程可以通过TCP套接字相互通信;从沙箱外部传入的连接尝试(即使它们位于同一台计算机上)将失败。有关更多详细信息,请参见下一主题。

这是一个有趣的片段:

尝试连接到本地地址(例如localhost,127.0.0.1)和计算机自己的IP将失败,除非同一沙箱中的另一个进程在目标端口上创建了侦听套接字

2.领事从App Service本身产生

我已经复制consul到Web App(作为构建输出),并在应用程序启动代码中添加了以下几行:

var consul = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin/consul/consul.exe");

Process.Start(consul, "agent --data-dir=../../data");
Process.Start(consul, "join my-cluster-dns.name");
Run Code Online (Sandbox Code Playgroud)

...它加入了集群我什至能够通过127.0.0.1:8500App Service(Web App)本身连接到领事。

但是,它仍然是无用的设置,因为必须可以从服务器访问Consul代理,因此,从群集的角度来看,我只能看到一个死节点,并且“自我”运行状况检查失败。再次,根据文档,这没有解决方法:“可以通过Internet访问应用程序的唯一方法是通过已经公开的HTTP(80)和HTTPS(443)TCP端口”。

https://www.consul.io/docs/agent/basics.html

并非集群中的所有Consul代理都必须使用相同的端口,但是所有其他节点都必须可以访问此地址。

摘要

总而言之,可能无法通过Azure App Services正确托管/使用Consul。

领事


piz*_*cki 1

您不需要 Consul Agent 来检索应用程序的配置。

您可以使用库Winton.Extensions.Configuration.Consul。它引入了可以集成到您的应用程序中的配置提供程序文档)。

这里是示例配置(此处提供完整的示例项目)

internal sealed class Program
{
    public static IHostBuilder CreateHostBuilder(string[] args)
    {
        return Host
            .CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(builder => builder.UseStartup<Startup>())
            .ConfigureAppConfiguration(
                builder =>
                {
                    builder
                        .AddConsul(
                            "appsettings.json",
                            options =>
                            {
                                options.ConsulConfigurationOptions =
                                    cco => { cco.Address = new Uri("http://consul:8500"); };
                                options.Optional = true;
                                options.PollWaitTime = TimeSpan.FromSeconds(5);
                                options.ReloadOnChange = true;
                            })
                        .AddEnvironmentVariables();
                });
    }

    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }
}
Run Code Online (Sandbox Code Playgroud)

您的应用程序配置将定期更新。