Partager via


Créer un cluster Azure Red Hat OpenShift avec des identités managées (préversion)

Important

Actuellement, cette fonctionnalité Azure Red Hat OpenShift est proposée en préversion uniquement. Les fonctionnalités en préversion sont disponibles en libre-service et font l’objet d’un consentement. Les préversions sont fournies en l’état et selon disponibilité, et elles sont exclues des accords de niveau de service et de la garantie limitée. Les préversions d’Azure Red Hat OpenShift sont, dans la mesure du possible, partiellement couvertes par le service clientèle. Telles quelles, ces fonctionnalités ne sont pas destinées à une utilisation en production.

Cet article explique comment déployer un cluster Azure Red Hat OpenShift à l’aide d’identités managées. Un cluster existant qui utilise un principal de service ne peut pas être migré pour utiliser une identité managée. Vous devez créer un cluster qui utilise une identité managée sur un cluster Azure Red Hat OpenShift.

Azure Red Hat OpenShift est un service OpenShift géré qui prend en charge les identités managées et les identités de charge de travail. Les identités managées et les identités de charge de travail permettent de réduire les risques lors de la sécurisation des charges de travail et des applications en fournissant des jetons de courte durée plutôt que des informations d’identification de longue durée telles qu’un principal de service avec des informations d’identification de secret client.

Pour plus d’informations, consultez :

Conditions préalables

Vérifiez que vous utilisez la version 2.67.0 ou une version plus récente de l’interface Azure CLI. Permet az--version de rechercher la version d’Azure CLI que vous avez installée. Si vous devez installer ou mettre à niveau, voir Installer Azure CLI.

Azure Red Hat OpenShift nécessite un minimum de 44 cœurs pour créer un cluster OpenShift. Le quota de ressources Azure par défaut pour un nouvel abonnement Azure ne répond pas à cette exigence. Pour demander une augmentation de votre limite de ressources, consultez Augmenter les quotas de processeurs virtuels de famille de machines virtuelles.

Les 44 cœurs sont utilisés comme suit :

  • Machine d'amorçage : 8 cœurs
  • Plan de contrôle (machines maîtres) : 24 cœurs
  • Calcul (machines de travail) : 12 cœurs

Une fois l’installation terminée, la machine de démarrage est supprimée et votre cluster utilise un total de 36 cœurs. Pour plus d’informations, consultez Installation sur Azure.

Par exemple, pour vérifier le quota d’abonnement actuel de la plus petite référence SKU de famille de machines virtuelles prises en charge « Standard DSv5 » :

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

Télécharger le fichier de roue d’extension Azure Red Hat OpenShift (préversion uniquement)

Pour exécuter les commandes de cet article, commencez par télécharger le fichier de roue d’extension Azure Red Hat OpenShift à partir de https://aka.ms/az-aroext-latest. Pour installer l’extension , exécutez la commande suivante :

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

Vérifier vos autorisations

Dans cet article, vous allez créer un groupe de ressources qui contient le réseau virtuel et les identités managées pour le cluster. Pour créer un groupe de ressources, vous avez besoin d’autorisations Contributeur et Administrateur de l’accès utilisateur ou des autorisations propriétaires sur le groupe de ressources ou l’abonnement contenant celui-ci.

Vous avez également besoin d’autorisations Microsoft Entra suffisantes (soit un utilisateur membre du locataire, soit un invité affecté avec le rôle d'administrateur de l'application) pour créer un ensemble d’identités gérées et attribuer des rôles utilisés par le cluster. Pour plus d’informations, consultez Membres et invitéset Attribuer des rôles d’administrateur et de non-administrateur aux utilisateurs avec l’ID Microsoft Entra.

Inscrire les fournisseurs de ressources

Certains fournisseurs de ressources Azure, y compris le fournisseur de ressources Azure Red Hat OpenShift, nécessitent l’inscription pour fonctionner. L’inscription d’un fournisseur de ressources crée un principal de service à l’intérieur de votre abonnement qui autorise le fournisseur de ressources à effectuer certaines actions, telles que la création de ressources. Pour plus d’informations sur l’inscription du fournisseur de ressources, consultez Inscrire un fournisseur de ressources.

  1. Si vous possédez plusieurs abonnements Azure, indiquez l’ID d’abonnement pertinent :

    az account set --subscription <SUBSCRIPTION ID>
    
  2. Inscrivez le fournisseur de ressources Microsoft.RedHatOpenShift :

    az provider register -n Microsoft.RedHatOpenShift --wait
    
  3. Inscrivez le fournisseur de ressources Microsoft.Compute :

    az provider register -n Microsoft.Compute --wait
    
  4. Inscrivez le fournisseur de ressources Microsoft.Storage :

    az provider register -n Microsoft.Storage --wait
    
  5. Inscrivez le fournisseur de ressources Microsoft.Authorization :

    az provider register -n Microsoft.Authorization --wait
    

Récupération d’un secret d’extraction Red Hat (facultatif)

Un secret d’extraction Azure Red Hat OpenShift ne change pas le coût de la licence Red Hat OpenShift.

Un secret d’extraction Red Hat permet au cluster d’accéder à des registres du conteneur Red Hat, ainsi qu’à d’autres contenus comme les opérateurs de OperatorHub. Cette étape est facultative, mais recommandée. Si vous décidez ultérieurement d’ajouter le secret d’extraction, suivez ces instructions. Le champ cloud.openshift.com sera supprimé de votre secret même si votre secret d’extraction contient ce champ. Ce champ active une fonctionnalité de surveillance supplémentaire qui envoie des données à RedHat et qui est par conséquent désactivée par défaut. Pour activer cette fonctionnalité, consultez Activation du rapport de santé en téléreportage.

  1. Accédez au portail de votre gestionnaire de cluster Red Hat OpenShift, puis connectez-vous.

    Vous devez vous connecter à votre compte Red Hat ou créer un compte Red Hat avec votre e-mail professionnel et accepter les conditions générales.

  2. Sélectionnez Télécharger le secret collecteur, puis téléchargez un secret collecteur à utiliser avec votre cluster Azure Red Hat OpenShift.

    Conservez le fichier pull-secret.txt enregistré dans un emplacement sûr. Le fichier est utilisé dans chaque création de cluster si vous devez créer un cluster qui inclut des exemples ou des opérateurs pour les partenaires Red Hat ou certifiés.

    Lors de l’exécution de la commande az aro create, vous pouvez référencer votre secret d’extraction à l’aide du paramètre --pull-secret @pull-secret.txt. Exécutez az aro create à partir du répertoire où vous avez stocké votre fichier pull-secret.txt. Sinon, remplacez @pull-secret.txt par @/path/to/my/pull-secret.txt.

    Si vous copiez votre secret d’extraction, ou que vous le référencez dans d’autres scripts, il doit être au format d’une chaîne JSON valide.

Préparer un domaine personnalisé pour votre cluster (facultatif)

Lorsque vous exécutez la commande az aro create, vous pouvez spécifier un domaine personnalisé pour votre cluster à l’aide du paramètre --domain foo.example.com.

Remarque

L’ajout d’un nom de domaine est facultatif lors de la création d’un cluster via Azure CLI. Un nom de domaine (ou un préfixe utilisé dans le cadre du nom DNS généré automatiquement pour les serveurs de console et d’API OpenShift) est nécessaire lors de l’ajout d’un cluster via le portail. Pour plus d’informations, consultez Démarrage rapide : Déployer un cluster Azure Red Hat OpenShift à l’aide du portail Azure.

Si vous fournissez un domaine personnalisé pour votre cluster, notez les points suivants :

  • Après avoir créé votre cluster, vous devez créer deux enregistrements DNS A dans votre serveur DNS pour les --domain éléments spécifiés :
    • API : pointant vers l’adresse IP du serveur d’API
    • *.apps  : pointant vers l’adresse IP d’entrée
    • Récupérez ces valeurs en exécutant la commande suivante après la création du cluster : az aro show -n -g --query '{api:apiserverProfile.ip, ingress:ingressProfiles[0].ip}'.
  • La console OpenShift est disponible sur une URL telle que https://console-openshift-console.apps.example.com, au lieu du domaine https://console-openshift-console.apps.<random>.<location>.aroapp.iointégré .
  • Par défaut, OpenShift utilise des certificats auto-signés pour toutes les routes créées sur des domaines personnalisés *.apps.example.com. Si vous choisissez d’utiliser dns personnalisé après vous être connecté au cluster, vous devez suivre la documentation OpenShift pour configurer une autorité de certification personnalisée pour votre contrôleur d’entrée et une autorité de certification personnalisée pour votre serveur d’API.

Installation

Vous pouvez utiliser Azure CLI, Bicep ou un modèle Azure Resource Manager (modèle ARM) pour déployer un cluster Azure Red Hat OpenShift qui utilise des identités managées.

Installer avec Azure CLI

Cette section explique comment utiliser Azure CLI pour créer un cluster Azure Red Hat OpenShift à l’aide d’identités managées.

Créer un réseau virtuel contenant deux sous-réseaux vides

Créez un réseau virtuel contenant deux sous-réseaux vides. Si vous disposez d’un réseau virtuel existant qui répond à vos besoins, ignorez cette étape.

Pour plus d’informations sur la mise en réseau et les exigences, consultez Mise en réseau pour Azure Red Hat OpenShift.

  1. Définissez les variables suivantes dans l’environnement shell dans lequel vous exécutez les az commandes.

    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. Créez un groupe de ressources.

    Un groupe de ressources Azure est un groupe logique dans lequel des ressources Azure sont déployées et gérées. Lorsque vous créez un groupe de ressources, vous devez spécifier un emplacement. Cet emplacement est l’emplacement où les métadonnées du groupe de ressources sont stockées et où vos ressources s’exécutent dans Azure si vous ne spécifiez pas une autre région lors de la création de ressources. Créez un groupe de ressources avec la commande az group create.

    Remarque

    Azure Red Hat OpenShift n’est pas disponible dans toutes les régions où un groupe de ressources Azure peut être créé. Pour savoir où Azure Red Hat OpenShift est pris en charge, consultez Régions disponibles.

    az group create \
      --location $LOCATION \
      --name $RESOURCEGROUP
    
  3. Créez un réseau virtuel, ainsi que les sous-réseaux maître et worker, dans le même groupe de ressources précédemment créé.

    Les clusters Azure Red Hat OpenShift nécessitent un réseau virtuel avec deux sous-réseaux vides pour les nœuds maître et Worker. Vous pouvez créer un réseau virtuel ou utiliser un réseau virtuel existant.

    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
    

Créer les identités gérées assignées par l'utilisateur requises

  1. Créez les identités requises suivantes. Azure Red Hat OpenShift nécessite neuf identités managées, chacune doit avoir un rôle intégré affecté :

    • Sept identités managées liées aux opérateurs OpenShift principaux.
    • Une identité managée pour l’opérateur de service Azure Red Hat OpenShift.
    • Une autre identité pour le cluster afin d’activer l’utilisation de ces identités.

    Les composants d’identité managée sont les suivants :

    • Opérateur de registre d'images OpenShift (image-registry)
    • Opérateur Réseau OpenShift (cloud-network-config)
    • Opérateur de stockage de disque OpenShift (disk-csi-driver)
    • Opérateur de stockage de fichiers OpenShift (file-csi-driver)
    • Opérateur d'Ingress du Cluster OpenShift
    • OpenShift Gestionnaire de contrôleur Cloud (cloud-controller-manager)
    • OpenShift Machine API Operator (API de gestion des machines)
    • Opérateur de service Azure Red Hat OpenShift (aro-operator)

    Il existe huit identités managées différentes et des rôles intégrés correspondants qui représentent les autorisations nécessaires pour chaque composant d’Azure Red Hat OpenShift pour effectuer ses tâches. En outre, la plateforme nécessite une autre identité, l’identité du cluster, pour effectuer la création d’informations d’identification fédérées pour les composants d’identité managée précédemment répertoriés (aro-cluster).

    Pour plus d’informations sur les opérateurs de cluster Red Hat OpenShift, consultez la référence des opérateurs de cluster.

    Pour plus d’informations sur les identités managées dans Azure Red Hat OpenShift, consultez Présentation des identités managées dans Azure Red Hat OpenShift.

    Créez les identités requises :

    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. Créez les attributions de rôle requises pour chaque identité d’opérateur, identité de cluster et principal du service tiers.

    Remarque

    Cet article suppose que seuls les sous-réseaux maître et ouvrier sont présents. Si vous avez configuré davantage de sous-réseaux de cluster au moment de l’installation, vous devez accorder l’étendue d’attribution de rôle à ces sous-réseaux, pour les opérateurs qui en ont besoin.

    Les attributions de rôle suivantes pour les sous-réseaux maître et de travailleur supposent qu'aucun groupe de sécurité réseau (NSG), table de routage ou passerelle de traduction d'adresses réseau (NAT) n'est attaché. Si vous apportez l’une de ces ressources réseau à l’installation, vous devez créer davantage d’attributions de rôles qui accordent des autorisations d’identités d’opérateur pour ces ressources réseau supplémentaires. Pour chaque opérateur qui nécessite une attribution de rôle pour les sous-réseaux suivants ou le réseau virtuel, il nécessite également une attribution de rôle pour la ressource réseau supplémentaire.

    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"
    

Créer le cluster

Pour créer un cluster, exécutez la commande suivante affichée sous les options. Si vous choisissez d’utiliser l’une des options suivantes, modifiez la commande en conséquence :

  • Option 1 : Vous pouvez transmettre votre secret d’extraction Red Hat, ce qui permet à votre cluster d’accéder aux registres de conteneurs Red Hat ainsi qu’à d’autres contenus. Ajoutez l’argument --pull-secret @pull-secret.txt à votre commande.
  • Option 2 : Vous pouvez utiliser un domaine personnalisé. Ajoutez l’argument --domain foo.example.com à votre commande en remplaçant foo.example.com par votre propre domaine personnalisé.

Créez le cluster avec les variables d’environnement requises. Pour chaque --assign-platform-workload-identity indicateur, le premier argument représente la clé, qui indique au fournisseur de ressources Azure Red Hat OpenShift quel opérateur OpenShift utiliser pour une identité donnée. Le deuxième argument représente la référence à l’identité elle-même.

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

En option, si des ressources d’identité existent dans une autre région ou un groupe de ressources, vous pouvez transmettre des ID de ressources complets pour créer. Consultez l’exemple suivant :

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

Sélectionner une autre version d’Azure Red Hat OpenShift

Vous pouvez choisir d’utiliser une version spécifique d’Azure Red Hat OpenShift lors de la création de votre cluster. Tout d’abord, utilisez l’interface CLI pour rechercher les versions d’Azure Red Hat OpenShift disponibles :

az aro get-versions --location <REGION>

Une fois la version choisie, spécifiez-la à l’aide du --version paramètre dans la az aro create commande.

Installer à l’aide de Bicep

Cette section explique comment utiliser Bicep pour créer un cluster Azure Red Hat OpenShift avec des identités managées.

  1. Enregistrez l’exemple de fichier Bicep dans un fichier. Pour cet exemple, enregistrez-le en tant qu’azuredeploy.bicep.

  2. Indiquez les variables suivantes dans l'environnement shell où vous prévoyez d'exécuter les commandes 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. Créez un groupe de ressources pour contenir la ressource de cluster et le réseau virtuel et les identités de cluster.

    az group create --name $RESOURCEGROUP --location $LOCATION
    
  4. Pour le fournisseur de ressources, vérifiez l’ID d’objet du principal de service tiers pour votre abonnement.

    ARO_RP_SP_OBJECT_ID=$(az ad sp list --display-name "Azure Red Hat OpenShift RP" --query '[0].id' -o tsv)
    
  5. Déployez le fichier Bicep :

    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
    

    Si vous utilisez des paramètres facultatifs pour le secret d’extraction ou le domaine personnalisé, ajoutez une barre oblique inverse de continuation de ligne (\) après le rpObjectId paramètre et incluez les paramètres suivants dans la commande de déploiement :

    --parameters domain=$DOMAIN \ #optional
    --parameters pullSecret=$PULL_SECRET # optional
    

Exemple de fichier Bicep

Remarque

Cet article suppose que seuls les sous-réseaux maître et ouvrier sont présents. Si vous avez configuré davantage de sous-réseaux de cluster au moment de l’installation, vous devez accorder l’étendue d’attribution de rôle à ces sous-réseaux, pour les opérateurs qui en ont besoin.

Les attributions de rôle suivantes pour les sous-réseaux maître et de travailleur supposent qu'aucun groupe de sécurité réseau (NSG), table de routage ou passerelle de traduction d'adresses réseau (NAT) n'est attaché. Si vous apportez l’une de ces ressources réseau à l’installation, vous devez créer davantage d’attributions de rôles qui accordent des autorisations d’identités d’opérateur pour ces ressources réseau supplémentaires. Pour chaque opérateur qui nécessite une attribution de rôle pour les sous-réseaux suivants ou le réseau virtuel, il nécessite également une attribution de rôle pour la ressource réseau supplémentaire.

@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}': {}
       }
   }
}

Installer à l’aide d’un modèle ARM

Cette section explique comment utiliser un modèle ARM pour créer un cluster Azure Red Hat OpenShift avec des identités managées.

  1. Enregistrez l’exemple de modèle ARM dans un fichier. Pour cet exemple, nommez le fichier azuredeploy.json.

  2. Indiquez les variables suivantes dans l'environnement shell où vous prévoyez d'exécuter les commandes 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. Créez un groupe de ressources pour contenir la ressource de cluster et le réseau virtuel et les identités de cluster.

    az group create --name $RESOURCEGROUP --location $LOCATION
    
  4. Pour le fournisseur de ressources, vérifiez l’ID d’objet du principal de service tiers pour votre abonnement.

    ARO_RP_SP_OBJECT_ID=$(az ad sp list --display-name "Azure Red Hat OpenShift RP" --query '[0].id' -o tsv)
    
  5. Déployez le modèle ARM :

    az deployment group create \
      --name aroDeployment \
      --resource-group $RESOURCEGROUP \
      --template-file azuredeploy.json \
      --parameters location=$LOCATION \
      --parameters version=$VERSION \
      --parameters clusterName=$CLUSTER \
      --parameters rpObjectId=$ARO_RP_SP_OBJECT_ID
    

    Si vous utilisez les paramètres facultatifs pour le secret d’extraction ou le domaine personnalisé, ajoutez un antislash de continuation de ligne (\) après le paramètre rpObjectId et incluez les paramètres suivants dans la commande de déploiement :

    --parameters domain=$DOMAIN \ #optional
    --parameters pullSecret=$PULL_SECRET # optional
    

Exemple de modèle Resource Manager

Remarque

Cet article suppose que seuls les sous-réseaux maître et ouvrier sont présents. Si vous avez configuré davantage de sous-réseaux de cluster au moment de l’installation, vous devez accorder l’étendue d’attribution de rôle à ces sous-réseaux, pour les opérateurs qui en ont besoin.

Les attributions de rôle suivantes pour les sous-réseaux maître et de travailleur supposent qu'aucun groupe de sécurité réseau (NSG), table de routage ou passerelle de traduction d'adresses réseau (NAT) n'est attaché. Si vous apportez l’une de ces ressources réseau à l’installation, vous devez créer davantage d’attributions de rôles qui accordent des autorisations d’identités d’opérateur pour ces ressources réseau supplémentaires. Pour chaque opérateur qui nécessite une attribution de rôle pour les sous-réseaux suivants ou le réseau virtuel, il nécessite également une attribution de rôle pour la ressource réseau supplémentaire.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "metadata": {
    "_generator": {
      "name": "bicep",
      "version": "0.38.33.27573",
      "templateHash": "9848565761041118745"
    }
  },
  "parameters": {
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Location"
      }
    },
    "domain": {
      "type": "string",
      "metadata": {
        "description": "Domain Prefix"
      }
    },
    "version": {
      "type": "string",
      "metadata": {
        "description": "Version of the OpenShift cluster"
      }
    },
    "pullSecret": {
      "type": "securestring",
      "defaultValue": "",
      "metadata": {
        "description": "Pull secret from cloud.redhat.com. The json should be input as a string"
      }
    },
    "clusterVnetName": {
      "type": "string",
      "defaultValue": "aro-vnet",
      "metadata": {
        "description": "Name of vNet"
      }
    },
    "clusterVnetCidr": {
      "type": "string",
      "defaultValue": "10.100.0.0/15",
      "metadata": {
        "description": "vNet Address Space"
      }
    },
    "workerSubnetCidr": {
      "type": "string",
      "defaultValue": "10.100.70.0/23",
      "metadata": {
        "description": "Worker node subnet address space"
      }
    },
    "masterSubnetCidr": {
      "type": "string",
      "defaultValue": "10.100.76.0/24",
      "metadata": {
        "description": "Master node subnet address space"
      }
    },
    "masterVmSize": {
      "type": "string",
      "defaultValue": "Standard_D8s_v3",
      "metadata": {
        "description": "Master Node VM Type"
      }
    },
    "workerVmSize": {
      "type": "string",
      "defaultValue": "Standard_D4s_v3",
      "metadata": {
        "description": "Worker Node VM Type"
      }
    },
    "workerVmDiskSize": {
      "type": "int",
      "defaultValue": 128,
      "minValue": 128,
      "metadata": {
        "description": "Worker Node Disk Size in GB"
      }
    },
    "podCidr": {
      "type": "string",
      "defaultValue": "10.128.0.0/14",
      "metadata": {
        "description": "Cidr for Pods"
      }
    },
    "serviceCidr": {
      "type": "string",
      "defaultValue": "172.30.0.0/16",
      "metadata": {
        "description": "Cidr of service"
      }
    },
    "clusterName": {
      "type": "string",
      "metadata": {
        "description": "Unique name for the cluster"
      }
    },
    "apiServerVisibility": {
      "type": "string",
      "defaultValue": "Public",
      "allowedValues": [
        "Private",
        "Public"
      ],
      "metadata": {
        "description": "Api Server Visibility"
      }
    },
    "ingressVisibility": {
      "type": "string",
      "defaultValue": "Public",
      "allowedValues": [
        "Private",
        "Public"
      ],
      "metadata": {
        "description": "Ingress Visibility"
      }
    },
    "rpObjectId": {
      "type": "string",
      "metadata": {
        "description": "The ObjectID of the Resource Provider Service Principal"
      }
    },
    "fips": {
      "type": "string",
      "defaultValue": "Disabled",
      "allowedValues": [
        "Enabled",
        "Disabled"
      ],
      "metadata": {
        "description": "Specify if FIPS validated crypto modules are used"
      }
    },
    "masterEncryptionAtHost": {
      "type": "string",
      "defaultValue": "Disabled",
      "allowedValues": [
        "Enabled",
        "Disabled"
      ],
      "metadata": {
        "description": "Specify if master VMs are encrypted at host"
      }
    },
    "workerEncryptionAtHost": {
      "type": "string",
      "defaultValue": "Disabled",
      "allowedValues": [
        "Enabled",
        "Disabled"
      ],
      "metadata": {
        "description": "Specify if worker VMs are encrypted at host"
      }
    }
  },
  "variables": {
    "resourceGroupId": "[format('/subscriptions/{0}/resourceGroups/aro-{1}-{2}', subscription().subscriptionId, parameters('domain'), parameters('location'))]",
    "masterSubnetId": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('clusterVnetName'), 'master')]",
    "workerSubnetId": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('clusterVnetName'), 'worker')]"
  },
  "resources": [
    {
      "type": "Microsoft.Network/virtualNetworks",
      "apiVersion": "2023-06-01",
      "name": "[parameters('clusterVnetName')]",
      "location": "[parameters('location')]",
      "properties": {
        "addressSpace": {
          "addressPrefixes": [
            "[parameters('clusterVnetCidr')]"
          ]
        },
        "subnets": [
          {
            "name": "master",
            "properties": {
              "addressPrefixes": [
                "[parameters('masterSubnetCidr')]"
              ],
              "serviceEndpoints": [
                {
                  "service": "Microsoft.ContainerRegistry"
                }
              ]
            }
          },
          {
            "name": "worker",
            "properties": {
              "addressPrefixes": [
                "[parameters('workerSubnetCidr')]"
              ],
              "serviceEndpoints": [
                {
                  "service": "Microsoft.ContainerRegistry"
                }
              ]
            }
          }
        ]
      }
    },
    {
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
      "apiVersion": "2023-01-31",
      "name": "cloud-controller-manager",
      "location": "[parameters('location')]"
    },
    {
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
      "apiVersion": "2023-01-31",
      "name": "ingress",
      "location": "[parameters('location')]"
    },
    {
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
      "apiVersion": "2023-01-31",
      "name": "machine-api",
      "location": "[parameters('location')]"
    },
    {
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
      "apiVersion": "2023-01-31",
      "name": "disk-csi-driver",
      "location": "[parameters('location')]"
    },
    {
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
      "apiVersion": "2023-01-31",
      "name": "cloud-network-config",
      "location": "[parameters('location')]"
    },
    {
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
      "apiVersion": "2023-01-31",
      "name": "image-registry",
      "location": "[parameters('location')]"
    },
    {
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
      "apiVersion": "2023-01-31",
      "name": "file-csi-driver",
      "location": "[parameters('location')]"
    },
    {
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
      "apiVersion": "2023-01-31",
      "name": "aro-operator",
      "location": "[parameters('location')]"
    },
    {
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
      "apiVersion": "2023-01-31",
      "name": "cluster",
      "location": "[parameters('location')]"
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Network/virtualNetworks/{0}/subnets/{1}', parameters('clusterVnetName'), 'master')]",
      "name": "[guid(resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('clusterVnetName'), 'master'), 'cloud-controller-manager')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-controller-manager'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'a1f96423-95ce-4224-ab27-4e3dc72facd4')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-controller-manager')]",
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Network/virtualNetworks/{0}/subnets/{1}', parameters('clusterVnetName'), 'worker')]",
      "name": "[guid(resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('clusterVnetName'), 'worker'), 'cloud-controller-manager')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-controller-manager'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'a1f96423-95ce-4224-ab27-4e3dc72facd4')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-controller-manager')]",
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Network/virtualNetworks/{0}/subnets/{1}', parameters('clusterVnetName'), 'master')]",
      "name": "[guid(resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('clusterVnetName'), 'master'), 'ingress')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'ingress'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0336e1d3-7a87-462b-b6db-342b63f7802c')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'ingress')]",
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Network/virtualNetworks/{0}/subnets/{1}', parameters('clusterVnetName'), 'worker')]",
      "name": "[guid(resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('clusterVnetName'), 'worker'), 'ingress')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'ingress'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0336e1d3-7a87-462b-b6db-342b63f7802c')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'ingress')]",
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Network/virtualNetworks/{0}/subnets/{1}', parameters('clusterVnetName'), 'master')]",
      "name": "[guid(resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('clusterVnetName'), 'master'), 'machine-api')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'machine-api'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0358943c-7e01-48ba-8889-02cc51d78637')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'machine-api')]",
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Network/virtualNetworks/{0}/subnets/{1}', parameters('clusterVnetName'), 'worker')]",
      "name": "[guid(resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('clusterVnetName'), 'worker'), 'machine-api')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'machine-api'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0358943c-7e01-48ba-8889-02cc51d78637')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'machine-api')]",
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Network/virtualNetworks/{0}', parameters('clusterVnetName'))]",
      "name": "[guid(resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName')), 'cloud-network-config')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-network-config'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'be7a6435-15ae-4171-8f30-4a343eff9e8f')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-network-config')]",
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Network/virtualNetworks/{0}', parameters('clusterVnetName'))]",
      "name": "[guid(resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName')), 'file-csi-driver')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'file-csi-driver'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0d7aedc0-15fd-4a67-a412-efad370c947e')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'file-csi-driver')]",
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Network/virtualNetworks/{0}', parameters('clusterVnetName'))]",
      "name": "[guid(resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName')), 'image-registry')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'image-registry'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '8b32b316-c2f5-4ddf-b05b-83dacd2d08b5')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'image-registry')]",
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Network/virtualNetworks/{0}/subnets/{1}', parameters('clusterVnetName'), 'master')]",
      "name": "[guid(resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('clusterVnetName'), 'master'), 'aro-operator')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'aro-operator'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '4436bae4-7702-4c84-919b-c4069ff25ee2')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'aro-operator')]",
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Network/virtualNetworks/{0}/subnets/{1}', parameters('clusterVnetName'), 'worker')]",
      "name": "[guid(resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('clusterVnetName'), 'worker'), 'aro-operator')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'aro-operator'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '4436bae4-7702-4c84-919b-c4069ff25ee2')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'aro-operator')]",
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.ManagedIdentity/userAssignedIdentities/{0}', 'cloud-controller-manager')]",
      "name": "[guid(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-controller-manager'), 'cluster')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-controller-manager')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster')]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.ManagedIdentity/userAssignedIdentities/{0}', 'ingress')]",
      "name": "[guid(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'ingress'), 'cluster')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'ingress')]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.ManagedIdentity/userAssignedIdentities/{0}', 'machine-api')]",
      "name": "[guid(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'machine-api'), 'cluster')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'machine-api')]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.ManagedIdentity/userAssignedIdentities/{0}', 'disk-csi-driver')]",
      "name": "[guid(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'disk-csi-driver'), 'cluster')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'disk-csi-driver')]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.ManagedIdentity/userAssignedIdentities/{0}', 'cloud-network-config')]",
      "name": "[guid(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-network-config'), 'cluster')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-network-config')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster')]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.ManagedIdentity/userAssignedIdentities/{0}', 'image-registry')]",
      "name": "[guid(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'image-registry'), 'cluster')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'image-registry')]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.ManagedIdentity/userAssignedIdentities/{0}', 'file-csi-driver')]",
      "name": "[guid(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'file-csi-driver'), 'cluster')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'file-csi-driver')]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.ManagedIdentity/userAssignedIdentities/{0}', 'aro-operator')]",
      "name": "[guid(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'aro-operator'), 'cluster')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'aro-operator')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster')]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Network/virtualNetworks/{0}', parameters('clusterVnetName'))]",
      "name": "[guid(resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName')), parameters('rpObjectId'))]",
      "properties": {
        "principalId": "[parameters('rpObjectId')]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '4d97b98b-1d4f-4787-a291-c67834d212e7')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
      ]
    },
    {
      "type": "Microsoft.RedHatOpenShift/openShiftClusters",
      "apiVersion": "2024-08-12-preview",
      "name": "[parameters('clusterName')]",
      "location": "[parameters('location')]",
      "properties": {
        "clusterProfile": {
          "domain": "[parameters('domain')]",
          "resourceGroupId": "[variables('resourceGroupId')]",
          "version": "[parameters('version')]",
          "fipsValidatedModules": "[parameters('fips')]",
          "pullSecret": "[parameters('pullSecret')]"
        },
        "networkProfile": {
          "podCidr": "[parameters('podCidr')]",
          "serviceCidr": "[parameters('serviceCidr')]"
        },
        "masterProfile": {
          "vmSize": "[parameters('masterVmSize')]",
          "subnetId": "[variables('masterSubnetId')]",
          "encryptionAtHost": "[parameters('masterEncryptionAtHost')]"
        },
        "workerProfiles": [
          {
            "name": "worker",
            "count": 3,
            "diskSizeGB": "[parameters('workerVmDiskSize')]",
            "vmSize": "[parameters('workerVmSize')]",
            "subnetId": "[variables('workerSubnetId')]",
            "encryptionAtHost": "[parameters('workerEncryptionAtHost')]"
          }
        ],
        "apiserverProfile": {
          "visibility": "[parameters('apiServerVisibility')]"
        },
        "ingressProfiles": [
          {
            "name": "default",
            "visibility": "[parameters('ingressVisibility')]"
          }
        ],
        "platformWorkloadIdentityProfile": {
          "platformWorkloadIdentities": {
            "cloud-controller-manager": {
              "resourceId": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-controller-manager')]"
            },
            "ingress": {
              "resourceId": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'ingress')]"
            },
            "machine-api": {
              "resourceId": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'machine-api')]"
            },
            "disk-csi-driver": {
              "resourceId": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'disk-csi-driver')]"
            },
            "cloud-network-config": {
              "resourceId": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-network-config')]"
            },
            "image-registry": {
              "resourceId": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'image-registry')]"
            },
            "file-csi-driver": {
              "resourceId": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'file-csi-driver')]"
            },
            "aro-operator": {
              "resourceId": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'aro-operator')]"
            }
          }
        }
      },
      "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "[format('{0}', resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster'))]": {}
        }
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'aro-operator')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-controller-manager')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-network-config')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'disk-csi-driver')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'file-csi-driver')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'image-registry')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'ingress')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'machine-api')]"
      ]
    }
  ]
}

Nettoyage

Pour supprimer un cluster d’identité managée, exécutez la commande suivante :

az aro delete -n $CLUSTER -g $RESOURCEGROUP

La commande delete ne nettoie pas les identités managées affectées par le cluster qui ont été créées dans le cadre de l’installation. Vous devez supprimer manuellement les identités et les attributions de rôles.

Pour plus d’informations, consultez Comprendre les identités managées dans Azure Red Hat OpenShift (préversion).