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 un clúster de Red Hat OpenShift de Azure mediante identidades administradas.
Importante
Actualmente, esta característica red Hat OpenShift de Azure solo se ofrece en versión preliminar. Las características en versión preliminar están disponibles como opción de participación y autoservicio. Las versiones preliminares se proporcionan tal cual y están disponibles, y se excluyen de los contratos de nivel de servicio y la garantía limitada. Las versiones preliminares de Red Hat OpenShift en Azure reciben cobertura parcial del soporte al cliente en la medida de lo posible. Por lo tanto, estas características no están diseñadas para su uso en producción.
Red Hat OpenShift en Azure 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
Asegúrese de que usa la versión 2.67.0 o posterior de la CLI de Azure. 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:
- Sistema de arranque: 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.
Por ejemplo, para comprobar la cuota de suscripción actual del SKU de la familia de máquinas virtuales más pequeña admitida "Standard DSv5":
LOCATION=eastus
az vm list-usage -l $LOCATION \
--query "[?contains(name.value, 'standardDSv5Family')]" -o table
Descargue el archivo de rueda de extensión Red Hat OpenShift de Azure (solo versión preliminar)
Para ejecutar los comandos de este artículo, descargue primero el archivo de rueda de extensión Red Hat OpenShift de Azure desde https://aka.ms/az-aroext-latest. Para instalar la extensión , ejecute el siguiente comando:
az extension add -s <path to downloaded whl file>
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
Algunos proveedores de recursos de Azure, incluido el proveedor de recursos red Hat OpenShift de Azure, requieren el registro para funcionar. El registro de un proveedor de recursos crea una entidad de servicio dentro de la suscripción que autoriza al proveedor de recursos a realizar determinadas acciones, como la creación de recursos. 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 --wait
Registre el proveedor de recursos
Microsoft.Compute
:az provider register -n Microsoft.Compute --wait
Registre el proveedor de recursos
Microsoft.Storage
:az provider register -n Microsoft.Storage --wait
Registre 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)
Nota:
El secreto de extracción de Azure Red Hat OpenShift no cambia el costo de la licencia de Red Hat OpenShift para ello.
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 RedHat y, por tanto, está deshabilitada de manera 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 y, a continuación, descargue un secreto de extracción que se usará con el clúster de Red Hat OpenShift de Azure.
Mantenga el archivo de
pull-secret.txt
guardado 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 al secreto de incorporación de cambios mediante el parámetro--pull-secret @pull-secret.txt
. Ejecuteaz aro create
desde el directorio donde haya almacenado el archivopull-secret.txt
. De lo contrario, reemplace@pull-secret.txt
por@/path/to/my/pull-secret.txt
.Si va a copiar el secreto de incorporación de cambios o hacer 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
--domain
especificado:- api : apunta a la dirección IP del servidor de API.
- *.apps: apunta a la dirección IP de entrada.
- Para recuperar estos valores, ejecute el comando siguiente después de la creación del clúster:
az aro show -n -g --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.io
integrado . - 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
Puede usar la CLI de Azure o Bicep para implementar un clúster de Red Hat OpenShift de Azure mediante identidades administradas.
Instalación mediante la CLI de Azure
En esta sección se describe cómo usar la CLI de Azure para crear un clúster de Red Hat OpenShift de Azure mediante identidades administradas.
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
az
comandos.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
Cree 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 $RESOURCEGROUP
Cree una red virtual, subredes principales y 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/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
Crear las identidades administradas asignadas al usuario necesarias
Cree las siguientes identidades necesarias. Red Hat OpenShift en Azure requiere nueve identidades administradas, cada una debe tener 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 Cluster Ingress de OpenShift (ingress)
- OpenShift Cloud Controller Manager (administrador de control en la nube)
- Operador de API de máquinas de OpenShift (machine-api)
- Operador de Azure Red Hat OpenShift Service (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.
Cree las identidades necesarias:
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
Cree las asignaciones de roles necesarias para cada identidad de operador, identidad de clúster y la entidad de servicio de primera parte.
Nota:
En este artículo se supone que solo están presentes las subredes principales 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 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/subnets/master" 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/subnets/worker" 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"
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: Puede proporcionar su secreto de extracción de Red Hat, lo que permite que su clúster acceda a los registros de contenedores de Red Hat junto con otros contenidos. Agregue el argumento
--pull-secret @pull-secret.txt
al comando. - Opción 2: Puede usar un dominio personalizado. Agregue el argumento
--domain foo.example.com
al comando, reemplazandofoo.example.com
por 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 otra región o grupo de recursos, puede pasar identificadores de recursos completos para crear. 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 .
Instalar usando Bicep
En esta sección se describe cómo usar Bicep para crear un clúster de Red Hat OpenShift de Azure mediante identidades administradas.
Guarde la plantilla ejemplo de Bicep (ubicada después del paso 5) en un archivo.
Establezca las siguientes variables en el entorno de shell que planea ejecutar los
az
comandos.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
Cree 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 $LOCATION
Para el proveedor de recursos, compruebe el identificador de objeto de la entidad de servicio principal de la suscripción.
ARO_RP_SP_OBJECT_ID=$(az ad sp list --display-name "Azure Red Hat OpenShift RP" --query '[0].id' -o tsv)
Aplique la plantilla 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_ID (--parameters domain=$DOMAIN) \ #optional (--parameters pullSecret=$PULL_SECRET) # optional
Plantilla de ejemplo Bicep
Nota:
En este artículo se supone que solo están presentes las subredes principales 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 ARO vNet')
param clusterVnetName string = 'aro-vnet'
@description('ARO 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 fileCsiDriverMasterSubnetRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(masterSubnet.id, 'file-csi-driver')
scope: masterSubnet
properties: {
principalId: fileCsiDriver.properties.principalId
roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0d7aedc0-15fd-4a67-a412-efad370c947e')
principalType: 'ServicePrincipal'
}
}
resource fileCsiDriverWorkerSubnetRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(workerSubnet.id, 'file-csi-driver')
scope: workerSubnet
properties: {
principalId: fileCsiDriver.properties.principalId
roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0d7aedc0-15fd-4a67-a412-efad370c947e')
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}': {}
}
}
}
Limpieza
Para eliminar un clúster de identidad administrada, ejecute el siguiente comando:
az aro delete -n $CLUSTER -g $RESOURCEGROUP
Tenga en cuenta que este 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.