Tutorial: Configuración de roles de control de acceso basado en rol (RBAC) en Azure Kubernetes Service (AKS) mediante Ansible

Importante

Para ejecutar los cuadernos de estrategias de ejemplo de este tutorial, se requiere Ansible 2.8 (o cualquier versión posterior).

Azure Kubernetes Service (AKS) simplifica la implementación en Azure de clústeres de Kubernetes administrados. AKS reduce la complejidad y la sobrecarga operativa de la administración de Kubernetes al descargar gran parte de esa responsabilidad en Azure. Como servicio hospedado de Kubernetes, Azure maneja tareas críticas como la supervisión del estado y el mantenimiento para usted. Azure administra los maestros de Kubernetes. Usted solo administra y mantiene los nodos del agente. Como servicio de Kubernetes administrado, AKS es gratuito (solo debe pagar los nodos de agente incluidos en sus clústeres, no los maestros).

AKS se puede configurar para usar microsoft Entra ID para la autenticación de usuario. Una vez configurado, se usa el token de autenticación de Microsoft Entra para iniciar sesión en el clúster de AKS. El RBAC puede basarse en la identidad de un usuario o en la pertenencia al grupo de directorio.

En este artículo aprenderá a:

  • Creación de un clúster de AKS habilitado para el identificador de Entra de Microsoft
  • Configurar un rol de RBAC en el clúster

Requisitos previos

  • Suscripción de Azure: si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
  • Instalar la biblioteca de RedHat OpenShift - pip install openshift

Configuración del identificador de Entra de Microsoft para la autenticación de AKS

Al configurar microsoft Entra ID para la autenticación de AKS, se configuran dos aplicaciones de Microsoft Entra. Un administrador del inquilino de Azure debe realizar esta operación. Para obtener más información, consulte Integración de Microsoft Entra ID con AKS.

Desde el Administrador de inquilinos de Azure, obtenga los siguientes valores:

  • Secreto de la aplicación de servidor
  • Id. de la aplicación de servidor
  • Id. de la aplicación cliente
  • Id. de inquilino

Estos valores son necesarios para ejecutar el cuaderno de estrategias de ejemplo.

Creación de un clúster de AKS

En esta sección, creará una instancia de AKS con la aplicación Microsoft Entra.

Estas son algunas notas importantes que hay que tener en cuenta al trabajar con el cuaderno de estrategias de ejemplo:

  • El cuaderno de estrategias carga ssh_key desde ~/.ssh/id_rsa.pub. Si lo modifica, utilice el formato de línea única, empezando por "ssh-rsa" (sin las comillas).

  • Los valores client_id y client_secret se cargan desde ~/.azure/credentials, que es el archivo de credenciales predeterminado. Puede establecer estos valores en su entidad de servicio o cargarlos desde las variables de entorno:

    client_id: "{{ lookup('env', 'AZURE_CLIENT_ID') }}"
    client_secret: "{{ lookup('env', 'AZURE_SECRET') }}"
    

Guarde el siguiente cuaderno de estrategias como aks-create.yml:

- name: Create resource group
  azure_rm_resourcegroup:
      name: "{{ resource_group }}"
      location: "{{ location }}"

- name: List supported kubernetes version from Azure
  azure_rm_aksversion_facts:
      location: "{{ location }}"
  register: versions

- name: Create AKS cluster with RBAC enabled
  azure_rm_aks:
      resource_group: "{{ resource_group }}"
      name: "{{ name }}"
      dns_prefix: "{{ name }}"
      enable_rbac: yes
      kubernetes_version: "{{ versions.azure_aks_versions[-1] }}"
      agent_pool_profiles:
        - count: 3
          name: nodepool1
          vm_size: Standard_D2_v2
      linux_profile:
          admin_username: azureuser
          ssh_key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
      service_principal:
          client_id: "{{ lookup('ini', 'client_id section=default file=~/.azure/credentials') }}"
          client_secret: "{{ lookup('ini', 'secret section=default file=~/.azure/credentials') }}"
      aad_profile:
          client_app_id: "{{ client_app_id }}"
          server_app_id: "{{ server_app_id }}"
          server_app_secret: "{{ server_app_secret }}"
          tenant_id: "{{ app_tenant_id }}"
  register: aks

- name: Save cluster user config
  copy:
      content: "{{ aks.kube_config }}"
      dest: "aks-{{ name }}-kubeconfig-user"

- name: Get admin config of AKS
  azure_rm_aks_facts:
      resource_group: "{{ resource_group }}"
      name: "{{ name }}"
      show_kubeconfig: admin
  register: aks

- name: Save the kubeconfig
  copy:
      content: "{{ aks.aks[0].kube_config }}"
      dest: "aks-{{ name }}-kubeconfig"

Obtención del identificador de objeto de Microsoft Entra

Para crear un enlace RBAC, primero debe obtener el identificador de objeto de Microsoft Entra.

  1. Inicie sesión en Azure Portal.

  2. En el campo de búsqueda de la parte superior de la página, escriba Microsoft Entra ID.

  3. Haga clic en Enter.

  4. En el menú Administrar, seleccione Usuarios.

  5. En el campo de nombre, busque su cuenta.

  6. En la columna Nombre, seleccione el vínculo a su cuenta.

  7. En la sección Identidad, copie el Id. de objeto.

    Copy the Microsoft Entra Object ID.

Creación del enlace de RBAC

En esta sección, creará un enlace de rol o un enlace de rol del clúster en AKS.

Guarde el siguiente cuaderno de estrategias como kube-role.yml:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: cluster-admins
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: <your-aad-account>

Reemplace el marcador de posición por el <your-aad-account> identificador de objeto de inquilino de Microsoft Entra.

Guarde el siguiente cuaderno de estrategias, que implementa el nuevo rol en AKS, como aks-kube-deploy.yml:

- name: Apply role to AKS
  k8s:
      src: kube-role.yml
      kubeconfig: "aks-{{ name }}-kubeconfig"

Ejecución del cuaderno de estrategias de ejemplo

En esta sección se indica el cuaderno de estrategias de ejemplo completo que llama a las tareas que se crean en este artículo.

Guarde el siguiente cuaderno de estrategias como aks-rbac.yml:

---
- hosts: localhost
  vars:
      resource_group: aksansibletest
      name: aksansibletest
      location: eastus
  tasks:
     - name: Ensure resource group exist
       azure_rm_resourcegroup:
           name: "{{ resource_group }}"
           location: "{{ location }}"

     - name: Create AKS
       vars:
           client_app_id: <client id>
           server_app_id: <server id>
           server_app_secret: <server secret>
           app_tenant_id: <tenant id>
       include_tasks: aks-create.yml

     - name: Enable RBAC
       include_tasks: aks-kube-deploy.yml

En la vars sección, reemplace los siguientes marcadores de posición por la información de Microsoft Entra:

  • <client id>
  • <server id>
  • <server secret>
  • <tenant id>

Ejecute el cuaderno de estrategias completo con el comando ansible-playbook:

ansible-playbook aks-rbac.yml

Verificación de los resultados

En esta sección, usará la lista de nodos de kubectl creada en este artículo.

Escriba el siguiente comando en un símbolo del sistema de terminal:

kubectl --kubeconfig aks-aksansibletest-kubeconfig-user get nodes

El comando le remitirá a una página de autenticación. Inicie sesión con su cuenta de Azure.

Una vez autenticado, kubectl enumera los nodos de una forma similar a la que se muestra en los siguientes resultados:

To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code XXXXXXXX to authenticate.
NAME                       STATUS   ROLES   AGE   VERSION
aks-nodepool1-33413200-0   Ready    agent   49m   v1.12.6
aks-nodepool1-33413200-1   Ready    agent   49m   v1.12.6
aks-nodepool1-33413200-2   Ready    agent   49m   v1.12.6

Limpieza de recursos

Cuando ya no los necesite, elimine los recursos creados en este artículo.

Guarde el siguiente código como cleanup.yml:

---
- hosts: localhost
  vars:
      name: aksansibletest
      resource_group: aksansibletest
  tasks:
      - name: Clean up resource group
        azure_rm_resourcegroup:
            name: "{{ resource_group }}"
            state: absent
            force: yes
      - name: Remove kubeconfig
        file:
            state: absent
            path: "aks-{{ name }}-kubeconfig"

Ejecute el cuaderno de estrategias mediante ansible-playbook.

ansible-playbook cleanup.yml

Pasos siguientes