Udostępnij przez


Tworzenie infrastruktury do uruchamiania klastra Valkey w usłudze Azure Kubernetes Service (AKS)

W tym przewodniku krok po kroku opisano kompletny proces konfiguracji klastra Valkey w usłudze AKS. Ten proces obejmuje konfigurowanie zmiennych środowiskowych, aprowizowanie podstawowych zasobów platformy Azure (takich jak grupa zasobów, usługa Azure Key Vault i usługa Azure Container Registry (ACR)), tworzenie klastra usługi AKS z zintegrowaną tożsamością obciążenia i zarządzanie wpisami tajnymi. Obejmuje również tworzenie specjalnej puli węzłów dla zadań Valkey oraz sposób importowania obrazów Valkey do prywatnego rejestru. Jeśli wolisz korzystać z infrastruktury jako kodu, przewodnik zawiera alternatywną ścieżkę wdrażania przy użyciu narzędzia Terraform z modułami zweryfikowanymi platformy Azure, zapewniając najlepsze rozwiązania i gotowość produkcyjną.

Aby wdrożyć infrastrukturę przy użyciu narzędzia Terraform, użyjemy modułu zweryfikowanego platformy Azuredla usługi AKS.

Uwaga / Notatka

Jeśli planujesz uruchomić to wdrożenie w środowisku produkcyjnym, zalecamy zapoznanie się z modułem wzorca produkcyjnego usługi AKS dla modułów zweryfikowanych na platformie Azure. Ten moduł jest powiązany z zaleceniami dotyczącymi najlepszych rozwiązań.

Wymagania wstępne

Ustawianie zmiennych środowiskowych

  • Ustaw wymagane zmienne środowiskowe do użycia w tym przewodniku:

    random=$(echo $RANDOM | tr '[0-9]' '[a-z]')
    export MY_RESOURCE_GROUP_NAME=myResourceGroup-rg-$(echo $random)
    export MY_LOCATION=centralus
    export MY_ACR_REGISTRY=mydns$(echo $random)
    export MY_KEYVAULT_NAME=vault-$(echo $random)-kv
    export MY_CLUSTER_NAME=cluster-aks
    

Tworzenie grupy zasobów

  • Utwórz grupę zasobów przy użyciu az group create polecenia .

    az group create --name $MY_RESOURCE_GROUP_NAME --location $MY_LOCATION --output table
    

    Przykładowe wyjście:

    Location    Name
    ----------  ------------------
    eastus      myResourceGroup-rg
    

Tworzenie wystąpienia usługi Azure Key Vault

  • Utwórz wystąpienie usługi Azure Key Vault przy użyciu az keyvault createpolecenia . Usługa Azure Key Vault bezpiecznie przechowuje i umożliwia dostęp do wpisów tajnych, takich jak klucze interfejsu API, hasła, certyfikaty lub klucze kryptograficzne.

    az keyvault create --name $MY_KEYVAULT_NAME --resource-group $MY_RESOURCE_GROUP_NAME --location $MY_LOCATION --enable-rbac-authorization false --output table
    

    Przykładowe wyjście:

    Location    Name            ResourceGroup
    ----------  --------------  ------------------
    eastus      vault-bbbhe-kv  myResourceGroup-rg
    

Tworzenie rejestru Azure Container Registry

  • Utwórz usługę Azure Container Registry do przechowywania obrazów kontenerów i zarządzania nimi przy użyciu az acr create polecenia .

    az acr create \
      --name ${MY_ACR_REGISTRY} \
      --resource-group $MY_RESOURCE_GROUP_NAME \
      --sku Premium \
      --location $MY_LOCATION \
      --admin-enabled true \
      --output table
    export MY_ACR_REGISTRY_ID=$(az acr show --name $MY_ACR_REGISTRY --resource-group $MY_RESOURCE_GROUP_NAME --query id --output tsv)
    

    Przykładowe wyjście:

    NAME                  RESOURCE GROUP      LOCATION    SKU      LOGIN SERVER                     CREATION DATE         ADMIN ENABLED
    --------------------  ------------------  ----------  -------  -------------------------------  --------------------  ---------------
    mydnsrandomnamebbbhe  myResourceGroup-rg  eastus      Premium  mydnsrandomnamebbbhe.azurecr.io  2024-06-11T09:36:43Z  True
    

Tworzenie klastra AKS

W tym kroku utworzymy klaster usługi AKS. Włączamy dodatek dostawcy wpisów tajnych usługi Azure Key Vault (azure-keyvault-secrets-provider), który umożliwia klastrowi usługi AKS dostęp do wpisów tajnych przechowywanych w usłudze Azure Key Vault. Włączamy również tożsamość obciążeń roboczych, która umożliwia klastrowi AKS bezpieczny dostęp do innych zasobów Azure.

  • Utwórz klaster usługi AKS przy użyciu az aks create polecenia .

    az aks create \
     --location $MY_LOCATION \
     --name $MY_CLUSTER_NAME \
     --tier standard \
     --resource-group $MY_RESOURCE_GROUP_NAME \
     --network-plugin azure  \
     --node-vm-size Standard_D4_v3 \
     --node-count 3 \
     --auto-upgrade-channel stable \
     --node-os-upgrade-channel  NodeImage \
     --attach-acr ${MY_ACR_REGISTRY} \
     --enable-oidc-issuer \
     --enable-workload-identity \
     --enable-addons azure-keyvault-secrets-provider \
     --zones 1 2 3 \
     --generate-ssh-keys \
     --output table
    

    Przykładowe wyjście:

    Kind    KubernetesVersion    Location    MaxAgentPools    Name         NodeResourceGroup                         ProvisioningState    ResourceGroup       ResourceUid               SupportPlan
    -----------------------------------------------------------------------  --------------------------  ----------------------  ----------------------------------  ------------------------------------  -------------------------  ------------  ----------------------------------------------------------------  ------  -------------------  ----------  ---------------  -----------  ----------------------------------------  -------------------  ------------------  ------------------------  ------------------
    cluster-ak-myresourcegroup--9b70ac-hhrizake.portal.hcp.eastus.azmk8s.io  1.28.9                      False                   cluster-ak-myResourceGroup--9b70ac  a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1  False                      True          cluster-ak-myresourcegroup--9b70ac-hhrizake.hcp.eastus.azmk8s.io Base     1.28                 eastus      100              cluster-aks  MC_myResourceGroup-rg_cluster-aks_eastus  Succeeded            myResourceGroup-rg  b1b1b1b1-cccc-dddd-eeee-f2f2f2f2f2f2  KubernetesOfficial
    

Pobieranie identyfikatora tożsamości i identyfikatora obiektu dostawcy tajemnic Azure Key Vault

  • Pobierz identyfikator tożsamości oraz identyfikator obiektu utworzony przez dodatek dostawcy sekretów usługi Azure Key Vault przy użyciu polecenia az aks show.

    export userAssignedIdentityID=$(az aks show --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_CLUSTER_NAME --query addonProfiles.azureKeyvaultSecretsProvider.identity.clientId --output tsv)
    export userAssignedObjectID=$(az aks show --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_CLUSTER_NAME --query addonProfiles.azureKeyvaultSecretsProvider.identity.objectId --output tsv)
    

Przypisz rolę tożsamości kubeleta

  • AcrPull Przypisz rolę do tożsamości kubelet przy az role assignment create użyciu polecenia .

    export KUBELET_IDENTITY=$(az aks show --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_CLUSTER_NAME --output tsv --query identityProfile.kubeletidentity.objectId)
    az role assignment create \
      --assignee ${KUBELET_IDENTITY} \
      --role "AcrPull" \
      --scope ${MY_ACR_REGISTRY_ID} \
      --output table
    

    Przykładowe wyjście:

    CreatedBy                             CreatedOn                         Name                                  PrincipalId                           PrincipalName                         PrincipalType     ResourceGroup       RoleDefinitionId                                                                                                                            RoleDefinitionName    Scope                                                                                                                                                        UpdatedBy                             UpdatedOn
    ------------------------------------  --------------------------------  ------------------------------------  ------------------------------------  ------------------------------------  ----------------  ------------------  ------------------------------------------------------------------------------------------------------------------------------------------  --------------------  -----------------------------------------------------------------------------------------------------------------------------------------------------------  ------------------------------------  --------------------------------
    bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f  2024-06-11T09:41:36.631310+00:00  00aa00aa-bb11-cc22-dd33-44ee44ee44ee  aaaaaaaa-bbbb-cccc-1111-222222222222  bbbbbbbb-cccc-dddd-2222-333333333333  ServicePrincipal  myResourceGroup-rg  /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/providers/Microsoft.Authorization/roleDefinitions/aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb  AcrPull               /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myResourceGroup-rg/providers/Microsoft.ContainerRegistry/registries/mydnsrandomnamebbbhe  bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f  2024-06-11T09:41:36.631310+00:00
    

Tworzenie puli węzłów dla obciążenia Valkey

W tej sekcji utworzymy pulę węzłów dedykowaną do uruchamiania obciążenia Valkey. Ta pula węzłów ma wyłączone skalowanie automatyczne i jest tworzona z sześcioma węzłami w dwóch strefach dostępności, ponieważ chcemy mieć jedną pomocniczą na jedną podstawową w innej strefie. Repliki są zaplanowane w trzeciej strefie.

  • Utwórz nową pulę węzłów przy użyciu az aks nodepool add polecenia .

    while [ "$(az aks show --resource-group $MY_RESOURCE_GROUP_NAME --name $MY_CLUSTER_NAME --output tsv --query provisioningState)" != "Succeeded" ]; do echo "waiting for cluster to be ready"; sleep 10; done
    
    az aks nodepool add \
        --resource-group $MY_RESOURCE_GROUP_NAME \
        --cluster-name  $MY_CLUSTER_NAME \
        --name valkey \
        --node-vm-size Standard_D4_v3 \
        --node-count 6 \
        --zones 1 2 3 \
        --output table
    

    Przykładowe wyjście:

    Count    CurrentOrchestratorVersion    ETag                                  EnableAutoScaling    EnableCustomCaTrust    EnableEncryptionAtHost    EnableFips    EnableNodePublicIp    EnableUltraSsd    KubeletDiskType    MaxPods    Mode    Name    NodeImageVersion                          OrchestratorVersion    OsDiskSizeGb    OsDiskType    OsSku    OsType    ProvisioningState    ResourceGroup       ScaleDownMode    TypePropertiesType       VmSize           WorkloadRuntime
    -------  ----------------------------  ------------------------------------  -------------------  ---------------------  ------------------------  ------------  --------------------  ----------------  -----------------  ---------  ------  ------  ----------------------------------------  ---------------------  --------------  ------------  -------  --------  -------------------  ------------------  ---------------  -----------------------  ---------------  -----------------
    6        1.28.9                        aaaa0000-bb11-2222-33cc-444444dddddd  False                False                  False                     False         False                 False             OS                 30         User    valkey  AKSUbuntu-2204gen2containerd-202405.27.0  1.28                   128             Managed       Ubuntu   Linux     Succeeded            myResourceGroup-rg  Delete           VirtualMachineScaleSets  Standard_D4s_v3  OCIContainer
    

Przekazywanie obrazów valkey do usługi Azure Container Registry

W tej sekcji pobierzemy obraz Valkey z usługi Docker Hub i przekażemy go do usługi Azure Container Registry. Ten krok gwarantuje, że obraz jest dostępny w rejestrze prywatnym i może być używany w klastrze usługi AKS. Nie zalecamy korzystania z obrazu publicznego w środowisku produkcyjnym.

  • Zaimportuj obraz Valkey z usługi Dockerhub i przekaż go do usługi Azure Container Registry przy użyciu az acr import polecenia .

    az acr import \
        --name $MY_ACR_REGISTRY \
        --source docker.io/valkey/valkey:latest  \
        --image valkey:latest \
        --output table
    

Klonowanie modułu Terraform

  • Sklonuj repozytorium git za pomocą modułu Terraform.

    git clone https://github.com/Azure/terraform-azurerm-avm-res-containerservice-managedcluster.git
    cd terraform-azurerm-avm-res-containerservice-managedcluster/tree/stateful-workloads/examples/stateful-workloads-valkey
    

Tworzenie pliku zmiennych terraform

  • Ustaw zmienne Valkey, tworząc valkey.tfvars plik z następującą zawartością. Możesz również podać określone zmienne w tym kroku:

        acr_task_content = <<-EOF
        version: v1.1.0
        steps:
          - cmd: bash echo Waiting 10 seconds the propagation of the Container Registry Data Importer and Data Reader role
          - cmd: bash sleep 10
          - cmd: az login --identity
          - cmd: az acr import --name $RegistryName --source docker.io/valkey/valkey:latest --image valkey:latest
        EOF
    
        valkey_enabled = true
        node_pools = {
          valkey = {
            name       = "valkey"
            vm_size    = "Standard_DS4_v2"
            node_count = 3
            zones      = [1, 2, 3]
            os_type    = "Linux"
          }
        }
    

Wdrażanie infrastruktury

  1. Aby wdrożyć infrastrukturę, uruchom polecenia Terraform. W tym kroku ustawiamy wymagane zmienne na potrzeby wdrażania Valkey.

    terraform init
    export MY_RESOURCE_GROUP_NAME=myResourceGroup-rg
    export MY_LOCATION=centralus
    SECRET=$(openssl rand -base64 32)
    export TF_VAR_valkey_password=${SECRET}
    export TF_VAR_location=${MY_LOCATION}
    export TF_VAR_resource_group_name=${MY_RESOURCE_GROUP_NAME}
    terraform apply -var-file="valkey.tfvars"
    

    Uwaga / Notatka

    W niektórych przypadkach zadania rejestru kontenerów importujące obrazy Valkey do rejestru kontenerów mogą zakończyć się niepowodzeniem. Aby uzyskać więcej informacji, odwiedź container-registry-task. W większości przypadków ponawianie próby rozwiąże problem.

  2. Uruchom następujące polecenie, aby wyeksportować wartości wyjściowe programu Terraform jako zmienne środowiskowe w terminalu, aby użyć ich w następnych krokach:

    export MY_ACR_REGISTRY=$(terraform output -raw acr_registry_name)
    export MY_CLUSTER_NAME=$(terraform output -raw aks_cluster_name)
    

Następny krok

Współautorzy

Firma Microsoft utrzymuje ten artykuł. Następujący współautorzy pierwotnie to napisali:

  • Nelly Kiboi | Inżynier usługi
  • Saverio Proto | Główny inżynier środowiska klienta
  • Don High | Główny inżynier klienta
  • LaBrina Loving | Główny inżynier usługi
  • Ken Kilty | Moduł TPM podmiotu zabezpieczeń
  • Russell de Pina | Moduł TPM podmiotu zabezpieczeń
  • Colin Mixon | Menedżer produktu
  • Ketan Chawda | Starszy inżynier klienta
  • Naveed Kharadi | Inżynier środowiska klienta
  • Erin Schaffer | Content Developer 2