SQL-прокси Kubernetes Engine Cloud Потеряно соединение с сервером MySQL при «чтении начального пакета связи» - PullRequest
0 голосов

У меня приложение Django, развернутое на Kubernetes Engine после этого урока - https://cloud.google.com/python/django/kubernetes-engine. Когда я пытаюсь сделать запрос к базе данных, я получаю эту ошибку:

OperationalError at /admin/login/
(2013, "Lost connection to MySQL server at 'reading initial communication packet', system error: 0")
Request Method: POST
Request URL:    [MY_URL]
Django Version: 2.1.5
Exception Type: OperationalError
Exception Value:    
(2013, "Lost connection to MySQL server at 'reading initial communication packet', system error: 0")
Exception Location: /env/lib/python3.6/site-packages/MySQLdb/connections.py in __init__, line 164
Python Executable:  /env/bin/python3
Python Version: 3.6.8
Python Path:    
['/home/vmagent/app',
 '/env/bin',
 '/env/lib/python36.zip',
 '/env/lib/python3.6',
 '/env/lib/python3.6/lib-dynload',
 '/opt/python3.6/lib/python3.6',
 '/env/lib/python3.6/site-packages']
Server time:    Fri, 22 Mar 2019 14:41:35 +0000

Есть много подобных вопросов, однако, я перепробовал все и не нашел точно мой случай.

  • Я могу подключиться через тот же прокси-сервер Cloud SQL на моем локальном ПК, и он отлично работает.
  • Я могу добавить 0.0.0.0/0 в облачные сети с поддержкой SQL и подключиться напрямую из Django, и это прекрасно работает.

Вот мои настройки django для базы данных:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'polls',
        'USER': os.getenv('DATABASE_USER'),
        'PASSWORD': os.getenv('DATABASE_PASSWORD'),
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

И мое развертывание k8s yaml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "3"
  creationTimestamp: 2019-03-22T01:02:36Z
  generation: 4
  labels:
    app: polls
  name: polls
  namespace: default
  resourceVersion: "305840"
  selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/polls
  uid: 2ead6fa6-4c3e-11e9-9e47-42010a800102
spec:
  progressDeadlineSeconds: 2147483647
  replicas: 3
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: polls
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: polls
        revision: "1"
    spec:
      containers:
      - env:
        - name: DATABASE_USER
          valueFrom:
            secretKeyRef:
              key: username
              name: cloudsql
        - name: DATABASE_PASSWORD
          valueFrom:
            secretKeyRef:
              key: password
              name: cloudsql
        image: gcr.io/fcul-vova/polls
        imagePullPolicy: Always
        name: polls-app
        ports:
        - containerPort: 8080
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      - command:
        - /cloud_sql_proxy
        - --dir=/cloudsql
        - -instances=fcul-vova:europe-west1:polls-instance=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-oauth-credentials
          readOnly: true
        - mountPath: /etc/ssl/certs
          name: ssl-certs
        - mountPath: /cloudsql
          name: cloudsql
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
      - name: cloudsql-oauth-credentials
        secret:
          defaultMode: 420
          secretName: cloudsql-oauth-credentials
      - hostPath:
          path: /etc/ssl/certs
          type: ""
        name: ssl-certs
      - emptyDir: {}
        name: cloudsql
status:
  availableReplicas: 3
  conditions:
  - lastTransitionTime: 2019-03-22T01:04:53Z
    lastUpdateTime: 2019-03-22T01:04:53Z
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  observedGeneration: 4
  readyReplicas: 3
  replicas: 3
  updatedReplicas: 3

1 Ответ

1 голос

Мне просто нужно было включить Cloud SQL Admin API здесь: https://console.developers.google.com/apis/api/sqladmin.googleapis.com/

...