我找到了解決方案。
使用下面的yml部署代理,並將部署作爲服務公開。最重要的是,使代理監聽0.0.0.0,而不是默認的127.0.0.1。所有的祕密,按照谷歌的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連接。
但是有很多好處:
- 更簡單,不需要修改現有的K8S部署文件
- 允許切換執行到MySQL泊塢容器或使用谷歌雲SQL代理無需做任何修改到客戶端配置。
我很好奇@Hylton Peimer - 我面臨同樣的問題:我需要將SQL代理託管在一個單獨的窗格中,但是如何讓您的兩個窗格彼此進行通信?我要麼拒絕連接,要麼找不到主機名 –
公開部署的Kubernetes服務。然後使用服務的名稱。例如上面的「kubectl公開部署mysql」,然後讓客戶端使用「mysql」,就像您使用主機名一樣。 –
雖然我與您分享同樣的問題,但在同一個窗格中將代理作爲邊櫃運行有一些很好的理由: - 通過將代理公開給集羣,您將失去對哪些服務有權訪問的控制權,除非您以其他方式保護它 - 不使用標籤和選擇器,您不能確定每個節點上運行的代理程序包都需要它,這可能會影響性能,具體取決於客戶端需要與服務器交談以及如果該客戶端恰好與代理位於同一節點上。 – Khash