无法从Kubernetes连接到本地主机上托管的SQL Server数据库,该如何调试呢?

时间:2018-12-27 12:07:51

标签: sql-server docker kubernetes minikube

我正在尝试在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并不陌生,并且对网络并不是很满意,因此欢迎任何帮助。 最好的帮助是给我一些建议/工具来调试它,因为我什至不知道在什么地方或什么时候阻止连接尝试...

谢谢!

1 个答案:

答案 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 连接  阅读更多herehere for windows

我不确定这是否可以在minicube中使用-主机的linux / windows实现曾经有一个不同的DNS名称。

如果要使用IP(请记住,它最终会改变),则可以对其进行跟踪并确保它是虚拟子网中唯一可见的一个

PS:我现在正在使用与docker一起使用的kubernetes,似乎更易于使用。