首页 > 解决方案 > 无法从 kubernetes 中的 c# 前端连接到 Mysql 服务

问题描述

我有一个 kubernetes 集群,前端是用 .NET Core 编写的 C# 控制台应用程序和一个后端 Mysql db。这两个应用程序都部署为不同 pod 中的 Kubernetes 中的部署。我还创建了一个 mysql 服务,以便能够与 Mysql db 连接。但是,我似乎无法从 .NET 核心控制台应用程序连接到 mysql 服务器到 kubernetes Mysql 服务。但是,我几乎可以使用控制台应用程序中的 IP 地址与 Mysql pod 连接。

我会尽力描述这里的情况。

$ kubectl -n radiomicsapp get pods -o wide
NAME                                                          READY     STATUS    RESTARTS   AGE       IP             NODE
anonymizer-pod-586548ddd9-kv8cj                               2/2       Running   0          21s       10.244.0.187   aks-agentpool-35971152-1
mysql-744bfb878c-scwz9                                        1/1       Running   0          19h       10.244.1.244   aks-agentpool-35971152-2

$ kubectl -n abcapp get svc
NAME                                         TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)                      AGE
mysql                                        ClusterIP      10.0.54.120    <none>           3306/TCP                     104d

如果我使用 pod (10.244.1.244) 中的 IP 地址与 db 连接,它可以工作。但是,如果我使用 mysql 服务的 IP 地址(10.0.54.120),它会抛出

Error: Unable to connect to any of the specified MySQL hosts.

由于 mysql pod 的 IP 地址会在 pod 重新启动/重新创建时发生变化,因此我必须在我的匿名控制台应用程序中更改 db 连接字符串,我创建了一个 ClusterIP 类型的 mysql 服务,如下所示:

apiVersion: v1
kind: Service
metadata:
   name: mysql
   namespace: abcapp
   labels:
    app: abc
spec:
   type: ClusterIP
   ports:
     - name: mysql
       port: 3306
       protocol: TCP
       targetPort: 3306
   selector:
     app: abc

此外,我的匿名器 pod、mysql pod 以及 mysql 服务都在同一个命名空间中。

任何帮助将非常感激。感谢您抽出宝贵时间。

标签: c#mysqlkuberneteskubectl

解决方案


您必须在代码上使用服务名称,并让 kube-dns 处理 IP 解析,以确保无论 pod 是重新创建还是移动,并且在此过程中使用不同的 IP 地址,您的代码都能正常工作。

从另一个答案很容易推断出一个近似的例子

如何连接到 MySQL 数据库?

string connstring = string.Format("Server=mysql; database={0}; UID=UserName; password=your password", databaseName);
connection = new MySqlConnection(connstring);

注意只需要放在Server上mysql


推荐阅读