读者们,你们好!本文介绍了云SQL代理在GKE中的设置 ,并进行了实际演示。
如果您正在寻找托管Kubernetes托管服务,查看我们为growth.构建的简单托管Kubernetes服务
那么,让我们开始吧!😊
云SQL Proxy的优势
随着应用程序走向现代化的道路,应用程序的组件现在正在迁移到公共云环境(如Google,Azure,Amazon等)上托管资源。
数据库、高速缓存存储等关键组件现在已经为现代化铺平了道路。
大多数应用程序现在都被集装箱化,以优化和减少碳足迹。
从这个场景来看,必须有一种方式或路径在作为容器托管的应用程序和云数据库实例之间形成连接。
同样,云SQL代理也出现在我们的视野中。
通过云SQL Proxy,我们可以发起容器化应用和云数据库实例之间的连接。
我们也可以使用实例的内网IP地址进行连接,但以下优势使我们倾向于使用云SQL代理作为您的应用程序与云数据库实例的连接方式。
- 建立安全连接-Cloud SQL Proxy通过对进出数据库实例的流量进行加密来实现安全连接。
- 基于IAM的数据库身份验证-它通过使用服务帐户/工作负载身份实现身份验证,从而通过IAM复制访问。
实际实施-在GKE中将云SQL代理设置为容器/实例
以下是构建云SQL代理Pod的前提条件列表。
- 安装了 kubectl** 工具的完整Google Kubernetes Engine集群。
- 如果希望使用内网IP连接,则需要确保云SQL代理和数据库实例共享同一个VPC网络。
- 云SQL实例(MySQL、PostgreSQL、SQL Server)
- PostgreSQL实例中的帐号。在GKE集群中运行的应用程序将使用这些帐户凭据连接到数据库。
第一步:用数据库配置创建密钥
对于在集群中运行的应用程序,我们将云SQL代理配置为侧车。在这种情况下,应用程序将通过代理本身与数据库实例通信。
因此,我们需要将数据库配置值填充到应用程序容器中,以便它连接到定制的数据库。
为此,我们需要在应用程序容器共享的同一命名空间中创建一个秘密,如下所示-
1kubectl create secret generic <YOUR-DB-SECRET> \
2 --from-literal=username=<YOUR-DATABASE-USER> \
3 --from-literal=password=<YOUR-DATABASE-PASSWORD> \
4 --from-literal=database=<YOUR-DATABASE-NAME>
第二步:获取云SQL实例配置值
要将应用程序连接到数据库实例,我们需要将Cloud SQL代理设置为一个VM或一个容器(SideCar)。同样,我们需要云SQL实例的以下信息-
- 实例连接名称
- 在包含GKE集群的项目中启用Cloud SQL Admin API
- 服务帐户的JSON密钥(凭据)文件,该帐户对拥有云SQL实例资源的Google Project具有必要的权限。
第三步:生成云SQL Proxy使用的服务账号放在GKE中
要在GKE集群内运行云SQL代理实例,我们需要创建一个服务帐户并赋予其必要的权限。
建议对单独的应用程序使用单独的服务帐户,以获得更安全的体验和过渡。
服务帐户的要求-
1.必须在运行云SQL实例的同一项目中创建。 2.必须至少为其赋予云SQL客户端IAM角色。 3.如果使用内网IP进行连接,则云SQL实例和GKE必须共享同一个VPC网络。
创建服务帐号后,我们需要将服务帐号的密钥作为卷从秘密挂载到云SQL代理容器中。
让我们通过下面的例子来理解这一点!
使用gCloud命令创建凭据密钥文件-
1gcloud iam service-accounts keys create ~/key.json \
2
3--iam-account=[email protected]
从凭据文件创建K8密钥 -
1kubectl create secret generic YOUR-SA-SECRET \
2
3--from-file=service_account.json=~/key.json
使用上述密钥作为代理容器中的卷-
1volumes:
2
3- name: <YOUR-SA-SECRET-VOLUME>
4
5 secret:
6
7 secretName: <YOUR-SA-SECRET>
第四步:将云SQL代理作为侧车/实例执行
一旦我们进入步骤4,我们就需要在应用程序Pod中创建SideCar代理容器,因为它具有以下优势:
- 由于IAM数据库权限,使用SideCar可减少实例对整个集群的暴露。
- 通过加密来减少和防止本地暴露于SQL出流量。
代码-
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 name: <YOUR-DEPLOYMENT-NAME>
5spec:
6 selector:
7 matchLabels:
8 app: <YOUR-APPLICATION-NAME>
9 template:
10 metadata:
11 labels:
12 app: <YOUR-APPLICATION-NAME>
13 spec:
14 containers:
15 - name: <YOUR-APPLICATION-NAME>
16 # ... other container configuration
17 env:
18 - name: DB_USER
19 valueFrom:
20 secretKeyRef:
21 name: <YOUR-DB-SECRET>
22 key: username
23 - name: DB_PASS
24 valueFrom:
25 secretKeyRef:
26 name: <YOUR-DB-SECRET>
27 key: password
28 - name: DB_NAME
29 valueFrom:
30 secretKeyRef:
31 name: <YOUR-DB-SECRET>
32 key: database
33 - name: cloud-sql-proxy
34
35 image: gcr.io/cloudsql-docker/gce-proxy:1.28.0 # make sure the use the latest version
36 command:
37 - "/cloud_sql_proxy"
38 - "-ip_address_types=PRIVATE"
39
40 # Replace DB_PORT with the port the proxy should listen on
41 # Defaults: MySQL: 3306, Postgres: 5432, SQLServer: 1433
42 - "-instances=<INSTANCE_CONNECTION_NAME>=tcp:<DB_PORT>"
43
44 - "-credential_file=/secrets/service_account.json"
45 securityContext:
46
47 runAsNonRoot: true
48 volumeMounts:
49 - name: <YOUR-SA-SECRET-VOLUME>
50 mountPath: /secrets/
51 readOnly: true
52 resources:
53 requests:
54
55 memory: "2Gi"
56
57 cpu: "1"
58 volumes:
59 - name: <YOUR-SA-SECRET-VOLUME>
60 secret:
61 secretName: <YOUR-SA-SECRET>
结论
至此,我们已经接近这个话题的尾声。如果您遇到任何问题,请随时在下面发表评论。
有关云数据库和Kubernetes原生信息的更多此类帖子,请随时关注我们。
在此之前,学习快乐!!😊
参考文献
1.关于云SQL Proxy 2.GKE中的云SQL代理