Не удалось подключиться к облачному SQL с помощью прокси, несмотря на соблюдение документации

#doctrine-orm #google-cloud-platform #google-cloud-sql #cloud-sql-proxy

# #doctrine-orm #google-cloud-platform #google-cloud-sql #cloud-sql-proxy

Вопрос:

Я использую doctrine ORM с Symfony, фреймворком PHP. Я получаю странное поведение при попытке подключиться к облачному SQL с помощью GKE.

Я могу получить соединение с БД через doctrine в командной строке, например php bin/console doctrine:database:create , успешно, и я вижу, что соединение открыто в журналах прокси-модуля.

Но когда я пытаюсь подключиться к БД через doctrine в своем приложении, я обязательно сталкиваюсь с этой ошибкой:

 An exception occurred in driver: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known
 

Я пытался разобраться в этом, но это не имеет смысла, почему я могу подключиться через командную строку, но не в моем приложении?

Я следовал документации здесь для настройки подключения к БД с помощью облачного прокси. Это мое развертывание Kubernetes:

 ---
apiVersion: "extensions/v1beta1"
kind: "Deployment"
metadata:
  name: "riptides-api"
  namespace: "default"
  labels:
    app: "riptides-api"
    microservice: "riptides"
spec:
  replicas: 3
  selector:
    matchLabels:
      app: "riptides-api"
      microservice: "riptides"
  template:
    metadata:
      labels:
        app: "riptides-api"
        microservice: "riptides"
    spec:
      containers:
        - name: "api-sha256"
          image: "eu.gcr.io/riptides/api@sha256:ce0ead9d1dd04d7bfc129998eca6efb58cb779f4f3e41dcc3681c9aac1156867"
          env:
            - name: DB_HOST
              value: 127.0.0.1:3306
            - name: DB_USER
              valueFrom:
                secretKeyRef:
                  name: riptides-mysql-user-skye
                  key: user
            - name: DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: riptides-mysql-user-skye
                  key: password
            - name: DB_NAME
              value: riptides
          lifecycle:
            postStart:
              exec:
                command: ["/bin/bash", "-c", "php bin/console doctrine:migrations:migrate -n"]
          volumeMounts:
            - name: keys
              mountPath: "/app/config/jwt"
              readOnly: true
        - name: cloudsql-proxy
          image: gcr.io/cloudsql-docker/gce-proxy:1.11
          command: ["/cloud_sql_proxy",
                    "-instances=riptides:europe-west4:riptides-sql=tcp:3306",
                    "-credential_file=/secrets/cloudsql/credentials.json"]
          # [START cloudsql_security_context]
          securityContext:
            runAsUser: 2  # non-root user
            allowPrivilegeEscalation: false
          # [END cloudsql_security_context]
          volumeMounts:
            - name: riptides-mysql-service-account
              mountPath: /secrets/cloudsql
              readOnly: true
      volumes:
        - name: keys
          secret:
            secretName: riptides-api-keys
            items:
            - key: private.pem
              path: private.pem
            - key: public.pem
              path: public.pem
        - name: riptides-mysql-service-account
          secret:
            secretName: riptides-mysql-service-account
---
apiVersion: "autoscaling/v2beta1"
kind: "HorizontalPodAutoscaler"
metadata:
  name: "riptides-api-hpa"
  namespace: "default"
  labels:
    app: "riptides-api"
    microservice: "riptides"
spec:
  scaleTargetRef:
    kind: "Deployment"
    name: "riptides-api"
    apiVersion: "apps/v1beta1"
  minReplicas: 1
  maxReplicas: 5
  metrics:
    - type: "Resource"
      resource:
        name: "cpu"
        targetAverageUtilization: 70

 

Если у кого-нибудь есть какие-либо предложения, я был бы навсегда благодарен

Комментарии:

1. Можете ли вы поделиться своей строкой подключения и развертываниями k8s? Возможно, вам потребуется включить VPC при создании кластера, если вы хотите подключиться к частному IP Cloud SQL без прокси.

2. @petomalina Я обновил свой пост файлом развертывания, который я использовал. В данный момент я использую общедоступный IP с прокси, не могли бы вы предложить вместо этого настроить частный IP?

3. спасибо за обновление сообщения. Глядя на ваше значение DB_HOST, вы уверены, что порт должен быть добавлен в конце? Хосты настраиваются только с DNS много раз, например 127.0.0.1

4. @petomalina Спасибо за вашу помощь, к сожалению, это не устраняет проблему. Теперь я перешел на использование частного IP, но по-прежнему сталкиваюсь с той же проблемой. Я могу использовать doctrine через командную строку нормально, но мое приложение возвращает ту же ошибку. Должна быть какая-то конфигурация symfony, которую я неправильно сконфигурировал, но я не могу понять, что это может быть

5. можете ли вы попытаться распечатать URL-адрес перед подключением к БД в Symfony?

Ответ №1:

Не похоже, что с вашим k8s yaml что-то не так, но, скорее всего, в том, как вы подключаетесь с помощью Symfony. Согласно документации здесь, Symfony ожидает, что URI базы данных будет передан через переменную среды с именем «DATABASE_URL». Смотрите следующий пример:

 # customize this line!
DATABASE_URL="postgres://db_user:db_password@127.0.0.1:5432/db_name"
 

Комментарии:

1. Спасибо, но у меня уже есть переменная DB_NAME в моем файле развертывания. Что странно, команды CLI doctrine работают как doctrine: database:create, но это просто не работает в моем приложении, должна быть какая-то конфигурация, которую я пропускаю, но. Я не вижу, что

Ответ №2:

Это происходило потому, что doctrine использовала значения по умолчанию вместо (должны быть переопределяющими) переменных среды, которые я настроил в своем развертывании. Я изменил имена переменных среды, чтобы они отличались от имен по умолчанию, и это работает