Cloud Composer无法连接到Cloud SQL代理服务

时间:2018-11-15 14:01:32

标签: kubernetes google-cloud-sql airflow google-kubernetes-engine google-cloud-composer

我们启动了Cloud Composer集群,并希望使用它将数据从Cloud SQL(Postgres)移至BQ。我遵循以下两个资源中提到的有关执行此操作的说明:

Google Cloud Composer and Google Cloud SQL

https://cloud.google.com/sql/docs/postgres/connect-kubernetes-engine

我们启动运行cloud_sql_proxy的Pod,并启动服务以暴露Pod。问题在于,尝试使用临时查询进行测试时,Cloud Composer无法看到指出错误的服务:

cloud not translate host name "sqlproxy-service" to address: Name or service not known"

尝试使用服务IP地址会导致页面超时。

在本地环境或云外壳中使用时,传递给cloud_sql_proxy的-instances工作。日志文件似乎表明没有尝试连接

me@cloudshell:~ (my-proj)$ kubectl logs -l app=sqlproxy-service
me@2018/11/15 13:32:59 current FDs rlimit set to 1048576, wanted limit is 8500. Nothing to do here.

    2018/11/15 13:32:59 using credential file for authentication; email=my-service-account@service.iam.gserviceaccount.com
    2018/11/15 13:32:59 Listening on 0.0.0.0:5432 for my-proj:my-ds:my-db
    2018/11/15 13:32:59 Ready for new connections

我在这里https://stackoverflow.com/a/53307344/1181412看到一条评论,甚至可能不支持此操作?

气流

enter image description here

YAML

apiVersion: v1
kind: Service
metadata:
  name: sqlproxy-service
  namespace: default
  labels:
    app: sqlproxy
spec:
  ports:
  - port: 5432
    protocol: TCP
    targetPort: 5432
  selector:
    app: sqlproxy
  sessionAffinity: None
  type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sqlproxy
  labels:
    app: sqlproxy
spec:
  selector:
    matchLabels:
      app: sqlproxy
  template:
    metadata:
      labels:
        app: sqlproxy
    spec:
      containers:
        - name: cloudsql-proxy
          ports:
          - containerPort: 5432
            protocol: TCP
          image: gcr.io/cloudsql-docker/gce-proxy:latest
          imagePullPolicy: Always
          command: ["/cloud_sql_proxy",
                    "-instances=my-proj:my-region:my-db=tcp:0.0.0.0:5432",
                    "-credential_file=/secrets/cloudsql/credentials.json"]
          securityContext:
            runAsUser: 2  # non-root user
            allowPrivilegeEscalation: false
          volumeMounts:
            - name: cloudsql-instance-credentials
              mountPath: /secrets/cloudsql
              readOnly: true
      volumes:
        - name: cloudsql-instance-credentials
          secret:
            secretName: cloudsql-instance-credentials

1 个答案:

答案 0 :(得分:1)

在链接的答案中找到的信息是正确的-不支持从Airflow Web服务器到Composer环境中的群集内部服务的临时查询。这是因为Web服务器使用自己的独立网络(未连接到GKE群集)在App Engine flex上运行,您可以在Composer architecture diagram中看到它。

在这种情况下,您的SQL代理必须公开在公共IP地址上,Composer Airflow Web服务器才能连接到它。对于侦听GKE群集内RFC1918地址(即未公开在公共IP上)的任何服务/端点,您将需要其他网络配置以接受外部连接。

如果这是您的主要阻止者,请考虑运行self-managed Airflow web server。由于此Web服务器将与您设置的SQL代理在同一群集中运行,因此名称解析将不再存在任何问题。