Docker compose 正在为 Dotnet 核心项目工作时 Kubernetes 因 SSL 错误而失败
Kubernetes failing with SSL error while Docker compose is working for Dotnet core project
我是 Kubernetes 的新手,我正在本地开发中尝试其中的一些。在我给出问题陈述之前,这里是我的环境和项目状态。
- 我有 Windows 10 和 Ubuntu 运行 通过 VS Code 启用 WSL2。
- 我已经在 VS Code 中启用了所需的插件(比如 Kubernetes,Docker 等等)
- 我安装了 Docker 桌面,启用了 WSL2 + Ubuntu + Kubernetes。
- 我的本地系统有 ASP.Net Core 5 工作版本 + ubuntu 到 Docker
- 我有 dockerfile + docker compose 文件,我已经测试了所有使用和不使用 SSL 端口的文件,这些文件使用 SSL 和不使用 SSL。 (为此我修改了程序以接受非 SSL 请求)。
即将进入 docker 文件
-- 它需要公开的端口,如 5000(对于非 SSL)和 5001(对于 SSL)
即将 docker 撰写文件
-- 它需要像 5000:80
和 5000:443
这样的映射
-- 它也有 URL 的环境变量,如
ASPNETCORE_URLS=https://+5001;http://+5000
-- 它也有证书路径的环境变量,如
ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx
-- 它也有证书密码的环境变量,如
ASPNETCORE_Kestrel__Certificates__Default__Password=SECRETPASSWORD
现在,当我说 docker compose up --build
它会构建项目并启动容器。
我可以通过 https://localhost:5001 和 http://localhost:5000
访问网站
现在,来到 kubernets
-- 我已经使用 kompose 工具生成 kubernetes 特定的 yaml 文件
-- 我没有做任何改变。我运行命令kompose convert -f docker-compose.yaml -o ./.k8
-- 最后,我运行kubectl apply -f .k8
它启动容器但立即失败。我检查了日志,它说了以下内容:
crit: Microsoft.AspNetCore.Server.Kestrel[0]
Unable to start Kestrel.
Interop+Crypto+OpenSslCryptographicException: error:2006D080:BIO routines:BIO_new_file:no such file
at Interop.Crypto.CheckValidOpenSslHandle(SafeHandle handle)
at Internal.Cryptography.Pal.OpenSslX509CertificateReader.FromFile(String fileName, SafePasswordHandle password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(String fileName, String password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Certificates.CertificateConfigLoader.LoadCertificate(CertificateConfig certInfo, String endpointName)
at Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.LoadDefaultCert()
at Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.Reload()
at Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.Load()
at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.BindAsync(CancellationToken cancellationToken)
at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken)
Unhandled exception. Interop+Crypto+OpenSslCryptographicException: error:2006D080:BIO routines:BIO_new_file:no such file
在“It has required mapping like 5000:80
and 5000:443
”中,实际上应该是5001:443
(因为端口5001用于映射到https 443端口)。
基于此错误消息
"nterop+Crypto+OpenSslCryptographicException: error:2006D080:BIO routines:BIO_new_file:no such file",
证书文件似乎不存在于以下位置:/https/aspnetapp.pfx
运行 图像,使用以下 Docker 命令:
docker run -it --entrypoint sh <image name>
您将在没有 运行 入口点的情况下访问容器,执行 cd /https/
,检查证书是否位于此文件夹中,如果不是,则可能是问题所在。
我是 Kubernetes 的新手,我正在本地开发中尝试其中的一些。在我给出问题陈述之前,这里是我的环境和项目状态。
- 我有 Windows 10 和 Ubuntu 运行 通过 VS Code 启用 WSL2。
- 我已经在 VS Code 中启用了所需的插件(比如 Kubernetes,Docker 等等)
- 我安装了 Docker 桌面,启用了 WSL2 + Ubuntu + Kubernetes。
- 我的本地系统有 ASP.Net Core 5 工作版本 + ubuntu 到 Docker
- 我有 dockerfile + docker compose 文件,我已经测试了所有使用和不使用 SSL 端口的文件,这些文件使用 SSL 和不使用 SSL。 (为此我修改了程序以接受非 SSL 请求)。
即将进入 docker 文件
-- 它需要公开的端口,如 5000(对于非 SSL)和 5001(对于 SSL)
即将 docker 撰写文件
-- 它需要像 5000:80
和 5000:443
-- 它也有 URL 的环境变量,如
ASPNETCORE_URLS=https://+5001;http://+5000
-- 它也有证书路径的环境变量,如
ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx
-- 它也有证书密码的环境变量,如
ASPNETCORE_Kestrel__Certificates__Default__Password=SECRETPASSWORD
现在,当我说 docker compose up --build
它会构建项目并启动容器。
我可以通过 https://localhost:5001 和 http://localhost:5000
现在,来到 kubernets
-- 我已经使用 kompose 工具生成 kubernetes 特定的 yaml 文件
-- 我没有做任何改变。我运行命令kompose convert -f docker-compose.yaml -o ./.k8
-- 最后,我运行kubectl apply -f .k8
它启动容器但立即失败。我检查了日志,它说了以下内容:
crit: Microsoft.AspNetCore.Server.Kestrel[0]
Unable to start Kestrel.
Interop+Crypto+OpenSslCryptographicException: error:2006D080:BIO routines:BIO_new_file:no such file
at Interop.Crypto.CheckValidOpenSslHandle(SafeHandle handle)
at Internal.Cryptography.Pal.OpenSslX509CertificateReader.FromFile(String fileName, SafePasswordHandle password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(String fileName, String password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Certificates.CertificateConfigLoader.LoadCertificate(CertificateConfig certInfo, String endpointName)
at Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.LoadDefaultCert()
at Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.Reload()
at Microsoft.AspNetCore.Server.Kestrel.KestrelConfigurationLoader.Load()
at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.BindAsync(CancellationToken cancellationToken)
at Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerImpl.StartAsync[TContext](IHttpApplication`1 application, CancellationToken cancellationToken)
Unhandled exception. Interop+Crypto+OpenSslCryptographicException: error:2006D080:BIO routines:BIO_new_file:no such file
在“It has required mapping like 5000:80
and 5000:443
”中,实际上应该是5001:443
(因为端口5001用于映射到https 443端口)。
基于此错误消息
"nterop+Crypto+OpenSslCryptographicException: error:2006D080:BIO routines:BIO_new_file:no such file",
证书文件似乎不存在于以下位置:/https/aspnetapp.pfx
运行 图像,使用以下 Docker 命令:
docker run -it --entrypoint sh <image name>
您将在没有 运行 入口点的情况下访问容器,执行 cd /https/
,检查证书是否位于此文件夹中,如果不是,则可能是问题所在。