Dela via


Distribuera en PostgreSQL-databas med hög tillgänglighet i Azure Kubernetes Service (AKS)

I den här artikeln distribuerar du en PostgreSQL-databas med hög tillgänglighet på AKS.

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

  1. Generera en hemlighet för att verifiera PostgreSQL-distributionen genom interaktiv inloggning för en bootstrap-appanvändare med hjälp av kubectl create secret kommandot .

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
  1. 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 apply kommando:

    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.

  1. Lägg till Prometheus Community Helm-lagringsplatsen med kommandot helm repo add .

    helm repo add prometheus-community \
        https://prometheus-community.github.io/helm-charts
    
  2. Uppgradera Prometheus Community Helm-repositoryt och installera det på det primära klustret med kommandot helm upgrade och 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.

  1. 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)"
    
  2. 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

  1. Distribuera PostgreSQL-klustret med kluster-CRD med hjälp av kubectl apply kommandot .

    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
    
  1. 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_NAME
    

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

  1. 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 yaml
    

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

Skärmbild som visar Postgres-klustermått på en Azure Monitor-arbetsyta i Azure-portalen.

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:

Skärmbild av Postgres-klustermått i en Azure Managed Grafana-instans i Azure-portalen.

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:

Skärmbild som visar alternativ för Azure Monitor-datakälla i Azure-portalen.

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:

Skärmbild som visar en hanterad Prometheus-instrumentpanel med Postgres-klustermått.

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:

Skärmbild som visar en sparad hanterad Prometheus-instrumentpanel i Azure-portalen.

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