Dokumen ini menjelaskan cara menyiapkan deployment Spanner Omni di beberapa cluster Kubernetes. Anda dapat men-deploy Spanner Omni dengan atau tanpa enkripsi TLS. Jika Anda menggunakan enkripsi, Spanner Omni akan menggunakan Transport Layer Security (TLS) 1.3 untuk mengenkripsi dan mengautentikasi komunikasi dalam deployment dan dengan kliennya.
Deployment tanpa enkripsi TLS memiliki risiko keamanan berikut:
- Siapa pun dapat mengakses deployment jika mereka dapat menjangkau alamat IP-nya.
- Tidak ada enkripsi jaringan antara klien dan server atau antara pod.
Karena risiko ini, hindari deployment yang tidak dikonfigurasi dengan enkripsi TLS untuk lingkungan produksi.
Versi Pratinjau dari Spanner Omni tidak mendukung enkripsi TLS dan berhenti menulis data 90 hari setelah Anda membuat deployment. Untuk mendapatkan akses awal ke edisi dengan fitur lengkap, hubungi Google.
Sebelum memulai
Untuk mempersiapkan deployment, selesaikan persyaratan berikut:
Buat beberapa cluster Kubernetes di setiap lokasi untuk deployment Anda. Cluster dapat bersifat zonal jika Anda men-deploy hanya di satu zona dalam cluster tersebut. Spanner Omni mendukung konfigurasi chart Helm untuk lingkungan Google Kubernetes Engine (GKE) dan Amazon Elastic Kubernetes Service (Amazon EKS). Lingkungan lain mungkin memerlukan konfigurasi kustom.
Dapatkan akses ke image container yang dihosting di Artifact Registry.
Jika Anda menyiapkan lingkungan Kubernetes di mesin platform virtualisasi vSphere, nonaktifkan virtualisasi Time Stamp Counter (TSC) dengan menambahkan
monitor_control.virtual_rdtsc = FALSEke file konfigurasi.vmxvirtual machine. Hal ini membantu TrueTime berfungsi dengan benar.Konfigurasi jaringan cluster Kubernetes sehingga pod di satu cluster dapat terhubung dengan pod di cluster lain. Secara default, Spanner Omni menggunakan port TCP 15000 hingga 15025 untuk komunikasi internal. Untuk mengaktifkan komunikasi antar-pod di cluster ini, buka port ini untuk traffic.
Konfigurasi DNS cluster untuk me-resolve nama host pod, seperti
spanner-a-0.pod.spanner-ns-r1, ke alamat IP-nya. Spanner Omni memerlukan resolusi nama host untuk koneksi TCP antar-pod di cluster yang berbeda.
Menyiapkan konfigurasi chart Helm
Buat konfigurasi Helm. Untuk mengetahui informasi selengkapnya, lihat Membuat konfigurasi Helm.
Jumlah server root per zona harus berupa bilangan ganjil antara satu dan sembilan, inklusif, untuk memastikan kuorum demi konsistensi. Jika jumlah server adalah bilangan genap, deployment mungkin gagal. Saat mengonfigurasi zona, tetapkan server sebagai server root. Sebaiknya gunakan satu untuk pengembangan atau pengujian dan tiga untuk zona produksi yang sangat tersedia.
Karena ini adalah deployment multi-cluster, pastikan file YAML konfigurasi Helm Anda menyertakan hal berikut:
# This is required for a multi-cluster deployment setup.
deployment:
multiCluster: true
Contoh konfigurasi chart Helm untuk deployment multi-cluster
Berikut adalah contoh chart Helm yang dikonfigurasi untuk deployment multi-cluster Spanner Omni. Konfigurasi ini membuat
deployment di tiga Google Cloud region: us-west1, us-west2,
dan us-west3. Deployment tersebar di lima zona, dengan setiap zona mewakili replika. Replika di us-west1 dan us-west2 bersifat baca-tulis, sedangkan satu replika di us-west3 adalah replika saksi.
# The platform of the deployment
global:
platform: gke
# This is required for a multi-cluster deployment setup.
deployment:
multiCluster: true
# Locations and zones where clusters are created for the deployment
locations:
- name: us-west1
namespace: spanner-ns-usw1
zones:
- name: "us-west1-a"
shortName: "a"
- name: "us-west1-b"
shortName: "b"
- name: us-west2
namespace: spanner-ns-usw2
zones:
- name: "us-west2-a"
shortName: "a"
- name: "us-west2-b"
shortName: "b"
- name: us-west3
namespace: spanner-ns-usw3
zones:
- name: "us-west3-a"
shortName: "a"
replicaType: WITNESS
# Remaining configuration like storage, resources, isn't included in this sample.
Mengonfigurasi kubectl untuk terhubung dengan beberapa cluster
Sebelum melanjutkan, buat cluster dengan konteks kubectl. Misalnya, di file YAML konfigurasi
Helm, Anda dapat
memberi nama konteks berdasarkan lokasi, seperti ctx-usw1, ctx-usw2, dan
ctx-usw3.
Mengonfigurasi enkripsi TLS
Jika Anda menyiapkan deployment tanpa enkripsi, lanjutkan ke Menginstal chart Helm untuk setiap cluster.
Untuk mengonfigurasi enkripsi TLS pada deployment multi-cluster, Anda harus membuat Certificate Authority (CA) dan membuat sertifikat untuk setiap cluster. Untuk mengetahui informasi selengkapnya, lihat Menambahkan enkripsi TLS ke deployment Kubernetes Anda.
Membuat sertifikat
Buat CA dan sertifikat untuk server dan API. Sertifikat server dan API harus menyertakan host dari semua cluster.
Membuat sertifikat server Spanner Omni
Server Spanner Omni menggunakan sertifikat server untuk mengenkripsi komunikasi antar-server.
Untuk membuat sertifikat server, jalankan perintah berikut. Ganti SERVER_LIST dengan daftar FQDN pod server Spanner Omni yang dipisahkan koma atau gunakan karakter pengganti.
SERVER_NAMES=*.pod.spanner-ns-usw1,*.pod.spanner-ns-usw2,*.pod.spanner-ns-usw3
Spanner Omni CLI certificates create-server --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs
Membuat sertifikat API
Sertifikat API mengenkripsi komunikasi dari sistem yang berinteraksi dengan deployment.
Untuk membuat sertifikat API, jalankan perintah berikut. Ganti OMNI_ENDPOINT dengan endpoint layanan untuk setiap cluster.
OMNI_ENDPOINT=spanner.spanner-ns-usw1,spanner.spanner-ns-usw2,spanner.spanner-ns-usw3
Spanner Omni CLI certificates create-server --filename-prefix=api --hostnames=${OMNI_ENDPOINT} --ca-certificate-directory certs --output-directory certs
Mengirim sertifikat ke setiap cluster Kubernetes
Untuk setiap cluster, buat namespace dan secret generik yang berisi sertifikat.
# Repeat for each context (for example, ctx-usw1, ctx-usw2, ctx-usw3)
# Replace NAMESPACE with the appropriate namespace for each region
kubectl create namespace <var>NAMESPACE</var> --context <var>CONTEXT</var>
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 <var>NAMESPACE</var> \
--context <var>CONTEXT</var>
Menginstal chart Helm untuk setiap cluster
Buat konfigurasi Helm. Untuk mengetahui informasi selengkapnya, lihat Membuat konfigurasi Helm.
Untuk deployment multi-cluster, terapkan konfigurasi chart Helm dari file konfigurasi Helm ke setiap cluster Kubernetes. Di setiap perintah, targetkan lokasi tertentu dan namespace-nya untuk mengikatnya ke deployment Spanner Omni. Terapkan konfigurasi ke setiap lokasi dalam urutan yang sama seperti yang tercantum dalam file konfigurasi Helm Anda. Saat Anda menerapkan konfigurasi ke lokasi terakhir, sistem akan membuat tugas bootstrap deployment di cluster tersebut.
Sebelum menginstal Helm untuk setiap cluster, buat namespace pemantauan di cluster tempat Anda berencana menghosting stack observabilitas:
kubectl create namespace monitoring --context ctx-usw1
Contoh perintah penginstalan chart Helm
Perintah berikut menginstal chart Helm di cluster. Di setiap perintah, PATH_TO_HELM_CONFIG_FILE adalah jalur ke konfigurasi chart Helm file YAML yang Anda buat untuk deployment Anda.
Menginstal chart di us-west1 dengan pemantauan diaktifkan
helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni --version 0.1.0 \
-f PATH_TO_HELM_CONFIG_FILE \
--namespace spanner-ns-usw1 \
--set currentLocation=us-west1 \
--set monitoring.enabled=true \
--create-namespace \
--kube-context ctx-usw1
Menginstal chart di us-west2 tanpa pemantauan
helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni --version 0.1.0 \
-f PATH_TO_HELM_CONFIG_FILE \
--namespace spanner-ns-usw2 \
--set currentLocation=us-west2 \
--create-namespace \
--kube-context ctx-usw2
Menginstal chart di us-west3 tanpa pemantauan
helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni --version 0.1.0 \
-f PATH_TO_HELM_CONFIG_FILE \
--namespace spanner-ns-usw3 \
--set currentLocation=us-west3 \
--create-namespace \
--kube-context ctx-usw3
Mengikuti progres deployment Anda
Setelah Anda menerapkan konfigurasi chart Helm, tugas bootstrap akan dimulai di setiap cluster Kubernetes. Setelah tugas bootstrap dimulai di cluster terakhir, jalankan perintah berikut untuk mengikuti proses deployment:
kubectl logs -n spanner-ns-usw3 -l app.kubernetes.io/component=bootstrap -f
Jika log menunjukkan bahwa deployment tidak dapat menjangkau semua server, pastikan layanan DNS di setiap cluster dikonfigurasi dengan benar.
Mengonfigurasi layanan DNS cluster
Jika Anda menggunakan DNS eksternal dengan cluster Kubernetes dan DNS tersebut mengelola entri DNS untuk layanan tanpa antarmuka, Anda dapat melewati langkah ini.
Spanner menggunakan nama host pod untuk semua komunikasi internal.
Konfigurasi DNS sehingga pod dapat me-resolve nama host meskipun berjalan di cluster Kubernetes yang berbeda. Untuk melakukannya, ekspos layanan kube-dns di setiap cluster sehingga cluster lain dapat menjangkaunya dengan menjalankan skrip dns-setup.sh.
Skrip ini men-deploy layanan load balancer di setiap cluster untuk aplikasi kube-dns, dan memperbarui konfigurasi DNS untuk mengarah ke layanan load balancer. Meskipun dns-setup.sh mengonfigurasi kube-dns dan CoreDNS di seluruh GKE dan Amazon EKS, Anda mungkin perlu mengonfigurasinya untuk lingkungan Anda.
Untuk mengonfigurasi layanan DNS cluster:
Jika belum dilakukan, download skrip
dns-setup.shdari bucket Cloud Storagespanner-omni.Jalankan skrip
dns-setup.sh:dns-setup.sh -n CSV_NAME_SPACE_LIST CONTEXTSGanti CSV_NAME_SPACE_LIST dengan daftar namespace Anda yang dipisahkan koma.
Ganti CONTEXTS dengan daftar konteks Anda.
Berikut adalah contoh penggunaan skrip
dns-setup.sh:dns-setup.sh -n spanner-ns-usw1,spanner-ns-usw2,spanner-ns-usw3 ctx-usw1 ctx-usw2 ctx-usw3
Setelah menjalankan skrip, periksa log dari tugas deployment. Pesan menunjukkan bahwa deployment sedang berlangsung, dan pesan Deployment created successfully akan muncul.
Memperbarui sertifikat API
Jika Anda menyiapkan deployment tanpa enkripsi TLS, lanjutkan ke Berinteraksi dengan Spanner Omni.
Untuk menerapkan enkripsi TLS, Anda harus memperbarui sertifikat API dengan alamat IP eksternal atau nama DNS load balancer untuk setiap cluster. Hal ini memastikan bahwa klien dapat terhubung ke deployment melalui saluran yang aman.
Dapatkan detail layanan untuk setiap cluster:
kubectl get service spanner -n spanner-ns-usw1 --context ctx-usw1 kubectl get service spanner -n spanner-ns-usw2 --context ctx-usw2 kubectl get service spanner -n spanner-ns-usw3 --context ctx-usw3Perbarui sertifikat API dengan alamat IP eksternal:
# Replace <var>EXTERNAL_IP_USW1</var>, <var>EXTERNAL_IP_USW2</var>, and <var>EXTERNAL_IP_USW3</var> # with the actual external IP addresses or DNS names. OMNI_ENDPOINT=<var>EXTERNAL_IP_USW1</var>,<var>EXTERNAL_IP_USW2</var>,<var>EXTERNAL_IP_USW3</var>,spanner.spanner-ns.svc Spanner Omni CLI certificates update --filename_prefix=api --hostnames=${OMNI_ENDPOINT} --ca-certificate-directory certs --output_directory certs --overwritePerbarui secret di setiap cluster Kubernetes dengan sertifikat API baru:
# Repeat for each context kubectl patch secret tls-certs -n spanner-ns-usw1 --context ctx-usw1 -p "{\"data\":{\"api.crt\":\"$(base64 -w 0 certs/api.crt)\"}}" kubectl patch secret tls-certs -n spanner-ns-usw2 --context ctx-usw2 -p "{\"data\":{\"api.crt\":\"$(base64 -w 0 certs/api.crt)\"}}" kubectl patch secret tls-certs -n spanner-ns-usw3 --context ctx-usw3 -p "{\"data\":{\"api.crt\":\"$(base64 -w 0 certs/api.crt)\"}}"
Berinteraksi dengan Spanner Omni
Setiap cluster dalam penyiapan multi-cluster memiliki satu layanan load balancer. Anda dapat menggunakan salah satu alamat IP eksternal layanan untuk berinteraksi dengan Spanner Omni. Untuk operasi tulis dan baca yang kuat, gunakan alamat yang bertindak sebagai region utama. Untuk permintaan baca yang tidak valid, gunakan region terdekat dengan aplikasi Anda untuk mencapai performa yang optimal.
Jalankan perintah berikut untuk mendapatkan alamat layanan:
kubectl get service spanner -n spanner-ns-usw1 --context ctx-usw1EXTERNAL-IP:PORTadalah DEPLOYMENT_ENDPOINT untuk deployment Anda.Jika belum dilakukan, download Spanner Omni CLI dari bucket Cloud Storage
spanner-omni.Jika Anda membuat deployment dengan enkripsi TLS, Anda harus menyertakan sertifikat CA dengan setiap perintah untuk membuat koneksi terenkripsi. Jika Anda mengaktifkan mTLS untuk klien, sertakan juga direktori sertifikat klien.
--ca-certificate-file=certs/ca-api.crt--client-certificate-directory=clientcerts
Gunakan Spanner Omni CLI untuk membuat database GoogleSQL atau PostgreSQL dan berinteraksi dengannya.
GoogleSQL
Untuk membuat dan berinteraksi dengan database GoogleSQL, jalankan perintah berikut:
Spanner Omni CLI databases create DATABASE_NAME \ --deployment-endpoint=dns:///DEPLOYMENT_ENDPOINT \ --ca-certificate-file=certs/ca-api.crt Spanner Omni CLI sql --database=DATABASE_NAME \ --deployment-endpoint=dns:///DEPLOYMENT_ENDPOINT \ --ca-certificate-file=certs/ca-api.crtPostgreSQL
Untuk membuat dan berinteraksi dengan database PostgreSQL, jalankan perintah berikut:
Spanner Omni CLI databases create POSTGRESQL_DATABASE_NAME \ --database_dialect POSTGRESQL \ --deployment-endpoint=dns:///DEPLOYMENT_ENDPOINT \ --ca-certificate-file=certs/ca-api.crt Spanner Omni CLI sql --database=POSTGRESQL_DATABASE_NAME \ --deployment-endpoint=dns:///DEPLOYMENT_ENDPOINT \ --ca-certificate-file=certs/ca-api.crtAnda juga dapat berinteraksi dengan database PostgreSQL dengan mengikuti petunjuk di Menghubungkan menggunakan PGAdapter untuk mengonfigurasi PGAdapter dan menggunakan alat PostgreSQL, seperti
psql, dengan database dialek PostgreSQL Anda.
Langkah berikutnya
- Pelajari cara menggunakan library klien dan driver JDBC untuk menghubungkan aplikasi Anda ke deployment.