【问题标题】:How do I connect a kubernetes cluster to an external SQL Server database using docker desktop?如何使用 docker desktop 将 kubernetes 集群连接到外部 SQL Server 数据库?
【发布时间】:2019-10-28 06:59:09
【问题描述】:

我需要知道如何将我的 Kubernetes 集群连接到在 Kubernetes 集群外部的 docker 映像中运行的外部 SQL Server 数据库。

我的集群中目前有两个 pod 正在运行,每个 pod 中都有一个从 asp.net 核心应用程序创建的不同图像。有一个完全独立的(在 Kubernetes 之外,但在我的机器 localhost,1433 上本地运行)托管 SQL Server 数据库的 docker 映像。我需要 Kubernetes pod 中的应用程序能够访问和操作该数据库。我已经尝试创建一个 YAML 文件并配置不同的端口,但我不知道如何让它工作,或者如何在设置后测试它是否真的工作。我需要确切的步骤/命令来创建能够将连接从集群中的图像路由到数据库并返回的服务。

  • Docker SQL Server 创建(提升的 powershell/docker 桌面):

    docker pull mcr.microsoft.com/mssql/server:2017-latest
    
    docker run -d -p 1433:1433 --name sql -v "c:/Temp/DockerShared:/host_mount" -e SA_PASSWORD="aPasswordPassword" -e ACCEPT_EULA=Y mcr.microsoft.com/mssql/server:2017-latest
    
  • definitions.yaml

    #Pods in the cluster
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-1
      labels:
        app: podnet
        type: module
    spec:
      containers:
       - name: container1
         image: username/image1
    
    ---
    
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-2
      labels:
        app: podnet
        type: module
    spec:
      containers:
       - name: container2
         image: username/image2
    
    ---
    #Service created in an attempt to contact external SQL Server DB
    apiVersion: v1
    kind: Service
    metadata:
     name: ext-sql-service
    spec:
     ports:
     - port: 1433
       targetPort: 1433
    type: ClusterIP
    ---
    apiVersion: v1
    kind: Endpoints
    metadata:
     name: ext-sql-service
    subsets:
     - addresses:
         - ip: (Docker IP for DB Instance)
       ports:
         - port: 1433
    

理想情况下,我希望我的 kubernetes 集群中的应用程序能够操作我已经设置的 SQL Server(在集群外部但在我的机器上本地运行)。

【问题讨论】:

  • 你能从本地机器上的 sql management studio 连接到 dockered mssql 服务器吗?容器需要在同一个网络上才能看到彼此。
  • @ChetanRanpariya 是的,我可以在 sql server mgmt studio 中连接到它服务器名称:localhost,1433。这不意味着它们在同一个网络上......因为数据库是一个 docker图片?我需要确切的说明才能完成这项工作,我缺少什么?

标签: sql-server powershell docker kubernetes


【解决方案1】:

当从本地 docker 运行时,你的连接字符串不是你的本地机器。 它是本地 docker “world”,恰好在您的机器上运行。

host.docker.internal:1433

以上是 docker 容器与您的本地机器对话。显然,端口可能会根据您公开它的方式而有所不同。

......

如果您试图让正在运行的容器与也在 docker 世界中运行的 sql-server 通信,则该连接字符串如下所示:

服务器名称:

my-mssql-service-deployment-name.$_CUSTOMNAMESPACENAME.svc.cluster.local

其中 $_CUSTOMNAMESPACENAME 可能是“默认”,但您可能正在运行不同的命名空间。

my-mssql-service-deployment-name 是您的部署的名称(我在此处存根)

注意这里没有端口号。

这在此处记录:

https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#services

【讨论】:

  • 我应该将连接字符串插入我的 asp.net 核心应用程序并重建它的 docker 映像,还是将其放入 YAML 文件中代替 IP 以进行 DNS 解析。请提供确切的示例/步骤,我对 kubernetes 还不是很熟练
  • 最常见的是将环境变量覆盖到容器上。并使用“docker run”将该环境变量 VALUE 传递给容器。将配置数据构建到容器中是一种不好的做法(实际上和安全性)。
  • 如果您有 db-Password.......那么输入 db-password 是不安全的。你需要研究“kubernetes 的秘密”。对于这个问题来说,这个话题太大了。
【解决方案2】:

问题可能在于您提供的服务。 ClusterIP 使您可以在集群内的 pod 之间进行连接。 要连接到外部服务,您只需将服务类型的定义更改为 NodePort

尝试更改服务定义:

#Service created in an attempt to contact external SQL Server DB
apiVersion: v1
kind: Service
metadata:
 name: ext-sql-service
spec:
 type: NodePort
 ports:
 - port: 1433
   targetPort: 1433

并执行命令:

$ kubectl apply -f your_service_definition_file_name.yaml 

请记住在配置了您的部署的正确命名空间中运行此命令。

不好的做法是将环境变量覆盖到容器上。并通过“docker run”将该环境变量 VALUE 传递给容器。

当然是在执行 docker 命令的上下文中

$ docker run -d -p 1433:1433 --name sql -v "c:/Temp/DockerShared:/host_mount" -e SA_PASSWORD="aPasswordPassword" -e ACCEPT_EULA=Y mcr.microsoft.com/mssql/server:2017-latest

让 db-password 可见是不安全的。使用 Kubernetes 机密。

您可以在此处找到更多信息:kubernetes-secret

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-13
    • 1970-01-01
    • 2017-11-08
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    相关资源
    最近更新 更多