【问题标题】:Kubernetes access to Google Cloud SQL C# Connection StringKubernetes 访问 Google Cloud SQL C# 连接字符串
【发布时间】:2021-06-26 15:55:11
【问题描述】:

我有一个 DOTNET Core C# 控制台应用程序,我的连接字符串有一个字符串,现在,要连接到本地 MySql 数据库,我使用以下连接字符串:

Server=127.0.0.1;Database=database;Uid=root;Pwd=123;

我已经设置了一个 Google Cloud SQL MySql 实例并在那里创建了一个数据库并为其分配了一个私有 IP。我还创建了一个 GKE 集群。我正在关注有关使用私有 IP 从 GKE 连接到 Cloud SQL 的文档:

https://cloud.google.com/sql/docs/mysql/connect-kubernetes-engine

在该文档中,它说我需要 2 个 kubernetes 机密,1 个用于服务帐户凭据,我使用了在 Cloud SQL 实例中生成的密钥。另一个应该是数据库凭据。这个秘密应该是什么样子,我的连接字符串应该是什么样子才能使用秘密中指示的值。

我试图忽略数据库凭据机密并按原样使用连接字符串,仅将 ip 更改为给定的私有 IP,认为出于测试目的应该足够了,但没有成功。

【问题讨论】:

  • 这个问题不是 GKE 特有的,而是一般适用于 kubernetes。

标签: c# mysql kubernetes google-cloud-platform


【解决方案1】:

这就是我得到连接字符串的方式:

var dbHost     = Environment.GetEnvironmentVariable("DB_HOST");
var dbName     = Environment.GetEnvironmentVariable("DB_NAME");
var dbUser     = Environment.GetEnvironmentVariable("DB_USER");
var dbPassword = Environment.GetEnvironmentVariable("DB_PASSWORD");

string connectionString = $"server={dbHost};database={dbName};uid={dbUser};pwd={dbPassword};";

并在部署 yml 文件中使用容器上的 env,如下所示:

     env:
        - name: DB_HOST
          value: 127.0.0.1
        - name: DB_NAME
          value: name
        - name: DB_USER
          valueFrom:
            secretKeyRef:
              name: cloudsql-db-credentials
              key: username
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: cloudsql-db-credentials
              key: password

我用这个命令创建了一个通用秘密:

kubectl create secret generic cloudsql-db-credentials --from-literal=username=root --from-literal=password=123

【讨论】:

    【解决方案2】:

    在您提供的链接中,您拥有将秘密信息带入应用程序 pod 所需的一切。

    首先,您使用 kubectl create 创建密钥,该密钥将多个键值对作为输入。

    kubectl create secret generic <YOUR-DB-SECRET> \
      --from-literal=username=<YOUR-DATABASE-USER> \
      --from-literal=password=<YOUR-DATABASE-PASSWORD> \
      --from-literal=database=<YOUR-DATABASE-NAME>
    

    然后你将秘密作为一个卷安装在你的 pod 中:

    volumes:
    - name: <YOUR-DB-SECRET-VOLUME>
      secret:
        secretName: <YOUR-DB-SECRET>
    

    然后你在 pod 文件系统中为你的卷指定一个挂载路径:

    volumeMounts:
    - name: <YOUR-DB-SECRET-VOLUME>
      mountPath: /secrets/
      readOnly: true
    

    此时,您可以从 pod 的 /secrets 文件夹访问您的键值对,其中每个键值对都存储为一个文件,其键为名称,值作为文件内容。

    您的 /secrets/ 文件夹列表应该是:

    username
    password
    database
    

    要从您的应用程序访问它们,您只需获取 /secrets/ 文件夹文件列表并读取每个文件的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 1970-01-01
      • 2017-01-12
      相关资源
      最近更新 更多