这是我的docker映像
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-alpine3.8 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
COPY ./xyz/publish .
ENV ASPNETCORE_URLS=https://+:443;http://+80
ENTRYPOINT ["dotnet","abc/xyz.dll"]
这是我的Deployment.yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: xyzdemo
namespace: default
spec:
replicas: 1
selector:
matchLabels:
papi: web
template:
metadata:
labels:
papi: web
spec:
containers:
- name: xyzdemo-site
image: xyz.azurecr.io/abc:31018
ports:
- containerPort: 443
imagePullSecrets:
- name: secret
---
apiVersion: v1
kind: Service
metadata:
name: xyzdemo-entrypoint
namespace: default
spec:
type: LoadBalancer
selector:
papi: web
ports:
- port: 44328
targetPort: 443
这是我的appsettings文件
"Server": "xyz.database.windows.net",
"Database": "pp",
"User": "ita",
"Password": "password",
使用所有这些,我将应用程序部署到了k8s集群中,并且能够从浏览器中打开应用程序,但是当我尝试从数据库中获取信息时,应用程序在一段时间后出现了与网络相关的错误。
System.Data.SqlClient.SqlException(0x80131904):与网络相关或 建立与以下对象的连接时发生特定于实例的错误 SQL Server
我尝试进入POD并执行ls命令,我可以看到我的应用程序设置文件以及Cat应用程序设置时的情况,我可以看到正确的凭据,但我不知道该怎么办,不确定为什么不这样做能够连接到数据库。
所以最后我尝试将sql连接作为env变量添加到pod,然后它开始工作。当我删除那些没有连接。
现在我删除了具有sql连接的env变量,然后在pod上进行了日志。
它说无法连接到数据库:“ Empty”和服务器:“ Empty”
不确定applicationsettings.json
文件中包含详细信息的原因为何会为空。
答案 0 :(得分:0)
好吧,我看不到您的k8应用程序连接到数据库的配置是什么。重要的是,您的数据库托管在哪里? papi:web
如何连接到数据库?
我还怀疑您的服务没有适当的端口重定向。从上面的service.yaml
来看,https
端口的443内部映射到44328。什么是44328?该端口上正在监听什么?您的应用程序似乎没有提及44328。(请参阅Dockerfile)
我会即兴将您的service.yaml
看起来像这样:
apiVersion: v1
kind: Service
metadata:
name: xyzdemo-entrypoint
namespace: default //This is inferred anyways
spec:
selector:
papi: web
ports:
- name: http
protocol: TCP
port: 80
targetPort: xxxx //Where your web-server is listening. (From your dockerfile, this is also 80 but it can be any valid TCP port)
- name: https
protocol: TCP
port: 443
targetPort: xxxx //https for your web-server. (From your dockerfile, this is also 443. Again, can be any TCP port)
将数据库服务器开放到Internet并不是一个好习惯。这是一个巨大的安全威胁。良好的模式是促进您的Web服务器通过k8维护的内部dns与数据库服务器通信(这是假设您的数据库服务器也是容器-类似kubedb。如果没有,则您必须通过以下方式使用数据库服务器)某种将白名单中的已知主机仅允许已知主机的代理(例如-GCP中的cloudsql代理)。
根据数据库服务器的托管方式,您必须配置数据库配置以允许或将容器化的应用程序列入白名单(应用service.yaml
后获得的IP),只有这样,您的k8的应用程序才能通话/实现与各个数据库的连接。
答案 1 :(得分:0)
我怀疑您需要允许Azure SQL防火墙上的连接才能起作用。使用门户是最简单的方法。您可以allow all
或allow Azure services
作为初学者(假设您的Kubernetes位于Azure内)。然后将其缩小(如果是罪魁祸首)。