Merampingkan penerapan PostgreSQL di Amazon EKS dengan menggunakan PGO - AWS Prescriptive Guidance

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Merampingkan penerapan PostgreSQL di Amazon EKS dengan menggunakan PGO

Shalaka Dengale, Amazon Web Services

Ringkasan

Pola ini mengintegrasikan Operator Postgres dari Crunchy Data (PGO) dengan Amazon Elastic Kubernetes Service (Amazon EKS) untuk merampingkan penerapan PostgreSQL di lingkungan cloud-native. PGO menyediakan otomatisasi dan skalabilitas untuk mengelola database PostgreSQL di Kubernetes. Saat Anda menggabungkan PGO dengan Amazon EKS, PGO akan membentuk platform yang kuat untuk menerapkan, mengelola, dan menskalakan database PostgreSQL secara efisien.

Integrasi ini memberikan manfaat utama berikut:

  • Penyebaran otomatis: Menyederhanakan penyebaran dan manajemen cluster PostgreSQL.

  • Definisi sumber daya kustom (CRDs): Menggunakan primitif Kubernetes untuk manajemen PostgreSQL.

  • Ketersediaan tinggi: Mendukung failover otomatis dan replikasi sinkron.

  • Pencadangan dan pemulihan otomatis: Merampingkan proses pencadangan dan pemulihan.

  • Penskalaan horisontal: Memungkinkan penskalaan dinamis cluster PostgreSQL.

  • Peningkatan versi: Memfasilitasi peningkatan bergulir dengan waktu henti minimal.

  • Keamanan: Menerapkan enkripsi, kontrol akses, dan mekanisme otentikasi.

Prasyarat dan batasan

Prasyarat

Versi produk

Batasan

Arsitektur

Tumpukan teknologi target

  • Amazon EKS

  • Amazon Virtual Private Cloud (Amazon VPC)

  • Amazon Elastic Compute Cloud (Amazon EC2)

Arsitektur target

Arsitektur untuk menggunakan PGO dengan tiga Availability Zones dan dua replika, PgBouncer, dan operator PGO.

Pola ini membangun arsitektur yang berisi cluster Amazon EKS dengan tiga node. Setiap node berjalan pada satu set EC2 instance di backend. Pengaturan PostgreSQL ini mengikuti arsitektur replika utama, yang sangat efektif untuk kasus penggunaan read-heavy. Arsitektur mencakup komponen-komponen berikut:

  • Container database primer (pg-primary) menghosting instance PostgreSQL utama di mana semua operasi penulisan diarahkan.

  • Container replika sekunder (pg-replica) menghosting instance PostgreSQL yang mereplikasi data dari database utama dan menangani operasi baca.

  • PgBounceradalah pooler koneksi ringan untuk database PostgreSQL yang disertakan dengan PGO. Itu berada di antara klien dan server PostgreSQL, dan bertindak sebagai perantara untuk koneksi database.

  • PGO mengotomatiskan penerapan dan pengelolaan klaster PostgreSQL di lingkungan Kubernetes ini.

  • Patroni adalah alat open-source yang mengelola dan mengotomatiskan konfigurasi ketersediaan tinggi untuk PostgreSQL. Ini termasuk dengan PGO. Saat Anda menggunakan Patroni dengan PGO di Kubernetes, Patroni memainkan peran penting dalam memastikan ketahanan dan toleransi kesalahan klaster PostgreSQL. Untuk informasi lebih lanjut, lihat dokumentasi Patroni.

Alur kerja mencakup langkah-langkah ini:

  • Menyebarkan operator PGO. Anda menerapkan operator PGO di klaster Kubernetes Anda yang berjalan di Amazon EKS. Ini dapat dilakukan dengan menggunakan manifes Kubernetes atau bagan Helm. Pola ini menggunakan manifes Kubernetes.

  • Tentukan instance PostgreSQL. Saat operator berjalan, Anda membuat resource kustom (CRs) untuk menentukan status instans PostgreSQL yang diinginkan. Ini termasuk konfigurasi seperti penyimpanan, replikasi, dan pengaturan ketersediaan tinggi.

  • Manajemen operator. Anda berinteraksi dengan operator melalui objek API Kubernetes seperti CRs membuat, memperbarui, atau menghapus instance PostgreSQL.

  • Pemantauan dan pemeliharaan. Anda dapat memantau kesehatan dan kinerja instans PostgreSQL yang berjalan di Amazon EKS. Operator sering menyediakan metrik dan pencatatan untuk tujuan pemantauan. Anda dapat melakukan tugas pemeliharaan rutin seperti peningkatan dan penambalan seperlunya. Untuk informasi selengkapnya, lihat Memantau performa klaster Anda dan melihat log di dokumentasi Amazon EKS.

  • Penskalaan dan pencadangan: Anda dapat menggunakan fitur yang disediakan oleh operator untuk menskalakan instance PostgreSQL dan mengelola cadangan.

Pola ini tidak mencakup operasi pemantauan, pemeliharaan, dan pencadangan.

Otomatisasi dan skala

  • Anda dapat menggunakan AWS CloudFormation untuk mengotomatiskan pembuatan infrastruktur. Untuk informasi selengkapnya, lihat Membuat resource Amazon EKS dengan AWS CloudFormation dokumentasi Amazon EKS.

  • Anda dapat menggunakan GitVersion atau Jenkins membangun nomor untuk mengotomatiskan penyebaran instance database.

Alat

Layanan AWS

Alat-alat lainnya

  • eksctl adalah alat baris perintah sederhana untuk membuat cluster di Amazon EKS.

  • kubectl adalah utilitas baris perintah untuk menjalankan perintah terhadap klaster Kubernetes.

  • PGO mengotomatiskan dan menskalakan pengelolaan database PostgreSQL di Kubernetes.

Praktik terbaik

Ikuti praktik terbaik ini untuk memastikan penerapan yang lancar dan efisien:

  • Amankan kluster EKS Anda. Terapkan praktik terbaik keamanan untuk kluster EKS Anda, seperti menggunakan peran AWS Identity and Access Management (IAM) untuk akun layanan (IRSA), kebijakan jaringan, dan grup keamanan VPC. Batasi akses ke server API cluster EKS, dan enkripsi komunikasi antara node dan server API dengan menggunakan TLS.

  • Pastikan kompatibilitas versi antara PGO dan Kubernetes berjalan di Amazon EKS. Beberapa fitur PGO mungkin memerlukan versi Kubernetes tertentu atau memperkenalkan batasan kompatibilitas. Untuk informasi selengkapnya, lihat Komponen dan Kompatibilitas dalam dokumentasi PGO.

  • Rencanakan alokasi sumber daya untuk penyebaran PGO Anda, termasuk CPU, memori, dan penyimpanan. Pertimbangkan persyaratan sumber daya dari PGO dan instance PostgreSQL yang dikelolanya. Pantau penggunaan sumber daya dan skala sumber daya sesuai kebutuhan.

  • Desain untuk ketersediaan tinggi. Rancang penerapan PGO Anda untuk ketersediaan tinggi guna meminimalkan waktu henti dan memastikan keandalan. Terapkan beberapa replika PGO di beberapa Availability Zone untuk toleransi kesalahan.

  • Menerapkan prosedur pencadangan dan pemulihan untuk database PostgreSQL Anda yang dikelola PGO. Gunakan fitur yang disediakan oleh PGO atau solusi cadangan pihak ketiga yang kompatibel dengan Kubernetes dan Amazon EKS.

  • Siapkan pemantauan dan pencatatan untuk penerapan PGO Anda untuk melacak kinerja, kesehatan, dan peristiwa. Gunakan alat seperti Prometheus untuk memantau metrik dan Grafana untuk visualisasi. Konfigurasikan logging untuk menangkap log PGO untuk pemecahan masalah dan audit.

  • Konfigurasikan jaringan dengan benar untuk memungkinkan komunikasi antara instans PGO, PostgreSQL, dan layanan lainnya di klaster Kubernetes Anda. Gunakan fitur jaringan VPC Amazon dan plugin jaringan Kubernetes seperti Calico atau Amazon VPC CNI untuk penegakan kebijakan jaringan dan isolasi lalu lintas.

  • Pilih opsi penyimpanan yang sesuai untuk database PostgreSQL Anda, dengan mempertimbangkan faktor-faktor seperti kinerja, daya tahan, dan skalabilitas. Gunakan volume Amazon Elastic Block Store (Amazon EBS) AWS atau layanan penyimpanan terkelola untuk penyimpanan persisten. Untuk informasi selengkapnya, lihat Menyimpan volume Kubernetes dengan Amazon EBS di dokumentasi Amazon EKS.

  • Gunakan alat infrastruktur sebagai kode (IAc) seperti AWS CloudFormation untuk mengotomatiskan penerapan dan konfigurasi PGO di Amazon EKS. Tentukan komponen infrastruktur—termasuk kluster EKS, jaringan, dan sumber daya PGO—sebagai kode untuk konsistensi, pengulangan, dan kontrol versi.

Epik

TugasDeskripsiKeterampilan yang dibutuhkan

Buat peran IAM.

  1. Buat peran IAM dengan menggunakan perintah berikut di AWS CLI:

    aws iam create-role \ --role-name {YourRoleName} \ --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "eks.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }' && \ aws iam attach-role-policy \ --role-name {YourRoleName}\ --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy && \ aws iam attach-role-policy \ --role-name {YourRoleName}\ --policy-arn arn:aws:iam::aws:policy/AmazonEKSServicePolicy && \ aws iam attach-role-policy \ --role-name {YourRoleName}\ --policy-arn arn:aws:iam::aws:policy/CloudWatchFullAccess
  2. Tinjau peran dalam AWS Management Console:

    1. Buka konsol IAM.

    2. Pilih Peran, dan cari nama peran yang Anda buat.

    3. Validasi bahwa kebijakan berikut terlampir:

      AmazonEKSClusterPolicy

      AmazonEKSServicePolicy

      CloudWatchFullAccess

Administrator AWS
TugasDeskripsiKeterampilan yang dibutuhkan

Buat klaster Amazon EKS.

Jika Anda sudah menerapkan cluster, lewati langkah ini. Jika tidak, terapkan kluster Amazon EKS di saat ini Akun AWS dengan menggunakaneksctl, Terraform, atau. AWS CloudFormation Pola ini digunakan eksctl untuk penyebaran cluster.

catatan

Pola ini menggunakan Amazon EC2 sebagai grup simpul untuk Amazon EKS. Jika Anda ingin menggunakan AWS Fargate, lihat managedNodeGroups konfigurasi dalam dokumentasi eksctl.

  1. Gunakan file eksctl input berikut untuk menghasilkan cluster.

    sample-cluster.yaml:

    apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: postgresql region: us-east-1 version: "1.29" accessConfig: authenticationMode: API_AND_CONFIG_MAP availabilityZones: - us-east-1a - us-east-1b - us-east-1c nodeGroups: - name: ng-1 instanceType: m5.16xlarge desiredCapacity: 2 - name: ng-2 instanceType: m5.16xlarge desiredCapacity: 2 - name: ng-3 instanceType: m5.16xlarge desiredCapacity: 2 vpc: cidr: 192.168.0.0/16 clusterEndpoints: publicAccess: true nat: gateway: HighlyAvailable iamIdentityMappings: - arn: arn:aws:iam::<account-id>:role/<role-name> # update the IAM role ARN created in step 1 username: <user-name> # Enter the user name per your choice noDuplicateARNs: false
  2. Jalankan perintah berikut untuk membuat cluster (berikan path file ke sample-cluster.yaml file Anda):

    eksctl create cluster -f sample-cluster.yaml
Administrator AWS, administrator Terraform atau eksctl, administrator Kubernetes

Validasi status cluster.

Jalankan perintah berikut untuk melihat status node saat ini di cluster:

kubectl get nodes

Jika Anda menemukan kesalahan, lihat bagian pemecahan masalah dokumentasi Amazon EKS.

Administrator AWS, administrator Terraform atau eksctl, administrator Kubernetes
TugasDeskripsiKeterampilan yang dibutuhkan

Aktifkan penyedia IAM OIDC.

Sebagai prasyarat untuk driver Amazon EBS Container Storage Interface (CSI), Anda harus memiliki penyedia IAM OpenID Connect (OIDC) yang sudah ada untuk klaster Anda.

Aktifkan penyedia IAM OIDC dengan menggunakan perintah berikut:

eksctl utils associate-iam-oidc-provider --region={region} --cluster={YourClusterNameHere} --approve

Untuk informasi selengkapnya tentang langkah ini, lihat dokumentasi Amazon EKS.

Administrator AWS

Buat peran IAM untuk driver Amazon EBS CSI.

Gunakan eksctl perintah berikut untuk membuat peran IAM untuk driver CSI:

eksctl create iamserviceaccount \ --region {RegionName} \ --name ebs-csi-controller-sa \ --namespace kube-system \ --cluster {YourClusterNameHere} \ --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \ --approve \ --role-only \ --role-name AmazonEKS_EBS_CSI_DriverRole

Jika Anda menggunakan drive Amazon EBS terenkripsi, Anda harus mengonfigurasi kebijakan lebih lanjut. Untuk petunjuk, lihat dokumentasi driver Amazon EBS SCI.

Administrator AWS

Tambahkan driver Amazon EBS CSI.

Gunakan eksctl perintah berikut untuk menambahkan driver Amazon EBS CSI:

eksctl create addon \ --name aws-ebs-csi-driver \ --cluster <YourClusterName> service-account-role-arn arn:aws:iam::$(aws sts get-caller-identity \ --query Account \ --output text):role/AmazonEKS_EBS_CSI_DriverRole \ --force
Administrator AWS
TugasDeskripsiKeterampilan yang dibutuhkan

Kloning repositori PGO.

Kloning GitHub repositori untuk PGO:

git clone https://github.com/CrunchyData/postgres-operator-examples.git
AWS DevOps

Berikan detail peran untuk pembuatan akun layanan.

Untuk memberikan akses klaster Amazon EKS ke AWS sumber daya yang diperlukan, tentukan Nama Sumber Daya Amazon (ARN) peran OIDC yang Anda buat sebelumnya dalam file. service_account.yaml File ini terletak di folder namespace repositori.

cd postgres-operator-examples
--- metadata: annotations: eks.amazonaws.com/role-arn: arn:aws:iam::<accountId>:role/<role_name> # Update the OIDC role ARN created earlier
Administrator AWS, administrator Kubernetes

Buat namespace dan prasyarat PGO.

  1. Jalankan perintah berikut untuk membuat namespace:

    kubectl apply -k kustomize/install/namespace

    Ini menetapkan namespace khusus untuk PGO. Jika perlu, Anda dapat memodifikasi namespace.yml file dan menetapkan namespace nama yang berbeda.

  2. Jalankan perintah berikut untuk menerapkan konfigurasi default ke cluster:

    kubectl apply --server-side -k kustomize/install/default

    kustomize/install/defaultmenyediakan konfigurasi default untuk Kubernetes role-based access control (RBAC), custom resource definition (CRD), dan file Kubernetes Manager.

Administrator Kunernetes

Verifikasi pembuatan pod.

Verifikasi bahwa namespace dan konfigurasi default telah dibuat:

kubectl get pods -n postgres-operator
Administrator AWS, administrator Kubernetes

Verifikasi PVCs.

Gunakan perintah berikut untuk memverifikasi klaim volume persisten (PVCs):

kubectl describe pvc -n postgres-operator
Administrator AWS, administrator Kubernetes
TugasDeskripsiKeterampilan yang dibutuhkan

Buat operator.

Merevisi isi file yang terletak di /kustomize/postgres/postgres.yaml agar sesuai dengan yang berikut:

spec: instances: - name: pg-1 replicas: 3 patroni: dynamicConfiguration: postgresql: pg_hba: - "host all all 0.0.0.0/0 trust" # this line enabled logical replication with programmatic access - "host all postgres 127.0.0.1/32 md5" synchronous_mode: true users: - name: replicator databases: - testdb options: "REPLICATION"

Pembaruan ini melakukan hal berikut:

  • Sesuaikan pengaturan konfigurasi PostgreSQL untuk memfasilitasi akses ke instance PostgreSQL.

  • Sertakan konfigurasi untuk pengguna replikasi, pengguna database, dan superuser untuk mengaktifkan replikasi streaming, akses database, dan manajemen cluster.

Administrator AWS, DBA, administrator Kubernetes

Menyebarkan operator.

Menerapkan operator PGO untuk mengaktifkan pengelolaan dan pengoperasian database PostgreSQL yang efisien di lingkungan Kubernetes:

kubectl apply -k kustomize/postgres
Administrator AWS, DBA, administrator Kubernetes

Verifikasi penyebaran.

  1. Validasi bahwa operator telah dikerahkan:

    kubectl get pods -n postgres-operator --selector=postgres-operator.crunchydata.com/instance-set \ -L postgres-operator.crunchydata.com/role
  2. Verifikasi bahwa sumber daya layanan yang terkait dengan pod operator telah dibuat:

    kubectl get svc -n postgres-operator

Dari output perintah, perhatikan replika utama (primary_pod_name) dan baca replika (read_pod_name). Anda akan menggunakan ini di langkah selanjutnya.

Administrator AWS, DBA, administrator Kubernetes
TugasDeskripsiKeterampilan yang dibutuhkan

Tulis data ke replika utama.

Gunakan perintah berikut untuk terhubung ke replika utama PostgreSQL dan menulis data ke database:

kubectl exec -it <primary_pod_name> bash -n postgres-operator
psql
CREATE TABLE customers (firstname text, customer_id serial, date_created timestamp); \dt
Administrator AWS, administrator Kubernetes

Konfirmasikan bahwa replika baca memiliki data yang sama.

Hubungkan ke replika baca PostgreSQL dan periksa apakah replikasi streaming berfungsi dengan benar:

kubectl exec -it {read_pod_name} bash -n postgres-operator
psql
\dt

Replika baca harus memiliki tabel yang Anda buat di replika utama pada langkah sebelumnya.

Administrator AWS, administrator Kubernetes

Pemecahan Masalah

IsuSolusi

Pod tidak dimulai.

  • Gunakan perintah berikut untuk memeriksa status pod:

    kubectl get pods -n your-namespace
  • Periksa log untuk kesalahan apa pun:

    kubectl logs your-pod-name -n your-namespace
  • Periksa peristiwa pod untuk setiap peristiwa abnormal yang terkait dengan pod Anda:

    kubectl describe pod your-pod-name -n your-namespace

Replika secara signifikan berada di belakang database utama.

  • Periksa kelambatan replikasi:

    SELECT * FROM pg_stat_replication;
  • Pastikan replika memiliki sumber daya CPU dan memori yang cukup. Periksa batas sumber daya:

    kubectl describe pod your-replica-pod -n your-namespace
  • Verifikasi bahwa backend penyimpanan berkinerja optimal. Disk yang lambat I/O dapat menyebabkan kelambatan replikasi.

Anda tidak memiliki visibilitas ke kinerja dan kesehatan cluster PostgreSQL.

  • Aktifkan CloudWatch Log Amazon dan pastikan log dikirim ke Amazon CloudWatch untuk dianalisis. Untuk informasi selengkapnya, lihat dokumentasi Amazon EKS.

  • Periksa pg_stat_activity:

    SELECT * FROM pg_stat_activity;

Replikasi tidak bekerja.

  • Periksa konfigurasi utama dengan melihat pengaturan replikasi dipostgresql.conf:

    wal_level = replica
    max_wal_senders = 10
    wal_keep_size = 64 # or wal_keep_segments in older versions
  • Verifikasi yang pg_hba.conf menyertakan izin replikasi:

    host replication replica_user all md5
  • Periksa konfigurasi replika. Pastikan bahwa recovery.conf atau pengaturan yang setara (standby.signaldanprimary_conninfo) diatur dengan benar pada replika.

Sumber daya terkait