Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit artikel implementeert u een maximaal beschikbare PostgreSQL-database op AKS.
- Als u nog steeds de vereiste infrastructuur voor deze implementatie moet maken, volgt u de stappen in Infrastructuur maken voor het implementeren van een maximaal beschikbare PostgreSQL-database op AKS om te worden ingesteld en keert u terug naar dit artikel.
Important
Opensource-software wordt vermeld in AKS-documentatie en -voorbeelden. Software die u implementeert, is uitgesloten van AKS-serviceovereenkomsten, beperkte garantie en ondersteuning voor Azure. Wanneer u opensource-technologie naast AKS gebruikt, raadpleegt u de beschikbare ondersteuningsopties van de respectieve community's en projectonderhouders om een plan te ontwikkelen.
Microsoft neemt de verantwoordelijkheid voor het bouwen van de opensource-pakketten die we implementeren op AKS. Deze verantwoordelijkheid omvat het volledige eigendom van het bouw-, scan-, onderteken-, validatie- en hotfixproces, samen met controle over de binaire bestanden in container images. Zie Beveiligingsbeheer voor AKS- en AKS-ondersteuningsdekking voor meer informatie.
Geheim maken voor bootstrap-app-gebruiker
- Genereer een geheim om de PostgreSQL-implementatie te valideren door interactieve aanmelding voor een bootstrap-app-gebruiker met behulp van de
kubectl create secretopdracht.
Important
Microsoft raadt u aan de veiligste verificatiestroom te gebruiken die beschikbaar is. De verificatiestroom die in deze procedure wordt beschreven, vereist een hoge mate van vertrouwen in de toepassing en draagt risico's die niet aanwezig zijn in andere stromen. U moet deze stroom alleen gebruiken wanneer andere veiligere stromen, zoals beheerde identiteiten, niet haalbaar zijn.
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
Controleer of het geheim is gemaakt met behulp van de
kubectl getopdracht.kubectl get secret db-user-pass --namespace $PG_NAMESPACE --context $AKS_PRIMARY_CLUSTER_NAME
Omgevingsvariabelen instellen voor het PostgreSQL-cluster
Implementeer een ConfigMap om de CNPG-operator te configureren met behulp van de volgende
kubectl applyopdracht. Deze waarden vervangen de verouderdeENABLE_AZURE_PVC_UPDATESschakelaar, die niet meer vereist is, en helpen bij het gefaseerd uitvoeren van upgrades en het versnellen van het verbindingsherstel van replica's. Voordat u deze configuratie in productie gaat implementeren, moet u controleren of alle bestaandeDRAIN_TAINTSinstellingen die u vertrouwt compatibel blijven met uw Azure-omgeving.cat <<EOF | kubectl apply --context $AKS_PRIMARY_CLUSTER_NAME -n $PG_NAMESPACE -f - apiVersion: v1 kind: ConfigMap metadata: name: cnpg-controller-manager-config data: CLUSTERS_ROLLOUT_DELAY: '120' STANDBY_TCP_USER_TIMEOUT: '10' EOF
De Prometheus PodMonitors installeren
Prometheus scrapet CNPG met behulp van de opnameregels die zijn opgeslagen in de CNPG GitHub-voorbeelden opslagplaats. Omdat de door de operator beheerde PodMonitor wordt afgeschaft, maakt en beheert u de PodMonitor-resource zelf, zodat u deze kunt aanpassen aan uw bewakingsstack.
Voeg de Prometheus Community Helm-opslagplaats toe met de
helm repo addopdracht.helm repo add prometheus-community \ https://prometheus-community.github.io/helm-chartsWerk de Prometheus Community Helm-opslagplaats bij en installeer deze op het primaire cluster met behulp van de
helm upgradeopdracht met de--installvlag.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_NAMEMaak een PodMonitor voor het cluster. Het CNPG-team beëindigt de door de operator beheerde PodMonitor, zodat u het nu rechtstreeks beheert:
cat <<EOF | kubectl apply --context $AKS_PRIMARY_CLUSTER_NAME --namespace $PG_NAMESPACE -f - apiVersion: monitoring.coreos.com/v1 kind: PodMonitor metadata: name: $PG_PRIMARY_CLUSTER_NAME namespace: ${PG_NAMESPACE} labels: cnpg.io/cluster: ${PG_PRIMARY_CLUSTER_NAME} spec: selector: matchLabels: cnpg.io/cluster: ${PG_PRIMARY_CLUSTER_NAME} podMetricsEndpoints: - port: metrics EOF
Een federatieve inloggegevens maken
In deze sectie maakt u een federatieve identiteitsreferentie voor PostgreSQL-back-up, zodat CNPG AKS-workloadidentiteit kan gebruiken om te verifiëren bij de bestemming van het opslagaccount voor back-ups. De CNPG-operator maakt een Kubernetes-serviceaccount met dezelfde naam als het cluster dat wordt gebruikt in het CNPG-clusterimplementatiemanifest.
Haal de URL van de OIDC-verlener van het cluster op met behulp van de
az aks showopdracht.export AKS_PRIMARY_CLUSTER_OIDC_ISSUER="$(az aks show \ --name $AKS_PRIMARY_CLUSTER_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --query "oidcIssuerProfile.issuerUrl" \ --output tsv)"Maak een federatieve identiteitsreferentie met behulp van de
az identity federated-credential createopdracht.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
Een postgreSQL-cluster met hoge beschikbaarheid implementeren
In deze sectie implementeert u een PostgreSQL-cluster met hoge beschikbaarheid met behulp van de CNPG Cluster Custom Resource Definition (CRD).
CRD-parameters voor cluster
De volgende tabel bevat een overzicht van de belangrijkste eigenschappen die zijn ingesteld in het YAML-implementatiemanifest voor de CLUSTER CRD:
| Property | Definition |
|---|---|
imageName |
Verwijst naar de container image van de CloudNativePG-operand. Gebruik ghcr.io/cloudnative-pg/postgresql:18-system-trixie met de in-core back-upintegratie zoals weergegeven in deze handleiding, of schakel over naar 18-standard-trixie wanneer u de Barman Cloud-invoegtoepassing adopteert. |
inheritedMetadata |
Specifiek voor de CNPG-operator. De CNPG-operator past de metagegevens toe op elk object dat is gerelateerd aan het cluster. |
annotations |
Bevat het DNS-label dat is vereist bij het beschikbaar maken van de clustereindpunten en het inschakelen alpha.cnpg.io/failoverQuorum van failover op basis van quorums. |
labels: azure.workload.identity/use: "true" |
Geeft aan dat AKS workloadidentiteitsafhankelijkheden moet injecteren in de pods die als host fungeren voor de PostgreSQL-clusterinstanties. |
topologySpreadConstraints |
Verschillende zones en verschillende knooppunten met label "workload=postgres"vereisen. |
resources |
Hiermee configureert u een QoS-klasse (Quality of Service) van Gegarandeerd. In een productieomgeving zijn deze waarden essentieel voor het maximaliseren van het gebruik van de onderliggende knooppunt-VM en variëren op basis van de gebruikte Azure VM-SKU. |
probes |
Vervangt de verouderde startDelay configuratie. Streaming-opstart- en gereedheidstests helpen ervoor te zorgen dat replica's in orde zijn voordat verkeer wordt geleverd. |
smartShutdownTimeout |
Hiermee kunnen langlopende transacties correct worden voltooid tijdens updates in plaats van agressieve stopvertragingen te gebruiken. |
bootstrap |
Specifiek voor de CNPG-operator. Initialiseert met een lege app-database. |
storage |
Hiermee worden de PersistentVolume-instellingen voor de database gedefinieerd. Met beheerde Azure-schijven bewaart de vereenvoudigde syntaxis gegevens en WAL op hetzelfde 64 GiB-volume, dat betere doorvoerlagen op beheerde schijven biedt. Pas aan als u afzonderlijke WAL-volumes nodig hebt. |
postgresql.synchronous |
minSyncReplicas
/
maxSyncReplicas Hiermee kunt u synchrone replicatiegedrag opgeven met behulp van het nieuwere schema. |
postgresql.parameters |
Specifiek voor de CNPG-operator. Kaartinstellingen voor postgresql.conf, pg_hba.confen pg_ident.conf. Het voorbeeld benadrukt waarneembaarheid en standaardinstellingen voor WAL-retentie die passen bij het identiteitsscenario van de AKS-werklast, maar moeten per werklast worden afgestemd. |
serviceAccountTemplate |
Bevat de sjabloon die nodig is voor het genereren van de serviceaccounts en wijst de federatieve AKS-identiteitsreferenties toe aan de UAMI om AKS-workloadidentiteitsverificatie in te schakelen van de pods die als host fungeren voor de PostgreSQL-exemplaren naar externe Azure-resources. |
barmanObjectStore |
Specifiek voor de CNPG-operator. Hiermee configureert u de barman-cloud tool suite met behulp van de AKS-workloadidentiteit voor verificatie bij de Azure Blob Storage-objectopslag. |
Als u PostgreSQL-workloads verder wilt isoleren, kunt u een taint (bijvoorbeeld node-role.kubernetes.io/postgres=:NoSchedule) toevoegen aan uw gegevensvlakknooppunten en het voorbeeld nodeSelector/tolerations vervangen door de waarden die door CloudNativePG worden aanbevolen. Als u deze aanpak volgt, labelt u de knooppunten dienovereenkomstig en bevestigt u dat het AKS-beleid voor automatische schaalaanpassing overeenkomt met uw topologie.
PostgreSQL-prestatieparameters
De prestaties van PostgreSQL zijn sterk afhankelijk van de onderliggende resources en workload van uw cluster. De volgende tabel bevat basislijnrichtlijnen voor een cluster met drie knooppunten dat wordt uitgevoerd op Standard D4s v3-knooppunten (16-GiB-geheugen). Behandel deze waarden als uitgangspunt en pas deze aan wanneer u uw workloadprofiel begrijpt:
| Property | Aanbevolen waarde | Definition |
|---|---|---|
wal_compression |
lz4 | Comprimeert volledige pagina's geschreven in een WAL-bestand met een specifieke methode |
max_wal_size |
6 GB | Hiermee stelt u de WAL-grootte in waarmee een controlepunt wordt geactiveerd |
checkpoint_timeout |
15 minuten | Hiermee stelt u de maximale tijd in tussen automatische WAL-controlepunten |
checkpoint_completion_target |
0,9 | Hiermee wordt het werk van het controlepunt verdeeld over het controlepuntvenster |
checkpoint_flush_after |
2 MB | Aantal pagina's waarna eerder uitgevoerde schrijfbewerkingen naar schijf worden leeggemaakt |
wal_writer_flush_after |
2 MB | Hoeveelheid WAL die is uitgeschreven door de WAL writer die een flush activeert |
min_wal_size |
2 GB | Hiermee stelt u de minimale grootte in waarop de WAL wordt verkleind. |
max_slot_wal_keep_size |
10 GB | Bovengrens voor WAL voor overblijvende replicatiesleuven |
shared_buffers |
4 GB | Hiermee stelt u het aantal gedeelde geheugenbuffers in dat wordt gebruikt door de server (25% van het knooppuntgeheugen in dit voorbeeld) |
effective_cache_size |
12 GB | Stelt de aanname van de planner in over de totale grootte van de gegevenscaches |
work_mem |
1/256e van het knooppuntgeheugen | Hiermee stelt u het maximale geheugen in dat moet worden gebruikt voor querywerkruimten |
maintenance_work_mem |
6.25% van knooppuntgeheugen | Hiermee stelt u het maximale geheugen in dat moet worden gebruikt voor onderhoudsbewerkingen |
autovacuum_vacuum_cost_limit |
2400 | Hoeveelheid vacuümkosten beschikbaar voor napping, voor autovacuum |
random_page_cost |
1.1 | Hiermee stelt u de schatting van de planner in van de kosten van een niet-opeenvolgend opgehaalde schijfpagina |
effective_io_concurrency |
64 | Hiermee stelt u in hoeveel gelijktijdige aanvragen het schijfsubsysteem efficiënt kan verwerken |
maintenance_io_concurrency |
64 | Een variant van 'effective_io_concurrency' die wordt gebruikt voor onderhoudswerkzaamheden |
PostgreSQL implementeren
Implementeer het PostgreSQL-cluster met cluster CRD met behulp van de
kubectl applyopdracht.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 annotations: alpha.cnpg.io/failoverQuorum: "true" spec: imageName: ghcr.io/cloudnative-pg/postgresql:18-system-trixie inheritedMetadata: annotations: service.beta.kubernetes.io/azure-dns-label-name: $AKS_PRIMARY_CLUSTER_PG_DNSPREFIX labels: azure.workload.identity/use: "true" instances: 3 smartShutdownTimeout: 30 probes: startup: type: streaming maximumLag: 32Mi periodSeconds: 5 timeoutSeconds: 3 failureThreshold: 120 readiness: type: streaming maximumLag: 0 periodSeconds: 10 failureThreshold: 6 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: storageClass: $POSTGRES_STORAGE_CLASS size: 64Gi postgresql: synchronous: method: any number: 1 parameters: wal_compression: lz4 max_wal_size: 6GB max_slot_wal_keep_size: 10GB checkpoint_timeout: 15min checkpoint_completion_target: '0.9' checkpoint_flush_after: 2MB wal_writer_flush_after: 2MB min_wal_size: 2GB shared_buffers: 4GB effective_cache_size: 12GB work_mem: 62MB maintenance_work_mem: 1GB autovacuum_vacuum_cost_limit: "2400" random_page_cost: "1.1" effective_io_concurrency: "64" maintenance_io_concurrency: "64" log_checkpoints: 'on' log_lock_waits: 'on' log_min_duration_statement: '1000' log_statement: 'ddl' log_temp_files: '1024' log_autovacuum_min_duration: '1s' pg_stat_statements.max: '10000' pg_stat_statements.track: 'all' hot_standby_feedback: 'on' 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
Opmerking
Het voorbeeldmanifest maakt gebruik van de ghcr.io/cloudnative-pg/postgresql:18-system-trixie afbeelding omdat deze werkt met de in-core Barman Cloud-integratie die later wordt weergegeven. Wanneer u klaar bent om over te schakelen naar de Barman Cloud-invoegtoepassing, moet u de spec.imageName voor de invoegtoepassing bijwerken ghcr.io/cloudnative-pg/postgresql:18-standard-trixie en volgen voordat u het cluster opnieuw implementeert.
Important
De voorbeeldvermelding pg_hba staat niet-TLS-toegang toe. Als u deze configuratie behoudt, documenteert u de gevolgen voor de beveiliging van uw team en geeft u waar mogelijk de voorkeur aan versleutelde verbindingen.
Controleer of het primaire PostgreSQL-cluster is gemaakt met behulp van de
kubectl getopdracht. Het CNPG-cluster CRD heeft drie exemplaren opgegeven, die kunnen worden gevalideerd door actieve pods weer te geven zodra elk exemplaar wordt opgehaald en toegevoegd voor replicatie. Wees geduldig omdat het enige tijd kan duren voordat alle drie de exemplaren online zijn en deelnemen aan het cluster.kubectl get pods --context $AKS_PRIMARY_CLUSTER_NAME --namespace $PG_NAMESPACE -l cnpg.io/cluster=$PG_PRIMARY_CLUSTER_NAMEVoorbeelduitvoer
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
Important
Als u lokale NVMe gebruikt met Azure Container Storage en een pod in de init-fase vastzit met een fout bij meerdere koppelingen, zoekt de pod nog steeds naar het volume op een verloren node. Nadat de pod wordt uitgevoerd, wordt er een CrashLoopBackOff status ingevoerd omdat CNPG een nieuwe replica maakt op een nieuw knooppunt zonder gegevens en de pgdata map niet kan vinden. U kunt dit probleem oplossen door het betrokken exemplaar te vernietigen en een nieuw exemplaar weer te geven. Voer de volgende opdracht uit:
kubectl cnpg destroy [cnpg-cluster-name] [instance-number]
Valideren dat Prometheus PodMonitor wordt uitgevoerd
De handmatig gemaakte PodMonitor koppelt de kube-prometheus-stack-scrape-configuratie aan de CNPG-pods die u eerder hebt geïmplementeerd.
Controleer of PodMonitor wordt uitgevoerd met behulp van de kubectl get opdracht.
kubectl --namespace $PG_NAMESPACE \
--context $AKS_PRIMARY_CLUSTER_NAME \
get podmonitors.monitoring.coreos.com \
$PG_PRIMARY_CLUSTER_NAME \
--output yaml
Voorbeelduitvoer
kind: PodMonitor
metadata:
labels:
cnpg.io/cluster: pg-primary-cnpg-r8c7unrw
name: pg-primary-cnpg-r8c7unrw
namespace: cnpg-database
spec:
podMetricsEndpoints:
- port: metrics
selector:
matchLabels:
cnpg.io/cluster: pg-primary-cnpg-r8c7unrw
Als u Azure Monitor voor Beheerde Prometheus gebruikt, moet u een extra podmonitor toevoegen met de aangepaste groepsnaam. Beheerde Prometheus haalt de aangepaste resourcedefinities (CRD's) niet op van de Prometheus-community. Afgezien van de groepsnaam zijn de CRD's hetzelfde. Met dit ontwerp kunnen podmonitors voor Beheerde Prometheus worden uitgevoerd naast podmonitors die gebruikmaken van de CRD van de community. Als u beheerde Prometheus niet gebruikt, kunt u deze sectie overslaan. Maak een nieuwe podmonitor:
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
Controleer of de podmonitor is gemaakt (let op het verschil in de groepsnaam).
kubectl --namespace $PG_NAMESPACE \
--context $AKS_PRIMARY_CLUSTER_NAME \
get podmonitors.azmonitoring.coreos.com \
-l cnpg.io/cluster=$PG_PRIMARY_CLUSTER_NAME \
-o yaml
Optie A - Azure Monitor-werkruimte
Nadat u het Postgres-cluster en de podmonitor hebt geïmplementeerd, kunt u de metrische gegevens bekijken met behulp van Azure Portal in een Azure Monitor-werkruimte.
Optie B - Beheerd Grafana
Nadat u het Postgres-cluster en de podmonitoren hebt geïmplementeerd, kunt u ook een dashboard met metrische gegevens maken op het beheerde Grafana-exemplaar dat door het implementatiescript is gemaakt om de metrische gegevens te visualiseren die zijn geëxporteerd naar de Azure Monitor-werkruimte. U hebt toegang tot managed Grafana via Azure Portal. Navigeer naar het beheerde Grafana-exemplaar dat is gemaakt door het implementatiescript en selecteer de koppeling Eindpunt, zoals hier wordt weergegeven:
Als u de koppeling Eindpunt selecteert, wordt een nieuw browservenster geopend waarin u dashboards kunt maken op het beheerde Grafana-exemplaar. Volg de instructies voor het configureren van een Azure Monitor-gegevensbron. Vervolgens kunt u visualisaties toevoegen om een dashboard met metrische gegevens te maken vanuit het Postgres-cluster. Nadat u de verbinding met de gegevensbron hebt ingesteld, selecteert u in het hoofdmenu de optie Gegevensbronnen. U ziet nu een set opties voor gegevensbronnen voor de gegevensbronverbinding, zoals hier wordt weergegeven:
Selecteer in de optie Beheerde Prometheus de optie om een dashboard te maken om de dashboardeditor te openen. Nadat het editorvenster is geopend, selecteert u de optie Visualisatie toevoegen en selecteert u vervolgens de optie Beheerde Prometheus om door de metrische gegevens van het Postgres-cluster te bladeren. Nadat u de metrische gegevens hebt geselecteerd die u wilt visualiseren, selecteert u de knop Query's uitvoeren om de gegevens voor de visualisatie op te halen, zoals hier wordt weergegeven:
Selecteer het pictogram Opslaan om het deelvenster toe te voegen aan uw dashboard. U kunt andere panelen toevoegen door de knop Toevoegen te selecteren in de dashboardeditor en dit proces te herhalen om andere metrische gegevens te visualiseren. Als u de visualisaties voor metrische gegevens toevoegt, moet u iets hebben dat er als volgt uitziet:
Selecteer het pictogram Opslaan om uw dashboard op te slaan.
Volgende stappen
Contributors
Microsoft onderhoudt dit artikel. De volgende inzenders hebben het oorspronkelijk geschreven:
- Ken Kilty | Hoofd TPM
- Russell de Pina | Principal TPM
- Adrian Joian | Senior klanttechnicus
- Jenny Hayes | Senior Content Developer
- Carol Smith | Senior Content Developer
- Erin Schaffer | Inhoudsontwikkelaar 2
- Adam Sharif | Technisch Klantadviseur 2
Erkenning
Deze documentatie is gezamenlijk ontwikkeld met EnterpriseDB, de onderhouders van de CloudNativePG-operator. We danken Gabriele Bartolini voor het bekijken van eerdere concepten van dit document en het aanbieden van technische verbeteringen.