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.
Sebelum memulai
Untuk mempersiapkan deployment, selesaikan persyaratan berikut:
Buat beberapa cluster Kubernetes di setiap lokasi untuk deployment Anda. Cluster dapat bersifat per zona jika Anda men-deploy hanya di satu zona dalam cluster tersebut. Spanner Omni mendukung konfigurasi diagram 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.
Instal dan konfigurasi alat command line
kubectldan Helm.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 diagram 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 dengan ketersediaan tinggi.
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 diagram Helm untuk deployment multi-cluster
Berikut adalah contoh diagram Helm yang dikonfigurasi untuk deployment multi-cluster Spanner Omni. Konfigurasi ini membuat
deployment di tiga region Google Cloud : 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 replika tunggal 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, dalam 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 diagram 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.
Buat sertifikat
Buat CA dan sertifikat untuk server dan API. Sertifikat server dan API harus menyertakan host dari semua cluster.
Buat 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
Buat 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
Kirimkan 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>
Instal diagram Helm untuk setiap cluster
Buat konfigurasi Helm. Untuk mengetahui informasi selengkapnya, lihat Membuat konfigurasi Helm.
Untuk deployment multi-cluster, terapkan konfigurasi diagram Helm dari file konfigurasi Helm Anda 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 akhir, 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 kemampuan pengamatan:
kubectl create namespace monitoring --context ctx-usw1
Contoh perintah penginstalan diagram Helm
Perintah berikut menginstal diagram Helm di cluster. Di setiap perintah, PATH_TO_HELM_CONFIG_FILE adalah jalur ke file YAML konfigurasi Helm chart yang Anda buat untuk deployment.
Menyisipkan diagram di us-west1 dengan pemantauan diaktifkan
helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni --version 1.0.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 diagram di us-west2 tanpa pemantauan
helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni --version 1.0.0 \
-f PATH_TO_HELM_CONFIG_FILE \
--namespace spanner-ns-usw2 \
--set currentLocation=us-west2 \
--create-namespace \
--kube-context ctx-usw2
Menginstal diagram di us-west3 tanpa pemantauan
helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni --version 1.0.0 \
-f PATH_TO_HELM_CONFIG_FILE \
--namespace spanner-ns-usw3 \
--set currentLocation=us-west3 \
--create-namespace \
--kube-context ctx-usw3
Memantau progres deployment Anda
Setelah Anda menerapkan konfigurasi diagram 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 mengelola entri DNS untuk layanan tanpa header, 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 agar 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 Anda belum melakukannya, 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 alamat IP eksternal layanan untuk berinteraksi dengan Spanner Omni. Untuk penulisan dan pembacaan kuat, gunakan alamat yang bertindak sebagai region pemimpin. Untuk permintaan baca yang tidak valid, gunakan region terdekat dengan aplikasi Anda untuk mendapatkan 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 Anda belum melakukannya, 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 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.