Si trabajamos en un entrono de kubernetes en el que varias personas tienen acceso compartiendo el usuario administrador, quizá sea una buena idea facilitar un usuario restringido a un namespace concreto. Para ello deberemos de crear varias cosas:
- Certificados del usuario
- Contexto
- Rol
- Rolbinding
Para esta prueba vamos a usar el entorno de minikube. Comenzamos creando el namespace de prueba ejecutando: kubectl create ns prueba
A continuación creamos los certificados del usuario con los siguientes comandos:
openssl genrsa -out developer.key 2048 openssl req -new -key developer.key -out developer.csr -subj "/CN=developer/O=occentus" openssl x509 -req -in developer.csr -CA ~/.minikube/ca.crt -CAkey ~/.minikube/ca.key -CAcreateserial -out developer.crt -days 500
Ahora creamos el contexto para el usuario con los siguientes comandos:
kubectl config set-credentials developer --client-certificate=developer.crt --client-key=developer.key kubectl config set-context developer-context --cluster=minikube --namespace=prueba --user=developer
Ahora podemos probar a cambiar de contexto ejecutando kubeselect y seleccionando el namespace de prueba. Si intentamos ver los pods, por ejemplo, nos dará un error de que no tenemos permisos.
Error from server (Forbidden): pods is forbiden: User "developer" cannot list pods in the namespace "prueba"
Ahora debemos crear el rol con los permisos que queramos otorgar en el namespace prueba. Debemos crear un fichero .yaml con el siguiente contenido:
kind: Role apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: namespace: prueba name: permisos-prueba rules: - apiGroups: ["", "extensions", "apps"] resources: ["pods"] verbs: ["get"]
En este caso solo vamos a dar permisos para que puedan ejecutar kubectl get pods. Aplicamos el fichero ejecutando kubectl apply -f rol.yaml
Una vez creado el rol, creamos el rolbinding, que básicamente lo que hace es asociar el rol con el usuario developer. Creamos otro fichero .yaml con el siguiente contenido:
kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: rolbinding-prueba namespace: prueba subjects: - kind: User name: developer apiGroup: "" roleRef: kind: Role name: permisos-prueba apiGroup: ""
Lo aplicamos ejecutando
kubectl apply -f rolbinding.yaml
y ahora cambiamos al contexto del usuario developer y podemos comprobar que ahora sí que nos deja ver los pods.