我正在尝试在Kubernetes中部署一个asp.net core 2.2应用程序。此应用程序是一个简单的网页,需要访问SQL Server数据库才能显示某些信息。该数据库托管在我的本地开发计算机(localhost)上,并且Web应用程序部署在minikube集群中,以模拟生产环境,在此环境中,我的Web应用程序可以部署在云中并访问远程数据库。
我设法通过暴露端口80来显示Web应用程序。但是,我不知道如何使Web应用程序从群集内部连接到本地计算机上托管的SQL Server数据库。
我认为我的连接字符串正确,因为当我将Web应用程序部署到IIS本地服务器上,Docker容器(docker run)或docker服务(docker create service)中时,我的Web应用程序可以连接到SQL Server数据库,但是不是在Kubernetes集群中部署时。我知道群集位于不同的网络中,因此我尝试创建this question中所述的不带选择器的服务,但是没有运气...我什至尝试更改连接字符串IP地址以匹配其中一个。创建服务,但也失败了。
我的防火墙设置为接受到1433端口的入站连接。
我的SQL Server数据库配置为允许远程访问。
这是我使用的连接字符串:
"Server=172.24.144.1\\MyServer,1433;Database=TestWebapp;User Id=user_name;Password=********;"
这是我用于部署Web应用程序的文件:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: webapp
spec:
replicas: 1
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: webapp
image: <private_repo_url>/webapp:db
imagePullPolicy: Always
ports:
- containerPort: 80
- containerPort: 443
- containerPort: 1433
imagePullSecrets:
- name: gitlab-auth
volumes:
- name: secrets
secret:
secretName: auth-secrets
---
apiVersion: v1
kind: Service
metadata:
name: webapp
labels:
app: webapp
spec:
type: NodePort
selector:
app: webapp
ports:
- name: port-80
port: 80
targetPort: 80
nodePort: 30080
- name: port-443
port: 443
targetPort: 443
nodePort: 30443
---
apiVersion: v1
kind: Service
metadata:
name: sql-server
labels:
app: webapp
spec:
ports:
- name: port-1433
port: 1433
targetPort: 1433
---
apiVersion: v1
kind: Endpoints
metadata:
name: sql-server
labels:
app: webapp
subsets:
- addresses:
- ip: 172.24.144.1 <-- IP of my local computer where SQL Server is running
ports:
- port: 1433
因此,我得到一个名为“ webapp”的部署,该部署只有一个吊舱,两个名为“ webapp”和“ sql-server”的服务以及两个端点也分别名为“ webapp”和“ sql-server”。这是他们的详细信息:
> kubectl describe svc webapp
Name: webapp
Namespace: default
Labels: app=webapp
Annotations: <none>
Selector: app=webapp
Type: NodePort
IP: 10.108.225.112
Port: port-80 80/TCP
TargetPort: 80/TCP
NodePort: port-80 30080/TCP
Endpoints: 172.17.0.4:80
Port: port-443 443/TCP
TargetPort: 443/TCP
NodePort: port-443 30443/TCP
Endpoints: 172.17.0.4:443
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
> kubectl describe svc sql-server
Name: sql-server
Namespace: default
Labels: app=webapp
Annotations: <none>
Selector: <none>
Type: ClusterIP
IP: 10.107.142.32
Port: port-1433 1433/TCP
TargetPort: 1433/TCP
Endpoints:
Session Affinity: None
Events: <none>
> kubectl describe endpoints webapp
Name: webapp
Namespace: default
Labels: app=webapp
Annotations: <none>
Subsets:
Addresses: 172.17.0.4
NotReadyAddresses: <none>
Ports:
Name Port Protocol
---- ---- --------
port-443 443 TCP
port-80 80 TCP
Events: <none>
> kubectl describe endpoints sql-server
Name: sql-server
Namespace: default
Labels: app=webapp
Annotations: <none>
Subsets:
Addresses: 172.24.144.1
NotReadyAddresses: <none>
Ports:
Name Port Protocol
---- ---- --------
<unset> 1433 TCP
Events: <none>
我希望连接到SQL Server数据库,但是当我的应用程序尝试打开连接时,出现此错误:
SqlException:建立与SQL Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称正确,并且已将SQL Server配置为允许远程连接。 (提供者:TCP Provider,错误:40-无法打开与SQL Server的连接)
我对Kubernetes并不陌生,并且对网络并不是很满意,因此欢迎任何帮助。 最好的帮助是给我一些建议/工具来调试它,因为我什至不知道在什么地方或什么时候阻止连接尝试...
谢谢!
答案 0 :(得分:2)
您认为主机的IP地址是内部网络的专用IP。该IP地址可能是您的计算机在您使用的“真实”网络上使用的IP地址。 kubernetes虚拟网络位于另一个子网中,因此-您在内部使用的IP无法访问。
subsets:
- addresses:
- ip: 172.24.144.1 <-- IP of my local computer where SQL Server is running
ports:
- port: 1433
您可以通过DNS条目 host.docker.internal 连接 阅读更多here和here for windows
我不确定这是否可以在minicube中使用-主机的linux / windows实现曾经有一个不同的DNS名称。
如果要使用IP(请记住,它最终会改变),则可以对其进行跟踪并确保它是虚拟子网中唯一可见的一个
。PS:我现在正在使用与docker一起使用的kubernetes,似乎更易于使用。