Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se muestra cómo implementar una Red Hat OpenShift en Azure con un clúster de arquitectura estándar mediante identidades administradas. No se puede migrar un clúster existente que use una entidad de servicio para usar una identidad administrada. Debe crear un clúster que use una identidad administrada en un clúster de Red Hat OpenShift en Azure con arquitectura estándar.
Red Hat OpenShift en Azure con arquitectura estándar es un servicio de OpenShift administrado que admite identidades administradas e identidades de carga de trabajo. Las identidades administradas y las identidades de carga de trabajo ayudan a minimizar el riesgo al proteger las cargas de trabajo y las aplicaciones proporcionando tokens de corta duración en lugar de credenciales de larga duración, como una entidad de servicio con credenciales secretas de cliente.
Para obtener más información, consulte:
- Descripción de las identidades administradas en Red Hat OpenShift en Azure
- ¿Qué son las identidades de carga de trabajo?
- ¿Qué son las identidades administradas para los recursos de Azure?
Prerrequisitos
Si no usa el portal de Azure, asegúrese de que usa CLI de Azure versión 2.90.0 o posterior, que contiene los argumentos de la CLI totalmente compatibles para los clústeres de identidades administradas. Use az --version para buscar la versión de la CLI de Azure que ha instalado. Si necesita instalarla o actualizarla, vea Instalación de la CLI de Azure.
Red Hat OpenShift en Azure requiere un mínimo de 44 núcleos para crear un clúster de OpenShift. La cuota de recursos de Azure predeterminada para una nueva suscripción de Azure no cumple este requisito. Para solicitar un aumento en el límite de recursos, consulte Aumento de las cuotas de vCPU de la familia de máquinas virtuales.
Los 44 núcleos se usan de la siguiente manera:
- Bootstrap: 8 núcleos
- Plano de control (máquinas maestras): 24 núcleos
- Proceso (máquinas de trabajo): 12 núcleos
Una vez completada la instalación, se quita la máquina de arranque y el clúster usa un total de 36 núcleos. Para más información, consulte Instalación en Azure.
Ejecute el siguiente comando para comprobar la cuota de la suscripción de Azure para el tamaño de máquina virtual DSv5 estándar que es el tamaño de máquina virtual predeterminado para la CLI o el portal:
LOCATION=eastus
az vm list-usage -l $LOCATION \
--query "[?contains(name.value, 'standardDSv5Family')]" -o table
Comprobación de los permisos
En este artículo, creará un grupo de recursos que contiene la red virtual y las identidades administradas para el clúster. Para crear un grupo de recursos, necesita permisos de colaborador y administrador de acceso de usuario o permisos de propietario en el grupo de recursos o la suscripción que lo contiene.
También necesita permisos suficientes de Microsoft Entra (ya sea un usuario miembro del inquilino o un invitado asignado con el rol Administrador de aplicaciones) para crear un conjunto de identidades administradas y asignar roles para que el clúster lo use. Para obtener más información, vea Miembros e invitados yAsignar roles de administrador y no administrativos a los usuarios con el identificador de Microsoft Entra.
Registro de los proveedores de recursos
Para usar algunos proveedores de recursos de Azure, incluido el proveedor de recursos Red Hat OpenShift en Azure, debe registrarlos. Al registrar un proveedor de recursos, se crea una entidad de servicio en la suscripción que autoriza al proveedor de recursos a realizar determinadas acciones, como la creación de recursos. Para obtener instrucciones sobre cómo registrar proveedores de recursos mediante el portal de Azure o para obtener más información sobre el registro del proveedor de recursos, consulte Registro del proveedor de recursos.
Si tiene varias suscripciones de Azure, especifique el identificador de la relevante:
az account set --subscription <SUBSCRIPTION ID>Registre el proveedor de recursos
Microsoft.RedHatOpenShift:az provider register -n Microsoft.RedHatOpenShift --waitRegistre el proveedor de recursos
Microsoft.Compute:az provider register -n Microsoft.Compute --waitRegistre el proveedor de recursos
Microsoft.Storage:az provider register -n Microsoft.Storage --waitRegistre el proveedor de recursos
Microsoft.Authorization:az provider register -n Microsoft.Authorization --wait
Obtención de un secreto de extracción de Red Hat (opcional)
Un secreto de extracción de Red Hat OpenShift en Azure no modifica el coste de la suscripción a Red Hat OpenShift.
Los secretos de extracción de Red Hat permiten al clúster acceder a los registros de contenedor de Red Hat, junto con otro contenido, como operadores de OperatorHub. Este paso es opcional, pero se recomienda. Si decidiera agregar el secreto de extracción más adelante, siga estas instrucciones. El campo cloud.openshift.com se quitará del secreto incluso aunque el secreto de extracción contenga ese campo. Este campo habilita una característica de supervisión adicional, que envía datos a Red Hat y, por tanto, está deshabilitado de forma predeterminada. Para habilitar esta característica, consulte Habilitación de informes de salud remoto.
Vaya al portal del administrador de clústeres de Red Hat OpenShift e inicie sesión.
Debe iniciar sesión en su cuenta de Red Hat o crear una nueva cuenta de Red Hat con su correo electrónico empresarial y aceptar los términos y condiciones.
Seleccione Descargar secreto de extracción para guardar una copia para usarla con el clúster de Red Hat OpenShift en Azure.
Mantenga el archivo de
pull-secret.txtguardado en algún lugar seguro. El archivo se usa en cada creación de clústeres si necesita crear un clúster que incluya muestras o operadores para Red Hat o asociados certificados.Al ejecutar el comando
az aro create, puede hacer referencia a su secreto de extracción mediante el parámetro--pull-secret @pull-secret.txt. Ejecuteaz aro createdesde el directorio donde almacenó elpull-secret.txtarchivo. De lo contrario, reemplace@pull-secret.txtpor@/path/to/my/pull-secret.txt.Si copias tu secreto de extracción o haces referencia a él en otros scripts, debe tener el formato de una cadena JSON válida.
Preparación de un dominio personalizado para el clúster (opcional)
Al ejecutar el comando az aro create, puede especificar un dominio personalizado para el clúster mediante el parámetro --domain foo.example.com.
Nota:
Agregar un nombre de dominio es opcional al crear un clúster a través de la CLI de Azure. Se necesita un nombre de dominio (o un prefijo usado como parte del nombre DNS generado automáticamente para los servidores de API y consola de OpenShift) al agregar un clúster a través del portal. Para más información, consulte Inicio rápido: Implementación de un clúster de Red Hat OpenShift de Azure mediante Azure Portal.
Si proporciona un dominio personalizado para el clúster, tenga en cuenta los siguientes puntos:
- Después de crear el clúster, debe crear dos registros DNS A en el servidor DNS para el
--domainespecificado:- api : apunta a la dirección IP del servidor de API.
- *.apps: apunta a la dirección IP de entrada.
- Recupere estos valores mediante la ejecución del comando siguiente después de la creación del clúster:
az aro show $CLUSTER -g $RESOURCEGROUP --query '{api:apiserverProfile.ip, ingress:ingressProfiles[0].ip}'.
- La consola de OpenShift está disponible en una dirección URL como
https://console-openshift-console.apps.example.com, en lugar del dominiohttps://console-openshift-console.apps.<random>.<location>.aroapp.iointegrado . - De forma predeterminada, OpenShift usa certificados autofirmados para todas las rutas creadas en los dominios personalizados
*.apps.example.com. Si decide usar DNS personalizado después de conectarse al clúster, debe seguir la documentación de OpenShift para configurar una CA personalizada para el controlador de entrada y una CA personalizada para el servidor de API.
Instalación mediante el CLI de Azure
En esta sección se describe cómo usar el CLI de Azure para crear un clúster de Red Hat OpenShift en Azure mediante identidades administradas. Tiene tres opciones para crear el clúster mediante la CLI:
- Totalmente automatizado: la CLI controla la creación de las identidades administradas asignadas por el usuario necesarias, las asignaciones de roles y la creación del clúster en un comando. Todavía debe crear previamente los recursos de red.
-
Parcialmente automatizado: la creación del clúster consta de dos partes:
- Creación de identidades y asignaciones de roles: la CLI crea las identidades necesarias y las asignaciones de roles.
- Creación de clústeres: ejecute el comando cluster create que proporciona los nombres de identidad administrada (o identificadores de recursos) que acaba de crear.
-
Manual: usted crea las identidades administradas asignadas por el usuario necesarias y las asignaciones de roles, y luego las proporciona en el comando de creación del clúster.
- También puede hacer que la CLI genere los comandos para que se ejecuten con el fin de crear las identidades necesarias y las asignaciones de roles.
Creación de una red virtual que contenga dos subredes vacías
Cree una red virtual con dos subredes vacías. Si tiene una red virtual existente que satisfaga sus necesidades, omita este paso.
Para más información sobre las redes y los requisitos, consulte Redes para Red Hat OpenShift en Azure.
Establezca las siguientes variables en el entorno de shell en el que se ejecutan los
azcomandos.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 clusterCree un grupo de recursos.
Un grupo de recursos de Azure es un grupo lógico en el que se implementan y administran los recursos de Azure. Cuando se crea un grupo de recursos, se le pide que especifique una ubicación. Esta ubicación es donde se almacenan los metadatos del grupo de recursos y el lugar en el que los recursos se ejecutan en Azure si no se especifica otra región al crearlos. Cree un grupo de recursos con el comando az group create.
Nota:
Red Hat OpenShift en Azure no está disponible en todas las regiones en las que se puede crear un grupo de recursos de Azure. Consulte Regiones disponibles para obtener información sobre dónde se admite Red Hat OpenShift en Azure.
az group create \ --location $LOCATION \ --name $RESOURCEGROUPCrea una red virtual, una subred maestra y subredes de trabajo en el mismo grupo de recursos creado anteriormente.
Los clústeres de Red Hat OpenShift de Azure requieren una red virtual con dos subredes vacías para los nodos maestros y de trabajo. Puede crear una red virtual o usar una red virtual existente.
az network vnet create \ --resource-group $RESOURCEGROUP \ --name aro-vnet \ --address-prefixes 10.0.0.0/22az network vnet subnet create \ --resource-group $RESOURCEGROUP \ --vnet-name aro-vnet \ --name master \ --address-prefixes 10.0.0.0/23az network vnet subnet create \ --resource-group $RESOURCEGROUP \ --vnet-name aro-vnet \ --name worker \ --address-prefixes 10.0.2.0/23
Métodos de creación
Totalmente automatizado
Para crear un clúster mediante el método totalmente automatizado, ejecute el siguiente comando que agrega el --enable-managed-identity parámetro . Este comando también crea las identidades administradas asignadas por el usuario necesarias y las asignaciones de roles. Para agregar un secreto de extracción o usar un dominio personalizado, consulte Creación del clúster.
az aro create \
--resource-group $RESOURCEGROUP \
--name $CLUSTER \
--vnet aro-vnet \
--master-subnet master \
--worker-subnet worker \
--version <VERSION> \
--enable-managed-identity
Comienza la creación del clúster. Si desea usar una versión específica de OpenShift, consulte Selección de una versión de Red Hat OpenShift en Azure diferente. Cuando el clúster esté listo, consulte Limpieza para obtener información sobre cómo eliminarlo.
Parcialmente automatizado
Para crear solo las identidades administradas asignadas por el usuario necesarias y las asignaciones de roles, ejecute el siguiente comando:
az aro identity create-required \
--resource-group $RESOURCEGROUP \
--location $LOCATION \
--vnet aro-vnet \
--master-subnet master \
--worker-subnet worker \
--version <VERSION>
Una vez finalizado el comando, verá los detalles de cada identidad administrada creada.
Ejemplo:
[
{
"clientId": "22222222-2222-2222-2222-222222222222",
"id": "/subscriptions/<SUBSCRIPTION>/resourcegroups/<RESOURCEGROUP>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/aro-cluster",
"isolationScope": "None",
"location": "westus3",
"name": "aro-cluster",
"principalId": "33333333-3333-3333-3333-333333333333",
"resourceGroup": "<RESOURCEGROUP>",
"tags": {},
"tenantId": "11111111-1111-1111-1111-111111111111",
"type": "Microsoft.ManagedIdentity/userAssignedIdentities"
},
[...]
Continúe con el uso de los nombres de identidad o los identificadores de recursos devueltos desde el comando anterior en el comando Crear el clúster .
Manual
Cree de forma independiente las identidades administradas asignadas por el usuario necesarias y las asignaciones de roles y, a continuación, Cree el clúster.
Cree las identidades administradas asignadas por el usuario necesarias. Red Hat OpenShift en Azure requiere nueve identidades administradas, cada una de las cuales necesita un rol integrado asignado:
- Siete identidades administradas relacionadas con los principales operadores de OpenShift.
- Una identidad administrada para el operador de servicio Red Hat OpenShift en Azure.
- Otra identidad del clúster para habilitar el uso de estas identidades.
Los componentes de identidad administrada son:
- Operador de Registro de Imágenes de OpenShift (image-registry)
- Operador de red de OpenShift (cloud-network-config)
- Operador de almacenamiento en disco de OpenShift (disk-csi-driver)
- Operador de almacenamiento de archivos de OpenShift (file-csi-driver)
- Operador de entrada de clúster de OpenShift (ingress)
- OpenShift Cloud Controller Manager (administrador de control en la nube)
- Operador de API de máquinas de OpenShift (machine-api)
- Operador del servicio Red Hat OpenShift en Azure (aro-operator)
Hay ocho identidades administradas diferentes y los roles integrados correspondientes que representan los permisos necesarios para cada componente de Red Hat OpenShift de Azure para realizar sus tareas. Además, la plataforma requiere una otra identidad, la identidad del clúster, para realizar la creación de credenciales federadas para los componentes de identidad administrada enumerados anteriormente (aro-cluster).
Para obtener más información sobre los operadores de clúster de Red Hat OpenShift, consulte Referencia de operadores de clúster.
Para más información sobre las identidades administradas en Red Hat OpenShift en Azure, consulte Descripción de las identidades administradas en Red Hat OpenShift en Azure.
Nota:
También puede obtener los comandos de creación de identidades y asignación de roles de la CLI mediante
az aro identity get-required.Cree las identidades necesarias:
az identity create \ --resource-group $RESOURCEGROUP \ --name aro-clusteraz identity create \ --resource-group $RESOURCEGROUP \ --name cloud-controller-manageraz identity create \ --resource-group $RESOURCEGROUP \ --name ingressaz identity create \ --resource-group $RESOURCEGROUP \ --name machine-apiaz identity create \ --resource-group $RESOURCEGROUP \ --name disk-csi-driveraz identity create \ --resource-group $RESOURCEGROUP \ --name cloud-network-configaz identity create \ --resource-group $RESOURCEGROUP \ --name image-registryaz identity create \ --resource-group $RESOURCEGROUP \ --name file-csi-driveraz identity create \ --resource-group $RESOURCEGROUP \ --name aro-operatorCree las asignaciones de roles necesarias para cada identidad de operador, identidad de clúster y la entidad de servicio de primera parte.
Nota:
Este artículo da por hecho que solo hay subredes maestras y de trabajo. Si configuró más subredes de clúster en tiempo de instalación, debe conceder el ámbito de asignación de roles a esas subredes, para los operadores que lo requieran.
Las siguientes asignaciones de roles para subredes maestras y de trabajo suponen que no hay ningún grupo de seguridad de red (NSG), tabla de rutas o puerta de enlace de traducción de direcciones de red (NAT) conectada. Si trae cualquiera de esos recursos de red a la instalación, debe crear más asignaciones de roles que concedan permisos de identidades de operador para esos recursos de red adicionales. Para cada operador que requiera una asignación de roles para las siguientes subredes o la red virtual, también requiere una asignación de roles para el recurso de red adicional.
SUBSCRIPTION_ID=$(az account show --query 'id' -o tsv) # assign cluster identity permissions over the identities 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/42f3c60f-e7b1-46d7-ba56-6de681664342" \ --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/aro-vnet"
Creación del clúster
Para crear un clúster, ejecute el siguiente comando que se muestra en las opciones. Si decide usar cualquiera de las siguientes opciones, modifique el comando según corresponda:
- Opción 1: Pase el secreto de extracción de Red Hat, que permite al clúster acceder a registros de contenedor de Red Hat junto con otro contenido. Agregue el argumento
--pull-secret @pull-secret.txtal comando. - Opción 2: Usar un dominio personalizado. Agregue el argumento
--domain foo.example.comal comando, reemplazandofoo.example.compor su propio dominio personalizado.
Cree el clúster con las variables de entorno necesarias. Para cada --assign-platform-workload-identity marca, el primer argumento representa la clave, que indica al proveedor de recursos red Hat OpenShift de Azure qué operador de OpenShift debe usar para una identidad determinada. El segundo argumento representa la referencia a la propia identidad.
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
Como opción, si existen recursos de identidad en una región o un grupo de recursos diferentes, puedes pasar los ID completos de los recursos para crearlos. Vea el ejemplo siguiente:
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
Selección de otra versión de Red Hat OpenShift en Azure
Puede optar por usar una versión específica de Red Hat OpenShift en Azure al crear el clúster. En primer lugar, use la CLI para consultar las versiones disponibles de Red Hat OpenShift en Azure:
az aro get-versions --location <REGION>
Una vez elegida la versión, especifíquela con el --version parámetro en el az aro create comando .
Instala utilizando Bicep
En esta sección se describe cómo usar Bicep para crear un clúster de Red Hat OpenShift de Azure con identidades administradas.
Guarde el archivo de Bicep de ejemplo en un archivo. En este ejemplo, guárdelo como azuredeploy.bicep.
Establezca las siguientes variables en el entorno de shell que planea ejecutar los
azcomandos.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.21.22 # the version of the cluster PULL_SECRET=$(cat pull-secret.txt) # the Red Hat pull secret JSON, provided as file or stringCree un grupo de recursos para contener el recurso de clúster y la red virtual del clúster y las identidades.
az group create --name $RESOURCEGROUP --location $LOCATIONPara el proveedor de recursos, comprueba el ID del objeto de entidad de servicio propio de tu suscripción.
ARO_RP_SP_OBJECT_ID=$(az ad sp list --display-name "Azure Red Hat OpenShift RP" --query '[0].id' -o tsv)Implemente el archivo de 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_IDSi utiliza los parámetros opcionales para el secreto de extracción o el dominio personalizado, añada una barra invertida de continuación de línea (
\) después delrpObjectIdparámetro e incluya los siguientes parámetros en el comando de implementación:--parameters domain=$DOMAIN \ #optional --parameters pullSecret=$PULL_SECRET # optional
Archivo Bicep de ejemplo
Nota:
Este artículo da por hecho que solo hay subredes maestras y de trabajo. Si configuró más subredes de clúster en tiempo de instalación, debe conceder el ámbito de asignación de roles a esas subredes, para los operadores que lo requieran.
Las siguientes asignaciones de roles para subredes maestras y de trabajo suponen que no hay ningún grupo de seguridad de red (NSG), tabla de rutas o puerta de enlace de traducción de direcciones de red (NAT) conectada. Si trae cualquiera de esos recursos de red a la instalación, debe crear más asignaciones de roles que concedan permisos de identidades de operador para esos recursos de red adicionales. Para cada operador que requiera una asignación de roles para las siguientes subredes o la red virtual, también requiere una asignación de roles para el recurso de red adicional.
@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', '42f3c60f-e7b1-46d7-ba56-6de681664342')
principalType: 'ServicePrincipal'
}
}
// create cluster
resource cluster 'Microsoft.RedHatOpenShift/openShiftClusters@2025-07-25' = {
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}': {}
}
}
}
Instalación mediante una plantilla de ARM
En esta sección se describe cómo usar una plantilla de ARM para crear un clúster de Red Hat OpenShift de Azure con identidades administradas.
Guarde la plantilla de ARM de ejemplo en un archivo. En este ejemplo, asigne al archivo el nombre azuredeploy.json.
Establezca las siguientes variables en el entorno de shell que planea ejecutar los
azcomandos.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.21.22 # the version of the cluster PULL_SECRET=$(cat pull-secret.txt) # the Red Hat pull secret JSON, provided as file or stringCree un grupo de recursos para contener el recurso de clúster y la red virtual del clúster y las identidades.
az group create --name $RESOURCEGROUP --location $LOCATIONPara el proveedor de recursos, comprueba el ID del objeto de entidad de servicio propio de tu suscripción.
ARO_RP_SP_OBJECT_ID=$(az ad sp list --display-name "Azure Red Hat OpenShift RP" --query '[0].id' -o tsv)Implementación de la plantilla de 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_IDSi utiliza los parámetros opcionales para el secreto de extracción o el dominio personalizado, añada una barra invertida de continuación de línea (
\) después delrpObjectIdparámetro e incluya los siguientes parámetros en el comando de implementación:--parameters domain=$DOMAIN \ #optional --parameters pullSecret=$PULL_SECRET # optional
Ejemplo de plantilla de ARM
Nota:
Este artículo da por hecho que solo hay subredes maestras y de trabajo. Si configuró más subredes de clúster en tiempo de instalación, debe conceder el ámbito de asignación de roles a esas subredes, para los operadores que lo requieran.
Las siguientes asignaciones de roles para subredes maestras y de trabajo suponen que no hay ningún grupo de seguridad de red (NSG), tabla de rutas o puerta de enlace de traducción de direcciones de red (NAT) conectada. Si trae cualquiera de esos recursos de red a la instalación, debe crear más asignaciones de roles que concedan permisos de identidades de operador para esos recursos de red adicionales. Para cada operador que requiera una asignación de roles para las siguientes subredes o la red virtual, también requiere una asignación de roles para el recurso de red adicional.
{
"$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', '42f3c60f-e7b1-46d7-ba56-6de681664342')]",
"principalType": "ServicePrincipal"
},
"dependsOn": [
"[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
]
},
{
"type": "Microsoft.RedHatOpenShift/openShiftClusters",
"apiVersion": "2025-07-25",
"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')]"
]
}
]
}
Creación de un clúster de Red Hat OpenShift en Azure
Inicie sesión en Azure Portal.
En el menú de Azure Portal o en la página Inicio, seleccione Todos los servicios en las tres barras horizontales situadas en la página superior izquierda.
Busque y seleccione Clústeres de Red Hat OpenShift en Azure.
Selecciona Crear.
En la pestaña Información básica, configure las siguientes opciones:
-
Detalles del proyecto:
- Seleccione una suscripción de Azure.
- Seleccione o cree un grupo de recursos de Azure, como
test-aro-rg.
-
Detalles de instancia:
- Seleccione una Región para el clúster de Red Hat OpenShift en Azure.
- Escriba un nombre de clúster de OpenShift, como
testcluster. - Escriba un nombre de dominio, como
testdomain. - Selección de una versión de clúster de OpenShift
- Seleccione Tamaño de máquina virtual maestra y Tamaño de máquina virtual de trabajo.
- Seleccione Número de nodos de trabajo (el número de nodos de trabajo que se van a crear).
Nota:
El campo Nombre de dominio se rellena previamente con una cadena aleatoria. Puede especificar un nombre de dominio como example.com o una cadena o prefijo como abc que se usa como parte del nombre DNS generado automáticamente para los servidores de API y consola de OpenShift. Este prefijo también se usa como parte del nombre del grupo de recursos que se crea para hospedar las máquinas virtuales del clúster si no se especifica un nombre de grupo de recursos.
-
Detalles del proyecto:
En la pestaña Autenticación, complete las siguientes secciones.
Puede seleccionar el mecanismo de autenticación para su clúster utilizando ya sea identidades administradas o un principal de servicio. El valor predeterminado es la identidad administrada.
En Identidad administrada, seleccione Crear identidades y roles automáticamente o Usar identidades y asignaciones de roles existentes.
Si selecciona Crear identidades y roles automáticamente, el usuario que ha iniciado sesión debe tener permisos para crear identidades administradas asignadas por el usuario y asignaciones de roles. Las identidades administradas asignadas por el usuario necesarias y las asignaciones de roles adecuadas mediante los roles integrados correspondientes se realizarán en su nombre.
Si selecciona Usar identidades existentes y asignaciones de roles, debe tener las identidades administradas asignadas por el usuario correctas y las asignaciones de roles correspondientes ya creadas. Al seleccionar esta opción, se expandirá una sección a continuación, lo que le permitirá seleccionar la identidad administrada asignada por el usuario para cada componente.
Nota:
Consulte Descripción de la arquitectura de asignación de roles de identidad para obtener información detallada sobre las identidades administradas asignadas por el usuario y las asignaciones de roles que se deben crear.
Haga clic en Seleccionar para cada componente y la hoja de selección de identidad se abrirá a la derecha, lo que le permite seleccionar la identidad administrada correspondiente.
En la pestaña Redes, configure las opciones necesarias.
Nota:
Los clústeres de Red Hat OpenShift en Azure que ejecutan OpenShift 4 requieren una red virtual con dos subredes vacías: una para el plano de control y otra para los nodos de trabajo.
Nota:
Si usa identidades administradas existentes, debe tener una red virtual y subredes existentes. No podrá crear una red virtual como parte del flujo de creación del clúster.
En la pestaña Etiquetas, agregue etiquetas para organizar los recursos.
Seleccione Revisar y crear y, a continuación, Crear cuando se complete la validación. Tome nota del mecanismo de autenticación seleccionado y de si eligió el flujo de identidades automatizadas o existentes.
La creación del clúster de Red Hat OpenShift en Azure tarda unos 45 minutos. Una vez finalizada la implementación, vaya al recurso; puede hacerlo de dos maneras:
- Seleccione Ir al recurso.
- Vaya al grupo de recursos del clúster red Hat OpenShift de Azure y seleccione el recurso Red Hat OpenShift de Azure.
Limpieza
Para eliminar un clúster de identidad administrada, ejecute el siguiente comando:
az aro delete -n $CLUSTER -g $RESOURCEGROUP
El comando delete no limpia las identidades administradas asignadas por el clúster que se crearon como parte de la instalación. Debe eliminar manualmente las identidades y las asignaciones de roles.
Contenido relacionado
Para más información, consulte Descripción de las identidades administradas en Red Hat OpenShift en Azure.