2023年GKE中配置云 SQL 代理的完整教程:从入门到精通
云SQL代理在GKE中的使用 – 全面指南(第1部分)
大家好,读者朋友们!本文讲述了在GKE中使用Cloud SQL代理进行设定,并提供了实际演示。
如果你正在寻找一个托管的Kubernetes主机服务,不妨看一看我们为发展打造的简单易用、可托管的Kubernetes服务。
那么,让我们开始吧!
云SQL代理的优势包括:
- 方便性:使用云SQL代理可以轻松地与云SQL数据库建立安全的连接,减少了复杂的配置和管理工作。
- 安全性:云SQL代理通过认证和加密保障了数据的安全传输,提供了更高的数据安全性。
- 可扩展性:云SQL代理能够自动处理连接池管理,从而提供更好的数据库性能和可扩展性。
- 灵活性:云SQL代理支持多种操作系统和编程语言,可以适应不同的环境和需求。
- 可靠性:云SQL代理具备自动重连和故障转移功能,保证了持续的数据库连接和可靠性。
请注意,以上是云SQL代理的主要优势。
随着应用程序走向现代化,应用程序的组件现在开始将资源托管到公共云环境上,如Google、Azure、Amazon等。
关键的组件,如数据库和缓存存储,现在已经走向现代化。
大多数应用现在都被容器化,以优化资源利用和减少碳足迹。
在这种情况下,肯定有一种方式或路径可以连接作为容器托管的应用和云数据库实例。
为此,云SQL代理应运而生。
通过使用Cloud SQL Proxy,我们可以在容器化应用和云数据库实例之间建立连接。
我们也可以使用实例的私有IP地址进行连接,但是以下优势使我们倾向于使用云SQL代理作为将您的应用程序连接到云数据库实例的方法。
- 建立安全连接 – 云SQL代理通过加密往返于数据库实例的流量来启用安全连接。
- 基于IAM的数据库认证 – 它通过使用服务账号/工作负载身份启用认证,从而通过IAM复制访问权限。
在GKE中以容器/Pod的形式设置云SQL代理进行实际实施
以下是构建Cloud SQL代理Pod所需的先决条件清单:
- 一个功能完整的Google Kubernetes Engine集群,并已安装kubectl工具。
- 如果我们希望通过私有IP使用连接,需要确保云SQL代理和数据库实例共享相同的VPC网络。
- 一个Cloud SQL实例(MYSQL、PostgreSQL、SQL Server)
- PostgreSQL实例中的一个账户。在GKE集群中运行的应用程序将使用这些账户凭据连接到数据库。
步骤1:使用数据库配置创建一个密钥
对于我们在集群中运行的应用程序,我们将配置云SQL代理作为辅助容器。在这种情况下,应用程序将通过代理与数据库实例通信。
因此,我们需要将数据库配置值添加到应用容器中,以便它能够连接到定制的数据库。
为了做到这一点,我们需要在相同的命名空间中创建一个密钥,该密钥由应用容器共享,如下所示:
kubectl create secret generic <YOUR-DB-SECRET> \
--from-literal=username=<YOUR-DATABASE-USER> \
--from-literal=password=<YOUR-DATABASE-PASSWORD> \
--from-literal=database=<YOUR-DATABASE-NAME>
步骤二:获取Cloud SQL实例的配置数值
为了将应用程序连接到数据库实例,我们需要设置云SQL代理,可以选择将其作为虚拟机或容器(侧载)进行。为此,我们需要以下关于云SQL实例的信息:
- 实例连接名称
- 在持有GKE集群的项目中启用Cloud SQL Admin API
- 服务账号的JSON密钥(凭据)文件,该服务账号在持有Cloud SQL实例资源的Google项目上具有必要权限。
步骤三:生成一个用于在GKE中使用的Cloud SQL代理的服务账号
要在GKE集群中运行Cloud SQL Proxy实例,我们需要创建一个服务账号并赋予它必要的权限。
建议为不同的应用程序使用单独的服务账户,以获得更安全的体验和过渡。
服务账号的要求:
- 必须在运行Cloud SQL实例的相同项目中创建它。
- 必须至少给予它一个Cloud SQL客户端IAM角色。
- 如果使用私有IP进行连接,则Cloud SQL实例和GKE必须共享相同的VPC网络。
一旦您创建了一个服务账号,我们需要将该服务账号的密钥作为密钥从一个卷挂载到Cloud SQL代理容器上。
让我们通过下面的例子来理解这个!
使用gcloud命令创建凭据密钥文件:
gcloud iam service-accounts keys create ~/key.json \
--iam-account=YOUR-SA-NAME@project-id.iam.gserviceaccount.com
从凭据文件创建一个Kubernetes密钥:
kubectl create secret generic YOUR-SA-SECRET \
--from-file=service_account.json=~/key.json
将上述密钥用作代理容器中的卷:
volumes:
- name: <YOUR-SA-SECRET-VOLUME>
secret:
secretName: <YOUR-SA-SECRET>
第四步:作为一个旁车/容器,在Cloud SQL Proxy上执行
一旦我们达到第四步,由于以下优势,我们需要在应用程序容器中创建一个旁载代理容器。
- 由于IAM数据库权限,使用旁载代理可以减少实例对整个集群的暴露。
- 它通过加密SQL出站流量来减少和防止本地暴露。
代码
apiVersion: apps/v1
kind: Deployment
metadata:
name: <YOUR-DEPLOYMENT-NAME>
spec:
selector:
matchLabels:
app: <YOUR-APPLICATION-NAME>
template:
metadata:
labels:
app: <YOUR-APPLICATION-NAME>
spec:
containers:
- name: <YOUR-APPLICATION-NAME>
# ... 其他容器配置
env:
- name: DB_USER
valueFrom:
secretKeyRef:
name: <YOUR-DB-SECRET>
key: username
- name: DB_PASS
valueFrom:
secretKeyRef:
name: <YOUR-DB-SECRET>
key: password
- name: DB_NAME
valueFrom:
secretKeyRef:
name: <YOUR-DB-SECRET>
key: database
- name: cloud-sql-proxy
image: gcr.io/cloudsql-docker/gce-proxy:1.28.0 # 确保使用最新版本
command:
- "/cloud_sql_proxy"
- "-ip_address_types=PRIVATE"
# 将DB_PORT替换为代理应该监听的端口
# 默认值:MySQL: 3306, Postgres: 5432, SQLServer: 1433
- "-instances=<INSTANCE_CONNECTION_NAME>=tcp:<DB_PORT>"
- "-credential_file=/secrets/service_account.json"
securityContext:
runAsNonRoot: true
volumeMounts:
- name: <YOUR-SA-SECRET-VOLUME>
mountPath: /secrets/
readOnly: true
resources:
requests:
memory: "2Gi"
cpu: "1"
volumes:
- name: <YOUR-SA-SECRET-VOLUME>
secret:
secretName: <YOUR-SA-SECRET>
结论:
这是文章《云 SQL 代理在 GKE 中的使用 – 全面指南》的第3部分(共3部分)。
至此,我们已经接近这个主题的结尾。如果您在实践过程中遇到任何问题,请随时在下方评论区留言。
关于云数据库和Kubernetes本地化信息的更多相关内容,请持续关注我们。
祝您学习愉快!
参考资料
- Cloud SQL代理介绍
- GKE环境中的Cloud SQL代理