2016-12-15 167 views
4

我想将我的Kubernetes群集连接到Google Cloud SQL。通过代理连接到Google Cloud SQL的多个K8S容器

我有至少10个不同的部署荚,目前使用JDBC url +用户名/密码连接到MySQL [部署到k8s的docker映像]。

它可以使用Google Cloud SQL Proxy的单个实例并通过此代理将所有Pod连接到Cloud SQL数据库?理想情况下,我想用代理替换容器中运行的mysql。

我宁愿不必在每个部署中运行代理。我发现的唯一示例似乎表明代理需要在每个部署中声明。

回答

9

我找到了解决方案。

使用下面的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代理无需做任何修改到客户端配置。
+0

我很好奇@Hylton Peimer - 我面临同样的问题:我需要将SQL代理托管在一个单独的窗格中,但是如何让您的两个窗格彼此进行通信?我要么拒绝连接,要么找不到主机名 –

+0

公开部署的Kubernetes服务。然后使用服务的名称。例如上面的“kubectl公开部署mysql”,然后让客户端使用“mysql”,就像您使用主机名一样。 –

+0

虽然我与您分享同样的问题,但在同一个窗格中将代理作为边柜运行有一些很好的理由: - 通过将代理公开给集群,您将失去对哪些服务有权访问的控制权,除非您以其他方式保护它 - 不使用标签和选择器,您不能确定每个节点上运行的代理程序包都需要它,这可能会影响性能,具体取决于客户端需要与服务器交谈以及如果该客户端恰好与代理位于同一节点上。 – Khash

相关问题