CloudSQL docker 容器暂时无法连接到 sql 实例,然后在 k8s 中连接
CloudSQL docker container fails to connect to sql instance for a while then connects in k8s
我正在尝试使用 docker 云-sql 容器连接到我的 GCP Sql 实例。我还有一项服务依赖于 cloudsql 来连接到 GKE 中的数据库。这两个一起创建了一个 pod。
连接好像总是失败3、4次左右然后就连接成功了。每当我想通过创建更新的 kubernetes pod 来部署我的服务的新版本时,都会发生这种情况。
描述此代码的我的 kubernetes 部署是:
...
- name: cloudsql-proxy
image: gcr.io/cloudsql-docker/gce-proxy:1.12
command:
- /cloud_sql_proxy
- -instances=my-project:europe-west1:my-instance=tcp:5432
- -credential_file=/secrets/cloudsql/credentials.json
...
我希望 cloud-sql 立即连接到我的实例,但我在日志中多次收到此错误
couldn't connect to "my-project:europe-west1:my-instance": Post https://www.googleapis.com/sql/v1beta4/projects/my-project/instances/my-instance/createEphemeral?alt=json&prettyPrint=false: oauth2: cannot fetch token: Post https://oauth2.googleapis.com/token: net/http: TLS handshake timeout
OAuth 要求使用刷新令牌来获取新的访问令牌,因为它们的生命周期有限以增强安全性。刷新令牌将允许您的应用程序访问 Cloud SQL。
请创建一个新令牌,自动使最旧的令牌失效。
在- /cloud_sql_proxy
之后添加选项--dir=/cloudsql
- name: cloudsql-proxy
image: gcr.io/cloudsql-docker/gce-proxy:1.14
command: ["/cloud_sql_proxy",
"--dir=/cloudsql",
"-instances=my-project:europe-west1:my-instance=tcp:3306",
# If running on a VPC, the Cloud SQL proxy can connect via Private IP. See:
# https://cloud.google.com/sql/docs/mysql/private-ip for more info.
# "-ip_address_types=PRIVATE",
"-credential_file=/secrets/cloudsql/credentials.json"]
# [START cloudsql_security_context]
securityContext:
runAsUser: 2 # non-root user
allowPrivilegeEscalation: false
# [END cloudsql_security_context]
volumeMounts:
- name: cloudsql-instance-credentials
mountPath: /secrets/cloudsql
readOnly: true
- name: cloudsql
mountPath: /cloudsql
# [END proxy_container]
# [START volumes]
volumes:
- name: cloudsql-instance-credentials
secret:
secretName: cloudsql-instance-credentials
- name: cloudsql
emptyDir:
# [END volumes]
此错误表示 pod 过载或网络启动时间过慢。由于您正在连接到 Google OAuth 端点,我将排除另一端的问题。
如果您有集群或 pod 过载(达到内存限制,CPU 达到 100%,等等)网络响应可能会开始失败。
我正在尝试使用 docker 云-sql 容器连接到我的 GCP Sql 实例。我还有一项服务依赖于 cloudsql 来连接到 GKE 中的数据库。这两个一起创建了一个 pod。
连接好像总是失败3、4次左右然后就连接成功了。每当我想通过创建更新的 kubernetes pod 来部署我的服务的新版本时,都会发生这种情况。
描述此代码的我的 kubernetes 部署是:
...
- name: cloudsql-proxy
image: gcr.io/cloudsql-docker/gce-proxy:1.12
command:
- /cloud_sql_proxy
- -instances=my-project:europe-west1:my-instance=tcp:5432
- -credential_file=/secrets/cloudsql/credentials.json
...
我希望 cloud-sql 立即连接到我的实例,但我在日志中多次收到此错误
couldn't connect to "my-project:europe-west1:my-instance": Post https://www.googleapis.com/sql/v1beta4/projects/my-project/instances/my-instance/createEphemeral?alt=json&prettyPrint=false: oauth2: cannot fetch token: Post https://oauth2.googleapis.com/token: net/http: TLS handshake timeout
OAuth 要求使用刷新令牌来获取新的访问令牌,因为它们的生命周期有限以增强安全性。刷新令牌将允许您的应用程序访问 Cloud SQL。 请创建一个新令牌,自动使最旧的令牌失效。
在- /cloud_sql_proxy
--dir=/cloudsql
- name: cloudsql-proxy
image: gcr.io/cloudsql-docker/gce-proxy:1.14
command: ["/cloud_sql_proxy",
"--dir=/cloudsql",
"-instances=my-project:europe-west1:my-instance=tcp:3306",
# If running on a VPC, the Cloud SQL proxy can connect via Private IP. See:
# https://cloud.google.com/sql/docs/mysql/private-ip for more info.
# "-ip_address_types=PRIVATE",
"-credential_file=/secrets/cloudsql/credentials.json"]
# [START cloudsql_security_context]
securityContext:
runAsUser: 2 # non-root user
allowPrivilegeEscalation: false
# [END cloudsql_security_context]
volumeMounts:
- name: cloudsql-instance-credentials
mountPath: /secrets/cloudsql
readOnly: true
- name: cloudsql
mountPath: /cloudsql
# [END proxy_container]
# [START volumes]
volumes:
- name: cloudsql-instance-credentials
secret:
secretName: cloudsql-instance-credentials
- name: cloudsql
emptyDir:
# [END volumes]
此错误表示 pod 过载或网络启动时间过慢。由于您正在连接到 Google OAuth 端点,我将排除另一端的问题。
如果您有集群或 pod 过载(达到内存限制,CPU 达到 100%,等等)网络响应可能会开始失败。