我正试图在Kubernetes中部署一个asp.net核心2.2应用程序。此应用程序是一个简单的网页,需要访问Server数据库以显示某些信息。此数据库托管在本地开发计算机(localhost)上,web应用程序部署在小型库集群中,以模拟可以将web应用程序部署在云中并访问远程数据库的生产环境。
我通过公开端口80成功地显示了我的web应用程序。但是,我不知道如何使我的web应用程序从集群内部连接到驻留在本地计算机上的SQL Server数据库。
我假设我的连接字符串是正确的,因为当我将web应用程序部署到IIS本地服务器、码头容器(docker run)或码头服务(docker create service)中时,它可以连接到SQL server数据库,但部署在Kubernetes集群中时则不行。我知道集群在一个不同的网络中,所以我尝试创建一个没有选择器的服务,如这个问题中所描述的,但是没有运气.我甚至试图更改连接字符串IP地址以匹配创建的服务之一,但也失败了。
我的防火墙设置为接受到1433端口的入站连接。
我的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‘的部署,只有一个pod,两个名为'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>我希望连接到Server数据库,但是当我的应用程序试图打开连接时,我会得到以下错误:
SqlException:在建立到Server的连接时发生了与网络相关的或特定于实例的错误.找不到或无法访问服务器。验证实例名是否正确,以及Server是否配置为允许远程连接。(提供程序: TCP提供程序,错误: 40 -无法打开到Server的连接)
我和库伯内特斯是新来的,我对人际关系不太满意,所以欢迎任何帮助。最好的帮助是给我一些建议/工具来调试它,因为我甚至不知道连接尝试在哪里或何时被阻止.
谢谢!
发布于 2018-12-27 15:16:15
您认为主机的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连接,读取更多的这里和为窗户而来。
我不确定这在minicube中是否有效--对于主机来说,linux/windows实现以前有不同的DNS名称。
如果您想使用IP (请记住它最终会改变),您可能可以跟踪它,并确保它是通过虚拟子网“可见”的。
PS :我现在使用的库伯内特斯继续与码头,似乎更容易与工作。
https://stackoverflow.com/questions/53944826
复制相似问题