Configurar multiusuario con espacios de nombres de Kubernetes

[*]

La mayoría de las empresas quieren una plataforma multiusuario para ejecutar sus aplicaciones nativas en la nube porque ayuda a administrar los recursos, los costos, la eficiencia operativa y el control. residuos de nubes.

Kubernetes es la plataforma líder de código abierto para administrar cargas de trabajo y servicios en contenedores. Se ha ganado esta reputación debido a su flexibilidad al permitir que los operadores y desarrolladores establezcan la automatización con una configuración declarativa. Pero hay un problema: a medida que Kubernetes crece rápidamente, el antiguo problema de velocidad se convierte en un problema. Cuanto mayor sea su adopción, más problemas y desperdicio de recursos descubrirá.

Índice

Un ejemplo de una escalera.

Imagine que su negocio comenzó siendo pequeño con la adopción de Kubernetes mediante la implementación de una variedad de aplicaciones internas. Tiene múltiples flujos de proyectos en ejecución con múltiples desarrolladores dedicados a cada flujo de proyecto.

En un escenario como este, debe asegurarse de que el administrador del clúster tenga control total sobre el clúster para administrar sus recursos e implementar políticas de clúster y estándares de seguridad. En cierto modo, el administrador invita a los usuarios del clúster a utilizar las mejores prácticas. Un espacio de nombres es muy útil en este caso porque permite que varios equipos compartan un solo clúster donde los recursos informáticos se distribuyen entre varios equipos.

Si bien los espacios de nombres son su primer paso hacia la tenencia múltiple de Kubernetes, no son lo suficientemente buenos por sí solos. Hay una serie de primitivos de Kubernetes que debe tener en cuenta para poder administrar correctamente su clúster y ponerlo en una implementación lista para la producción.

Las primitivas de Kubernetes para multiusuario son:

  1. RBAC: Control de acceso basado en roles para Kubernetes
  2. Políticas de red: Para aislar el tráfico entre espacios de nombres
  3. Cuotas de recursos: Para controlar el acceso justo a los recursos del clúster

Este artículo le muestra cómo usar los espacios de nombres de Kubernetes y algunas configuraciones básicas de RBAC para particionar un solo clúster de Kubernetes y aprovechar estas herramientas integradas de Kubernetes.

¿Qué es un espacio de nombres de Kubernetes?

Antes de profundizar en cómo usar los espacios de nombres para preparar su clúster de Kubernetes para convertirse en multiinquilino, debe saber qué son los espacios de nombres.

A espacio de nombres es un objeto de Kubernetes que divide un clúster de Kubernetes en varios clústeres virtuales. Esto se hace con la ayuda de Nombres e ID de Kubernetes. Los espacios de nombres usan el objeto de nombre de Kubernetes, lo que significa que cada objeto dentro de un espacio de nombres obtiene un nombre e ID únicos en el clúster para permitir la partición virtual.

Cómo ayudan los espacios de nombres en la tenencia múltiple

Los espacios de nombres son una de las primitivas de Kubernetes que puede usar para particionar su clúster en múltiples clústeres virtuales para permitir la tenencia múltiple. Cada espacio de nombres está aislado del espacio de nombres de los demás usuarios, equipos o aplicaciones. Este aislamiento es esencial en la tenencia múltiple para que las actualizaciones y los cambios en las aplicaciones, los usuarios y los equipos estén contenidos en el espacio de nombres específico. (Tenga en cuenta que el espacio de nombres no proporciona segmentación de red).

Antes de continuar, verifique el espacio de nombres predeterminado en un clúster de Kubernetes en funcionamiento:

[root@master ~]# kubectl get namespace
NAME              STATUS   AGE
default           Active   3d
kube-node-lease   Active   3d
kube-public       Active   3d
kube-system       Active   3d

Luego crea tu primer espacio de nombres, llamado prueba:

[root@master ~]# kubectl create namespace test
namespace/test created

Compruebe el espacio de nombres recién creado:

[root@master ~]# kubectl get namespace
NAME              STATUS   AGE
default           Active   3d
kube-node-lease   Active   3d
kube-public       Active   3d
kube-system       Active   3d
test              Active   10s
[root@master ~]#

Describa el espacio de nombres recién creado:

[root@master ~]# kubectl describe namespace test
Name:         test
Labels:       <none>
Annotations:  <none>
Status:       Active
No resource quota.
No LimitRange resource.

Para eliminar un espacio de nombres:

[root@master ~]# kubectl delete namespace test
namespace "test" deleted

Su nuevo espacio de nombres está activo, pero no tiene etiquetas definidas, anotaciones o rangos de límite de cuota. Sin embargo, ahora que sabe cómo crear, describir y eliminar un espacio de nombres, le mostraré cómo puede usar un espacio de nombres para particionar virtualmente un clúster de Kubernetes.

Particionamiento de clústeres mediante espacio de nombres y RBAC

Implemente la siguiente aplicación simple para aprender a particionar un clúster usando el espacio de nombres y aislar una aplicación y sus objetos de "otros" usuarios.

Primero, verifique el espacio de nombres que usará. Para simplificar use el prueba espacio de nombres que creó anteriormente:

[root@master ~]# kubectl get namespaces
NAME              STATUS   AGE
default           Active   3d
kube-node-lease   Active   3d
kube-public       Active   3d
kube-system       Active   3d
test              Active   3h

Luego implemente una aplicación simple llamada aplicación de prueba dentro del espacio de nombres de prueba usando la siguiente configuración:

apiVersion: v1
kind
: Pod
metadata
:
  name
: test-app                 ⇒ name of the application
  namespace
: test                ⇒ the namespace where the app runs
  labels
:
     app
: test-app                      ⇒ labels for the app
spec
:
  Contenedores
:
  - name
: test-app
    image
: nginx:1.14.2         ⇒ the image we used for the app.
    ports
:
    - containerPort
: 80

Distribuirlo:

$ kubectl create -f test-app.yaml
    pod/test-app created

Luego verifique que se haya creado el pod de la aplicación:

$ kubectl get pods -n test
  NAME       READY   STATUS    RESTARTS   AGE
  test-app   1/1     Running   0          18s

Ahora que la aplicación en ejecución está dentro del archivo prueba espacio de nombres, pruebe un caso de uso donde:

  • usuario autorizado puede modificar y ver todos los objetos dentro del espacio de nombres de prueba
  • usuario no autorizado solo puede mostrar el espacio de nombres

Pre-creé usuarios para que los pruebes. Si quieres saber cómo creé usuarios dentro de Kubernetes, mira los comandos aquí.

$ kubectl config view -o jsonpath='{.users[*].name}'
  auth-user
  kubernetes-admin
  un-auth-user

Con esta configuración, cree un Kubernetes Roles y asociaciones de roles para aislar el espacio de nombres de destino prueba permitir usuario autorizado para ver y editar objetos dentro del espacio de nombres y no permitir usuario no autorizado para acceder o ver los objetos dentro de la prueba espacio de nombres

Comience creando un ClusterRole y un Rol. Estos objetos son una lista de verbos (acción) permitidos en recursos y espacios de nombres específicos.

Cree una función de clúster:

$ cat clusterrole.yaml
apiVersion
: rbac.authorization.k8s.io/v1beta1
kind
: ClusterRole
metadata
:
  name
: list-deployments
  namespace
: test
rules
:
  - apiGroups
: [ apps ]
    resources
: [ deployments ]
    verbs
: [ get, list ]

Crear un rol:

$ cat role.yaml
apiVersion
: rbac.authorization.k8s.io/v1beta1
kind
: Role
metadata
:
  name
: list-deployments
  namespace
: test
rules
:
  - apiGroups
: [ apps ]
    resources
: [ deployments ]
    verbs
: [ get, list ]

Aplicar el rol:

$ kubectl create -f role.yaml
roles.rbac.authorization.k8s.io "list-deployments" created

Use el mismo comando para crear un ClusterRole:

$ kubectl create -f clusterrole.yaml

$ kubectl get role -n test
  NAME               CREATED AT
  list-deployments   2021-01-18T00:54:00Z

Revisa los roles:

$ kubectl describe roles -n test
  Name:         list-deployments
  Labels:       <none>
  Annotations:  <none>
  PolicyRule:
    Resources         Non-Resource URLs  Resource Names  Verbs
    ---------         -----------------  --------------  -----
    deployments.apps  []                 []              [get list]

Recuerde que debe crear RoleBindings por espacio de nombres, no por usuario. Esto significa que se deben crear dos asociaciones de roles para el usuario usuario autorizado.

Aquí hay ejemplos de archivos YAML de RoleBinding para permitir usuario autorizado para editar y ver.

Modificar:

$ cat rolebinding-auth-edit.yaml
apiVersion
: rbac.authorization.k8s.io/v1
kind
: RoleBinding
metadata
:
  name
: auth-user-edit
  namespace
: test
subjects
:
- kind
: User
  name
: auth-user
  apiGroup
: rbac.authorization.k8s.io
roleRef
:
  kind
: ClusterRole
  name
: edit
  apiGroup
: rbac.authorization.k8s.io

Para ver:

$ cat rolebinding-auth-view.yaml
apiVersion
: rbac.authorization.k8s.io/v1
kind
: RoleBinding
metadata
:
  name
: auth-user-view
  namespace
: test
subjects
:
- kind
: User
  name
: auth-user
  apiGroup
: rbac.authorization.k8s.io
roleRef
:
  kind
: ClusterRole
  name
: view
  apiGroup
: rbac.authorization.k8s.io

Cree estos archivos YAML:

$ kubectl create rolebinding-auth-view.yaml
$ kubectl create rolebinding-auth-edit.yaml

Compruebe si los RoleBindings se han creado correctamente:

$ kubectl get rolebindings -n test
NAME             ROLE               AGE
auth-user-edit   ClusterRole/edit   48m
auth-user-view   ClusterRole/view   47m

Con los requisitos establecidos, verifique la partición del clúster:

[root@master]$ sudo su un-auth-user
[un-auth-user@master ~]$ kubect get pods -n test
[un-auth-user@master ~]$ kubectl get pods -n test
Error from server (Forbidden): pods is forbidden: User "un-auth-user" cannot list resource "pods" in API group "" in the namespace "test"

Iniciar sesión como usuario autorizado:

[root@master ]# sudo su auth-user
[auth-user@master auth-user]$ kubectl get pods -n test
NAME       READY   STATUS    RESTARTS   AGE
test-app   1/1     Running   0          3h8m
[auth-user@master un-auth-user]$

[auth-user@master auth-user]$ kubectl edit pods/test-app -n test
Edit cancelled, no changes made.

Puede ver y editar los objetos dentro prueba espacio de nombres ¿Qué hay de ver los nodos del clúster?

[auth-user@master auth-user]$ kubectl get nodes
Error from server (Forbidden): nodes is forbidden: User "auth-user" cannot list resource "nodes" in API group "" at the cluster scope
[auth-user@master auth-user]$

No puede porque los enlaces de roles para el usuario usuario autorizado forzarlos a tener acceso para ver o modificar objetos solo dentro del prueba espacio de nombres

Habilite el control de acceso con espacios de nombres

Los espacios de nombres proporcionan componentes básicos de control de acceso a través de RBAC y aislamiento para aplicaciones, usuarios o grupos de usuarios. Pero el uso de espacios de nombres solos como una solución de múltiples usuarios no es suficiente en una implementación empresarial. Recomendamos usar otras primitivas de múltiples inquilinos de Kubernetes para lograr un mayor aislamiento e implementar la seguridad adecuada.

Los espacios de nombres pueden proporcionar un aislamiento básico en su clúster de Kubernetes; por lo tanto, es importante tenerlos en cuenta con anticipación, especialmente al planificar un clúster de múltiples inquilinos. Los espacios de nombres también le permiten separar y asignar lógicamente recursos a usuarios, equipos o aplicaciones individuales.

Al usar espacios de nombres, puede aumentar la eficiencia de los recursos al permitir que un solo clúster se use para un conjunto diverso de cargas de trabajo.

Artículos de interés

Subir