Membuat infrastruktur untuk menyebarkan database PostgreSQL yang sangat tersedia di AKS
Dalam artikel ini, Anda membuat infrastruktur yang diperlukan untuk menyebarkan database PostgreSQL yang sangat tersedia di AKS menggunakan operator CloudNativePG (CNPG).
Penting
Perangkat lunak sumber terbuka disebutkan di seluruh dokumentasi dan sampel AKS. Perangkat lunak yang Anda sebarkan dikecualikan dari perjanjian tingkat layanan AKS, garansi terbatas, dan dukungan Azure. Saat Anda menggunakan teknologi sumber terbuka bersama AKS, konsultasikan opsi dukungan yang tersedia dari masing-masing komunitas dan pengelola proyek untuk mengembangkan rencana.
Misalnya, repositori Ray GitHub menjelaskan beberapa platform yang bervariasi dalam tingkat waktu respons, tujuan, dan dukungan.
Microsoft bertanggung jawab untuk membangun paket sumber terbuka yang kami sebarkan di AKS. Tanggung jawab itu termasuk memiliki kepemilikan lengkap atas proses build, pemindaian, tanda tangan, validasi, dan perbaikan, bersama dengan kontrol atas biner dalam gambar kontainer. Untuk informasi selengkapnya, lihat Manajemen kerentanan untuk cakupan dukungan AKS dan AKS.
- Tinjau gambaran umum penyebaran dan pastikan Anda memenuhi semua prasyarat dalam Cara menyebarkan database PostgreSQL yang sangat tersedia di AKS dengan Azure CLI.
- Atur variabel lingkungan untuk digunakan di seluruh panduan ini.
- Instal ekstensi yang diperlukan.
Atur variabel lingkungan berikut untuk digunakan di seluruh panduan ini:
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="westus3"
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.29"
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)
Ekstensi aks-preview
, k8s-extension
dan amg
menyediakan lebih banyak fungsionalitas untuk mengelola kluster Kubernetes dan mengkueri sumber daya Azure. Instal ekstensi ini menggunakan perintah berikut 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
Sebagai prasyarat untuk menggunakan kubectl, penting untuk terlebih dahulu menginstal Krew, diikuti dengan penginstalan plugin CNPG. Ini akan memungkinkan manajemen operator PostgreSQL menggunakan perintah berikutnya.
(
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
Buat grup sumber daya untuk menyimpan sumber daya yang Anda buat dalam panduan ini menggunakan az group create
perintah .
az group create \
--name $RESOURCE_GROUP_NAME \
--location $PRIMARY_CLUSTER_REGION \
--tags $TAGS \
--query 'properties.provisioningState' \
--output tsv
Di bagian ini, Anda membuat identitas terkelola yang ditetapkan pengguna (UAMI) untuk memungkinkan CNPG PostgreSQL menggunakan identitas beban kerja AKS untuk mengakses Azure Blob Storage. Konfigurasi ini memungkinkan kluster PostgreSQL di AKS untuk terhubung ke Azure Blob Storage tanpa rahasia.
Buat identitas terkelola yang ditetapkan pengguna menggunakan
az identity create
perintah .AKS_UAMI_WI_IDENTITY=$(az identity create \ --name $AKS_UAMI_CLUSTER_IDENTITY_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --location $PRIMARY_CLUSTER_REGION \ --output json)
Aktifkan identitas beban kerja AKS dan buat akun layanan untuk digunakan nanti dalam panduan ini menggunakan perintah berikut:
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"
ID objek adalah pengidentifikasi unik untuk ID klien (juga dikenal sebagai ID aplikasi) yang secara unik mengidentifikasi prinsip keamanan jenis Aplikasi dalam penyewa ID Microsoft Entra. ID sumber daya adalah pengidentifikasi unik untuk mengelola dan menemukan sumber daya di Azure. Nilai-nilai ini diperlukan untuk mengaktifkan identitas beban kerja AKS.
Operator CNPG secara otomatis menghasilkan akun layanan yang disebut postgres yang Anda gunakan nanti dalam panduan untuk membuat kredensial federasi yang memungkinkan akses OAuth dari PostgreSQL ke Azure Storage.
Buat akun penyimpanan objek untuk menyimpan cadangan PostgreSQL di wilayah utama menggunakan
az storage account create
perintah .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
Buat kontainer penyimpanan untuk menyimpan Write Ahead Logs (WAL) dan PostgreSQL reguler sesuai permintaan dan pencadangan terjadwal menggunakan
az storage container create
perintah .az storage container create \ --name $PG_STORAGE_BACKUP_CONTAINER_NAME \ --account-name $PG_PRIMARY_STORAGE_ACCOUNT_NAME \ --auth-mode login
Contoh output:
{ "created": true }
Catatan
Jika Anda menemukan pesan kesalahan:
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'
. Harap verifikasi izin pengguna untuk Azure Blob Storage dan, jika perlu, tingkatkan peran Anda untukStorage Blob Data Owner
menggunakan perintah yang disediakan di bawah ini dan setelah mencobaaz storage container create
kembali perintah.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
Untuk mengaktifkan cadangan, kluster PostgreSQL perlu membaca dan menulis ke penyimpanan objek. Kluster PostgreSQL yang berjalan di AKS menggunakan identitas beban kerja untuk mengakses akun penyimpanan melalui parameter inheritFromAzureAD
konfigurasi operator CNPG .
Dapatkan ID sumber daya utama untuk akun penyimpanan menggunakan
az storage account show
perintah .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
Tetapkan peran bawaan Azure "Storage Blob Data Contributor" ke ID objek dengan cakupan ID sumber daya akun penyimpanan untuk UAMI yang terkait dengan identitas terkelola untuk setiap kluster AKS menggunakan
az role assignment create
perintah .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
Di bagian ini, Anda menyebarkan instans Azure Managed Grafana, ruang kerja Azure Monitor, dan ruang kerja Azure Monitor Log Analytics untuk mengaktifkan pemantauan kluster PostgreSQL. Anda juga menyimpan referensi ke infrastruktur pemantauan yang dibuat untuk digunakan sebagai input selama proses pembuatan kluster AKS nanti dalam panduan. Bagian ini mungkin perlu waktu untuk menyelesaikannya.
Catatan
Instans Azure Managed Grafana dan kluster AKS ditagih secara independen. Untuk informasi harga selengkapnya, lihat Harga Azure Managed Grafana.
Buat instans Azure Managed Grafana menggunakan
az grafana create
perintah .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
Buat ruang kerja Azure Monitor menggunakan
az monitor account create
perintah .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
Buat ruang kerja Analitik Log Azure Monitor menggunakan
az monitor log-analytics workspace create
perintah .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
Di bagian ini, Anda membuat kluster AKS multizone dengan kumpulan simpul sistem. Kluster AKS menghosting replika utama kluster PostgreSQL dan dua replika siaga, masing-masing selaras dengan zona ketersediaan yang berbeda untuk mengaktifkan redundansi zona.
Anda juga menambahkan kumpulan simpul pengguna ke kluster AKS untuk menghosting kluster PostgreSQL. Menggunakan kumpulan simpul terpisah memungkinkan kontrol atas SKU Azure VM yang digunakan untuk PostgreSQL dan memungkinkan kumpulan sistem AKS untuk mengoptimalkan performa dan biaya. Anda menerapkan label ke kumpulan simpul pengguna yang dapat Anda referensikan untuk pilihan simpul saat menyebarkan operator CNPG nanti dalam panduan ini. Bagian ini mungkin perlu waktu untuk menyelesaikannya.
Buat kluster AKS menggunakan
az aks create
perintah .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
Tambahkan kumpulan simpul pengguna ke kluster AKS menggunakan
az aks nodepool add
perintah .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
Catatan
Jika Anda menerima pesan "(OperationNotAllowed) Operation is not allowed: Another operation (Updating) is in progress, please wait for it to finish before starting a new operation."
kesalahan saat menambahkan kumpulan simpul AKS, harap tunggu beberapa menit hingga operasi kluster AKS selesai lalu jalankan az aks nodepool add
perintah.
Di bagian ini, Anda mendapatkan kredensial kluster AKS, yang berfungsi sebagai kunci yang memungkinkan Anda mengautentikasi dan berinteraksi dengan kluster. Setelah tersambung, Anda membuat dua namespace: satu untuk layanan manajer pengontrol CNPG dan satu untuk kluster PostgreSQL dan layanan terkait.
Dapatkan kredensial kluster AKS menggunakan
az aks get-credentials
perintah .az aks get-credentials \ --resource-group $RESOURCE_GROUP_NAME \ --name $AKS_PRIMARY_CLUSTER_NAME \ --output none
Buat namespace layanan untuk layanan manajer pengontrol CNPG, kluster PostgreSQL, dan layanan terkait dengan menggunakan
kubectl create namespace
perintah .kubectl create namespace $PG_NAMESPACE --context $AKS_PRIMARY_CLUSTER_NAME kubectl create namespace $PG_SYSTEM_NAMESPACE --context $AKS_PRIMARY_CLUSTER_NAME
Ruang kerja Azure Monitor untuk Prometheus Terkelola dan Azure Managed Grafana secara otomatis ditautkan ke kluster AKS untuk metrik dan visualisasi selama proses pembuatan kluster. Di bagian ini, Anda mengaktifkan pengumpulan log dengan wawasan Kontainer AKS dan memvalidasi bahwa Prometheus Terkelola mengekstrak metrik dan wawasan Kontainer menyerap log.
Aktifkan pemantauan wawasan Kontainer pada kluster AKS menggunakan
az aks enable-addons
perintah .az aks enable-addons \ --addon monitoring \ --name $AKS_PRIMARY_CLUSTER_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --workspace-resource-id $ALA_RESOURCE_ID \ --output table
Validasi bahwa Prometheus Terkelola mengekstrak metrik dan wawasan Kontainer menyerap log dari kluster AKS dengan memeriksa DaemonSet menggunakan
kubectl get
perintah danaz aks show
perintah .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
Output Anda harus menyerupai contoh output berikut, dengan total enam simpul (tiga untuk kumpulan simpul sistem dan tiga untuk kumpulan simpul PostgreSQL) dan wawasan Kontainer yang
"enabled": true
menunjukkan :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 } }
Untuk memvalidasi penyebaran kluster PostgreSQL dan menggunakan alat PostgreSQL klien, seperti psql dan PgAdmin, Anda perlu mengekspos replika utama dan baca-saja untuk masuk. Di bagian ini, Anda membuat sumber daya IP publik Azure yang nantinya Anda berikan ke load balancer Azure untuk mengekspos titik akhir PostgreSQL untuk kueri.
Dapatkan nama grup sumber daya simpul kluster AKS menggunakan
az aks show
perintah .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
Buat alamat IP publik menggunakan
az network public-ip create
perintah .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
Dapatkan alamat IP publik yang baru dibuat menggunakan
az network public-ip show
perintah .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
Dapatkan ID sumber daya grup sumber daya simpul menggunakan
az group show
perintah .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
Tetapkan peran "Kontributor Jaringan" ke ID objek UAMI menggunakan cakupan grup sumber daya simpul menggunakan
az role assignment create
perintah .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}
Di bagian ini, Anda menginstal operator CNPG di kluster AKS menggunakan Helm atau manifes YAML.
Tambahkan repositori CNPG Helm menggunakan
helm repo add
perintah .helm repo add cnpg https://cloudnative-pg.github.io/charts
Tingkatkan repositori CNPG Helm dan instal pada kluster AKS menggunakan
helm upgrade
perintah dengan--install
bendera .helm upgrade --install cnpg \ --namespace $PG_SYSTEM_NAMESPACE \ --create-namespace \ --kube-context=$AKS_PRIMARY_CLUSTER_NAME \ cnpg/cloudnative-pg
Verifikasi penginstalan operator pada kluster AKS menggunakan
kubectl get
perintah .kubectl get deployment \ --context $AKS_PRIMARY_CLUSTER_NAME \ --namespace $PG_SYSTEM_NAMESPACE cnpg-cloudnative-pg
Microsoft mempertahankan artikel ini. Kontributor berikut awalnya menulisnya:
- Ken Kilty | TPM Utama
- Russell de Pina | TPM Utama
- Adrian Joian | Insinyur Pelanggan Senior
- Jenny Hayes | Pengembang Konten Senior
- Carol Smith | Pengembang Konten Senior
- Erin Schaffer | Pengembang Konten 2
Umpan balik Azure Kubernetes Service
Azure Kubernetes Service adalah proyek sumber terbuka. Pilih tautan untuk memberikan umpan balik: