Service Accounts
Un Service Account provee una identidad con la cual ejecutar los procesos de un Pod. Esta identidad funciona mediante permisos que se otorgan dentro del ambiente para poder interactuar con los demás componentes que existen.
Cuando un usuario ingresa al cluster ya sea mediante la Interfaz o mediante comandos (kubectl), este obtiene una identidad mediante la autenticación con ese usuario, por lo que puede acceder e interactuar con el APIServer y sus componentes. Esto mismo sucede con los Service Account, la diferencia consiste que en el caso de un Service Account se limita a ciertas acciones dentro del mismo namespace donde se está ejecutando el proceso en cuestión.
Cada Service Account puede estar asignado a una lista de permisos en específico mediante Roles que definen las acciones permitidas sobre los diferentes grupos de componentes del APIServer, como por ejemplo el grupo asociado a los Deployments con acciones de ver, listar, crear pero no modificar o eliminar.
Laboratorio: Service Accounts
Descripción
La presente guía muestra cómo crear, listar, modificar y eliminar Service Accounts dentro de un namespace.
Objetivos
- Crear un Service Account personalizado
- Autenticarse mediante un Token de Service Account
- Modificar los permisos del Service Account mediante Roles
- Verificar los permisos del Service Account
Antes de comenzar
- Contar con el acceso al ambiente de laboratorio
Inicio de laboratorio
-
Ingrese al CLI del sistema operativo del servidor usado como Bastion con el usuario y la contraseña proporcionados.
-
Ingresar al cluster de Kubernetes utilizando el archivo kubeconfig
export KUBECONFIG=~/rke-cluster-users/kube_config_cluster.yml -
Crear un nuevo namespace llamado example-sa
kubectl create ns example-sa -
Establecer el nuevo namespace por defecto con el contexto actual
kubectl config set-context --current --namespace=example-sa -
Liste los Service Accounts del namespace actual
kubectl get sa -
Obtenga la información del SA
defaultkubectl describe sa default -
Verifique los Secrets del namespace actual
Nota: El concepto de Secret se verá en otro tópico. Un Secret es un recurso de Kubernetes que permite almacenar datos considerados como credenciales y son utilizados por Aplicaciones y Herramientas, en este caso es utilizado para almacenar elkubectl get secretstokendel ServiceAccount. -
Obtenga la información del Secret
default-token-hash(cambiar hash por el nombre real de su Secret)El Token del ServiceAccount es utilizado para comunicarse contra el APIServer, para mantener el estado y la configuración del recurso.kubectl describe secret default-token-hash -
Obtener los diferentes contextos que se tienen configurados en el archivo kubeconfig
Nota: Anote el nombre del contexto que está utilizando actualmentekubectl config get-contexts -
Cree una entrada de usuario para kubectl utilizando el contenido descifrado del campo
tokenpara autenticarse contra el clusterNota: Cambiarkubectl config set-credentials sa-user --token=$(kubectl get secret default-token-hash -o jsonpath={.data.token} | base64 -d)default-token-hashcon el dato obtenido en el paso 7 -
Cambie el usuario que utiliza para kubectl (utilice el contexto del paso 9)
kubectl config set-context local --user=sa-user -
Verifique los usuarios que tiene para kubectl
kubectl config get-users -
Pruebe a obtener los Pods del namespace
Nota: Esta parte debe tirar un error de permisoskubectl get pods -
Pruebe a obtener los Namespaces del cluster
Nota: Esta parte debe tirar un error de permisoskubectl get ns -
Configure nuevamente kubectl para ocupar las credenciales de su usuario
kubectl config set-context local --user=kube-admin-local -
Cree un Service Account llamado
list-onlykubectl create sa list-only -
Cree un
Roleque permita obtener la lista de pods en el namespace actualkubectl create role pod-reader --verb=get --verb=list --resource=pods -
Cree un
RoleBindingpara el Service Accountlist-onlykubectl create rolebinding list-pods-sa-binding --role=pod-reader --serviceaccount=example-sa:list-only -
Verifique que los recursos
RoleyRoleBindingexistan en el namespacekubectl get roles,rolebindings -
Verifique la información del Service Account
list-onlykubectl describe sa list-only -
Obtenga el nombre del Secret a utilizar (con nombre
list-only-token-<hash>)kubectl get secrets -
Obtener los diferentes contextos que se tienen configurados en el archivo kubeconfig
Nota: Anote el nombre del contexto que está utilizando actualmentekubectl config get-contexts -
Cree una entrada de usuario para kubectl utilizando el contenido descifrado del campo
tokenpara autenticarse contra el clusterNota: Cambiarkubectl config set-credentials sa-user-list-only --token=$(kubectl get secret list-only-token-hash -o jsonpath={.data.token} | base64 -d)list-only-token-hashpor el dato obtenido en el paso 21 -
Cambie el usuario que utiliza para kubectl (utilice el contexto del paso 9)
kubectl config set-context <context> --user=sa-user-list-only -
Verifique que pueda obtener el listado de Pods
kubectl get pods -
Verifique que los demás accesos estén restringidos (debe dar error)
kubectl get nskubectl get secrets -
Configure nuevamente kubectl para ocupar las credenciales de su usuario
kubectl config set-context local --user=kube-admin-local -
Limpie el ambiente
kubectl delete ns example-sa -
Configure el namespace a utilizar por el contexto de kubectl a
defaultkubectl config set-context --current --namespace=default