Crea una implementación con encriptación TLS en Kubernetes

Spanner Omni usa TLS 1.3 para encriptar los datos que fluyen entre el cliente y el servidor, y entre los servidores de Spanner Omni. Spanner Omni proporciona mTLS para mejorar la seguridad, ya que ambas partes establecen la autenticidad de la otra antes de intercambiar datos. Si usas encriptación, tus servidores deben comunicarse a través de mTLS. Puedes elegir si tu cliente y servidor también usan mTLS.

La versión Preview de Spanner Omni no admite la encriptación TLS. Para obtener las funciones que te permiten crear implementaciones con encriptación TLS, comunícate con Google y solicita acceso anticipado a la versión completa de Spanner Omni.

Antes de comenzar

Asegúrate de cumplir con los siguientes requisitos:

  • Crea un clúster de Kubernetes. La configuración admite Google Kubernetes Engine (GKE) y Amazon Elastic Kubernetes Service (Amazon EKS). Es posible que debas personalizar la configuración para que funcione en otros entornos.

  • Asegúrate de que el clúster de Kubernetes pueda acceder al artefacto de Artifact Registry que aloja el contenedor de Spanner Omni.

  • Instala y configura la herramienta de línea de comandos de kubectl y Helm.

  • Si configuras el entorno de Kubernetes en máquinas de la plataforma de virtualización de vSphere, inhabilita la virtualización del contador de marcas de tiempo (TSC) agregando monitor_control.virtual_rdtsc = FALSE al archivo de configuración .vmx de la máquina virtual. Esto garantiza que TrueTime funcione correctamente.

  • Verifica que tu entorno cumpla con los requisitos del sistema de Spanner Omni.

Paso 1: Genera los certificados

Debes crear tres conjuntos de certificados:

  • Certificados de API: Ayudan a proteger el servidor de la API de Spanner Omni.

  • Certificados de servidor: Ayudan a proteger la comunicación entre servidores.

  • Certificados de cliente: Los usuarios finales o las aplicaciones los usan para establecer su identidad y confianza con los servidores de Spanner Omni.

Una autoridad certificadora (CA) emite estos certificados. Spanner Omni proporciona herramientas para crear una CA autofirmada y los tres tipos de certificados.

Realiza los siguientes pasos en una de tus máquinas. En los pasos, se supone que el espacio de nombres es spanner-ns. Cambia esto al espacio de nombres que pretendes usar en tu implementación.

Puedes crear estos certificados en tu estación de trabajo con la CLI de Spanner Omni.

1. Crea una autoridad certificadora (AC)

Una autoridad certificadora (CA) emite todos los certificados. Es posible que tu organización tenga una CA central, o bien puedes usar una CA pública. Si bien puedes usar la misma CA para todos los certificados, los certificados de API y los certificados de cliente deben usar la misma CA.

Spanner Omni te permite crear una CA privada.

./google/spanner/bin/spanner certificates create-ca --ca-certificate-directory=certs

El comando create-ca genera el certificado de la AC en el directorio certs. Puedes copiar este certificado para usarlo como la CA de los certificados de la API o crear una CA diferente. Asegúrate de usar la CA correcta cuando crees certificados.

cp certs/ca.crt certs/ca-api.crt

El directorio $HOME/.spanner/private-keys contiene la clave privada de la CA. Es fundamental hacer una copia de seguridad de este directorio y protegerlo. Los usuarios con acceso a la clave privada pueden firmar certificados arbitrarios en los que confían los clientes que confían en la AC autofirmada. De manera opcional, puedes crear una CA adicional (o usar una CA de confianza externa) para los certificados de la API. En este documento, se usa la misma CA para todos los tipos de certificados.

2. Genera certificados de servidor

Debes generar dos tipos de certificados de servidor:

  • Certificado de API: Usa este certificado para encriptar la comunicación de los sistemas que interactúan con la implementación.

  • Certificado del servidor de Spanner: Los servidores de Spanner Omni usan este certificado para encriptar la comunicación entre sí.

Esta configuración proporciona flexibilidad para administrar estos certificados. Por ejemplo, te permite usar la rotación de certificados.

Crea el certificado del servidor de Spanner

Para crear el certificado del servidor, ejecuta el siguiente comando:

# 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

Este comando crea server.crt y server.key en el directorio certs.

Crea el certificado de API

Para crear el certificado de API, ejecuta el siguiente comando:

OMNI_ENDPOINT=spanner.NAMESPACE
./google/spanner/bin/spanner certificates create-server --filename-prefix=api --hostnames=${OMNI_ENDPOINT} --ca-certificate-directory certs --output-directory certs

Este comando crea api.crt y api.key en el directorio certs. Si es necesario, usa una CA de confianza externa para los certificados de la API.

3. Genera certificados de cliente

Puedes usar certificados de cliente para autenticar usuarios y aplicaciones. Los certificados de cliente habilitan mTLS entre el cliente y el servidor. Puedes omitir este paso si no planeas usar mTLS.

La misma CA que firma el certificado de la API debe firmar los certificados de cliente, que también deben contener un nombre de usuario para la autorización. Para este ejemplo, usa el usuario admin, que es el usuario predeterminado para cada base de datos nueva. Para obtener más información, consulta Autenticación y autorización en Spanner Omni.

USERNAME=admin
./google/spanner/bin/spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs

Este comando crea client.crt y client.key en el directorio clientcerts. Envía estos archivos a cualquier máquina que se conecte a la implementación.

Si planeas usar certificados de cliente con la biblioteca cliente de Java, debes generar la clave del certificado en formato PKCS#8. Usa el siguiente comando:

USERNAME=admin
./google/spanner/bin/spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs --generate-pkcs8-key

Paso 2: Envía los certificados al clúster de Kubernetes

Ejecuta los siguientes comandos para enviar los certificados a tu clúster de Kubernetes:

kubectl create namespace NAMESPACE

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

Paso 3: Crea la implementación con encriptación TLS

Sigue estos pasos para crear tu implementación con encriptación TLS.

1. Prepara la configuración de Helm

Consulta Crea una configuración de gráfico de Helm y crea la configuración de implementación para tu entorno.

Para habilitar TLS, establece los siguientes valores en la configuración de tu gráfico de Helm:

# Enables TLS
global:
  insecureMode: false

# Enables client certificate authentication (mTLS)
deployment:
  enableClientCertificateAuthentication: true

2. Crea la implementación:

Ejecute el siguiente comando para crear la implementación:

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 \
  --namespace NAMESPACE \
  --set monitoring.enabled=true

El comando activa un trabajo de arranque. Puedes hacer un seguimiento del progreso observando los registros de este trabajo:

kubectl logs -n NAMESPACE -l app.kubernetes.io/component=bootstrap -f

El resultado indica el progreso. Cuando se complete, verás un mensaje que indica que se creó la Deployment correctamente.

3. Verifica el estado de los Pods

Ejecuta el siguiente comando para verificar el estado del pod:

kubectl get pods --watch --namespace NAMESPACE

Todos los Pods están en el estado READY.

4. Actualiza el certificado y la implementación con los detalles del balanceador de cargas

Este paso es obligatorio si deseas que los clientes se conecten desde fuera del clúster de 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 --filename_prefix=api --hostnames=${OMNI_ENDPOINT} --ca_certificate_directory certs --output_directory certs --overwrite

# Update the secrets in Kubernetes
kubectl patch secret tls-certs -n NAMESPACE -p "{\"data\":{\"api.crt\":\"$(base64 -w 0 certs/api.crt)\"}}"

Paso 4: Interactúa con Spanner Omni

Puedes interactuar con tu implementación de Spanner Omni desde cualquier VM con la CLI de Spanner Omni.

Si habilitaste mTLS para los clientes, usa las siguientes marcas con cada comando:

  • --client-certificate-directory=CLIENT_CERTIFICATE_DIRECTORY

  • --ca-certificate-file=API_CA_CERT_FILE_PATH

1. Accede a Spanner Omni

Ejecuta el siguiente comando para acceder:

./google/spanner/bin/spanner auth login admin --ca-certificate-file=certs/ca-api.crt \
--client-certificate_directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT

La contraseña predeterminada es admin.

Successfully logged in as "admin"

2. Crea una base de datos

Ejecuta el siguiente comando para crear una base de datos:

./google/spanner/bin/spanner --deployment-endpoint=DEPLOYMENT_ENDPOINT databases create DATABASE_NAME --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts

3. Abre SQL Shell

Ejecuta el siguiente comando para abrir el 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. Crea una tabla y agrega datos

Ejecuta los siguientes comandos 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. Verifica la implementación

Para enumerar las bases de datos, ejecuta el siguiente comando:

./google/spanner/bin/spanner databases list --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT

El resultado es similar al siguiente:

NOMBRE ESTADO VERSION_RETENTION_PERIOD EARLIEST_VERSION_TIME ENABLE_DROP_PROTECTION
DATABASE_NAME READY 1 h 2025-02-07T12:25:30Z falso

Para consultar los datos, ejecuta el siguiente comando:

./google/spanner/bin/spanner sql --database=DATABASE_NAME --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT

Ejecuta los siguientes comandos SQL:

SHOW TABLES;
SELECT * FROM names;

Como alternativa, puedes seguir las instrucciones en Uso de PGAdapter con Spanner Omni para configurar PGAdapter y realizar interacciones con herramientas como psql.

Paso 5: Supervisa la implementación

Si instalaste Spanner Omni con monitoring.enabled=true, Prometheus recopila métricas. Puedes usar Grafana para visualizar estas métricas.

1. Obtén los detalles del servicio

Ejecuta los siguientes comandos para obtener los detalles del servicio:

# 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

¿Qué sigue?