Поделиться через


Создание инфраструктуры для развертывания высокодоступной базы данных PostgreSQL в Службе Azure Kubernetes (AKS)

В этой статье вы создадите ресурсы инфраструктуры, необходимые для развертывания высокодоступной базы данных PostgreSQL в AKS с помощью оператора CloudNativePG (CNPG).

Внимание

Программное обеспечение с открытым кодом упоминается во всей документации и примерах AKS. Развертываемое программное обеспечение не подпадает под действие соглашений об уровне обслуживания AKS, ограниченной гарантии и поддержки Azure. При использовании технологии с открытым исходным кодом вместе с AKS ознакомьтесь с вариантами поддержки, доступными от соответствующих сообществ и обслуживающих проектов для разработки плана.

Например, репозиторий Ray GitHub описывает несколько платформ, которые зависят от времени отклика, назначения и уровня поддержки.

Корпорация Майкрософт несет ответственность за создание пакетов с открытым кодом, которые мы развертываем в AKS. Ответственность за это включает полное управление процессами сборки, сканирования, подписи, верификации и применения исправлений, а также контроль над двоичными файлами в образах контейнеров. Для получения дополнительной информации см. Управление уязвимостями для AKS и Поддержка AKS.

Прежде чем начать

Настройка переменных среды

Задайте следующие переменные среды для использования в этом руководстве:

export SUFFIX=$(cat /dev/urandom | LC_ALL=C tr -dc 'a-z0-9' | fold -w 8 | head -n 1)
export LOCAL_NAME="cnpg"
export TAGS="owner=user"
export RESOURCE_GROUP_NAME="rg-${LOCAL_NAME}-${SUFFIX}"
export PRIMARY_CLUSTER_REGION="eastus2"
export AKS_PRIMARY_CLUSTER_NAME="aks-primary-${LOCAL_NAME}-${SUFFIX}"
export AKS_PRIMARY_MANAGED_RG_NAME="rg-${LOCAL_NAME}-primary-aksmanaged-${SUFFIX}"
export AKS_PRIMARY_CLUSTER_FED_CREDENTIAL_NAME="pg-primary-fedcred1-${LOCAL_NAME}-${SUFFIX}"
export AKS_PRIMARY_CLUSTER_PG_DNSPREFIX=$(echo $(echo "a$(openssl rand -hex 5 | cut -c1-11)"))
export AKS_UAMI_CLUSTER_IDENTITY_NAME="mi-aks-${LOCAL_NAME}-${SUFFIX}"
export AKS_CLUSTER_VERSION="1.32"
export PG_NAMESPACE="cnpg-database"
export PG_SYSTEM_NAMESPACE="cnpg-system"
export PG_PRIMARY_CLUSTER_NAME="pg-primary-${LOCAL_NAME}-${SUFFIX}"
export PG_PRIMARY_STORAGE_ACCOUNT_NAME="hacnpgpsa${SUFFIX}"
export PG_STORAGE_BACKUP_CONTAINER_NAME="backups"
export ENABLE_AZURE_PVC_UPDATES="true"
export MY_PUBLIC_CLIENT_IP=$(dig +short myip.opendns.com @resolver3.opendns.com)

Установка необходимых расширений

aks-preview, k8s-extension и amg расширения предоставляют дополнительные функциональные возможности для управления кластерами Kubernetes и выполнения запросов к ресурсам Azure. Установите эти расширения с помощью следующих az extension add команд:

az extension add --upgrade --name aks-preview --yes --allow-preview true
az extension add --upgrade --name k8s-extension --yes --allow-preview false
az extension add --upgrade --name amg --yes --allow-preview false

Для использования kubectl нужно сначала установить Krew, а затем установить программный модуль CNPG. Эти установки позволяют управлять оператором PostgreSQL с помощью последующих команд.

(
  set -x; cd "$(mktemp -d)" &&
  OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
  ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
  KREW="krew-${OS}_${ARCH}" &&
  curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
  tar zxvf "${KREW}.tar.gz" &&
  ./"${KREW}" install krew
)

export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"

kubectl krew install cnpg

Создание группы ресурсов

Создайте группу ресурсов для хранения ресурсов, которые вы создаёте в этом руководстве, с помощью команды az group create.

az group create \
    --name $RESOURCE_GROUP_NAME \
    --location $PRIMARY_CLUSTER_REGION \
    --tags $TAGS \
    --query 'properties.provisioningState' \
    --output tsv

Создание управляемой идентичности, назначаемой пользователем

В этом разделе вы создаете управляемое удостоверение, назначаемое пользователем (UAMI), чтобы позволить CNPG PostgreSQL использовать удостоверение рабочей нагрузки AKS для доступа к Azure Blob Storage. Эта конфигурация позволяет кластеру PostgreSQL в AKS подключаться к Хранилище BLOB-объектов Azure без секрета.

  1. Создайте пользовательское управляемое удостоверение с помощью команды az identity create.

    AKS_UAMI_WI_IDENTITY=$(az identity create \
        --name $AKS_UAMI_CLUSTER_IDENTITY_NAME \
        --resource-group $RESOURCE_GROUP_NAME \
        --location $PRIMARY_CLUSTER_REGION \
        --output json)
    
  2. Включите идентификацию рабочей нагрузки AKS и создайте учетную запись службы для использования далее в этом руководстве при помощи следующих команд.

    export AKS_UAMI_WORKLOAD_OBJECTID=$( \
        echo "${AKS_UAMI_WI_IDENTITY}" | jq -r '.principalId')
    export AKS_UAMI_WORKLOAD_RESOURCEID=$( \
        echo "${AKS_UAMI_WI_IDENTITY}" | jq -r '.id')
    export AKS_UAMI_WORKLOAD_CLIENTID=$( \
        echo "${AKS_UAMI_WI_IDENTITY}" | jq -r '.clientId')
    
    echo "ObjectId: $AKS_UAMI_WORKLOAD_OBJECTID"
    echo "ResourceId: $AKS_UAMI_WORKLOAD_RESOURCEID"
    echo "ClientId: $AKS_UAMI_WORKLOAD_CLIENTID"
    

Идентификатор объекта — это уникальный идентификатор клиента (также известный как идентификатор приложения), который однозначно идентифицирует субъект безопасности типа Application в клиенте Идентификатора Microsoft Entra ID. Идентификатор ресурса — это уникальный идентификатор для управления и поиска ресурса в Azure. Эти значения необходимы для включения идентификации рабочей нагрузки AKS.

Оператор CNPG автоматически создает учетную запись сервиса с именем postgres, которую вы используете позже в руководстве для создания федеративных учетных данных, позволяющих OAuth получить доступ из PostgreSQL к сервису хранилища Azure.

Создание учетной записи хранения в основном регионе

  1. Создайте учетную запись хранения объектов для хранения резервных копий PostgreSQL в основном регионе az storage account create с помощью команды.

    az storage account create \
        --name $PG_PRIMARY_STORAGE_ACCOUNT_NAME \
        --resource-group $RESOURCE_GROUP_NAME \
        --location $PRIMARY_CLUSTER_REGION \
        --sku Standard_ZRS \
        --kind StorageV2 \
        --query 'provisioningState' \
        --output tsv
    
  2. Создайте контейнер для хранения журналов записи (WAL), а также регулярных и запланированных резервных копий PostgreSQL по запросу с помощью команды az storage container create.

    az storage container create \
        --name $PG_STORAGE_BACKUP_CONTAINER_NAME \
        --account-name $PG_PRIMARY_STORAGE_ACCOUNT_NAME \
        --auth-mode login
    

    Пример результата:

    {
        "created": true
    }
    

    Примечание.

    При возникновении сообщения об ошибке: The request may be blocked by network rules of storage account. Please check network rule set using 'az storage account show -n accountname --query networkRuleSet'. If you want to change the default action to apply when no rule matches, please use 'az storage account update' Обязательно проверьте разрешения пользователей для хранилища BLOB-объектов Azure и при необходимости повысьте свою роль, используя предоставленные команды, и затем повторно выполните команду az storage container create.

    export USER_ID=$(az ad signed-in-user show --query id --output tsv)
    
    export STORAGE_ACCOUNT_PRIMARY_RESOURCE_ID=$(az storage account show \
        --name $PG_PRIMARY_STORAGE_ACCOUNT_NAME \
        --resource-group $RESOURCE_GROUP_NAME \
        --query "id" \
        --output tsv)
    
    az role assignment list --scope $STORAGE_ACCOUNT_PRIMARY_RESOURCE_ID --output table
    
    az role assignment create \
        --assignee-object-id $USER_ID \
        --assignee-principal-type User \
        --scope $STORAGE_ACCOUNT_PRIMARY_RESOURCE_ID \
        --role "Storage Blob Data Owner" \
        --output tsv
    

Назначьте RBAC для учетных записей хранения

Чтобы включить резервное копирование, кластер PostgreSQL должен считывать и записывать данные в хранилище объектов. Кластер PostgreSQL, работающий в AKS, использует идентификацию рабочей нагрузки для доступа к хранилищу с помощью параметра inheritFromAzureAD конфигурации оператора CNPG.

  1. Получите идентификатор основного ресурса для учетной записи хранения с помощью команды az storage account show.

    export STORAGE_ACCOUNT_PRIMARY_RESOURCE_ID=$(az storage account show \
        --name $PG_PRIMARY_STORAGE_ACCOUNT_NAME \
        --resource-group $RESOURCE_GROUP_NAME \
        --query "id" \
        --output tsv)
    
    echo $STORAGE_ACCOUNT_PRIMARY_RESOURCE_ID
    
  2. Назначьте встроенную роль Azure "Участник данных BLOB-объектов хранилища" идентификатору объекта с областью идентификатора ресурса учетной записи хранения для UAMI, связанной с управляемым удостоверением для каждого кластера AKS с помощью az role assignment create команды.

    az role assignment create \
        --role "Storage Blob Data Contributor" \
        --assignee-object-id $AKS_UAMI_WORKLOAD_OBJECTID \
        --assignee-principal-type ServicePrincipal \
        --scope $STORAGE_ACCOUNT_PRIMARY_RESOURCE_ID \
        --query "id" \
        --output tsv
    

Настройка инфраструктуры мониторинга

В этом разделе развертываются экземпляр управляемой Grafana Azure, рабочая область Azure Monitor и рабочая область Azure Monitor Log Analytics, чтобы активировать мониторинг кластера PostgreSQL. Вы также сохраняете ссылки на созданную инфраструктуру мониторинга для использования в качестве входных данных во время процесса создания кластера AKS далее в руководстве. Для завершения этого раздела может потребоваться некоторое время.

Примечание.

Управляемые экземпляры Grafana Azure и кластеры AKS оплачиваются независимо. Для получения дополнительной информации о ценах см. цены на Azure Managed Grafana.

  1. Создайте экземпляр Azure Managed Grafana с помощью az grafana create команды.

    export GRAFANA_PRIMARY="grafana-${LOCAL_NAME}-${SUFFIX}"
    
    export GRAFANA_RESOURCE_ID=$(az grafana create \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $GRAFANA_PRIMARY \
        --location $PRIMARY_CLUSTER_REGION \
        --zone-redundancy Enabled \
        --tags $TAGS \
        --query "id" \
        --output tsv)
    
    echo $GRAFANA_RESOURCE_ID
    
  2. Создайте рабочую область Azure Monitor с помощью az monitor account create команды.

    export AMW_PRIMARY="amw-${LOCAL_NAME}-${SUFFIX}"
    
    export AMW_RESOURCE_ID=$(az monitor account create \
        --name $AMW_PRIMARY \
        --resource-group $RESOURCE_GROUP_NAME \
        --location $PRIMARY_CLUSTER_REGION \
        --tags $TAGS \
        --query "id" \
        --output tsv)
    
    echo $AMW_RESOURCE_ID
    
  3. Создайте рабочую область Azure Monitor Log Analytics с помощью az monitor log-analytics workspace create команды.

    export ALA_PRIMARY="ala-${LOCAL_NAME}-${SUFFIX}"
    
    export ALA_RESOURCE_ID=$(az monitor log-analytics workspace create \
        --resource-group $RESOURCE_GROUP_NAME \
        --workspace-name $ALA_PRIMARY \
        --location $PRIMARY_CLUSTER_REGION \
        --query "id" \
        --output tsv)
    
    echo $ALA_RESOURCE_ID
    

Создание кластера AKS для размещения кластера PostgreSQL

В этом разделе вы создадите многозонный кластер AKS с пулом системных узлов. Кластер AKS размещает основную реплику кластера PostgreSQL и две резервные реплики, каждая из которых соответствует другой зоне доступности, чтобы обеспечить зональную избыточность.

Вы также добавляете пул узлов пользователей в кластер AKS для размещения кластера PostgreSQL. Использование отдельного пула узлов позволяет управлять номерами SKU виртуальных машин Azure, используемыми для PostgreSQL, и позволяет системным пулу AKS оптимизировать производительность и затраты. Вы применяете метку к пользовательскому пулу узлов, чтобы впоследствии ссылаться на него при выборе узлов в процессе развертывания оператора CNPG в этом руководстве. Для завершения этого раздела может потребоваться некоторое время.

Внимание

Если вы решили использовать локальный NVMe в качестве хранилища PostgreSQL в последующих частях этого руководства, необходимо выбрать конфигурацию виртуальной машины (SKU), поддерживающую локальные диски NVMe, например оптимизированные для хранения SKU виртуальных машин или SKU виртуальных машин с ускорением GPU. Обновите $USER_NODE_POOL_VMSKU соответствующим образом.

  1. Создайте кластер AKS с помощью az aks create команды.

    export SYSTEM_NODE_POOL_VMSKU="standard_d2s_v3"
    export USER_NODE_POOL_NAME="postgres"
    export USER_NODE_POOL_VMSKU="standard_d4s_v3"
    
    az aks create \
        --name $AKS_PRIMARY_CLUSTER_NAME \
        --tags $TAGS \
        --resource-group $RESOURCE_GROUP_NAME \
        --location $PRIMARY_CLUSTER_REGION \
        --generate-ssh-keys \
        --node-resource-group $AKS_PRIMARY_MANAGED_RG_NAME \
        --enable-managed-identity \
        --assign-identity $AKS_UAMI_WORKLOAD_RESOURCEID \
        --network-plugin azure \
        --network-plugin-mode overlay \
        --network-dataplane cilium \
        --nodepool-name systempool \
        --enable-oidc-issuer \
        --enable-workload-identity \
        --enable-cluster-autoscaler \
        --min-count 2 \
        --max-count 3 \
        --node-vm-size $SYSTEM_NODE_POOL_VMSKU \
        --enable-azure-monitor-metrics \
        --azure-monitor-workspace-resource-id $AMW_RESOURCE_ID \
        --grafana-resource-id $GRAFANA_RESOURCE_ID \
        --api-server-authorized-ip-ranges $MY_PUBLIC_CLIENT_IP \
        --tier standard \
        --kubernetes-version $AKS_CLUSTER_VERSION \
        --zones 1 2 3 \
        --output table
    
  2. Добавьте пул узлов пользователя в кластер AKS с помощью az aks nodepool add команды.

    az aks nodepool add \
        --resource-group $RESOURCE_GROUP_NAME \
        --cluster-name $AKS_PRIMARY_CLUSTER_NAME \
        --name $USER_NODE_POOL_NAME \
        --enable-cluster-autoscaler \
        --min-count 3 \
        --max-count 6 \
        --node-vm-size $USER_NODE_POOL_VMSKU \
        --zones 1 2 3 \
        --labels workload=postgres \
        --output table
    

Примечание.

Если при добавлении пула узлов AKS появится сообщение "(OperationNotAllowed) Operation is not allowed: Another operation (Updating) is in progress, please wait for it to finish before starting a new operation." об ошибке, подождите несколько минут, пока операции кластера AKS будут завершены, а затем выполните az aks nodepool add команду.

Подключение к кластеру AKS и создание пространств имен

В этом разделе вы получите учетные данные кластера AKS, которые служат ключами, которые позволяют выполнять проверку подлинности и взаимодействовать с кластером. После подключения создайте два пространства имен: один для служб диспетчера контроллеров CNPG и один для кластера PostgreSQL и связанных служб.

  1. Получите учетные данные кластера AKS с помощью az aks get-credentials команды.

    az aks get-credentials \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $AKS_PRIMARY_CLUSTER_NAME \
        --output none
    
  2. Создайте пространство имен для служб диспетчера контроллеров CNPG, кластера PostgreSQL и связанных служб с помощью kubectl create namespace команды.

    kubectl create namespace $PG_NAMESPACE --context $AKS_PRIMARY_CLUSTER_NAME
    kubectl create namespace $PG_SYSTEM_NAMESPACE --context $AKS_PRIMARY_CLUSTER_NAME
    

Теперь можно определить другую переменную среды на основе требуемого параметра хранилища, на которую вы ссылаетесь далее в руководстве при развертывании PostgreSQL.

Вы можете ссылаться на класс хранилища драйвера CSI для Premium SSD дисков Azure, установленный по умолчанию.

export POSTGRES_STORAGE_CLASS="managed-csi-premium"

Обновление инфраструктуры мониторинга

Рабочая область Azure Monitor для Managed Prometheus и Azure Managed Grafana автоматически связаны с кластером AKS для метрик и визуализации во время процесса создания кластера. В этом разделе вы включаете сбор журналов с помощью аналитики контейнеров AKS и проверяете, собирает ли Управляемый Prometheus метрики, а аналитика контейнеров поглощает журналы.

  1. Включите мониторинг аналитики контейнеров в кластере az aks enable-addons AKS с помощью команды.

    az aks enable-addons \
        --addon monitoring \
        --name $AKS_PRIMARY_CLUSTER_NAME \
        --resource-group $RESOURCE_GROUP_NAME \
        --workspace-resource-id $ALA_RESOURCE_ID \
        --output table
    
  2. Убедитесь, что Управляемый Prometheus собирает метрики, а аналитика контейнеров обрабатывает журналы из кластера AKS, проверяя DaemonSet с помощью команды kubectl get и команды az aks show.

    kubectl get ds ama-metrics-node \
        --context $AKS_PRIMARY_CLUSTER_NAME \
        --namespace=kube-system
    
    kubectl get ds ama-logs \
        --context $AKS_PRIMARY_CLUSTER_NAME \
        --namespace=kube-system
    
    az aks show \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $AKS_PRIMARY_CLUSTER_NAME \
        --query addonProfiles
    

    Выходные данные должны выглядеть аналогично следующему примеру: всего шесть узлов (три для пула узлов системы и три для пула узлов PostgreSQL), а аналитические сведения о контейнерах должны показывать "enabled": true.

    NAME               DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR
    ama-metrics-node   6         6         6       6            6           <none>       
    
    NAME               DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR
    ama-logs           6         6         6       6            6           <none>       
    
    {
      "omsagent": {
        "config": {
          "logAnalyticsWorkspaceResourceID": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/rg-cnpg-9vbin3p8/providers/Microsoft.OperationalInsights/workspaces/ala-cnpg-9vbin3p8",
          "useAADAuth": "true"
        },
        "enabled": true,
        "identity": null
      }
    }
    

Создание общедоступного статического IP-адреса для входящего трафика кластера PostgreSQL

Чтобы проверить развертывание кластера PostgreSQL и использовать клиентские средства PostgreSQL, такие как psql и PgAdmin, необходимо предоставить доступ к первичной и только для чтения репликам через ingress. В этом разделе описано, как создать ресурс общедоступного IP-адреса Azure, который позже будет предоставлен подсистеме балансировки нагрузки Azure для предоставления конечных точек PostgreSQL для запроса.

  1. Получите имя группы ресурсов узла кластера AKS с помощью az aks show команды.

    export AKS_PRIMARY_CLUSTER_NODERG_NAME=$(az aks show \
        --name $AKS_PRIMARY_CLUSTER_NAME \
        --resource-group $RESOURCE_GROUP_NAME \
        --query nodeResourceGroup \
        --output tsv)
    
    echo $AKS_PRIMARY_CLUSTER_NODERG_NAME
    
  2. Создайте общедоступный IP-адрес с помощью az network public-ip create команды.

    export AKS_PRIMARY_CLUSTER_PUBLICIP_NAME="$AKS_PRIMARY_CLUSTER_NAME-pip"
    
    az network public-ip create \
        --resource-group $AKS_PRIMARY_CLUSTER_NODERG_NAME \
        --name $AKS_PRIMARY_CLUSTER_PUBLICIP_NAME \
        --location $PRIMARY_CLUSTER_REGION \
        --sku Standard \
        --zone 1 2 3 \
        --allocation-method static \
        --output table
    
  3. Получите только что созданный общедоступный IP-адрес с помощью az network public-ip show команды.

    export AKS_PRIMARY_CLUSTER_PUBLICIP_ADDRESS=$(az network public-ip show \
        --resource-group $AKS_PRIMARY_CLUSTER_NODERG_NAME \
        --name $AKS_PRIMARY_CLUSTER_PUBLICIP_NAME \
        --query ipAddress \
        --output tsv)
    
    echo $AKS_PRIMARY_CLUSTER_PUBLICIP_ADDRESS
    
  4. Получите идентификатор ресурса группы ресурсов узла с помощью az group show команды.

    export AKS_PRIMARY_CLUSTER_NODERG_NAME_SCOPE=$(az group show --name \
        $AKS_PRIMARY_CLUSTER_NODERG_NAME \
        --query id \
        --output tsv)
    
    echo $AKS_PRIMARY_CLUSTER_NODERG_NAME_SCOPE
    
  5. Назначьте роль "Участник сети" идентификатору объекта UAMI на уровне области группы ресурсов узла с использованием команды az role assignment create.

    az role assignment create \
        --assignee-object-id ${AKS_UAMI_WORKLOAD_OBJECTID} \
        --assignee-principal-type ServicePrincipal \
        --role "Network Contributor" \
        --scope ${AKS_PRIMARY_CLUSTER_NODERG_NAME_SCOPE}
    

Установка оператора CNPG в кластере AKS

В этом разделе описано, как установить оператор CNPG в кластере AKS с помощью Helm или манифеста YAML.

  1. Добавьте репозиторий CNPG Helm с помощью helm repo add команды.

    helm repo add cnpg https://cloudnative-pg.github.io/charts
    
  2. Обновите репозиторий CNPG Helm и установите его в кластере AKS, используя команду helm upgrade вместе с флагом --install.

    helm upgrade --install cnpg \
        --namespace $PG_SYSTEM_NAMESPACE \
        --create-namespace \
        --kube-context=$AKS_PRIMARY_CLUSTER_NAME \
        cnpg/cloudnative-pg
    
  3. Проверьте установку оператора в кластере AKS с помощью kubectl get команды.

    kubectl get deployment \
        --context $AKS_PRIMARY_CLUSTER_NAME \
        --namespace $PG_SYSTEM_NAMESPACE cnpg-cloudnative-pg
    

Следующие шаги

Соавторы

Корпорация Майкрософт поддерживает эту статью. Первоначально это написали следующие участники:

  • Кен Килти | Ведущий TPM
  • Рассел де Пина | Главный технический менеджер программ
  • Адриан Джоан | Старший инженер клиента
  • Дженни Хейс | Старший разработчик содержимого
  • Кэрол Смит | Старший разработчик содержимого
  • Эрин Шаффер | Разработчик содержимого 2