【问题标题】:How to configure cloud SQL with GKE using cloud sql proxy?如何使用 Cloud sql 代理通过 GKE 配置 Cloud SQL?
【发布时间】:2021-05-06 15:37:54
【问题描述】:

我正在尝试使用CloudSQL proxy 在Google Cloud Postgres 和Google Kubernetes Engine 之间建立连接。如果我查看两个工作负载的日志:

我得到:

2021-02-02T11:42:09.748706102Z2021/02/02 11:42:09 dial tcp 127.0.0.1:5432: connect: connection refused

我正在写下我使用所有真实文件关键字或文件名执行的所有步骤。

步骤

  1. 设置具有 3 个节点的 google cloud cluster。
  2. 设置Postgres 的Google Cloud SQL 实例。添加新用户gothamuser,密码为gothampass:在5432端口上运行
  3. 通过gothamcity-gke@miles-789.iam.gserviceaccount.com设置I am service账户并保存config.json文件。
  4. Docker file [.1] 的链接
  5. 使用gcloud builds submit --tag gcr.io/miles-789/gothamcity:0.10 . 构建容器
  6. Deployment.yaml [.2] 的链接
  7. 使用kubectl create -f deployment.yaml执行部署文件
  8. service.yaml[3]的链接
  9. 使用kubectl create -f service.yaml执行服务文件
  10. 使用 kubectl create secret generic cloudsql-instance-credentials --from-file=cred.json=/Users/gotham/Downloads/cofig.json 创建云 SQL 实例
  11. 已创建cloudsql-db credentials using kubectl create secret generic cloudsql-db-credentials --from-literal=username=gothamuser --from-literal=password=gothampass。由于要连接多个数据库,所以没有提及数据库名称。
  12. 在psql.yaml 文件中添加了cloudsql-db-credentials 和cloudsql-instance-credentials
  13. psql.yaml 文件 [4] 的链接
  14. 使用kubectl create -f psql.yaml 执行此文件
  15. Go 项目 [5] 上的数据库配置

kubectl 命令的屏幕截图

1 kubectl get nodes

2kubectl get pods

提到的文件

[1.] 码头工人

FROM golang:alpine AS build-env
ENV GOPATH /go
WORKDIR /go/src
COPY . /go/src/gothamcity

RUN cd /go/src/gothamcity && go build .

FROM alpine
RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk*

WORKDIR /app
COPY --from=build-env /go/src/gothamcity/gothamcity /app
COPY .env /app

EXPOSE 5432
EXPOSE 8080

ENTRYPOINT [ "./gothamcity" ]

[2.] 部署.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: gothamcity-backend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gothamcity
  template:
    metadata:
      labels:
        app: gothamcity
    spec:
      containers:
      - name: gothamcity-app
        image: gcr.io/miles-789/gothamcity:0.10
        ports:
        - containerPort: 8080
        env:
          - name: PORT
            value: "8080"

[3] 服务.yaml

apiVersion: v1
kind: Service
metadata:
  name: gothamcity
spec:
  type: LoadBalancer
  selector:
    app: gothamcity
  ports:
  - port: 80
    targetPort: 8080

[4] psql.yaml

 apiVersion: apps/v1
kind: Deployment
metadata:
  name: gothamcity-psql-proxy
spec:
  selector:
    matchLabels:
      app: gothamcity
  template:
    metadata:
      labels:
        app: gothamcity
    spec:
      containers:
      - image: gcr.io/miles-789/gothamcity:0.10
        name: gothamcity-app
        env:
        - namee: DB_HOST
          value: 127.0.0.1
        - name: DB_USER
          valueFrom:
            secretKeyRef:
              name: cloudsql-db-credentials
              key: username
        - name: DB_PASS
          valueFrom:
            secretKeyRef:
              name: cloudsql-db-credentials
              key: password
        - name: DB_NAME
          valueFrom:
            secretKeyRef:
              name: cloudsql-db-credentials
              key: database
      - name: cloud-sql-proxy
        image: gcr.io/cloudsql-docker/gce-proxy:1.17
        command:
          - "/cloud_sql_proxy"
          - "-instances=miles-789:europe-east1:gotham-miles-v1=tcp:5432"
          - "-credential_file=/secrets/config.json"
        securityContext:
          runAsNonRoot: true
        volumeMounts:
        - name: cloudsql-instance-credentials
          mountPath: /secrets/
          readOnly: true
      volumes:
      - name: cloudsql-instance-credentials
        secret:
          secretName: cloudsql-instance-credentials

[5] 数据库配置

package dataservices

import "os"

const (
    dbhost = "DBHOST"
    dbport = "DBPORT"
    dbuser = "DBUSER"
    dbpass = "DBPASS"
    dbname = "DBNAME"
    env    = "ENV"
)

func dbConfig(database string) map[string]string {
    var host = os.Getenv("DB_HOST")
    var user = os.Getenv("DB_USER")
    var password = os.Getenv("DB_PASS")
    var name = database
    var port = "5432"
    conf := make(map[string]string)
    conf[dbhost] = host
    conf[dbport] = port
    conf[dbuser] = user
    conf[dbpass] = password
    conf[dbname] = name
    return conf
}

我不明白我在这里做错了什么。是错字还是我在这里遗漏了某种配置。

【问题讨论】:

  • 根据this document,如果使用私有IP连接,您必须使用与您的Cloud SQL实例在同一VPC中的VPC原生GKE集群。您是否验证 gothamcity-psql-proxy 中的端口 5432 是否打开?如果您有出站防火墙策略,请确保它允许连接到目标计算机上的port 3307。

标签: docker go kubernetes google-kubernetes-engine cloud-sql-proxy


【解决方案1】:

这是一个私有集群吗? 如果是这样,您需要在同一个 VPC 上拥有 SQL DB(或拥有 VPC 对等)才能让您的应用访问 SQL DB

或者您需要在您的 VPC 上设置 Cloud NAT,以便集群与 SQL DB 对话

这很有用

https://groups.google.com/g/google-cloud-sql-discuss/c/6lA0r6zRfeI/m/hr8mRt9AGgAJ

【讨论】:

  • 感谢您的回答:我确实检查了集群信息并发现:Networking Private cluster is Disabled VPC-native traffic routing is Enabled 对吗?
猜你喜欢
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 2022-01-20
  • 2022-01-08
相关资源
最近更新 更多