首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从Kubernetes连接到本地主机上的Server数据库,如何调试?

无法从Kubernetes连接到本地主机上的Server数据库,如何调试?
EN

Stack Overflow用户
提问于 2018-12-27 12:07:50
回答 1查看 6.5K关注 0票数 5

我正试图在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数据库被配置为允许远程访问。

下面是我使用的连接字符串:

代码语言:javascript
复制
"Server=172.24.144.1\\MyServer,1433;Database=TestWebapp;User Id=user_name;Password=********;"

下面是用于部署web应用程序的文件:

代码语言:javascript
复制
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‘。以下是他们的详细资料:

代码语言:javascript
复制
> 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的连接)

我和库伯内特斯是新来的,我对人际关系不太满意,所以欢迎任何帮助。最好的帮助是给我一些建议/工具来调试它,因为我甚至不知道连接尝试在哪里或何时被阻止.

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-27 15:16:15

您认为主机的IP地址是内部网络的专用IP。这个IP地址可能是您的计算机在您正在使用的“真实”网络上使用的地址。kubernetes虚拟网络位于不同的子网上,因此您内部使用的IP是不可访问的。

代码语言:javascript
复制
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 :我现在使用的库伯内特斯继续与码头,似乎更容易与工作。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53944826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档