Spanner Omni 使用 TLS 1.3 加密客户端与服务器之间以及 Spanner Omni 服务器之间的数据流。 Spanner Omni 提供 mTLS 以增强安全性,其中双方在交换任何数据之前都会确定对方的真实性。如果您使用加密,则服务器必须通过 mTLS 进行通信。您可以选择客户端和服务器是否也使用 mTLS。
准备工作
确保您满足以下要求:
创建 Kubernetes 集群。该配置支持 Google Kubernetes Engine (GKE) 和 Amazon Elastic Kubernetes Service (Amazon EKS)。您可能需要自定义配置,才能在其他环境中运行。
确保 Kubernetes 集群可以访问托管 Spanner Omni 容器的 Artifact Registry 制品。
安装并配置
kubectl命令行工具和 Helm。如果您在 vSphere 虚拟化平台机器上设置 Kubernetes 环境,请通过向虚拟机的
.vmx配置文件添加monitor_control.virtual_rdtsc = FALSE来停用时间戳计数器 (TSC) 虚拟化。这可确保 TrueTime 正常运行。验证您的环境是否符合 Spanner Omni 系统要求。
第 1 步:生成证书
您必须创建三组证书:
API 证书:这些证书有助于保护 Spanner Omni API 服务器。
服务器证书:有助于保护服务器间通信。
客户端证书:最终用户或应用使用这些证书来建立与 Spanner Omni 服务器的身份和信任关系。
这些证书由证书授权机构 (CA) 颁发。Spanner Omni 提供了用于创建自签名 CA 和所有三种类型证书的工具。
在其中一台设备上执行以下步骤。这些步骤假定命名空间为 spanner-ns。请将此值更改为您打算在部署中使用的命名空间。
您可以使用 Spanner Omni CLI 在工作站上创建这些证书。
1. 创建证书授权机构 (CA)
所有证书均由证书授权机构 (CA) 颁发。您的组织可能拥有中央 CA,或者您也可以使用公共 CA。虽然您可以为所有证书使用同一 CA,但 API 证书和客户端证书必须使用同一 CA。
借助 Spanner Omni,您可以创建私有 CA。
./google/spanner/bin/spanner certificates create-ca --ca-certificate-directory=certs
create-ca 命令会在 certs 目录中生成 CA 证书。您可以复制此证书以用作 API 证书的 CA,也可以创建其他 CA。确保在创建证书时使用正确的 CA。
cp certs/ca.crt certs/ca-api.crt
目录 $HOME/.spanner/private-keys 包含 CA 的私钥。
请务必备份并保护此目录。有权访问私钥的用户可以签署任意证书,而信任自签名 CA 的客户端会信任这些证书。您可以选择为 API 证书创建额外的 CA(或使用外部可信的 CA)。本文档针对所有类型的证书使用相同的 CA。
2. 生成服务器证书
您必须生成两种类型的服务器证书:
API 证书:使用此证书可加密与部署进行交互的系统的通信。
Spanner 服务器证书:Spanner Omni 服务器使用此证书来加密彼此之间的通信。
此配置可灵活管理这些证书。例如,它允许您使用证书轮替。
创建 Spanner 服务器证书
如需创建服务器证书,请运行以下命令:
# Comma-separate names of the Spanner servers; wildcards are supported.
SERVER_NAMES=*.pod.NAMESPACE
./google/spanner/bin/spanner certificates create-server --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs
此命令会在 certs 目录中创建 server.crt 和 server.key。
创建 API 证书
如需创建 API 证书,请运行以下命令:
OMNI_ENDPOINT=spanner.NAMESPACE
./google/spanner/bin/spanner certificates create-server --filename-prefix=api --hostnames=${OMNI_ENDPOINT} --ca-certificate-directory certs --output-directory certs
此命令会在 certs 目录中创建 api.crt 和 api.key。如有必要,请为 API 证书使用外部可信的 CA。
3. 生成客户端证书
您可以使用客户端证书对用户和应用进行身份验证。客户端证书可在客户端与服务器之间启用 mTLS。如果您不打算使用 mTLS,可以跳过此步骤。
为 API 证书签名的 CA 必须为客户端证书签名,客户端证书还必须包含用于授权的用户名。在此示例中,请使用 admin 用户,这是每个新数据库的默认用户。如需了解详情,请参阅 Spanner Omni 中的身份验证和授权。
USERNAME=admin
./google/spanner/bin/spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs
此命令会在 clientcerts 目录中创建 client.crt 和 client.key。将这些文件发送到连接到部署的任何机器。
如果您计划将客户端证书与 Java 客户端库搭配使用,则必须以 PKCS#8 格式生成证书密钥。使用以下命令:
USERNAME=admin
./google/spanner/bin/spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs --generate-pkcs8-key
第 2 步:将证书和管理员密码推送到 Kubernetes 集群
运行以下命令以创建命名空间,并将证书和管理员密码推送到 Kubernetes 集群:
创建此命名空间:
kubectl create namespace NAMESPACE将 TLS 证书推送到 Secret:
kubectl create secret generic tls-certs \ --from-file=ca.crt="certs/ca.crt" \ --from-file=ca-api.crt="certs/ca-api.crt" \ --from-file=server.crt="certs/server.crt" \ --from-file=server.key="certs/server.key" \ --from-file=api.crt="certs/api.crt" \ --from-file=api.key="certs/api.key" \ -n NAMESPACE创建一个包含默认
admin用户密码的密码文件,该文件具有受限的权限(仅可由其所有者读取,权限为 600):printf '%s' 'PASSWORD' > admin_password.txt chmod 600 admin_password.txt密码必须符合以下要求:
- 长度介于 8 到 32 个字符之间。
- 至少一个大写字符。
- 至少包含一个小写字符。
- 至少一个数字。
- 至少一个特殊字符。
为管理员密码创建 Secret:
kubectl create secret generic spanner-admin-password \ --from-file=password=admin_password.txt \ -n NAMESPACE
第 3 步:创建采用 TLS 加密的部署
请按照以下步骤创建采用 TLS 加密的部署。
1. 准备 Helm 配置
请参阅创建 Helm 图表配置,并为您的环境创建部署配置。
如需启用 TLS 并配置管理员密码,请在 Helm 图表配置中设置以下值:
# Enables TLS
global:
insecureMode: false
# Enables client certificate authentication (mTLS)
deployment:
enableClientCertificateAuthentication: true
# Name of the secret containing the administrator password
adminPasswordSecret: spanner-admin-password
2. 创建部署
运行以下命令以创建部署:
kubectl create ns monitoring
helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni \
--version VERSION \
--set global.platform=gke \
--set global.insecureMode=false \
--set deployment.enableClientCertificateAuthentication=true \
--set deployment.adminPasswordSecret=spanner-admin-password \
--namespace NAMESPACE \
--set monitoring.enabled=true
该命令会触发引导作业。您可以通过查看此作业的日志来跟踪进度:
kubectl logs -n NAMESPACE -l app.kubernetes.io/component=bootstrap -f
输出会指示进度。完成后,您会看到一条消息,指出“部署已成功创建”。
3. 检查 pod 的状态
运行以下命令以验证 pod 状态:
kubectl get pods --watch --namespace NAMESPACE
所有 pod 都处于 READY 状态。
4. 使用负载均衡器详细信息更新证书和部署
如果您希望客户端从 Kubernetes 集群外部进行连接,则必须执行此步骤。
# Get the service details
kubectl get service spanner -n NAMESPACE
# The EXTERNAL-IP:PORT is the API or deployment endpoint for your deployment.
# Update the API certificate with these details.
OMNI_ENDPOINT=EXTERNAL_IP,spanner.NAMESPACE.svc
./google/spanner/bin/spanner certificates update \
--certificate-file=certs/api.crt \
--certificate-key-file=certs/api.key \
--hostnames=${OMNI_ENDPOINT} \
--ca-certificate-directory=certs
# Update the secrets in Kubernetes
kubectl patch secret tls-certs -n NAMESPACE -p "{\"data\":{\"api.crt\":\"$(base64 -w 0 certs/api.crt)\"}}"
第 4 步:与 Spanner Omni 互动
您可以使用 Spanner Omni CLI 从任何虚拟机与 Spanner Omni 部署进行交互。
如果您为客户端启用了 mTLS,请在每个命令中使用以下标志:
--client-certificate-directory=CLIENT_CERTIFICATE_DIRECTORY--ca-certificate-file=API_CA_CERT_FILE_PATH
1. 登录 Spanner Omni(可选)
登录 Spanner Omni(如果您使用客户端证书,则此步骤为可选步骤):
./google/spanner/bin/spanner auth login admin \
--ca-certificate-file=certs/ca-api.crt \
--deployment-endpoint=DEPLOYMENT_ENDPOINT
当系统提示时,输入在 admin_password.txt 中配置的密码。
Successfully logged in as "admin"
2. 创建数据库
运行以下命令以创建数据库:
./google/spanner/bin/spanner --deployment-endpoint=DEPLOYMENT_ENDPOINT databases create DATABASE_NAME --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts
3. 打开 SQL Shell
运行以下命令以打开 shell:
./google/spanner/bin/spanner sql --database=DATABASE_NAME --deployment-endpoint=DEPLOYMENT_ENDPOINT --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts
4. 创建表格并添加数据
运行以下 SQL 命令:
spanner> CREATE TABLE names (nameId INT64 NOT NULL, name String(100)) PRIMARY KEY (nameId);
Query OK, 0 rows affected (4.62 sec)
spanner> INSERT names (nameId, name) VALUES (1, "Jack");
Query OK, 1 rows affected (0.18 sec)
5. 验证 Deployment
如需列出数据库,请运行以下命令:
./google/spanner/bin/spanner databases list --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT
输出类似于以下内容:
| 名称 | 状态 | VERSION_RETENTION_PERIOD | EARLIEST_VERSION_TIME | ENABLE_DROP_PROTECTION |
|---|---|---|---|---|
| DATABASE_NAME | 准备就绪 | 1 小时 | 2025-02-07T12:25:30Z | false |
如需查询数据,请运行以下命令:
./google/spanner/bin/spanner sql --database=DATABASE_NAME --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT
运行以下 SQL 命令:
SHOW TABLES;
SELECT * FROM names;
或者,您也可以按照将 PGAdapter 与 Spanner Omni 搭配使用中的说明配置 PGAdapter,并使用 psql 等工具进行互动。
第 5 步:监控部署
如果您使用 monitoring.enabled=true 安装了 Spanner Omni,Prometheus 会抓取指标。您可以使用 Grafana 直观呈现这些指标。
1. 获取服务详情
运行以下命令以获取服务详情:
# Prometheus service details. Default port is 9090.
kubectl get service prometheus-service -n monitoring
# Grafana service details. Default port is 3000.
kubectl get service grafana -n monitoring
后续步骤
- 使用客户端库和 JDBC 驱动程序将应用与部署连接起来。
- 管理用户和角色。