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 环境,请通过将
monitor_control.virtual_rdtsc = FALSE添加到虚拟机的.vmx配置文件来停用时间戳计数器 (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
4. 生成封装容器密钥集
Spanner Omni 使用装载在每个服务器 Pod 的 /spanner/kms/wrapper_key 处的密钥加密密钥 (KEK) 封装密钥集来加密内部密钥,例如令牌加密和签名密钥。
如需使用 spanner keys create-keyset 生成新的封装容器密钥集文件,请运行以下命令:
./google/spanner/bin/spanner keys create-keyset --output-file=kms/wrapper_key
默认情况下,spanner keys create-keyset 会生成 AES256_GCM 密钥。如需生成其他类型的密钥,请将 --key-template 标志与以下密钥类型值之一搭配使用:AES256_GCM、AES128_GCM、AES256_GCM_RAW、CHACHA20_POLY1305 或 XCHACHA20_POLY1305。
第 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将封装容器密钥集推送到 Secret (
wrapper-key),该 Secret 挂载到每个服务器 Pod 中的/spanner/kms:kubectl create secret generic wrapper-key \ --from-file=wrapper_key="kms/wrapper_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. 创建部署
运行以下命令以创建 Deployment:
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
输出会显示进度。完成后,您会看到一条消息,指出“Deployment created successfully”(已成功创建部署)。
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 驱动程序将应用与部署连接。
- 管理用户和角色。