azure-container-instances - Azure 容器实例上的 Net Core 3.1 gRPC 服务器仅侦听端口 80
问题描述
- 我正在 Windows 10 64 位上使用 Visual Studio 2019 16.7.2 测试 gRPC,使用 Net Core 3.1 和模板 3.1.8 Greeting Service 示例创建 gRPC 服务器。
- 还使用带有 Google.Protobuf 3.13.0、Grpc.Net.Client 2.31.0 和 Grpc.Tools 2.31.0 的 Net Core 3.1 创建客户端
- 它使用 Docker Desktop for Windows 10 64bits 在 Linux Container 上运行良好。
- 然后我在 Azure Container Register 上部署了容器镜像,在我使用相同的 Linux 镜像创建了一个 Azure 容器实例之后,添加了端口:443、5001,如图所示,但它只监听端口 80 上的调用。
- 码头工人文件:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
EXPOSE 5001
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["GrpcService/GrpcService.csproj", "GrpcService/"]
RUN dotnet restore "GrpcService/GrpcService.csproj"
COPY . .
WORKDIR "/src/GrpcService"
RUN dotnet build "GrpcService.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "GrpcService.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "GrpcService.dll"]
解决方案
正如我所读到的,VS 使用开发人员证书在 localhost 上启用 SSL,这就是在 Docker Desktop 上打开端口的原因;但是当为部署构建 Docker 映像时,ASP 基础映像与 gRPC 服务器合并,因为没有证书,只打开端口 80
解决方案是使用反向代理:https ://docs.microsoft.com/en-us/azure/container-instances/container-instances-container-group-ssl
基于 Nginx gRPC 支持:https ://www.nginx.com/blog/nginx-1-13-10-grpc/ 需要对 nginx.conf 文件进行一些调整
server {
listen [::]:5001 ssl http2;
listen 5001 ssl http2;
server_name localhost;
ssl_protocols TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-RSA-RC4-SHA:ECDHE-ECDSA-RC4-SHA:AES128:AES256:RC4-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 24h;
keepalive_timeout 300;
add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains';
ssl_certificate /etc/nginx/ssl.crt;
ssl_certificate_key /etc/nginx/ssl.key;
location / {
grpc_pass grpc://localhost:80;
}
}
在 Deploy YAML 上添加 DNS 标签也很有用,因为 ip 地址可能会在容器映像更新时发生变化
ipAddress:
dnsNameLabel: mydnslabel
ports:
- port: 5001
protocol: TCP
type: Public
推荐阅读
- html - 如何将表格中的表格居中
- c# - 带有字典的 asp.net 核心 ioptions
- spring - Spring HTTP 基本身份验证会话身份验证
- python - 如何使函数在 fastAPI 中异步运行得更快?
- oracle - ORA-00900: 无效的 SQL 语句 - 当使用 node-oracledb 运行查询时
- c# - C#读取数据多个COM端口
- http - 谷歌搜索控制台 http https 索引
- javascript - 通过原始 DOM 引用元素查找克隆元素
- python - Pytorch Transformer 的维度问题
- python - Jupyter 拒绝在 VS Code 交互模式下加载虚拟环境