Membuat deployment multi-cluster untuk Spanner Omni di Kubernetes

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.

  • 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 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:

  1. Jika belum dilakukan, download skrip dns-setup.sh dari bucket Cloud Storage spanner-omni.

    Buka bucket Spanner Omni

  2. Jalankan skrip dns-setup.sh:

    dns-setup.sh -n CSV_NAME_SPACE_LIST CONTEXTS
    
    • Ganti 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.

  1. 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-usw3
    
  2. Perbarui 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 --overwrite
    
  3. Perbarui 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.

  1. Jalankan perintah berikut untuk mendapatkan alamat layanan:

    kubectl get service spanner -n spanner-ns-usw1 --context ctx-usw1
    

    EXTERNAL-IP:PORT adalah DEPLOYMENT_ENDPOINT untuk deployment Anda.

  2. Jika belum dilakukan, download Spanner Omni CLI dari bucket Cloud Storage spanner-omni.

    Buka bucket Spanner Omni

  3. 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
  4. 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.crt
    

    PostgreSQL

    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.crt
    

    Anda 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