Dela via


Skapa ett Azure Red Hat OpenShift-kluster med hanterade identiteter (förhandsversion)

Viktigt!

För närvarande erbjuds den här Azure Red Hat OpenShift-funktionen endast som förhandsversion. Förhandsversionsfunktioner är tillgängliga via självbetjäning och opt-in. Förhandsversioner tillhandahålls som de är och som är tillgängliga, och de undantas från serviceavtalen och den begränsade garantin. Förhandsversioner av Azure Red Hat OpenShift omfattas delvis av kundsupport på bästa sätt. Dessa funktioner är därmed inte avsedda för produktionsanvändning.

Den här artikeln visar hur du distribuerar ett Azure Red Hat OpenShift-kluster med hanterade identiteter. Ett befintligt kluster som använder ett huvudnamn för tjänsten kan inte migreras för att använda en hanterad identitet. Du måste skapa ett nytt kluster som använder en hanterad identitet i ett Azure Red Hat OpenShift-kluster.

Azure Red Hat OpenShift är en hanterad OpenShift-tjänst som stöder hanterade identiteter och arbetsbelastningsidentiteter. Hanterade identiteter och arbetsbelastningsidentiteter hjälper till att minimera risken vid skydd av arbetsbelastningar och program genom att tillhandahålla kortlivade token i stället för långlivade autentiseringsuppgifter, till exempel ett tjänsthuvudnamn med autentiseringsuppgifter för klienthemligheter.

Mer information finns i:

Förutsättningar

Kontrollera att du använder Azure CLI version 2.67.0 eller senare. Använd az--version för att hitta den version av Azure CLI som du har installerat. Om du behöver installera eller uppgradera, se Installera Azure CLI.

Azure Red Hat OpenShift kräver minst 44 kärnor för att skapa ett OpenShift-kluster. Standardkvoten för Azure-resurser för en ny Azure-prenumeration uppfyller inte det här kravet. Information om hur du begär en ökning av resursgränsen finns i Öka VCPU-kvoterna för VM-familjen.

De 44 kärnorna används på följande sätt:

  • Bootstrap-maskin: 8 kärnor
  • Kontrollplan (huvuddatorer): 24 kärnor
  • Beräkning (arbetsdatorer): 12 kärnor

När installationen är klar tas bootstrap-datorn bort och klustret använder totalt 36 kärnor. Mer information finns i Installera på Azure.

Om du till exempel vill kontrollera den aktuella prenumerationskvoten för den minsta stödda SKU för den virtuella datorfamiljen "Standard DSv5":

LOCATION=eastus
az vm list-usage -l $LOCATION \
--query "[?contains(name.value, 'standardDSv5Family')]" -o table

Ladda ned Fil för Azure Red Hat OpenShift-tilläggshjul (endast förhandsversion)

För att köra kommandona i den här artikeln, ladda först ner hjulfils för Azure Red Hat OpenShift-tillägget från https://aka.ms/az-aroext-latest. Kör följande kommando för att installera tillägget:

az extension add -s <path to downloaded whl file>

Verifiera dina behörigheter

I den här artikeln skapar du en resursgrupp som innehåller det virtuella nätverket och hanterade identiteter för klustret. Om du vill skapa en resursgrupp behöver du behörigheter som deltagare och administratör för användaråtkomst eller ägarbehörigheter för resursgruppen eller prenumerationen som innehåller den.

Du behöver också tillräckliga Microsoft Entra-behörigheter (antingen en medlemsanvändare i klientorganisationen eller en gäst som tilldelats rollen Programadministratör) för att skapa en uppsättning hanterade identiteter och tilldela roller som klustret ska använda. Mer information finns i Medlem och gäster och Tilldela administratörs- och icke-administratörsroller till användare med Microsoft Entra-ID.

Registrera resursprovidrar

Vissa Azure-resursproviders, inklusive Azure Red Hat OpenShift-resursprovidern, kräver registrering för att fungera. När du registrerar en resursprovider skapas ett huvudnamn för tjänsten i din prenumeration som ger resursprovidern behörighet att utföra vissa åtgärder, till exempel att skapa resurser. Mer information om registrering av resursprovider finns i Registrera resursprovider.

  1. Om du har flera Azure-prenumerationer anger du relevant prenumerations-ID:

    az account set --subscription <SUBSCRIPTION ID>
    
  2. Registrera Microsoft.RedHatOpenShift resursleverantören.

    az provider register -n Microsoft.RedHatOpenShift --wait
    
  3. Registrera Microsoft.Compute resursleverantören.

    az provider register -n Microsoft.Compute --wait
    
  4. Registrera Microsoft.Storage resursleverantören.

    az provider register -n Microsoft.Storage --wait
    
  5. Registrera Microsoft.Authorization resursleverantören.

    az provider register -n Microsoft.Authorization --wait
    

Hämta en Red Hat-pullhemlighet (valfritt)

Anmärkning

Dragningshemligheten för Azure Red Hat OpenShift ändrar inte kostnaden för Red Hat OpenShift-licensen.

Med en Red Hat-pullhemlighet kan klustret komma åt Red Hat-containerregister, tillsammans med annat innehåll, till exempel operatorer från OperatorHub. Det här steget är valfritt men rekommenderas. Om du bestämmer dig för att lägga till pull-hemligheten senare följer du den här vägledningen. Fältet cloud.openshift.com tas bort från din hemlighet även om pull-hemligheten innehåller det fältet. Det här fältet aktiverar en extra övervakningsfunktion som skickar data till RedHat och därför inaktiveras som standard. Information om hur du aktiverar den här funktionen finns i Aktivera fjärrhälsorapportering.

  1. Gå till Red Hat OpenShift-klusterhanterarens portal och logga in.

    Du måste logga in på ditt Red Hat-konto eller skapa ett nytt Red Hat-konto med ditt företags e-post och acceptera villkoren.

  2. Välj Hämta pull-hemlighet och ladda sedan ned en pull-hemlighet som ska användas med ditt Azure Red Hat OpenShift-kluster.

    Skydda den sparade pull-secret.txt filen. Filen används i varje kluster som skapas om du behöver skapa ett kluster som innehåller exempel eller operatorer för Red Hat eller certifierade partner.

    När du kör az aro create kommandot kan du referera till din pull-hemlighet med hjälp av parametern --pull-secret @pull-secret.txt . Kör az aro create från katalogen där du lagrade pull-secret.txt filen. Annars ersätter du @pull-secret.txt med @/path/to/my/pull-secret.txt.

    Om du kopierar din pull-hemlighet eller refererar till den i andra skript ska pull-hemligheten formateras som en giltig JSON-sträng.

Förbereda en anpassad domän för klustret (valfritt)

När du kör az aro create kommandot kan du ange en anpassad domän för klustret med hjälp av parametern --domain foo.example.com .

Anmärkning

Det är valfritt att lägga till ett domännamn när du skapar ett kluster via Azure CLI. Ett domännamn (eller ett prefix som används som en del av det automatiskt genererade DNS-namnet för OpenShift-konsolen och API-servrarna) behövs när du lägger till ett kluster via portalen. Mer information finns i Snabbstart: Distribuera ett Azure Red Hat OpenShift-kluster med azure-portalen.

Observera följande om du anger en anpassad domän för klustret:

  • När du har skapat klustret måste du skapa två DNS A-poster på DNS-servern för den angivna --domain.
    • api – pekar på API-serverns IP-adress
    • *.apps – pekar på den inkommande IP-adressen
    • Hämta dessa värden genom att köra följande kommando när klustret har skapats: az aro show -n -g --query '{api:apiserverProfile.ip, ingress:ingressProfiles[0].ip}'.
  • OpenShift-konsolen är tillgänglig på en URL, till exempel https://console-openshift-console.apps.example.com, i stället för den inbyggda domänen https://console-openshift-console.apps.<random>.<location>.aroapp.io.
  • Som standard använder OpenShift självsignerade certifikat för alla vägar som skapats på anpassade domäner *.apps.example.com. Om du väljer att använda anpassad DNS när du har anslutit till klustret måste du följa OpenShift-dokumentationen för att konfigurera en anpassad certifikatutfärdare för din ingresskontrollant och en anpassad CERTIFIKATutfärdare för DIN API-server.

Installation

Du kan använda Azure CLI eller Bicep för att distribuera ett Azure Red Hat OpenShift-kluster med hanterade identiteter.

Installera med Azure CLI

I det här avsnittet beskrivs hur du använder Azure CLI för att skapa ett Azure Red Hat OpenShift-kluster med hanterade identiteter.

Skapa ett virtuellt nätverk som innehåller två tomma undernät

Skapa ett virtuellt nätverk som innehåller två tomma undernät. Om du har ett befintligt virtuellt nätverk som uppfyller dina behov hoppar du över det här steget.

Information om nätverk och krav finns i Nätverk för Azure Red Hat OpenShift.

  1. Ange följande variabler i gränssnittsmiljön där du kör kommandona az .

    LOCATION=eastus                 # the location of your cluster
    RESOURCEGROUP=aro-rg            # the name of the resource group where you want to create your cluster
    CLUSTER=cluster                 # the name of your cluster
    
  2. Skapa en resursgrupp.

    En Azure-resursgrupp är en logisk grupp där Azure-resurser distribueras och hanteras. När du skapar en resursgrupp uppmanas du att ange en plats. Den här platsen är platsen där resursgruppsmetadata lagras och där dina resurser körs i Azure om du inte anger en annan region när du skapar resurser. Skapa en resursgrupp med hjälp av kommandot az group create.

    Anmärkning

    Azure Red Hat OpenShift är inte tillgängligt i alla regioner där en Azure-resursgrupp kan skapas. Se Tillgängliga regioner för information om var Azure Red Hat OpenShift stöds.

    az group create \
      --location $LOCATION \
      --name $RESOURCEGROUP
    
  3. Skapa ett virtuellt nätverk, huvudnät och arbetsundernät i samma resursgrupp som du skapade tidigare.

    Azure Red Hat OpenShift-kluster kräver ett virtuellt nätverk med två tomma undernät för huvud- och arbetsnoderna. Du kan antingen skapa ett nytt virtuellt nätverk eller använda ett befintligt virtuellt nätverk.

    az network vnet create \
       --resource-group $RESOURCEGROUP \
       --name aro-vnet \
       --address-prefixes 10.0.0.0/22
    
    az network vnet subnet create \
       --resource-group $RESOURCEGROUP \
       --vnet-name aro-vnet \
       --name master \
       --address-prefixes 10.0.0.0/23
    
    az network vnet subnet create \
       --resource-group $RESOURCEGROUP \
       --vnet-name aro-vnet \
       --name worker \
       --address-prefixes 10.0.2.0/23
    

Skapa nödvändiga användartilldelade hanterade identiteter

  1. Skapa följande obligatoriska identiteter. Azure Red Hat OpenShift kräver nio hanterade identiteter, var och en måste ha en tilldelad, inbyggd roll:

    • Sju hanterade identiteter relaterade till grundläggande OpenShift-operatorer.
    • En hanterad identitet för Azure Red Hat OpenShift-tjänstoperatorn.
    • En annan identitet för klustret för att aktivera användningen av dessa identiteter.

    De hanterade identitetskomponenterna är:

    • OpenShift Image Registry Operator (bild-register)
    • OpenShift Nätverksoperatör (cloud-network-config)
    • OpenShift Disk Storage Operator (disk-csi-driver)
    • OpenShift Filhanteringsoperatör (file-csi-driver)
    • OpenShift-kluster ingångsoperator (ingress)
    • OpenShift Cloud Controller Manager (cloud-controller-manager)
    • OpenShift Machine API Operatör (machine-api)
    • Azure Red Hat OpenShift Service Operator (aro-operator) - en tjänst från Microsoft för att hantera OpenShift-kluster.

    Det finns åtta olika hanterade identiteter och motsvarande inbyggda roller som representerar de behörigheter som krävs för att varje komponent i Azure Red Hat OpenShift ska kunna utföra sina uppgifter. Dessutom kräver plattformen en annan identitet, klusteridentiteten, för att kunna skapa federerade autentiseringsuppgifter för de tidigare listade hanterade identitetskomponenterna (aro-kluster).

    Mer information om Red Hat OpenShift-klusteroperatorer finns i Referens för klusteroperatorer.

    Mer information om hanterade identiteter i Azure Red Hat OpenShift finns i Förstå hanterade identiteter i Azure Red Hat OpenShift.

    Skapa de identiteter som krävs:

    az identity create \
    --resource-group $RESOURCEGROUP \
    --name aro-cluster
    
    az identity create \
    --resource-group $RESOURCEGROUP \
    --name cloud-controller-manager
    
    az identity create \
    --resource-group $RESOURCEGROUP \
    --name ingress
    
    az identity create \
    --resource-group $RESOURCEGROUP \
    --name machine-api
    
    az identity create \
    --resource-group $RESOURCEGROUP \
    --name disk-csi-driver
    
    az identity create \
    --resource-group $RESOURCEGROUP \
    --name cloud-network-config
    
    az identity create \
    --resource-group $RESOURCEGROUP \
    --name image-registry
    
    az identity create \
    --resource-group $RESOURCEGROUP \
    --name file-csi-driver
    
    az identity create \
    --resource-group $RESOURCEGROUP \
    --name aro-operator
    
  2. Skapa nödvändiga rolltilldelningar för varje operatoridentitet, klusteridentitet och förstapartstjänstens huvudnamn.

    Anmärkning

    Den här artikeln förutsätter att endast huvud- och arbetsundernät finns. Om du konfigurerade fler klusterundernät vid installationstillfället måste du bevilja rolltilldelningsomfång till dessa undernät för operatorer som kräver det.

    Följande rolltilldelningar för huvud- och arbetsundernät förutsätter att det inte finns någon nätverkssäkerhetsgrupp (NSG), routningstabell eller nat-gateway (network address translation) ansluten. Om du tar med någon av dessa nätverksresurser till installationen måste du skapa fler rolltilldelningar som ger operatörsidentitetsbehörigheter för de extra nätverksresurserna. För varje operator som kräver en rolltilldelning för följande undernät eller det virtuella nätverket krävs även en rolltilldelning för den extra nätverksresursen.

    SUBSCRIPTION_ID=$(az account show --query 'id' -o tsv)
    
    # assign cluster identity permissions over identities previously created
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name aro-cluster --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/ef318e2a-8334-4a05-9e4a-295a196c6a6e" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/aro-operator"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name aro-cluster --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/ef318e2a-8334-4a05-9e4a-295a196c6a6e" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/cloud-controller-manager"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name aro-cluster --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/ef318e2a-8334-4a05-9e4a-295a196c6a6e" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ingress"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name aro-cluster --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/ef318e2a-8334-4a05-9e4a-295a196c6a6e" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/machine-api"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name aro-cluster --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/ef318e2a-8334-4a05-9e4a-295a196c6a6e" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/disk-csi-driver"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name aro-cluster --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/ef318e2a-8334-4a05-9e4a-295a196c6a6e" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/cloud-network-config"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name aro-cluster --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/ef318e2a-8334-4a05-9e4a-295a196c6a6e" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/image-registry"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name aro-cluster --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/ef318e2a-8334-4a05-9e4a-295a196c6a6e" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/file-csi-driver"
    
    # assign vnet-level permissions for operators that require it, and subnets-level permission for operators that require it
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name cloud-controller-manager --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/a1f96423-95ce-4224-ab27-4e3dc72facd4" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/aro-vnet/subnets/master"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name cloud-controller-manager --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/a1f96423-95ce-4224-ab27-4e3dc72facd4" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/aro-vnet/subnets/worker"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name ingress --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/0336e1d3-7a87-462b-b6db-342b63f7802c" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/aro-vnet/subnets/master"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name ingress --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/0336e1d3-7a87-462b-b6db-342b63f7802c" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/aro-vnet/subnets/worker"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name machine-api --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/0358943c-7e01-48ba-8889-02cc51d78637" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/aro-vnet/subnets/master"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name machine-api --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/0358943c-7e01-48ba-8889-02cc51d78637" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/aro-vnet/subnets/worker"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name cloud-network-config --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/be7a6435-15ae-4171-8f30-4a343eff9e8f" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/aro-vnet"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name file-csi-driver --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/0d7aedc0-15fd-4a67-a412-efad370c947e" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/aro-vnet"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name image-registry --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/8b32b316-c2f5-4ddf-b05b-83dacd2d08b5" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/aro-vnet"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name aro-operator --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/4436bae4-7702-4c84-919b-c4069ff25ee2" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/aro-vnet/subnets/master"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name aro-operator --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/4436bae4-7702-4c84-919b-c4069ff25ee2" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/aro-vnet/subnets/worker"
    
    az role assignment create \
        --assignee-object-id "$(az ad sp list --display-name "Azure Red Hat OpenShift RP" --query '[0].id' -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/4d97b98b-1d4f-4787-a291-c67834d212e7" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/aro-vnet"
    

Skapa klustret

Om du vill skapa ett kluster kör du följande kommando som visas under alternativen. Om du väljer att använda något av följande alternativ ändrar du kommandot i enlighet med detta:

  • Alternativ 1: Du kan skicka din Red Hat-pullhemlighet, vilket gör att klustret kan komma åt Red Hat-containerregister tillsammans med annat innehåll. Lägg till argumentet i --pull-secret @pull-secret.txt kommandot.
  • Alternativ 2: Du kan använda en anpassad domän. Lägg till argumentet i --domain foo.example.com kommandot och foo.example.com ersätt med din egen anpassade domän.

Skapa klustret med de miljövariabler som krävs. För varje --assign-platform-workload-identity flagga representerar det första argumentet nyckeln, som talar om för Azure Red Hat OpenShift-resursprovidern vilken OpenShift-operator som ska användas för en viss identitet. Det andra argumentet representerar referensen till själva identiteten.

az aro create \
    --resource-group $RESOURCEGROUP \
    --name $CLUSTER \
    --vnet aro-vnet \
    --master-subnet master \
    --worker-subnet worker \
    --version <VERSION> \
    --enable-managed-identity \
    --assign-cluster-identity aro-cluster \
    --assign-platform-workload-identity file-csi-driver file-csi-driver \
    --assign-platform-workload-identity cloud-controller-manager cloud-controller-manager \
    --assign-platform-workload-identity ingress ingress \
    --assign-platform-workload-identity image-registry image-registry \
    --assign-platform-workload-identity machine-api machine-api \
    --assign-platform-workload-identity cloud-network-config cloud-network-config \
    --assign-platform-workload-identity aro-operator aro-operator \
    --assign-platform-workload-identity disk-csi-driver disk-csi-driver

Som ett alternativ, om identitetsresurser finns i en annan region eller resursgrupp, kan du ange fullständiga resurs-ID:n för att skapa. Se följande exempel:

az aro create \
    --resource-group $RESOURCEGROUP \
    --name $CLUSTER \
    --vnet aro-vnet \
    --master-subnet master \
    --worker-subnet worker \
    --version <VERSION> \
    --enable-managed-identity \
    --assign-cluster-identity /subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/aro-cluster \
    --assign-platform-workload-identity file-csi-driver /subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/file-csi-driver \
    --assign-platform-workload-identity cloud-controller-manager /subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/cloud-controller-manager \
    --assign-platform-workload-identity ingress /subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ingress \
    --assign-platform-workload-identity image-registry /subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/image-registry \
    --assign-platform-workload-identity machine-api /subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/machine-api \
    --assign-platform-workload-identity cloud-network-config /subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/cloud-network-config \
    --assign-platform-workload-identity aro-operator /subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/aro-operator \
    --assign-platform-workload-identity disk-csi-driver /subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/disk-csi-driver

Välj en annan Azure Red Hat OpenShift-version

Du kan välja att använda en specifik version av Azure Red Hat OpenShift när du skapar klustret. Börja med att använda CLI för att fråga efter tillgängliga Azure Red Hat OpenShift-versioner:

az aro get-versions --location <REGION>

När versionen har valts anger du den med hjälp av parametern --versionaz aro create i kommandot .

Installera med Bicep

I det här avsnittet beskrivs hur du använder Bicep för att skapa ett Azure Red Hat OpenShift-kluster med hanterade identiteter.

  1. Spara Bicep-exempelmallen (som finns efter steg 5) i en fil.

  2. Ange följande variabler i gränssnittsmiljön som du planerar att köra kommandona az .

    LOCATION=eastus                     # the location of your cluster
    RESOURCEGROUP=aro-rg                # the name of the resource group where you want to create your cluster
    CLUSTER=cluster                     # the name of your cluster
    VERSION=4.15.35                     # the version of the cluster
    PULL_SECRET=$(cat pull-secret.txt)  # the Red Hat pull secret JSON, provided as file or string
    
  3. Skapa en resursgrupp som ska innehålla klusterresursen och det virtuella klustrets nätverk och identiteter.

    az group create --name $RESOURCEGROUP --location $LOCATION
    
  4. För resursleverantören, kontrollera objekt-ID:t för första partens tjänstehuvudnamn för din prenumeration.

    ARO_RP_SP_OBJECT_ID=$(az ad sp list --display-name "Azure Red Hat OpenShift RP" --query '[0].id' -o tsv)
    
  5. Använd Bicep-mallen:

    az deployment group create \
        --name aroDeployment \
        --resource-group $RESOURCEGROUP \
        --template-file azuredeploy.bicep \
        --parameters location=$LOCATION \
        --parameters version=$VERSION \
        --parameters clusterName=$CLUSTER \
        --parameters rpObjectId=$ARO_RP_SP_OBJECT_ID
        (--parameters domain=$DOMAIN) \ #optional
        (--parameters pullSecret=$PULL_SECRET) # optional
    

Exempel på Bicep-mall

Anmärkning

Den här artikeln förutsätter att endast huvud- och arbetsundernät finns. Om du konfigurerade fler klusterundernät vid installationstillfället måste du bevilja rolltilldelningsomfång till dessa undernät för operatorer som kräver det.

Följande rolltilldelningar för huvud- och arbetsundernät förutsätter att det inte finns någon nätverkssäkerhetsgrupp (NSG), routningstabell eller nat-gateway (network address translation) ansluten. Om du tar med någon av dessa nätverksresurser till installationen måste du skapa fler rolltilldelningar som ger operatörsidentitetsbehörigheter för de extra nätverksresurserna. För varje operator som kräver en rolltilldelning för följande undernät eller det virtuella nätverket krävs även en rolltilldelning för den extra nätverksresursen.

@description('Location')
param location string = resourceGroup().location

@description('Domain Prefix')
param domain string

@description('Version of the OpenShift cluster')
param version string

@description('Pull secret from cloud.redhat.com. The json should be input as a string')
@secure()
param pullSecret string = ''

@description('Name of vNet')
param clusterVnetName string = 'aro-vnet'

@description('vNet Address Space')
param clusterVnetCidr string = '10.100.0.0/15'

@description('Worker node subnet address space')
param workerSubnetCidr string = '10.100.70.0/23'

@description('Master node subnet address space')
param masterSubnetCidr string = '10.100.76.0/24'

@description('Master Node VM Type')
param masterVmSize string = 'Standard_D8s_v3'

@description('Worker Node VM Type')
param workerVmSize string = 'Standard_D4s_v3'

@description('Worker Node Disk Size in GB')
@minValue(128)
param workerVmDiskSize int = 128

@description('Cidr for Pods')
param podCidr string = '10.128.0.0/14'

@metadata({
 description: 'Cidr of service'
})
param serviceCidr string = '172.30.0.0/16'

@description('Unique name for the cluster')
param clusterName string

@description('Api Server Visibility')
@allowed([
 'Private'
 'Public'
])
param apiServerVisibility string = 'Public'

@description('Ingress Visibility')
@allowed([
 'Private'
 'Public'
])
param ingressVisibility string = 'Public'

@description('The ObjectID of the Resource Provider Service Principal')
param rpObjectId string

@description('Specify if FIPS validated crypto modules are used')
@allowed([
 'Enabled'
 'Disabled'
])
param fips string = 'Disabled'

@description('Specify if master VMs are encrypted at host')
@allowed([
 'Enabled'
 'Disabled'
])
param masterEncryptionAtHost string = 'Disabled'

@description('Specify if worker VMs are encrypted at host')
@allowed([
 'Enabled'
 'Disabled'
])
param workerEncryptionAtHost string = 'Disabled'

var resourceGroupId = '/subscriptions/${subscription().subscriptionId}/resourceGroups/aro-${domain}-${location}'
var masterSubnetId=resourceId('Microsoft.Network/virtualNetworks/subnets', clusterVnetName, 'master')
var workerSubnetId=resourceId('Microsoft.Network/virtualNetworks/subnets', clusterVnetName, 'worker')

resource vnet 'Microsoft.Network/virtualNetworks@2023-06-01' = {
 name: clusterVnetName
 location: location
 properties: {
   addressSpace: { addressPrefixes: [ clusterVnetCidr ] }
   subnets: [
     {
       name: 'master'
       properties: {
         addressPrefixes: [ masterSubnetCidr ]
         serviceEndpoints: [ { service: 'Microsoft.ContainerRegistry' } ]
       }
     }
     {
       name: 'worker'
       properties: {
         addressPrefixes: [ workerSubnetCidr ]
         serviceEndpoints: [ { service: 'Microsoft.ContainerRegistry' } ]
       }
     }
   ]
 }
}

resource workerSubnet 'Microsoft.Network/virtualNetworks/subnets@2020-08-01' existing = {
 parent: vnet
 name: 'worker'
}

resource masterSubnet 'Microsoft.Network/virtualNetworks/subnets@2020-08-01' existing = {
 parent: vnet
 name: 'master'
}

// create required identities

resource cloudControllerManager 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
   name: 'cloud-controller-manager'
   location: location
}

resource ingress 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
   name: 'ingress'
   location: location
}

resource machineApi 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
   name: 'machine-api'
   location: location
}

resource diskCsiDriver 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
   name: 'disk-csi-driver'
   location: location
}

resource cloudNetworkConfig 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
   name: 'cloud-network-config'
   location: location
}

resource imageRegistry 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
   name: 'image-registry'
   location: location
}

resource fileCsiDriver 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
   name: 'file-csi-driver'
   location: location
}

resource aroOperator 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
   name: 'aro-operator'
   location: location
}

resource clusterMsi 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
   name: 'cluster'
   location: location
}

// create required role assignments on vnet / subnets

resource cloudControllerManagerMasterSubnetRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(masterSubnet.id, 'cloud-controller-manager')
   scope: masterSubnet
   properties: {
       principalId: cloudControllerManager.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'a1f96423-95ce-4224-ab27-4e3dc72facd4')
       principalType: 'ServicePrincipal'
   }
}

resource cloudControllerManagerWorkerSubnetRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
 name: guid(workerSubnet.id, 'cloud-controller-manager')
 scope: workerSubnet
 properties: {
     principalId: cloudControllerManager.properties.principalId
     roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'a1f96423-95ce-4224-ab27-4e3dc72facd4')
     principalType: 'ServicePrincipal'
 }
}

resource ingressMasterSubnetRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(masterSubnet.id, 'ingress')
   scope: masterSubnet
   properties: {
       principalId: ingress.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0336e1d3-7a87-462b-b6db-342b63f7802c')
       principalType: 'ServicePrincipal'
   }
}

resource ingressWorkerSubnetRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
 name: guid(workerSubnet.id, 'ingress')
 scope: workerSubnet
 properties: {
     principalId: ingress.properties.principalId
     roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0336e1d3-7a87-462b-b6db-342b63f7802c')
     principalType: 'ServicePrincipal'
 }
}

resource machineApiMasterSubnetRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(masterSubnet.id, 'machine-api')
   scope: masterSubnet
   properties: {
       principalId: machineApi.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0358943c-7e01-48ba-8889-02cc51d78637')
       principalType: 'ServicePrincipal'
   }
}

resource machineApiWorkerSubnetRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(workerSubnet.id, 'machine-api')
   scope: workerSubnet
   properties: {
       principalId: machineApi.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0358943c-7e01-48ba-8889-02cc51d78637')
       principalType: 'ServicePrincipal'
   }
}

resource cloudNetworkConfigVnetRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(vnet.id, 'cloud-network-config')
   scope: vnet
   properties: {
       principalId: cloudNetworkConfig.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'be7a6435-15ae-4171-8f30-4a343eff9e8f')
       principalType: 'ServicePrincipal'
   }
}

resource fileCsiDriverVnetRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(vnet.id, 'file-csi-driver')
   scope: vnet
   properties: {
       principalId: fileCsiDriver.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0d7aedc0-15fd-4a67-a412-efad370c947e')
       principalType: 'ServicePrincipal'
   }
}

resource imageRegistryVnetRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(vnet.id, 'image-registry')
   scope: vnet
   properties: {
       principalId: imageRegistry.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '8b32b316-c2f5-4ddf-b05b-83dacd2d08b5')
       principalType: 'ServicePrincipal'
   }
}

resource aroOperatorMasterSubnetRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(masterSubnet.id, 'aro-operator')
   scope: masterSubnet
   properties: {
       principalId: aroOperator.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '4436bae4-7702-4c84-919b-c4069ff25ee2')
       principalType: 'ServicePrincipal'
   }
}

resource aroOperatorWorkerSubnetRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
 name: guid(workerSubnet.id, 'aro-operator')
 scope: workerSubnet
 properties: {
     principalId: aroOperator.properties.principalId
     roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '4436bae4-7702-4c84-919b-c4069ff25ee2')
     principalType: 'ServicePrincipal'
 }
}

// create required role assignments on cluster MSI

resource clusterMsiRoleAssignmentCloudControllerManager 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(cloudControllerManager.id, 'cluster')
   scope: cloudControllerManager
   properties: {
       principalId: clusterMsi.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')
       principalType: 'ServicePrincipal'
   }
}

resource clusterMsiRoleAssignmentIngress 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(ingress.id, 'cluster')
   scope: ingress
   properties: {
       principalId: clusterMsi.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')
       principalType: 'ServicePrincipal'
   }
}

resource clusterMsiRoleAssignmentMachineApi 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(machineApi.id, 'cluster')
   scope: machineApi
   properties: {
       principalId: clusterMsi.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')
       principalType: 'ServicePrincipal'
   }
}

resource clusterMsiRoleAssignmentDiskCsiDriver 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(diskCsiDriver.id, 'cluster')
   scope: diskCsiDriver
   properties: {
       principalId: clusterMsi.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')
       principalType: 'ServicePrincipal'
   }
}

resource clusterMsiRoleAssignmentCloudNetworkConfig 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(cloudNetworkConfig.id, 'cluster')
   scope: cloudNetworkConfig
   properties: {
       principalId: clusterMsi.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')
       principalType: 'ServicePrincipal'
   }
}

resource clusterMsiRoleAssignmentCloudImageRegistry 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(imageRegistry.id, 'cluster')
   scope: imageRegistry
   properties: {
       principalId: clusterMsi.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')
       principalType: 'ServicePrincipal'
   }
}

resource clusterMsiRoleAssignmentCloudFileCsiDriver 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(fileCsiDriver.id, 'cluster')
   scope: fileCsiDriver
   properties: {
       principalId: clusterMsi.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')
       principalType: 'ServicePrincipal'
   }
}

resource clusterMsiRoleAssignmentCloudAroOperator 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(aroOperator.id, 'cluster')
   scope: aroOperator
   properties: {
       principalId: clusterMsi.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')
       principalType: 'ServicePrincipal'
   }
}

// create first party role assignment over the vnet

resource fpspRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(vnet.id, rpObjectId)
   scope: vnet
   properties: {
       principalId: rpObjectId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '4d97b98b-1d4f-4787-a291-c67834d212e7')
       principalType: 'ServicePrincipal'
   }
}

// create cluster

resource cluster 'Microsoft.RedHatOpenShift/openShiftClusters@2024-08-12-preview' = {
   name: clusterName
   location: location
   properties: {
       clusterProfile: {
           domain: domain
           #disable-next-line use-resource-id-functions
           resourceGroupId: resourceGroupId
           version: version
           fipsValidatedModules: fips
           pullSecret: pullSecret
       }
       networkProfile: {podCidr: podCidr, serviceCidr: serviceCidr}
       masterProfile: {
           vmSize: masterVmSize
           subnetId: masterSubnetId
           encryptionAtHost: masterEncryptionAtHost
       }
       workerProfiles: [{
           name: 'worker'
           count: 3
           diskSizeGB: workerVmDiskSize
           vmSize: workerVmSize
           subnetId: workerSubnetId
           encryptionAtHost: workerEncryptionAtHost
       }]
       apiserverProfile: {visibility: apiServerVisibility}
       ingressProfiles: [{name: 'default', visibility: ingressVisibility}]
       platformWorkloadIdentityProfile: {
           platformWorkloadIdentities: {
               'cloud-controller-manager': {resourceId: cloudControllerManager.id}
               ingress: {resourceId: ingress.id}
               'machine-api': {resourceId: machineApi.id}
               'disk-csi-driver': {resourceId: diskCsiDriver.id}
               'cloud-network-config': {resourceId: cloudNetworkConfig.id}
               'image-registry': {resourceId: imageRegistry.id}
               'file-csi-driver': {resourceId: fileCsiDriver.id}
               'aro-operator': {resourceId: aroOperator.id}
           }
       }
   }
   identity: {
       type: 'UserAssigned'
       userAssignedIdentities: {
           '${clusterMsi.id}': {}
       }
   }
}

Städa upp

Kör följande kommando för att ta bort ett hanterat identitetskluster:

az aro delete -n $CLUSTER -g $RESOURCEGROUP

Observera att det här borttagningskommandot inte rensar de klustertilldelade hanterade identiteterna som skapades som en del av installationen. Du måste ta bort identiteter och rolltilldelningar manuellt.