Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
I den här artikeln distribuerar du en PostgreSQL-databas med hög tillgänglighet på AKS.
- Om du inte redan har skapat den infrastruktur som krävs för den här distributionen följer du stegen i Skapa infrastruktur för att distribuera en PostgreSQL-databas med hög tillgänglighet i AKS för att konfigurera och sedan kan du återgå till den här artikeln.
Important
Programvara med öppen källkod nämns i AKS-dokumentationen och exempel. Programvara som du distribuerar undantas från AKS-serviceavtal, begränsad garanti och Azure Support. När du använder teknik med öppen källkod tillsammans med AKS kan du läsa supportalternativen som är tillgängliga från respektive community och projektunderhållare för att utveckla en plan.
Till exempel beskriver Ray GitHub-lagringsplatsen flera plattformar som varierar i svarstid, syfte och supportnivå.
Microsoft tar ansvar för att skapa de paket med öppen källkod som vi distribuerar på AKS. Det ansvaret omfattar att ha fullständigt ägarskap för bygg-, genomsöknings-, signerings-, validerings- och snabbkorrigeringsprocessen, tillsammans med kontroll över binärfilerna i containeravbildningar. Mer information finns i Sårbarhetshantering för AKS - och AKS-stödtäckning.
Skapa hemlighet för bootstrap-appanvändare
- Generera en hemlighet för att verifiera PostgreSQL-distributionen genom interaktiv inloggning för en bootstrap-appanvändare med hjälp av
kubectl create secretkommandot .
Important
Microsoft rekommenderar att du använder det säkraste tillgängliga autentiseringsflödet. Det autentiseringsflöde som beskrivs i den här proceduren kräver mycket stort förtroende för programmet och medför risker som inte finns i andra flöden. Du bör bara använda det här flödet när andra säkrare flöden, till exempel hanterade identiteter, inte är livskraftiga.
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
Kontrollera att hemligheten har skapats med kommandot
kubectl get.kubectl get secret db-user-pass --namespace $PG_NAMESPACE --context $AKS_PRIMARY_CLUSTER_NAME
Ange miljövariabler för PostgreSQL-klustret
Distribuera en ConfigMap för att ange miljövariabler för PostgreSQL-klustret med följande
kubectl applykommando: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
Installera Prometheus PodMonitors
Prometheus skapar PodMonitors för CNPG-instanserna med hjälp av en uppsättning standardinspelningsregler som lagras på CNPG GitHub-exempellagringsplatsen. I en produktionsmiljö ändras dessa regler efter behov.
Lägg till Prometheus Community Helm-lagringsplatsen med kommandot
helm repo add.helm repo add prometheus-community \ https://prometheus-community.github.io/helm-chartsUppgradera Prometheus Community Helm-repositoryt och installera det på det primära klustret med kommandot
helm upgradeoch flaggan--install.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
Skapa en federerad autentiseringsuppgift
I det här avsnittet skapar du en federerad identitetsautentiseringsuppgift för PostgreSQL-säkerhetskopiering så att CNPG kan använda AKS-arbetsbelastningsidentitet för att autentisera till lagringskontots mål för säkerhetskopior. CNPG-operatorn skapar ett Kubernetes-tjänstkonto med samma namn som klustret med namnet som används i CNPG-klusterdistributionsmanifestet.
Hämta OIDC-utfärdarens URL för klustret med kommandot
az aks show.export AKS_PRIMARY_CLUSTER_OIDC_ISSUER="$(az aks show \ --name $AKS_PRIMARY_CLUSTER_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --query "oidcIssuerProfile.issuerUrl" \ --output tsv)"Skapa en federerad identitetsautentiseringsuppgift med kommandot
az identity federated-credential create.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
Distribuera ett PostgreSQL-kluster med hög tillgänglighet
I det här avsnittet distribuerar du ett PostgreSQL-kluster med hög tillgänglighet med hjälp av den anpassade resursdefinitionen för CNPG-kluster (CRD).
Crd-parametrar för kluster
I följande tabell beskrivs de nyckelegenskaper som anges i YAML-distributionsmanifestet för kluster-CRD:
| Property | Definition |
|---|---|
inheritedMetadata |
Specifikt för CNPG-operatorn. Metadata ärvs av alla objekt som är relaterade till klustret. |
annotations: service.beta.kubernetes.io/azure-dns-label-name |
DNS-etikett för användning när skrivskyddade och skrivskyddade Postgres-klusterslutpunkter exponeras. |
labels: azure.workload.identity/use: "true" |
Anger att AKS ska mata in arbetsbelastningsidentitetsberoenden i poddarna som är värdar för PostgreSQL-klusterinstanserna. |
topologySpreadConstraints |
Kräv olika zoner och olika noder med etiketten "workload=postgres". |
resources |
Konfigurerar en QoS-klass (Quality of Service) för Guaranteed. I en produktionsmiljö är dessa värden viktiga för att maximera användningen av den underliggande virtuella nodddatorn och varierar beroende på vilken Azure VM SKU som används. |
bootstrap |
Specifikt för CNPG-operatorn. Initieras med en tom appdatabas. |
storage / walStorage |
Specifikt för CNPG-operatorn. Definierar lagringsmallar för PersistentVolumeClaims (PVCs) för data och logglagring. Det går också att ange lagring för tablespaces som ska skalas ut för ökade IOP. |
replicationSlots |
Specifikt för CNPG-operatorn. Aktiverar replikeringsplatser för hög tillgänglighet. |
postgresql |
Specifikt för CNPG-operatorn. Maps-inställningar för postgresql.conf, pg_hba.confoch pg_ident.conf config. |
serviceAccountTemplate |
Innehåller mallen som behövs för att generera tjänstkontona och mappar AKS-federerade identitetsautentiseringsuppgifter till UAMI för att aktivera AKS-arbetsbelastningsidentitetsautentisering från poddarna som är värd för PostgreSQL-instanserna till externa Azure-resurser. |
barmanObjectStore |
Specifikt för CNPG-operatorn. Konfigurerar barman-cloud-verktygssviten med AKS arbetsbelastningsidentitet för autentisering mot Azure Blob Storage-objektlagret. |
Prestandaparametrar för PostgreSQL
PostgreSQL-prestanda är starkt beroende av klustrets underliggande resurser. Följande tabell innehåller några förslag på hur du beräknar nyckelparametrar för höga prestanda:
| Property | Rekommenderat värde | Definition |
|---|---|---|
wal_compression |
lz4 | Komprimerar helsidesskrivningar skrivna i WAL-fil med angiven metod |
max_wal_size |
6GB | Anger den WAL-storlek som utlöser en kontrollpunkt |
checkpoint_timeout |
15min | Anger den maximala tiden mellan automatiska WAL-kontrollpunkter |
checkpoint_flush_after |
2MB | Antal sidor varefter tidigare utförda skrivningar rensas till disk |
wal_writer_flush_after |
2MB | Mängden WAL som skrivs ut av WAL-skrivaren och som utlöser en tömning |
min_wal_size |
4GB | Anger den minsta storleken för att krympa WAL till |
shared_buffers |
25% av nodminne | Anger antalet buffertar för delat minne som används av servern |
effective_cache_size |
75% nodens minne | Anger planerarens antagande om den totala storleken på datacachen |
work_mem |
1/256-del av nodminnet | Anger det maximala minne som ska användas för frågearbetsytor |
maintenance_work_mem |
6.25% av nodminne | Anger det maximala minne som ska användas för underhållsåtgärder |
autovacuum_vacuum_cost_limit |
2400 | Vakuumkostnadsbelopp som är tillgängligt före tupplur, för autovacuum |
random_page_cost |
1.1 | Anger planerarens uppskattning av kostnaden för en icke-sekventiellt hämtad disksida |
effective_io_concurrency |
64 | Antal samtidiga begäranden som kan hanteras effektivt av diskundersystemet |
maintenance_io_concurrency |
64 | En variant av "effective_io_concurrency" som används för underhållsarbete |
Implementera PostgreSQL
Distribuera PostgreSQL-klustret med kluster-CRD med hjälp av
kubectl applykommandot .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: 32Gi pvcTemplate: accessModes: - ReadWriteOnce resources: requests: storage: 32Gi storageClassName: $POSTGRES_STORAGE_CLASS walStorage: size: 32Gi pvcTemplate: accessModes: - ReadWriteOnce resources: requests: storage: 32Gi storageClassName: $POSTGRES_STORAGE_CLASS monitoring: enablePodMonitor: true postgresql: parameters: wal_compression: lz4 max_wal_size: 6GB checkpoint_timeout: 15min checkpoint_flush_after: 2MB wal_writer_flush_after: 2MB min_wal_size: 4GB 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" 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
Kontrollera att det primära PostgreSQL-klustret har skapats med kommandot
kubectl get. CNPG-kluster-CRD angav tre instanser, som kan verifieras genom att visa poddar som körs när varje instans har tagits upp och anslutits för replikering. Ha tålamod eftersom det kan ta lite tid för alla tre instanserna att komma online och ansluta till klustret.kubectl get pods --context $AKS_PRIMARY_CLUSTER_NAME --namespace $PG_NAMESPACE -l cnpg.io/cluster=$PG_PRIMARY_CLUSTER_NAMEExempel på utdata
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
Om du använder lokal NVMe med Azure Container Storage och podden har fastnat i init-tillståndet med ett multi-attach-fel, söker den förmodligen fortfarande efter volymen på en förlorad nod. När podden börjar köras anger den ett CrashLoopBackOff tillstånd eftersom en ny replik har skapats på den nya noden utan några data och CNPG inte kan hitta katalogen pgdata. För att lösa detta måste du ta bort den berörda instansen och starta en ny. Kör följande kommando:
kubectl cnpg destroy [cnpg-cluster-name] [instance-number]
Verifiera att Prometheus PodMonitor körs
CNPG-operatorn skapar automatiskt en PodMonitor för den primära instansen med hjälp av de inspelningsregler som skapades under Installationen av Prometheus Community.
Verifiera att PodMonitor körs med kommandot
kubectl get.kubectl --namespace $PG_NAMESPACE \ --context $AKS_PRIMARY_CLUSTER_NAME \ get podmonitors.monitoring.coreos.com \ $PG_PRIMARY_CLUSTER_NAME \ --output yamlExempel på utdata
kind: PodMonitor metadata: annotations: cnpg.io/operatorVersion: 1.27.0 ...
Om du använder Azure Monitor för Managed Prometheus måste du lägga till ytterligare en poddövervakare med det anpassade gruppnamnet. Managed Prometheus hämtar inte de anpassade resursdefinitionerna (CRD) från Prometheus-communityn. Förutom gruppnamnet är CRD:erna samma. På så sätt kan podmonitorer för Managed Prometheus finnas sida vid sida med dem som använder community-podmonitorer. Om du inte använder Managed Prometheus kan du hoppa över det här. Skapa en ny poddövervakare:
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
Kontrollera att poddövervakaren har skapats (observera skillnaden i gruppnamnet).
kubectl --namespace $PG_NAMESPACE \
--context $AKS_PRIMARY_CLUSTER_NAME \
get podmonitors.azmonitoring.coreos.com \
-l cnpg.io/cluster=$PG_PRIMARY_CLUSTER_NAME \
-o yaml
Alternativ A – Azure Monitor-arbetsyta
När du har distribuerat Postgres-klustret och poddövervakaren kan du visa måtten med hjälp av Azure Portal på en Azure Monitor-arbetsyta.
Alternativ B – Hanterad Grafana
Alternativt, när du har distribuerat Postgres-klustret och poddövervakarna kan du skapa en instrumentpanel för mätvärden på instansen av Hanterad Grafana som skapats av distributionsskriptet för att visualisera de mätvärden som exporteras till Azure Monitor-arbetsytan. Du kan komma åt Managed Grafana via Azure Portal. Gå till den hanterade Grafana-instansen som skapats av distributionsskriptet och välj länken Slutpunkt enligt följande:
När du väljer slutpunktslänken öppnas ett nytt webbläsarfönster där du kan skapa instrumentpaneler på den hanterade Grafana-instansen. Genom att följa anvisningarna för att konfigurera en Azure Monitor-datakälla kan du sedan lägga till visualiseringar för att skapa en instrumentpanel med mått från Postgres-klustret. När du har konfigurerat anslutningen till datakällan går du till huvudmenyn och väljer alternativet Datakällor. Du bör se en uppsättning alternativ för anslutningen till datakällan som visas här:
Under alternativet Hanterad Prometheus väljer du att skapa en instrumentpanel för att öppna instrumentpanelsredigeraren. När redigeringsfönstret öppnas väljer du alternativet Lägg till visualisering och väljer sedan alternativet Hanterad Prometheus för att bläddra bland måtten från Postgres-klustret. När du har valt det mått som du vill visualisera väljer du knappen Kör frågor för att hämta data för visualiseringen enligt följande:
Välj ikonen Spara för att lägga till panelen på instrumentpanelen. Du kan lägga till andra paneler genom att välja knappen Lägg till i instrumentpanelsredigeraren och upprepa den här processen för att visualisera andra mått. Om du lägger till måttvisualiseringarna bör du ha något som ser ut så här:
Välj ikonen Spara för att spara instrumentpanelen.
Nästa steg
Contributors
Microsoft uppdaterar den här artikeln. Följande deltagare skrev den ursprungligen:
- Ken Kilty | Chef för TPM
- Russell de Pina | Chef för TPM
- Adrian Joian | Senior kundtekniker
- Jenny Hayes | Senior innehållsutvecklare
- Carol Smith | Senior innehållsutvecklare
- Erin Schaffer | Innehållsutvecklare 2
- Adam Sharif | Kundtekniker 2
Azure Kubernetes Service