Descripción general del controlador de jerarquía

El controlador de jerarquías agrega características jerárquicas a los espacios de nombres de Kubernetes, lo que te permite escribir políticas más expresivas, mejorar la observabilidad y delegar la administración de clústeres.

Además, el controlador se basa en el controlador de espacios de nombres jerárquico (HNC), un proyecto de código abierto. Se implementa mediante controladores de Kubernetes y controladores de admisión dinámicos que se ejecutan en tu clúster.

Espacios de nombres jerárquicos

En Kubernetes, los espacios de nombres son la unidad fundamental de la organización de la mayoría de los objetos. También forman la unidad fundamental de aislamiento y seguridad en Kubernetes. La mayoría de las políticas y los objetos de aislamiento operan a nivel del espacio de nombres, como las funciones de RBAC, los Secrets, las cuentas de servicio, las cuotas de recursos y las políticas de red.

Por lo general, puedes mejorar la seguridad y el aislamiento de tu clúster si limitas cada espacio de nombres para que contenga la menor cantidad de recursos, como un microservicio, junto con sus recursos y políticas. Sin embargo, esto puede generar una gran cantidad de espacios de nombres en tus clústeres, que pueden ser difíciles de administrar.

Para resolver esto, el controlador de jerarquías presenta el concepto de espacios de nombres jerárquicos, que te permiten agrupar espacios de nombres de Kubernetes según sus propietarios, y manipular esos grupos como unidades cohesivas. Son especialmente útiles en clústeres que comparten varios equipos, pero no es necesario que los propietarios sean personas. Por ejemplo, recomendamos que una herramienta automatizada sea la propietaria de un conjunto de espacios de nombres, en especial si requiere permisos muy amplios, pero solo necesita acceso a un conjunto pequeño de espacios de nombres relacionados.

Para admitir casos prácticos de multiusuario, los espacios de nombres jerárquicos son compatibles con varias características además de las de espacios de nombres de Kubernetes normales:

  • Aplicación de políticas. Los espacios de nombres jerárquicos pueden heredar ciertas políticas de sus principales mediante el uso de la propagación. Por ejemplo, esto te permite otorgar permisos RBAC en un espacio de nombres “raíz”, y el controlador de jerarquías garantiza que esos permisos también estén en todos los espacios de nombres descendientes mediante la copia (propagación) de los objetos RBAC a esos descendientes. La propagación también se puede controlar a nivel detallado mediante excepciones.
  • Aplicación de políticas. Todos los espacios de nombres jerárquicos incluyen etiquetas de confianza y conocidas que reflejan sus principales. Estas etiquetas se pueden usar en selectores de etiquetas para políticas como validar la configuración de webhook o las políticas de red.
  • Cuota jerárquica. Puedes definir una sola cuota jerárquica en un espacio de nombres principal, y los límites se aplicarán de forma automática en el uso total de ese espacio de nombres, así como en todos sus subordinados.
  • Observabilidad jerárquica. Las etiquetas de confianza que se usan para la aplicación de políticas también se pueden usar a fin de observar cargas de trabajo jerárquicas, como el filtrado o uso de registros.
  • Creación de espacios de nombres delegados. El controlador de jerarquía presenta el concepto de un subespacio de nombres, que los usuarios pueden crear en un espacio de nombres existente, incluso si no tiene privilegios de espacio de nombres a nivel del clúster.

Los espacios de nombres jerárquicos también admiten funciones de administración extensas, incluidas la delegación.

Espacios de nombres jerárquicos frente a espacios de nombres abstractos

Los espacios de nombres jerárquicos que proporciona el controlador de jerarquía son similares a los espacios de nombres abstractos que puedes usar si utilizas un repositorio jerárquico del Sincronizador de configuración. Sin embargo, tienen varias diferencias conceptuales:

  • Los espacios de nombres abstractos solo se pueden definir en un repositorio jerárquico, que aplica una estructura particular en tus archivos de configuración. Los espacios de nombres jerárquicos se pueden usar en repositorios no estructurados, lo que te permite organizar tus archivos de configuración como desees.
  • Los espacios de nombres abstractos solo existen en los repositorios de Git, mientras que los espacios de nombres jerárquicos también son espacios de nombres habituales de Kubernetes y existen en el clúster. Como resultado, los espacios de nombres jerárquicos se pueden definir en un repositorio o directamente en el clúster.
  • Los espacios de nombres jerárquicos no requieren permisos a nivel del clúster para crearse. En su lugar, puedes usar subespacios de nombres para la creación de espacios de nombres borrados.
  • Las cuotas de recursos jerárquicos solo son compatibles con los espacios de nombres jerárquicos, no con los abstractos.
  • Los espacios de nombres abstractos solo están disponibles para el Sincronizador de configuración, mientras que los espacios de nombres jerárquicos se basan en conceptos de código abierto.

Los espacios de nombres jerárquicos y abstractos también tienen algunos comportamientos predeterminados diferentes. De forma predeterminada, todos los objetos que se crean en un espacio de nombres abstracto se propagan a sus descendientes. Por el contrario, los objetos en los espacios de nombres jerárquicos solo se propagan si el controlador de jerarquía se configura para propagar ese tipo de objeto.

De forma predeterminada, solo se propagan las funciones de RBAC y las vinculaciones de funciones, pero cualquier objeto con espacio de nombres se puede propagar. Te recomendamos que solo propagues objetos de políticas (como roles) y objetos de recursos (como mapas de configuración). El controlador de jerarquía no está diseñado para propagar objetos de cargas de trabajo como pods, implementaciones o trabajos y puede producir consecuencias no deseadas si se usa de esta manera. Recomendamos colocar las cargas de trabajo en espacios de nombres de hoja.

Usa el controlador de jerarquía con el Sincronizador de configuración

El controlador de jerarquía te permite definir y aplicar políticas mediante conceptos jerárquicos, que son adecuados para muchas aplicaciones, incluidos los clústeres que usan varios equipos. El Sincronizador de configuración te permite almacenar esas políticas en un repositorio de Git y aplicarlas a grupos de clústeres. Si bien son diferentes, estas dos funciones son gratuitas y te brindan una manera potente de aplicar GitOps en entornos de varios equipos y varios clústeres.

Cuando usas el controlador de jerarquía con el Sincronizador de configuración, te recomendamos que uses un repositorio no estructurado para inhabilitar los espacios de nombres abstractos del sincronizador de configuración y usar el controlador de jerarquía para definir las jerarquías y propagar políticas. Para los espacios de nombres que quieras registrar en el repositorio, te recomendamos que solo verifiques los archivos de configuración de espacios de nombres completos, no los espacios de nombres secundarios, ya que puedes actualizar sus relaciones jerárquicas mediante la modificación del objeto HierarchicalConfiguration.

Es posible usar el controlador de jerarquía junto con los espacios de nombres abstractos del sincronizador de configuración en un repositorio jerárquico, pero solo de manera limitada. Por ejemplo, el controlador de jerarquía no te permitirá crear una relación jerárquica entre dos espacios de nombres que se definieron en un repositorio jerárquico, ya que esto podría entrar en conflicto con los espacios de nombres abstractos de ese repositorio. Sin embargo, puedes usar espacios de nombres jerárquicos con un repositorio jerárquico de las siguientes maneras:

  • Puedes crear subespacios de nombres de autoservicio en el clúster, debajo de un espacio de nombres creado a partir de un repositorio jerárquico. Sin embargo, no recomendamos que revises los archivos de configuración de esos subespacios de nombres.
  • Si usas varios repositorios, puedes crear anclas de subespacios de nombres en los repositorios de espacios de nombres, que le pedirán al controlador de jerarquías crear subespacios de nombres debajo del espacio de nombres especificado. Estos subespacios de nombres heredarán todos los recursos configurados de sus principales y estarán limitados por cualquier cuota de recursos jerárquico. Sin embargo, no puedes definir ningún recurso que solo exista en estos subespacios de nombres. El Sincronizador de configuración sincronizará todos los objetos del repositorio del espacio de nombres con el espacio de nombres especificado.

¿Qué sigue?