我想将我的kubernetes群集连接到Google Cloud SQL。
我使用JDBC URL 用户名/密码至少有10种不同部署的POD,这些POD目前连接到MySQL [Docker Image部署到K8S]。
可以使用Google Cloud SQL代理的单个实例,然后通过此代理将所有POD连接到Cloud SQL数据库?理想情况下,我想用代理替换在容器中运行的MySQL。
我宁愿不必在每个部署中运行代理。我发现的唯一样本似乎表明每个部署都需要声明代理。
我找到了一个解决方案。
用下面的YML部署代理,并将部署作为服务公开。最重要的是,让代理在0.0.0.0上聆听,而不是默认为127.0.0.1。根据Google Cloud SQL文档的所有秘密
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: mysql
spec:
replicas: 1
template:
metadata:
name: mysql
labels:
name: mysql
spec:
containers:
- image: b.gcr.io/cloudsql-docker/gce-proxy:1.05
name: cloudsql-proxy
command: ["/cloud_sql_proxy", "--dir=/cloudsql",
"-instances=MYSQL:ZONE:DATABASE_INSTANCE=tcp:0.0.0.0:3306",
"-credential_file=/secrets/cloudsql/credentials.json"]
volumeMounts:
- name: cloudsql-oauth-credentials
mountPath: /secrets/cloudsql
readOnly: true
- name: ssl-certs
mountPath: /etc/ssl/certs
ports:
- containerPort: 3306
name: mysql
volumes:
- name: cloudsql-oauth-credentials
secret:
secretName: cloudsql-oauth-credentials
- name: ssl-certs
hostPath:
path: /etc/ssl/certs
由于有额外的TCP连接,该解决方案比在与客户端软件相同的部署中的代理要贵一些。
但是有很多好处:
- 更简单,不需要修改现有的K8部署文件
- 允许将实现切换到MySQL Docker容器或使用Google Cloud SQL代理,而没有对客户端配置进行任何修改。
您可以创建一个部署和服务,以将CloudSQL代理公开到其他吊舱中:
apiVersion: v1
kind: Service
metadata:
name: cloudsqlproxy
spec:
ports:
- port: 3306
targetPort: database-port
selector:
app: cloudsqlproxy
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: cloudsqlproxy
spec:
template:
metadata:
labels:
app: cloudsqlproxy
spec:
volumes:
- name: service-account-token
secret:
secretName: service-account-token
containers:
- name: cloudsql-proxy
image: gcr.io/cloudsql-docker/gce-proxy:1.11
imagePullPolicy: Always
command:
- /cloud_sql_proxy
- -instances=<project>:<cloudsqlinstance>=tcp:0.0.0.0:3306
- -credential_file=/secrets/cloudsql/credentials.json
ports:
- name: database-port
containerPort: 3306
volumeMounts:
- name: service-account-token
mountPath: /secrets/cloudsql
readOnly: true
因此,在您的任何吊舱中,您的MYSQL_HOST:MYSQL_PORT
的数据库将为cloudsqlproxy:3306
对于通过相同代理的多个数据库,您将具有相同的代理部署结构,只是您现在将从POD中公开2个端口,例如:
apiVersion: extensions/v1beta1
...
spec:
template:
...
spec:
volumes:
...
containers:
- name: cloudsql-proxy
...
ports:
- name: database-port1
containerPort: 3306
- name: database-port2
containerPort: 3307
...
然后,您将创建2个服务,以在这些端口上进行发现:
apiVersion: v1
kind: Service
metadata:
name: cloudsqlproxy-db1
spec:
ports:
- port: 3306
targetPort: database-port1
selector:
app: cloudsqlproxy
---
apiVersion: v1
kind: Service
metadata:
name: cloudsqlproxy-db2
spec:
ports:
- port: 3306
targetPort: database-port2
selector:
app: cloudsqlproxy
因此,将这两个服务设置为端口3306
,您可以连接到该端口上的每个数据库:
mysql --host=cloudsqlproxy-db1 --port=3306 ...
mysql --host=cloudsqlproxy-db2 --port=3306 ...
参考:https://github.com/googlecloodplatform/cloudsql-proxy/blob/master/kubernetes.md
使用Google" private ip"云代理现在无关紧要!