Membuat deployment dengan enkripsi TLS di Kubernetes

Spanner Omni menggunakan TLS 1.3 untuk mengenkripsi data yang mengalir antara klien dan server, serta antara server Spanner Omni. Spanner Omni menyediakan mTLS untuk meningkatkan keamanan di mana kedua pihak saling membangun keaslian sebelum bertukar data. Jika Anda menggunakan enkripsi, server Anda harus berkomunikasi melalui mTLS. Anda dapat memilih apakah klien dan server Anda juga menggunakan mTLS.

Versi Pratinjau Spanner Omni tidak mendukung enkripsi TLS. Untuk mendapatkan fitur yang memungkinkan Anda membuat deployment dengan enkripsi TLS, hubungi Google untuk meminta akses awal ke Spanner Omni versi lengkap.

Sebelum memulai

Pastikan Anda memenuhi persyaratan berikut:

  • Membuat cluster Kubernetes Konfigurasi ini mendukung Google Kubernetes Engine (GKE) dan Amazon Elastic Kubernetes Service (Amazon EKS). Anda mungkin perlu menyesuaikan konfigurasi agar berfungsi di lingkungan lain.

  • Pastikan cluster Kubernetes dapat mengakses artefak Artifact Registry yang menghosting penampung Spanner Omni.

  • Instal dan konfigurasi alat command line kubectl dan Helm.

  • Jika Anda menyiapkan lingkungan Kubernetes di mesin platform virtualisasi vSphere, nonaktifkan virtualisasi Time Stamp Counter (TSC) dengan menambahkan monitor_control.virtual_rdtsc = FALSE ke file konfigurasi .vmx virtual machine. Hal ini memastikan TrueTime berfungsi dengan benar.

  • Pastikan lingkungan Anda memenuhi persyaratan sistem Spanner Omni.

Langkah 1: Buat sertifikat

Anda harus membuat tiga set sertifikat:

  • Sertifikat API: Sertifikat ini membantu melindungi server Spanner Omni API.

  • Sertifikat server: Sertifikat ini membantu melindungi komunikasi antar-server.

  • Sertifikat klien: Pengguna akhir atau aplikasi menggunakannya untuk menetapkan identitas dan kepercayaan mereka dengan server Spanner Omni.

Sertifikat ini diterbitkan oleh Otoritas Sertifikasi (CA). Spanner Omni menyediakan alat untuk membuat CA yang ditandatangani sendiri dan ketiga jenis sertifikat.

Lakukan langkah-langkah berikut di salah satu perangkat Anda. Langkah-langkah ini mengasumsikan bahwa namespace adalah spanner-ns. Ubah ini ke namespace yang ingin Anda gunakan dalam deployment.

Anda dapat membuat sertifikat ini di workstation menggunakan Spanner Omni CLI.

1. Buat Otoritas Sertifikasi (CA)

Otoritas Sertifikasi (CA) menerbitkan semua sertifikat. Organisasi Anda mungkin memiliki CA pusat, atau Anda dapat menggunakan CA publik. Meskipun Anda dapat menggunakan CA yang sama untuk semua sertifikat, sertifikat API dan sertifikat klien harus menggunakan CA yang sama.

Spanner Omni memungkinkan Anda membuat CA pribadi.

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

Perintah create-ca akan membuat sertifikat CA di direktori certs. Anda dapat menyalin sertifikat ini untuk digunakan sebagai CA bagi sertifikat API, atau membuat CA lain. Pastikan Anda menggunakan CA yang benar saat membuat sertifikat.

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

Direktori $HOME/.spanner/private-keys berisi kunci pribadi untuk CA. Anda harus mencadangkan dan mengamankan direktori ini. Pengguna dengan akses ke kunci pribadi dapat menandatangani sertifikat arbitrer yang dipercayai oleh klien yang mempercayai CA yang ditandatangani sendiri. Jika perlu, Anda dapat membuat CA tambahan (atau menggunakan CA yang dipercaya secara eksternal) untuk sertifikat API. Dokumen ini menggunakan CA yang sama untuk semua jenis sertifikat.

2. Membuat sertifikat server

Anda harus membuat dua jenis sertifikat server:

  • Sertifikat API: Gunakan sertifikat ini untuk mengenkripsi komunikasi dari sistem yang berinteraksi dengan deployment.

  • Sertifikat server Spanner: Server Spanner Omni menggunakan sertifikat ini untuk mengenkripsi komunikasi satu sama lain.

Konfigurasi ini memberikan fleksibilitas dalam mengelola sertifikat ini. Misalnya, Anda dapat menggunakan rotasi sertifikat.

Buat sertifikat server Spanner

Untuk membuat sertifikat server, jalankan perintah berikut:

# 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

Perintah ini akan membuat server.crt dan server.key di direktori certs.

Buat sertifikat API

Untuk membuat sertifikat API, jalankan perintah berikut:

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

Perintah ini akan membuat api.crt dan api.key di direktori certs. Jika perlu, gunakan CA tepercaya eksternal untuk sertifikat API.

3. Membuat sertifikat klien

Anda dapat menggunakan sertifikat klien untuk mengautentikasi pengguna dan aplikasi. Sertifikat klien memungkinkan mTLS antara klien dan server. Anda dapat melewati langkah ini jika Anda tidak berencana menggunakan mTLS.

CA yang sama yang menandatangani sertifikat API harus menandatangani sertifikat klien, yang juga harus berisi nama pengguna untuk otorisasi. Untuk contoh ini, gunakan pengguna admin, yang merupakan pengguna default untuk setiap database baru. Untuk mengetahui informasi selengkapnya, lihat Autentikasi dan otorisasi di Spanner Omni.

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

Perintah ini akan membuat client.crt dan client.key di direktori clientcerts. Kirim file ini ke mesin mana pun yang terhubung ke deployment.

Jika Anda berencana menggunakan sertifikat klien dengan library klien Java, Anda harus membuat kunci sertifikat dalam format PKCS#8. Gunakan perintah berikut:

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

Langkah 2: Kirim sertifikat ke cluster Kubernetes

Jalankan perintah berikut untuk mengirimkan sertifikat ke cluster Kubernetes Anda:

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

Langkah 3: Buat deployment dengan enkripsi TLS

Ikuti langkah-langkah berikut untuk membuat deployment dengan enkripsi TLS.

1. Menyiapkan konfigurasi Helm

Lihat Membuat konfigurasi diagram Helm dan buat konfigurasi deployment untuk lingkungan Anda.

Untuk mengaktifkan TLS, tetapkan nilai berikut dalam konfigurasi diagram Helm Anda:

# Enables TLS
global:
  insecureMode: false

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

2. Buat deployment

Jalankan perintah berikut untuk membuat 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 \
  --namespace NAMESPACE \
  --set monitoring.enabled=true

Perintah ini memicu tugas bootstrap. Anda dapat melacak progres dengan melihat log tugas ini:

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

Output menunjukkan progres. Setelah selesai, Anda akan melihat pesan yang menyatakan "Deployment created successfully".

3. Periksa status pod

Jalankan perintah berikut untuk memverifikasi status pod:

kubectl get pods --watch --namespace NAMESPACE

Semua pod dalam status READY.

4. Perbarui sertifikat dan deployment dengan detail load balancer

Langkah ini diperlukan jika Anda ingin klien terhubung dari luar cluster 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)\"}}"

Langkah 4: Berinteraksi dengan Spanner Omni

Anda dapat berinteraksi dengan deployment Spanner Omni dari VM mana pun menggunakan Spanner Omni CLI.

Jika Anda mengaktifkan mTLS untuk klien, gunakan flag berikut dengan setiap perintah:

  • --client-certificate-directory=CLIENT_CERTIFICATE_DIRECTORY

  • --ca-certificate-file=API_CA_CERT_FILE_PATH

1. Login ke Spanner Omni

Jalankan perintah berikut untuk login:

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

Sandi default-nya adalah admin.

Successfully logged in as "admin"

2. Buat database

Jalankan perintah berikut untuk membuat database:

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

3. Buka SQL Shell

Jalankan perintah berikut untuk membuka 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. Membuat tabel dan menambahkan data

Jalankan perintah SQL berikut:

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. Memverifikasi deployment

Untuk mencantumkan database, jalankan perintah berikut:

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

Outputnya akan terlihat mirip seperti berikut:

NAMA STATUS VERSION_RETENTION_PERIOD EARLIEST_VERSION_TIME ENABLE_DROP_PROTECTION
DATABASE_NAME SIAP 1j 2025-02-07T12:25:30Z false

Untuk membuat kueri data, jalankan perintah berikut:

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

Jalankan perintah SQL berikut:

SHOW TABLES;
SELECT * FROM names;

Atau, Anda dapat mengikuti petunjuk di Menggunakan PGAdapter dengan Spanner Omni untuk mengonfigurasi PGAdapter dan berinteraksi menggunakan alat seperti psql.

Langkah 5: Pantau deployment

Jika Anda menginstal Spanner Omni dengan monitoring.enabled=true, Prometheus akan meng-scrape metrik. Anda dapat menggunakan Grafana untuk memvisualisasikan metrik ini.

1. Mendapatkan detail layanan

Jalankan perintah berikut untuk mendapatkan detail layanan:

# 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

Langkah berikutnya