首页 > 解决方案 > 通过代理从 gke 连接到云 sql - 连接被拒绝

问题描述

我正在尝试使用指南使用代理 docker 映像将云 sql 上的 mysql 实例连接到 google kubernetes 集群。
我有一个带有 ubuntu 映像和 mysql 客户端的 pod,以及作为 sidecar 的代理映像。
代理日志显示“准备好新连接”,但是当我尝试使用 mysql 客户端和 127.0.0.1(端口 3306)作为主机连接到代理时,我收到以下错误:

错误 2003 (HY000):无法连接到“127.0.0.1”上的 MySQL 服务器(111“连接被拒绝”)。

该 pod 具有以下部署文件:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "20"
  creationTimestamp: 2019-01-30T15:29:58Z
  generation: 19
  labels:
    app: toolbox
  name: toolbox
  namespace: default
  resourceVersion: "1806058"
  selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/toolbox
  uid: e6ee574e-24a3-11e9-82e3-42010a9a0079
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: toolbox
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: toolbox
    spec:
      containers:
      - image: gcr.io/orayya-229213/toolbox:1.0
        imagePullPolicy: IfNotPresent
        name: toolbox
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      - command:
        - /cloud_sql_proxy
        - -instances=orayya-229213:europe-west2:orayya-db=tcp:0.0.0.0:3306
        - -credential_file=/secrets/cloudsql/credentials.json
        image: gcr.io/cloudsql-docker/gce-proxy:1.12
        imagePullPolicy: IfNotPresent
        name: cloudsql-proxy
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /secrets/cloudsql
          name: cloudsql-credentials
          readOnly: true
        - mountPath: /cloudsql
          name: cloudsql
      dnsPolicy: ClusterFirst
      nodeSelector:
        cloud.google.com/gke-nodepool: default-pool
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
      - name: cloudsql-credentials
        secret:
          defaultMode: 420
          secretName: cloudsql-credentials
      - emptyDir: {}
        name: cloudsql
status:
  availableReplicas: 1
  collisionCount: 1
  conditions:
  - lastTransitionTime: 2019-01-31T10:49:56Z
    lastUpdateTime: 2019-01-31T10:49:56Z
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  - lastTransitionTime: 2019-01-31T10:27:21Z
    lastUpdateTime: 2019-02-03T14:29:31Z
    message: ReplicaSet "toolbox-6d589d797" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  observedGeneration: 19
  readyReplicas: 1
  replicas: 1
  updatedReplicas: 1

我还尝试了其他几个示例变体。
如果需要,我很乐意提供更多信息。
谢谢!

编辑:
我终于设法完成了这项工作。我重新开始,显然我的工具箱容器有问题。感谢所有帮助过的人!

标签: google-cloud-platformgoogle-cloud-sql

解决方案


虽然我无法在没有更多信息的情况下帮助您解决此特定问题,但我可以为您提供一些建议来帮助您调试它。

首先,找出要查看的 pod 的名称。从发布的配置来看,您似乎可以使用 app 标签进行查找:

kubectl get pods -l=app=toolbox

如果您的 pod 未列出,则说明您的部署存在问题,并且未成功创建 pod。如果已列出,则问题出在其中一个 pod 中。

pod 里面有两个容器,所以下一步是检查代理以确保它成功启动,如果成功了,为什么它拒绝连接。

kubectl get logs <YOUR_POD_NAME> -c cloudsql-proxy

这应该打印与容器关联的日志,并且应该为您提供一些关于它为什么不工作的额外信息。


推荐阅读