【发布时间】: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
我正在写下我使用所有真实文件关键字或文件名执行的所有步骤。
步骤
- 设置具有 3 个节点的
google cloud cluster。 - 设置
Postgres的Google Cloud SQL实例。添加新用户gothamuser,密码为gothampass:在5432端口上运行 - 通过
gothamcity-gke@miles-789.iam.gserviceaccount.com设置I am service账户并保存config.json文件。 -
Docker file[.1] 的链接 - 使用
gcloud builds submit --tag gcr.io/miles-789/gothamcity:0.10 .构建容器 -
Deployment.yaml[.2] 的链接 - 使用
kubectl create -f deployment.yaml执行部署文件 -
service.yaml[3]的链接 - 使用
kubectl create -f service.yaml执行服务文件 - 使用
kubectl create secret generic cloudsql-instance-credentials --from-file=cred.json=/Users/gotham/Downloads/cofig.json创建云 SQL 实例 - 已创建
cloudsql-db credentials using kubectl create secret generic cloudsql-db-credentials --from-literal=username=gothamuser --from-literal=password=gothampass。由于要连接多个数据库,所以没有提及数据库名称。 - 在
psql.yaml文件中添加了cloudsql-db-credentials和cloudsql-instance-credentials -
psql.yaml文件 [4] 的链接 - 使用
kubectl create -f psql.yaml执行此文件 -
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