Docker Google Kubernetes引擎到云SQL

Docker Google Kubernetes引擎到云SQL,docker,asp.net-core,google-kubernetes-engine,google-cloud-sql,Docker,Asp.net Core,Google Kubernetes Engine,Google Cloud Sql,我目前正在尝试学习使用谷歌Kubernetes引擎和谷歌云SQL。为此,我在visual studio 2019中创建了一个AspnetCore 3.1 Web Api项目,用作培训项目 目前,我能够做到以下几点 使用 使用SSMS和SQL从自己的PC连接到云SQL 我想做的是如下 FROM gcr.io/google-appengine/aspnetcore:3.1 COPY . /app WORKDIR /app ENTRYPOINT ["dotnet", "

我目前正在尝试学习使用谷歌Kubernetes引擎和谷歌云SQL。为此,我在visual studio 2019中创建了一个AspnetCore 3.1 Web Api项目,用作培训项目

目前,我能够做到以下几点

  • 使用
  • 使用SSMS和SQL从自己的PC连接到云SQL
我想做的是如下

FROM gcr.io/google-appengine/aspnetcore:3.1
COPY . /app
WORKDIR /app
ENTRYPOINT ["dotnet", "HelloCloud.Api.dll"]

#FROM gcr.io/cloudsql-docker/gce-proxy
#COPY . /app
#WORKDIR /app
#CMD ["/cloud_sql_proxy -instances=noble-cubist-294511:europe-west2:helloclouddb=tcp:1433 -credential_file=/app/secrets/cloudsql/key.json"]
  • 将Web Api部署到GKE,使用包含
从我对云SQL的理解来看,最好始终通过代理访问它,因为它更安全,这就是为什么我需要sidecar。为了让代理正常工作,我需要保存在GKE中我的机密中的凭证文件。我还有一些与数据库相关的变量需要作为环境变量传入,同样来自GKE中的机密

目前在我的解决方案中,在我的api项目文件旁边,我有一个Dockerfile,如下所示

FROM gcr.io/google-appengine/aspnetcore:3.1
COPY . /app
WORKDIR /app
ENTRYPOINT ["dotnet", "HelloCloud.Api.dll"]

#FROM gcr.io/cloudsql-docker/gce-proxy
#COPY . /app
#WORKDIR /app
#CMD ["/cloud_sql_proxy -instances=noble-cubist-294511:europe-west2:helloclouddb=tcp:1433 -credential_file=/app/secrets/cloudsql/key.json"]
如您所见,Dockerfile的第二部分被注释掉了。之所以这样做是因为它会使GKE上的POD崩溃,因为它缺少需要从机密中挂载的凭证文件

Dockerfile旁边还有一个名为deployment.yaml的文件,其内容如下

FROM gcr.io/google-appengine/aspnetcore:3.1
COPY . /app
WORKDIR /app
ENTRYPOINT ["dotnet", "HelloCloud.Api.dll"]

#FROM gcr.io/cloudsql-docker/gce-proxy
#COPY . /app
#WORKDIR /app
#CMD ["/cloud_sql_proxy -instances=noble-cubist-294511:europe-west2:helloclouddb=tcp:1433 -credential_file=/app/secrets/cloudsql/key.json"]
apiVersion:apps/v1 种类:部署 元数据: 姓名:hellocloud 规格: 选择器: 火柴标签: 应用程序:hellocloud 模板: 元数据: 标签: 应用程序:hellocloud 规格: 容器: -姓名:hellocloud 图片:gcr.io/noble-cubist-294511/hello-cloud-api 环境: -姓名:DB_用户 价值来源: secretKeyRef: 名称:helloclouddb凭据 关键字:用户名 -姓名:DB_PASS 价值来源: secretKeyRef: 名称:helloclouddb凭据 密钥:密码 -姓名:DB_姓名 价值来源: secretKeyRef: 名称:helloclouddb凭据 关键词:数据库 资源: 限制: 内存:“128Mi” cpu:“500米” 端口: -集装箱港口:80 -名称:cloudsql代理 图片:gcr.io/cloudsql-docker/gce-proxy 命令:[“/cloud\u sql\u proxy”, “-instances=noble-cubist-294511:europe-west2:helloclouddb=tcp:1433”, “-credential_file=/secrets/cloudsql/key.json”] 资源: 限制: 内存:“128Mi” cpu:“500米” 体积数量: -名称:凭据卷 mountPath:/secrets/cloudsql 只读:正确 卷数: -名称:凭据卷 秘密: secretName:helloclouddb实例凭据 我已按照本网站上的指南创建了上述deployment.yaml:

从这方面的工作中,我发现它对Dockerfile有反应,这也是我尝试注释掉的部分的原因。我一直在试图弄清楚是否可以通过Dockerfile指示GKE使用deployment.yaml文件,因为据我所知,这应该可以做到

我喜欢干的开发概念(不要重复你自己),这是它希望通过能够做到这一点的另一个原因。我曾试图直接在GKE上创建一个部署,这花费了我大约10分钟的时间,但最终都没有成功。当然,如果我更习惯于在GKE上创建部署,这将减少时间,最终也会起作用,但这将是一种湿(每次写入)的方式

两天后,我的头撞到了桌子上,我没有再靠近了,这就是为什么我要写这个Stackoverflow任务,希望对Docker、GKE和Cloud SQL更有经验的人能给我一些建议

如果我可能错过了一些重要的事情,我可以自由地要求更多的细节

[编辑1]

作为一种解决方法,我正在尝试将文件放在我的驱动器上,Dockerfile中的副本将从那里获取文件,至少据我所知。下面是我在VisualStudio中的项目图像,后面是我更新的Dockerfile

在我的计算机上构建Dockerfile并使用命令查看图像的内容,它在指定位置包含“key.json”。即便如此,在部署到GKE时,Cloud Build也能很好地构建它,但在启动pod时,它抛出一个RunContainerError,抱怨“没有这样的文件或目录”。下面可以看到完整错误的图像


我通过在项目中创建自己的类使其工作,该类给定代理文件的路径,将使用所需的参数运行代理文件,我还通过类向代理文件提供参数。为了将代理文件与我自己的代码结合在一起,我使用以下Dockerfile构建了我的图像

FROM gcr.io/cloudsql-docker/gce-proxy as proxy
COPY . /app

FROM gcr.io/google-appengine/aspnetcore:3.1
Copy --from=proxy . /app
WORKDIR /app/app
ENTRYPOINT ["dotnet", "HelloCloud.Api.dll"]
给定代理文件的路径以及凭据和数据库文件,我的“CloudSQLInitializer”类将启动代理

公共启动(IConfiguration配置)
{
...
尝试
{
CloudSQLInitializer cloud=null;
//当前正在从bat或windows服务运行代理。
//因此,它不会启动代理
if(RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
cloud=新的CloudSQLInitializer($“Secrets/CloudSQL/database.json”);
if(RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
cloud=新的CloudSQLInitializer($”./cloud\u sql\u proxy“,$”Secrets/CloudSQL/database.json“,$”Secrets/CloudSQL/key.json”);
...
}
捕获(例外e)
{
...
}
}
公共类CloudSQLInitializer
{
公共字符串