Docker Google Kubernetes引擎到云SQL
我目前正在尝试学习使用谷歌Kubernetes引擎和谷歌云SQL。为此,我在visual studio 2019中创建了一个AspnetCore 3.1 Web Api项目,用作培训项目 目前,我能够做到以下几点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", "
- 使用
- 使用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,使用包含
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
{
公共字符串