AKS'de yüksek oranda kullanılabilir bir PostgreSQL veritabanı dağıtma
Bu makalede AKS üzerinde yüksek oranda kullanılabilir bir PostgreSQL veritabanı dağıtacaksınız.
- Bu dağıtım için gerekli altyapıyı henüz oluşturmadıysanız, ayarlamak üzere AKS'de yüksek oranda kullanılabilir bir PostgreSQL veritabanı dağıtmak için altyapı oluşturma başlığındaki adımları izleyin ve sonra bu makaleye dönebilirsiniz.
Önemli
Aks belgeleri ve örnekleri boyunca açık kaynak yazılımdan bahsedilmektedir. Dağıttığınız yazılımlar AKS hizmet düzeyi sözleşmelerinin, sınırlı garantinin ve Azure desteği dışında tutulur. AKS ile birlikte açık kaynak teknolojisini kullanırken, bir plan geliştirmek için ilgili toplulukların ve proje bakımcılarının sağlanan destek seçeneklerine başvurun.
Örneğin, Ray GitHub deposu yanıt süresi, amacı ve destek düzeyine göre değişen çeşitli platformları açıklar.
Microsoft, AKS'de dağıttığımız açık kaynak paketleri oluşturma sorumluluğunu üstlenir. Bu sorumluluk derleme, tarama, imzalama, doğrulama ve düzeltme işleminin tam sahipliğini ve kapsayıcı görüntülerindeki ikili dosyalar üzerindeki denetimi içerir. Daha fazla bilgi için bkz. AKS ve AKS destek kapsamı için güvenlik açığı yönetimi.
Bootstrap uygulaması kullanıcısı için gizli dizi oluşturma
Komutunu kullanarak bir bootstrap uygulaması kullanıcısı için etkileşimli oturum açarak PostgreSQL dağıtımını
kubectl create secret
doğrulamak için bir gizli dizi oluşturun.PG_DATABASE_APPUSER_SECRET=$(echo -n | openssl rand -base64 16) kubectl create secret generic db-user-pass \ --from-literal=username=app \ --from-literal=password="${PG_DATABASE_APPUSER_SECRET}" \ --namespace $PG_NAMESPACE \ --context $AKS_PRIMARY_CLUSTER_NAME
komutunu kullanarak gizli dizinin başarıyla oluşturulduğunu
kubectl get
doğrulayın.kubectl get secret db-user-pass --namespace $PG_NAMESPACE --context $AKS_PRIMARY_CLUSTER_NAME
PostgreSQL kümesi için ortam değişkenlerini ayarlama
Aşağıdaki
kubectl apply
komutu kullanarak PostgreSQL kümesi için ortam değişkenlerini ayarlamak üzere bir ConfigMap dağıtın:cat <<EOF | kubectl apply --context $AKS_PRIMARY_CLUSTER_NAME -n $PG_NAMESPACE -f - apiVersion: v1 kind: ConfigMap metadata: name: cnpg-controller-manager-config data: ENABLE_AZURE_PVC_UPDATES: 'true' EOF
Prometheus PodMonitors'ı yükleme
Prometheus, CNPG GitHub örnek deposunda depolanan bir dizi varsayılan kayıt kuralı kullanarak CNPG örnekleri için PodMonitors oluşturur. Bir üretim ortamında bu kurallar gerektiğinde değiştirilebilir.
komutunu kullanarak Prometheus Community Helm deposunu
helm repo add
ekleyin.helm repo add prometheus-community \ https://prometheus-community.github.io/helm-charts
Prometheus Community Helm deposunu yükseltin ve bayrağını kullanarak birincil kümeye
helm upgrade
--install
yükleyin.helm upgrade --install \ --namespace $PG_NAMESPACE \ -f https://raw.githubusercontent.com/cloudnative-pg/cloudnative-pg/main/docs/src/samples/monitoring/kube-stack-config.yaml \ prometheus-community \ prometheus-community/kube-prometheus-stack \ --kube-context=$AKS_PRIMARY_CLUSTER_NAME
Federasyon kimlik bilgisi oluşturma
Bu bölümde, CNPG'nin yedeklemeler için depolama hesabı hedefinde kimlik doğrulaması yapmak üzere AKS iş yükü kimliğini kullanmasına izin vermek üzere PostgreSQL yedeklemesi için federasyon kimlik bilgileri oluşturacaksınız. CNPG işleci, CNPG Kümesi dağıtım bildiriminde kullanılan adlı kümeyle aynı ada sahip bir Kubernetes hizmet hesabı oluşturur.
komutunu kullanarak kümenin OIDC veren URL'sini
az aks show
alın.export AKS_PRIMARY_CLUSTER_OIDC_ISSUER="$(az aks show \ --name $AKS_PRIMARY_CLUSTER_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --query "oidcIssuerProfile.issuerUrl" \ --output tsv)"
komutunu kullanarak
az identity federated-credential create
bir federasyon kimliği kimlik bilgisi oluşturun.az identity federated-credential create \ --name $AKS_PRIMARY_CLUSTER_FED_CREDENTIAL_NAME \ --identity-name $AKS_UAMI_CLUSTER_IDENTITY_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --issuer "${AKS_PRIMARY_CLUSTER_OIDC_ISSUER}" \ --subject system:serviceaccount:"${PG_NAMESPACE}":"${PG_PRIMARY_CLUSTER_NAME}" \ --audience api://AzureADTokenExchange
Yüksek oranda kullanılabilir bir PostgreSQL kümesi dağıtma
Bu bölümde, CNPG Kümesi özel kaynak tanımını (CRD) kullanarak yüksek oranda kullanılabilir bir PostgreSQL kümesi dağıtacaksınız.
Aşağıdaki tabloda, Küme CRD'sinin YAML dağıtım bildiriminde ayarlanan temel özellikler özetlenmiştir:
Özellik | Açıklama |
---|---|
inheritedMetadata |
CNPG işlecine özgüdür. Meta veriler kümeyle ilgili tüm nesneler tarafından devralınır. |
annotations: service.beta.kubernetes.io/azure-dns-label-name |
Salt okunur ve salt okunur Postgres kümesi uç noktaları kullanıma sunulurken kullanılacak DNS etiketi. |
labels: azure.workload.identity/use: "true" |
AKS'nin PostgreSQL küme örneklerini barındıran podlara iş yükü kimlik bağımlılıkları eklemesi gerektiğini gösterir. |
topologySpreadConstraints |
etiketine "workload=postgres" sahip farklı bölgeler ve farklı düğümler gerektir. |
resources |
Garantili Hizmet Kalitesi (QoS) sınıfını yapılandırıyor. Üretim ortamında bu değerler, temel düğüm VM'sinin kullanımını en üst düzeye çıkarmak için önemlidir ve kullanılan Azure VM SKU'su temelinde farklılık gösterir. |
bootstrap |
CNPG işlecine özgüdür. Boş bir uygulama veritabanıyla başlatılır. |
storage / walStorage |
CNPG işlecine özgüdür. Veriler ve günlük depolama için PersistentVolumeClaims (PVC) için depolama şablonlarını tanımlar. Artan IOP'ler için parçalanan tablo alanları için depolama alanı da belirtebilirsiniz. |
replicationSlots |
CNPG işlecine özgüdür. Yüksek kullanılabilirlik için çoğaltma yuvalarını etkinleştirir. |
postgresql |
CNPG işlecine özgüdür. , pg_hba.conf ve pg_ident.conf config için ayarları postgresql.conf eşler. |
serviceAccountTemplate |
Hizmet hesaplarını oluşturmak için gereken şablonu içerir ve PostgreSQL örneklerini barındıran podlardan AKS iş yükü kimliği kimlik doğrulamasını etkinleştirmek için AKS federasyon kimliği kimlik bilgilerini UAMI ile eşler. |
barmanObjectStore |
CNPG işlecine özgüdür. Azure Blob Depolama nesne deposunda kimlik doğrulaması için AKS iş yükü kimliğini kullanarak barman-cloud araç paketini yapılandırılır. |
Komutunu kullanarak PostgreSQL kümesini Küme CRD'siyle dağıtın
kubectl apply
.cat <<EOF | kubectl apply --context $AKS_PRIMARY_CLUSTER_NAME -n $PG_NAMESPACE -v 9 -f - apiVersion: postgresql.cnpg.io/v1 kind: Cluster metadata: name: $PG_PRIMARY_CLUSTER_NAME spec: inheritedMetadata: annotations: service.beta.kubernetes.io/azure-dns-label-name: $AKS_PRIMARY_CLUSTER_PG_DNSPREFIX labels: azure.workload.identity/use: "true" instances: 3 startDelay: 30 stopDelay: 30 minSyncReplicas: 1 maxSyncReplicas: 1 replicationSlots: highAvailability: enabled: true updateInterval: 30 topologySpreadConstraints: - maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: cnpg.io/cluster: $PG_PRIMARY_CLUSTER_NAME affinity: nodeSelector: workload: postgres resources: requests: memory: '8Gi' cpu: 2 limits: memory: '8Gi' cpu: 2 bootstrap: initdb: database: appdb owner: app secret: name: db-user-pass dataChecksums: true storage: size: 2Gi pvcTemplate: accessModes: - ReadWriteOnce resources: requests: storage: 2Gi storageClassName: managed-csi-premium walStorage: size: 2Gi pvcTemplate: accessModes: - ReadWriteOnce resources: requests: storage: 2Gi storageClassName: managed-csi-premium monitoring: enablePodMonitor: true postgresql: parameters: archive_timeout: '5min' auto_explain.log_min_duration: '10s' checkpoint_completion_target: '0.9' checkpoint_timeout: '15min' shared_buffers: '256MB' effective_cache_size: '512MB' pg_stat_statements.max: '1000' pg_stat_statements.track: 'all' max_connections: '400' max_prepared_transactions: '400' max_parallel_workers: '32' max_parallel_maintenance_workers: '8' max_parallel_workers_per_gather: '8' max_replication_slots: '32' max_worker_processes: '32' wal_keep_size: '512MB' max_wal_size: '1GB' pg_hba: - host all all all scram-sha-256 serviceAccountTemplate: metadata: annotations: azure.workload.identity/client-id: "$AKS_UAMI_WORKLOAD_CLIENTID" labels: azure.workload.identity/use: "true" backup: barmanObjectStore: destinationPath: "https://${PG_PRIMARY_STORAGE_ACCOUNT_NAME}.blob.core.windows.net/backups" azureCredentials: inheritFromAzureAD: true retentionPolicy: '7d' EOF
birincil PostgreSQL kümesinin komutunu kullanarak başarıyla oluşturulduğunu
kubectl get
doğrulayın. CNPG Kümesi CRD'si üç örnek belirtmiştir. Bu örnek çoğaltma için bir kez getirilip birleştirildikten sonra çalışan podlar görüntülenerek doğrulanabilir. Üç örneğin de çevrimiçi olması ve kümeye katılması biraz zaman alabildiği için sabırlı olun.kubectl get pods --context $AKS_PRIMARY_CLUSTER_NAME --namespace $PG_NAMESPACE -l cnpg.io/cluster=$PG_PRIMARY_CLUSTER_NAME
Örnek çıkış
NAME READY STATUS RESTARTS AGE pg-primary-cnpg-r8c7unrw-1 1/1 Running 0 4m25s pg-primary-cnpg-r8c7unrw-2 1/1 Running 0 3m33s pg-primary-cnpg-r8c7unrw-3 1/1 Running 0 2m49s
Prometheus PodMonitor'ın çalıştığını doğrulama
CNPG işleci, Prometheus Community yüklemesi sırasında oluşturulan kayıt kurallarını kullanarak birincil örnek için otomatik olarak bir PodMonitor oluşturur.
Komutunu kullanarak PodMonitor'ın
kubectl get
çalıştığını doğrulayın.kubectl --namespace $PG_NAMESPACE \ --context $AKS_PRIMARY_CLUSTER_NAME \ get podmonitors.monitoring.coreos.com \ $PG_PRIMARY_CLUSTER_NAME \ --output yaml
Örnek çıkış
kind: PodMonitor metadata: annotations: cnpg.io/operatorVersion: 1.23.1 ...
Yönetilen Prometheus için Azure İzleyici kullanıyorsanız, özel grup adını kullanarak başka bir pod izleyicisi eklemeniz gerekir. Yönetilen Prometheus, Prometheus topluluğundan özel kaynak tanımlarını (CRD) almaz. Grup adının yanı sıra CRD'ler de aynıdır. Bu, Yönetilen Prometheus için pod izleyicilerinin topluluk pod izleyicisini kullananların yan yana var olmasını sağlar. Managed Prometheus kullanmıyorsanız, bunu atlayabilirsiniz. Yeni bir pod izleyicisi oluşturun:
cat <<EOF | kubectl apply --context $AKS_PRIMARY_CLUSTER_NAME --namespace $PG_NAMESPACE -f -
apiVersion: azmonitoring.coreos.com/v1
kind: PodMonitor
metadata:
name: cnpg-cluster-metrics-managed-prometheus
namespace: ${PG_NAMESPACE}
labels:
azure.workload.identity/use: "true"
cnpg.io/cluster: ${PG_PRIMARY_CLUSTER_NAME}
spec:
selector:
matchLabels:
azure.workload.identity/use: "true"
cnpg.io/cluster: ${PG_PRIMARY_CLUSTER_NAME}
podMetricsEndpoints:
- port: metrics
EOF
Pod izleyicisinin oluşturulduğunu doğrulayın (grup adındaki farkı not edin).
kubectl --namespace $PG_NAMESPACE \
--context $AKS_PRIMARY_CLUSTER_NAME \
get podmonitors.azmonitoring.coreos.com \
-l cnpg.io/cluster=$PG_PRIMARY_CLUSTER_NAME \
-o yaml
A Seçeneği - Azure İzleyici Çalışma Alanı
Postgres kümesini ve pod izleyicisini dağıttıktan sonra Azure İzleyici çalışma alanında Azure portalını kullanarak ölçümleri görüntüleyebilirsiniz.
Seçenek B - Yönetilen Grafana
Alternatif olarak, Postgres kümesini ve pod izleyicilerini dağıttıktan sonra, Azure İzleyici çalışma alanına aktarılan ölçümleri görselleştirmek için dağıtım betiği tarafından oluşturulan Yönetilen Grafana örneğinde bir ölçüm panosu oluşturabilirsiniz. Yönetilen Grafana'ya Azure portalı üzerinden erişebilirsiniz. Dağıtım betiği tarafından oluşturulan Yönetilen Grafana örneğine gidin ve burada gösterildiği gibi Uç Nokta bağlantısına tıklayın:
Uç Nokta bağlantısına tıklanması, Yönetilen Grafana örneğinde pano oluşturabileceğiniz yeni bir tarayıcı penceresinin açılmasına neden olur. Azure İzleyici veri kaynağını yapılandırma yönergelerini izleyerek görselleştirmeler ekleyerek Postgres kümesinden bir ölçüm panosu oluşturabilirsiniz. Veri kaynağı bağlantısını ayarladıktan sonra, ana menüden Veri kaynakları seçeneğine tıklayın ve burada gösterildiği gibi veri kaynağı bağlantısı için bir veri kaynağı seçenekleri kümesi görmeniz gerekir:
Yönetilen Prometheus seçeneğinde, pano düzenleyicisini açmak için pano oluşturma seçeneğine tıklayın. Düzenleyici penceresi açıldıktan sonra Görselleştirme ekle seçeneğine ve ardından Yönetilen Prometheus seçeneğine tıklayarak Postgres kümesindeki ölçümlere göz atın. Görselleştirmek istediğiniz ölçümü seçtikten sonra, burada gösterildiği gibi görselleştirme verilerini getirmek için Sorguları çalıştır düğmesine tıklayın:
Paneli panonuza eklemek için Kaydet düğmesine tıklayın. Pano düzenleyicisinde Ekle düğmesine tıklayarak ve diğer ölçümleri görselleştirmek için bu işlemi yineleyerek başka paneller ekleyebilirsiniz. Ölçüm görselleştirmelerini eklerken aşağıdakine benzer bir öğeye sahip olmanız gerekir:
Panonuzu kaydetmek için Kaydet simgesine tıklayın.
Dağıtılan PostgreSQL kümesini inceleme
komutunu kullanarak kubectl get
AKS düğümü ayrıntılarını alarak PostgreSQL'in birden çok kullanılabilirlik alanına yayıldığını doğrulayın.
kubectl get nodes \
--context $AKS_PRIMARY_CLUSTER_NAME \
--namespace $PG_NAMESPACE \
--output json | jq '.items[] | {node: .metadata.name, zone: .metadata.labels."failure-domain.beta.kubernetes.io/zone"}'
Çıkışınız, her düğüm için gösterilen kullanılabilirlik alanıyla aşağıdaki örnek çıkışa benzemelidir:
{
"node": "aks-postgres-15810965-vmss000000",
"zone": "westus3-1"
}
{
"node": "aks-postgres-15810965-vmss000001",
"zone": "westus3-2"
}
{
"node": "aks-postgres-15810965-vmss000002",
"zone": "westus3-3"
}
{
"node": "aks-systempool-26112968-vmss000000",
"zone": "westus3-1"
}
{
"node": "aks-systempool-26112968-vmss000001",
"zone": "westus3-2"
}
PostgreSQL'e bağlanma ve örnek veri kümesi oluşturma
Bu bölümde bir tablo oluşturacak ve daha önce dağıttığınız CNPG Kümesi CRD'sinde oluşturulan uygulama veritabanına bazı veriler ekleyebilirsiniz. PostgreSQL kümesinin yedekleme ve geri yükleme işlemlerini doğrulamak için bu verileri kullanırsınız.
Aşağıdaki komutları kullanarak bir tablo oluşturun ve uygulama veritabanına veri ekleyin:
kubectl cnpg psql $PG_PRIMARY_CLUSTER_NAME --namespace $PG_NAMESPACE
# Run the following PSQL commands to create a small dataset # postgres=# CREATE TABLE datasample (id INTEGER,name VARCHAR(255)); INSERT INTO datasample (id, name) VALUES (1, 'John'); INSERT INTO datasample (id, name) VALUES (2, 'Jane'); INSERT INTO datasample (id, name) VALUES (3, 'Alice'); SELECT COUNT(*) FROM datasample; # Type \q to exit psql
Çıkışınız aşağıdaki örnek çıkışa benzemelidir:
CREATE TABLE INSERT 0 1 INSERT 0 1 INSERT 0 1 count ------- 3 (1 row)
PostgreSQL salt okunur çoğaltmalarına bağlanma
PostgreSQL salt okunur çoğaltmalarına bağlanın ve aşağıdaki komutları kullanarak örnek veri kümesini doğrulayın:
kubectl cnpg psql --replica $PG_PRIMARY_CLUSTER_NAME --namespace $PG_NAMESPACE
#postgres=# SELECT pg_is_in_recovery();
Örnek çıkış
# pg_is_in_recovery #------------------- # t #(1 row)
#postgres=# SELECT COUNT(*) FROM datasample;
Örnek çıkış
# count #------- # 3 #(1 row) # Type \q to exit psql
Barman kullanarak isteğe bağlı ve zamanlanmış PostgreSQL yedeklemeleri ayarlama
PostgreSQL kümesinin CNPG Kümesi CRD'sinde belirtilen Azure depolama hesabına erişebildiğini ve aşağıdaki komutu kullanarak raporlandığını
Working WAL archiving
OK
doğrulayın:kubectl cnpg status $PG_PRIMARY_CLUSTER_NAME 1 \ --context $AKS_PRIMARY_CLUSTER_NAME \ --namespace $PG_NAMESPACE
Örnek çıkış
Continuous Backup status First Point of Recoverability: Not Available Working WAL archiving: OK WALs waiting to be archived: 0 Last Archived WAL: 00000001000000000000000A @ 2024-07-09T17:18:13.982859Z Last Failed WAL: -
KOMUTUyla YAML dosyasını kullanarak AKS iş yükü kimlik tümleştirmesini kullanan Azure Depolama'ya isteğe bağlı yedekleme dağıtın
kubectl apply
.export BACKUP_ONDEMAND_NAME="on-demand-backup-1" cat <<EOF | kubectl apply --context $AKS_PRIMARY_CLUSTER_NAME --namespace $PG_NAMESPACE -v 9 -f - apiVersion: postgresql.cnpg.io/v1 kind: Backup metadata: name: $BACKUP_ONDEMAND_NAME spec: method: barmanObjectStore cluster: name: $PG_PRIMARY_CLUSTER_NAME EOF
komutunu kullanarak
kubectl describe
isteğe bağlı yedeklemenin durumunu doğrulayın.kubectl describe backup $BACKUP_ONDEMAND_NAME \ --context $AKS_PRIMARY_CLUSTER_NAME \ --namespace $PG_NAMESPACE
Örnek çıkış
Type Reason Age From Message ---- ------ ---- ---- ------- Normal Starting 6s cloudnative-pg-backup Starting backup for cluster pg-primary-cnpg-r8c7unrw Normal Starting 5s instance-manager Backup started Normal Completed 1s instance-manager Backup completed
Aşağıdaki komutu kullanarak kümenin ilk kurtarılabilirlik noktasına sahip olduğunu doğrulayın:
kubectl cnpg status $PG_PRIMARY_CLUSTER_NAME 1 \ --context $AKS_PRIMARY_CLUSTER_NAME \ --namespace $PG_NAMESPACE
Örnek çıkış
Continuous Backup status First Point of Recoverability: 2024-06-05T13:47:18Z Working WAL archiving: OK
komutuyla YAML dosyasını kullanarak saati 15 dakika geçe her saat için zamanlanmış yedekleme yapılandırın
kubectl apply
.export BACKUP_SCHEDULED_NAME="scheduled-backup-1" cat <<EOF | kubectl apply --context $AKS_PRIMARY_CLUSTER_NAME --namespace $PG_NAMESPACE -v 9 -f - apiVersion: postgresql.cnpg.io/v1 kind: ScheduledBackup metadata: name: $BACKUP_SCHEDULED_NAME spec: # Backup once per hour schedule: "0 15 * ? * *" backupOwnerReference: self cluster: name: $PG_PRIMARY_CLUSTER_NAME EOF
komutunu kullanarak
kubectl describe
zamanlanmış yedeklemenin durumunu doğrulayın.kubectl describe scheduledbackup $BACKUP_SCHEDULED_NAME \ --context $AKS_PRIMARY_CLUSTER_NAME \ --namespace $PG_NAMESPACE
komutunu kullanarak
az storage blob list
birincil küme için Azure blob depolamada depolanan yedekleme dosyalarını görüntüleyin.az storage blob list \ --account-name $PG_PRIMARY_STORAGE_ACCOUNT_NAME \ --container-name backups \ --query "[*].name" \ --only-show-errors
Çıktınız aşağıdaki örnek çıkışa benzemelidir ve yedeklemenin başarılı olduğunu doğrular:
[ "pg-primary-cnpg-r8c7unrw/base/20240605T134715/backup.info", "pg-primary-cnpg-r8c7unrw/base/20240605T134715/data.tar", "pg-primary-cnpg-r8c7unrw/wals/0000000100000000/000000010000000000000001", "pg-primary-cnpg-r8c7unrw/wals/0000000100000000/000000010000000000000002", "pg-primary-cnpg-r8c7unrw/wals/0000000100000000/000000010000000000000003", "pg-primary-cnpg-r8c7unrw/wals/0000000100000000/000000010000000000000003.00000028.backup", "pg-primary-cnpg-r8c7unrw/wals/0000000100000000/000000010000000000000004", "pg-primary-cnpg-r8c7unrw/wals/0000000100000000/000000010000000000000005", "pg-primary-cnpg-r8c7unrw/wals/0000000100000000/000000010000000000000005.00000028.backup", "pg-primary-cnpg-r8c7unrw/wals/0000000100000000/000000010000000000000006", "pg-primary-cnpg-r8c7unrw/wals/0000000100000000/000000010000000000000007", "pg-primary-cnpg-r8c7unrw/wals/0000000100000000/000000010000000000000008", "pg-primary-cnpg-r8c7unrw/wals/0000000100000000/000000010000000000000009" ]
İsteğe bağlı yedeklemeyi yeni bir PostgreSQL kümesine geri yükleme
Bu bölümde, daha önce CNPG işlecini kullanarak oluşturduğunuz isteğe bağlı yedeklemeyi bootstrap Kümesi CRD'sini kullanarak yeni bir örneğe geri yüklersiniz. Basitlik için tek bir örnek kümesi kullanılır. AKS iş yükü kimliğinin (CNPG aracılığıyla inheritFromAzureAD aracılığıyla) yedekleme dosyalarına eriştiği ve kurtarma kümesi adının kurtarma kümesine özgü yeni bir Kubernetes hizmet hesabı oluşturmak için kullanıldığını unutmayın.
Ayrıca yeni kurtarma kümesi hizmet hesabını blob depolamadaki yedekleme dosyalarına "Depolama Blob Verileri Katkıda Bulunanı" erişimi olan mevcut UAMI ile eşlemek için ikinci bir federasyon kimlik bilgisi oluşturursunuz.
komutunu kullanarak
az identity federated-credential create
ikinci bir federasyon kimliği kimlik bilgisi oluşturun.export PG_PRIMARY_CLUSTER_NAME_RECOVERED="$PG_PRIMARY_CLUSTER_NAME-recovered-db" az identity federated-credential create \ --name $PG_PRIMARY_CLUSTER_NAME_RECOVERED \ --identity-name $AKS_UAMI_CLUSTER_IDENTITY_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --issuer "${AKS_PRIMARY_CLUSTER_OIDC_ISSUER}" \ --subject system:serviceaccount:"${PG_NAMESPACE}":"${PG_PRIMARY_CLUSTER_NAME_RECOVERED}" \ --audience api://AzureADTokenExchange
komutuyla Küme CRD'sini kullanarak isteğe bağlı yedeklemeyi
kubectl apply
geri yükleyin.cat <<EOF | kubectl apply --context $AKS_PRIMARY_CLUSTER_NAME --namespace $PG_NAMESPACE -v 9 -f - apiVersion: postgresql.cnpg.io/v1 kind: Cluster metadata: name: $PG_PRIMARY_CLUSTER_NAME_RECOVERED spec: inheritedMetadata: annotations: service.beta.kubernetes.io/azure-dns-label-name: $AKS_PRIMARY_CLUSTER_PG_DNSPREFIX labels: azure.workload.identity/use: "true" instances: 1 affinity: nodeSelector: workload: postgres # Point to cluster backup created earlier and stored on Azure Blob Storage bootstrap: recovery: source: clusterBackup storage: size: 2Gi pvcTemplate: accessModes: - ReadWriteOnce resources: requests: storage: 2Gi storageClassName: managed-csi-premium volumeMode: Filesystem walStorage: size: 2Gi pvcTemplate: accessModes: - ReadWriteOnce resources: requests: storage: 2Gi storageClassName: managed-csi-premium volumeMode: Filesystem serviceAccountTemplate: metadata: annotations: azure.workload.identity/client-id: "$AKS_UAMI_WORKLOAD_CLIENTID" labels: azure.workload.identity/use: "true" externalClusters: - name: clusterBackup barmanObjectStore: destinationPath: https://${PG_PRIMARY_STORAGE_ACCOUNT_NAME}.blob.core.windows.net/backups serverName: $PG_PRIMARY_CLUSTER_NAME azureCredentials: inheritFromAzureAD: true wal: maxParallel: 8 EOF
Kurtarılan örneğe bağlanın, ardından aşağıdaki komutu kullanarak tam yedeklemenin alındığı özgün kümede oluşturulan veri kümesinin mevcut olduğunu doğrulayın:
kubectl cnpg psql $PG_PRIMARY_CLUSTER_NAME_RECOVERED --namespace $PG_NAMESPACE
postgres=# SELECT COUNT(*) FROM datasample;
Örnek çıkış
# count #------- # 3 #(1 row) # Type \q to exit psql
Aşağıdaki komutu kullanarak kurtarılan kümeyi silin:
kubectl cnpg destroy $PG_PRIMARY_CLUSTER_NAME_RECOVERED 1 \ --context $AKS_PRIMARY_CLUSTER_NAME \ --namespace $PG_NAMESPACE
komutunu kullanarak
az identity federated-credential delete
federasyon kimliği kimlik bilgilerini silin.az identity federated-credential delete \ --name $PG_PRIMARY_CLUSTER_NAME_RECOVERED \ --identity-name $AKS_UAMI_CLUSTER_IDENTITY_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --yes
Genel yük dengeleyici kullanarak PostgreSQL kümesini kullanıma sunma
Bu bölümde, IP kaynağı kısıtlamaları olan PostgreSQL okuma-yazma ve salt okunur uç noktalarını istemci iş istasyonunuzun genel IP adresine genel olarak göstermek için gerekli altyapıyı yapılandıracaksınız.
Küme IP hizmetinden de aşağıdaki uç noktaları alırsınız:
- ile
*-rw
biten bir birincil okuma-yazma uç noktası. - Sıfırdan N'ye (çoğaltma sayısına bağlı olarak) ile
*-ro
biten salt okunur uç noktalar. - ile
*-r
biten bir çoğaltma uç noktası.
komutunu kullanarak
kubectl get
Küme IP hizmeti ayrıntılarını alın.kubectl get services \ --context $AKS_PRIMARY_CLUSTER_NAME \ --namespace $PG_NAMESPACE \ -l cnpg.io/cluster=$PG_PRIMARY_CLUSTER_NAME
Örnek çıkış
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE pg-primary-cnpg-sryti1qf-r ClusterIP 10.0.193.27 <none> 5432/TCP 3h57m pg-primary-cnpg-sryti1qf-ro ClusterIP 10.0.237.19 <none> 5432/TCP 3h57m pg-primary-cnpg-sryti1qf-rw ClusterIP 10.0.244.125 <none> 5432/TCP 3h57m
Not
Üç hizmet vardır:
namespace/cluster-name-ro
5433namespace/cluster-name-rw
numaralı bağlantı noktasına eşlenir venamespace/cluster-name-r
5433 numaralı bağlantı noktasına eşlenir. PostgreSQL veritabanı kümesinin okuma/yazma düğümüyle aynı bağlantı noktasını kullanmaktan kaçınmak önemlidir. Uygulamaların PostgreSQL veritabanı kümesinin salt okunur çoğaltmasına erişmesini istiyorsanız, bunları 5433 numaralı bağlantı noktasına yönlendirin. Son hizmet genellikle veri yedeklemeleri için kullanılır, ancak salt okunur düğüm olarak da işlev görebilir.komutunu kullanarak
kubectl get
hizmet ayrıntılarını alın.export PG_PRIMARY_CLUSTER_RW_SERVICE=$(kubectl get services \ --namespace $PG_NAMESPACE \ --context $AKS_PRIMARY_CLUSTER_NAME \ -l "cnpg.io/cluster" \ --output json | jq -r '.items[] | select(.metadata.name | endswith("-rw")) | .metadata.name') echo $PG_PRIMARY_CLUSTER_RW_SERVICE export PG_PRIMARY_CLUSTER_RO_SERVICE=$(kubectl get services \ --namespace $PG_NAMESPACE \ --context $AKS_PRIMARY_CLUSTER_NAME \ -l "cnpg.io/cluster" \ --output json | jq -r '.items[] | select(.metadata.name | endswith("-ro")) | .metadata.name') echo $PG_PRIMARY_CLUSTER_RO_SERVICE
komutunu kullanarak yük dengeleyici hizmetini aşağıdaki YAML dosyalarıyla
kubectl apply
yapılandırın.cat <<EOF | kubectl apply --context $AKS_PRIMARY_CLUSTER_NAME -f - apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/azure-load-balancer-resource-group: $AKS_PRIMARY_CLUSTER_NODERG_NAME service.beta.kubernetes.io/azure-pip-name: $AKS_PRIMARY_CLUSTER_PUBLICIP_NAME service.beta.kubernetes.io/azure-dns-label-name: $AKS_PRIMARY_CLUSTER_PG_DNSPREFIX name: cnpg-cluster-load-balancer-rw namespace: "${PG_NAMESPACE}" spec: type: LoadBalancer ports: - protocol: TCP port: 5432 targetPort: 5432 selector: cnpg.io/instanceRole: primary cnpg.io/podRole: instance loadBalancerSourceRanges: - "$MY_PUBLIC_CLIENT_IP/32" EOF cat <<EOF | kubectl apply --context $AKS_PRIMARY_CLUSTER_NAME -f - apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/azure-load-balancer-resource-group: $AKS_PRIMARY_CLUSTER_NODERG_NAME service.beta.kubernetes.io/azure-pip-name: $AKS_PRIMARY_CLUSTER_PUBLICIP_NAME service.beta.kubernetes.io/azure-dns-label-name: $AKS_PRIMARY_CLUSTER_PG_DNSPREFIX name: cnpg-cluster-load-balancer-ro namespace: "${PG_NAMESPACE}" spec: type: LoadBalancer ports: - protocol: TCP port: 5433 targetPort: 5432 selector: cnpg.io/instanceRole: replica cnpg.io/podRole: instance loadBalancerSourceRanges: - "$MY_PUBLIC_CLIENT_IP/32" EOF
komutunu kullanarak
kubectl describe
hizmet ayrıntılarını alın.kubectl describe service cnpg-cluster-load-balancer-rw \ --context $AKS_PRIMARY_CLUSTER_NAME \ --namespace $PG_NAMESPACE kubectl describe service cnpg-cluster-load-balancer-ro \ --context $AKS_PRIMARY_CLUSTER_NAME \ --namespace $PG_NAMESPACE export AKS_PRIMARY_CLUSTER_ALB_DNSNAME="$(az network public-ip show \ --resource-group $AKS_PRIMARY_CLUSTER_NODERG_NAME \ --name $AKS_PRIMARY_CLUSTER_PUBLICIP_NAME \ --query "dnsSettings.fqdn" --output tsv)" echo $AKS_PRIMARY_CLUSTER_ALB_DNSNAME
Genel PostgreSQL uç noktalarını doğrulama
Bu bölümde, Azure Load Balancer'ın daha önce oluşturduğunuz statik IP'yi kullanarak ve bağlantıları birincil okuma-yazma ve salt okunur çoğaltmalara yönlendirerek düzgün şekilde ayarlandığını doğrular ve psql CLI'yi kullanarak her ikisine de bağlanırsınız.
Birincil okuma-yazma uç noktasının TCP bağlantı noktası 5432 ile eşlendiğini ve salt okunur çoğaltma uç noktalarının aynı PostgreSQL DNS adının okuyucular ve yazarlar için kullanılmasına izin vermek için 5433 numaralı bağlantı noktasına eşlendiğini unutmayın.
Not
Daha önce oluşturulan ve ortam değişkeninde depolanan PostgreSQL temel kimlik doğrulaması için uygulama kullanıcı parolasının $PG_DATABASE_APPUSER_SECRET
değerine ihtiyacınız vardır.
Aşağıdaki
psql
komutları kullanarak genel PostgreSQL uç noktalarını doğrulayın:echo "Public endpoint for PostgreSQL cluster: $AKS_PRIMARY_CLUSTER_ALB_DNSNAME" # Query the primary, pg_is_in_recovery = false psql -h $AKS_PRIMARY_CLUSTER_ALB_DNSNAME \ -p 5432 -U app -d appdb -W -c "SELECT pg_is_in_recovery();"
Örnek çıkış
pg_is_in_recovery ------------------- f (1 row)
echo "Query a replica, pg_is_in_recovery = true" psql -h $AKS_PRIMARY_CLUSTER_ALB_DNSNAME \ -p 5433 -U app -d appdb -W -c "SELECT pg_is_in_recovery();"
Örnek çıkış
# Example output pg_is_in_recovery ------------------- t (1 row)
Birincil okuma-yazma uç noktasına başarıyla bağlandığında PostgreSQL işlevi false değerini döndürür
f
ve geçerli bağlantının yazılabilir olduğunu gösterir.Bir çoğaltmaya bağlanıldığında işlev true değerini döndürür
t
ve veritabanının kurtarma ve salt okunur durumda olduğunu gösterir.
Planlanmamış yük devretme simülasyonu
Bu bölümde, postgreSQL birincilini barındıran düğüme ani bir kilitlenme veya ağ bağlantısı kaybı simülasyonu yapan birincil podu silerek ani bir hata tetiklersiniz.
Aşağıdaki komutu kullanarak çalışan pod örneklerinin durumunu denetleyin:
kubectl cnpg status $PG_PRIMARY_CLUSTER_NAME --namespace $PG_NAMESPACE
Örnek çıkış
Name Current LSN Rep role Status Node --------------------------- ----------- -------- ------- ----------- pg-primary-cnpg-sryti1qf-1 0/9000060 Primary OK aks-postgres-32388626-vmss000000 pg-primary-cnpg-sryti1qf-2 0/9000060 Standby (sync) OK aks-postgres-32388626-vmss000001 pg-primary-cnpg-sryti1qf-3 0/9000060 Standby (sync) OK aks-postgres-32388626-vmss000002
komutunu kullanarak birincil podu
kubectl delete
silin.PRIMARY_POD=$(kubectl get pod \ --namespace $PG_NAMESPACE \ --no-headers \ -o custom-columns=":metadata.name" \ -l role=primary) kubectl delete pod $PRIMARY_POD --grace-period=1 --namespace $PG_NAMESPACE
pg-primary-cnpg-sryti1qf-2
Aşağıdaki komutu kullanarak pod örneğinin artık birincil olduğunu doğrulayın:kubectl cnpg status $PG_PRIMARY_CLUSTER_NAME --namespace $PG_NAMESPACE
Örnek çıkış
pg-primary-cnpg-sryti1qf-2 0/9000060 Primary OK aks-postgres-32388626-vmss000001 pg-primary-cnpg-sryti1qf-1 0/9000060 Standby (sync) OK aks-postgres-32388626-vmss000000 pg-primary-cnpg-sryti1qf-3 0/9000060 Standby (sync) OK aks-postgres-32388626-vmss000002
pg-primary-cnpg-sryti1qf-1
Aşağıdaki komutu kullanarak pod örneğini birincil olarak sıfırlayın:kubectl cnpg promote $PG_PRIMARY_CLUSTER_NAME 1 --namespace $PG_NAMESPACE
Aşağıdaki komutu kullanarak pod örneklerinin planlanmamış yük devretme testi öncesinde özgün durumlarına geri döndüğünü doğrulayın:
kubectl cnpg status $PG_PRIMARY_CLUSTER_NAME --namespace $PG_NAMESPACE
Örnek çıkış
Name Current LSN Rep role Status Node --------------------------- ----------- -------- ------- ----------- pg-primary-cnpg-sryti1qf-1 0/9000060 Primary OK aks-postgres-32388626-vmss000000 pg-primary-cnpg-sryti1qf-2 0/9000060 Standby (sync) OK aks-postgres-32388626-vmss000001 pg-primary-cnpg-sryti1qf-3 0/9000060 Standby (sync) OK aks-postgres-32388626-vmss000002
Kaynakları temizleme
Dağıtımınızı gözden geçirmeyi bitirdikten sonra komutunu kullanarak
az group delete
bu kılavuzda oluşturduğunuz tüm kaynakları silin.az group delete --resource-group $RESOURCE_GROUP_NAME --no-wait --yes
Sonraki adımlar
Bu nasıl yapılır kılavuzunda şunların nasıl yapılacağını öğrendiniz:
- Çok bölgeli aks kümesi oluşturmak için Azure CLI'yi kullanın.
- CNPG işlecini kullanarak yüksek oranda kullanılabilir bir PostgreSQL kümesi ve veritabanı dağıtın.
- Prometheus ve Grafana kullanarak PostgreSQL için izlemeyi ayarlayın.
- PostgreSQL veritabanına örnek bir veri kümesi dağıtın.
- PostgreSQL ve AKS kümesi yükseltmeleri gerçekleştirin.
- Küme kesintisi ve PostgreSQL çoğaltma yük devretme benzetimi.
- PostgreSQL veritabanının yedeğini ve geri yüklemesini gerçekleştirin.
İş yükleriniz için AKS'den nasıl yararlanabileceğiniz hakkında daha fazla bilgi edinmek için bkz . Azure Kubernetes Service (AKS) nedir?
Katkıda Bulunanlar
Microsoft bu makaleyi korur. Başlangıçta aşağıdaki katkıda bulunanlar yazdı:
- Ken Kilty | Asıl TPM
- Russell de Pina | Asıl TPM
- Adrian Joian | Kıdemli Müşteri Mühendisi
- Jenny Hayes | Kıdemli İçerik Geliştirici
- Carol Smith | Kıdemli İçerik Geliştirici
- Erin Schaffer | İçerik Geliştirici 2
- Adem Şerif | Müşteri Mühendisi 2
Azure Kubernetes Service