Gestionando permisos en vSphere
En esta oportunidad hablaremos sobre los privilegios necesarios para realizar la instalación de un cluster Kubernetes sobre una infraestructura vSphere, particularmente usando Packer, Terraform y Clusterapi (como se explicó en el post Instalar Kubernetes en VMware Vsphere).
Se deben tener en consideración diferentes permisos para: instalar un cluster de k8s, manejarlo con Terraform, usar Clusterapi con el provider de vSphere, usar Packer, e incluso el cloud provider de k8s. Por ello, mencionamos a continuación algunos usuarios o grupos propuestos. La forma de gestionar los permisos será crear roles que se asocian a estos usuarios o grupos según sea necesario.
Prerequisitos
A lo largo de este post utilizaremos la herramienta govc. Si bien se puede realizar la gestión desde la UI del vcenter, es más fácil y rápido realizarla desde la terminal.
Según vSphere CSI driver, se debe cumplir lo siguiente:
- Versión mínima de ESXi 6.7U3 o mayor
- Las VMs a usar deben
habilitar en los discos enableUUID. Esto es necesario para
asegurar se asigne UUID únicos y consistentes a las vms. Para cambiarlo,
puede usarse govc:
govc vm.change -vm'/<datacenter-name>/vm/<vm-name1>' -e="disk.enableUUID=1"
- Como requisito para lo anterior el hw de la vm debe ser 15 o superior:
para cambiarlo con govc:
govc vm.upgrade -version=15 -vm '/<datacenter-name>/vm/<vm-name1>'
- Como requisito para lo anterior el hw de la vm debe ser 15 o superior:
para cambiarlo con govc:
Usuarios/Grupos
En resumen, deben crearse 3 usuarios/grupos diferentes, a decir:
- mw-packer: con permisos para poder operar con packer. Los templates deberían quedar a disposición por terraform y/o capv.
- mw-terraform: debe poder generar vms a partir de templates en un cluster/folder.
- mw-csi: cuenta con permisos necesarios para que el cloud provider pueda
solicitar discos al datastore y attacharlo a las vms que sean nodos del
cluster.
Hay otros privilegios relacionados a los tags de las vms.
Para crearlos con govc:
govc sso.user.create -p <password> <nombre>
Opcionales
Los siguientes usuarios o roles no serán necesarios pero aportarían mayor granularidad:
- mw-terraform-role: podría utilizarse para gestionar los roles aquí descriptos. Este rol debería unicamente crear o modificar roles.
- mw-k8s-clusterapi: representará un mix de lo necesario por mw-csi y mv-terraform.
Crear los roles
Los siguientes roles serán grupos de permisos que se deberán crear. Para crearlos utilizando govc:
govc role.create <nombre-rol> <lista-de-permisos>
También puede ser util agregar o quitar permisos a un rol existente:
# Agregar permisos
govc role.update -a <nombre-rol> <lista-de-permisos>
# Quitar
govc role.update -r <nombre-rol> <lista-de-permisos>
En la siguiente tabla se detallan las listas de privilegios para cada rol. También se agrega una comparativa con los nombres con los que figuran los privilegios en la UI, que no siempre coincide, por si no se está utilizando govc.
Rol | Privilegios (consola) | Privilegios (UI) |
---|---|---|
k8s-datacenter | Cns.Searchable |
|
k8s-global-permissions | InventoryService.Tagging.AttachTag InventoryService.Tagging.CreateCategory InventoryService.Tagging.EditCategory InventoryService.Tagging.DeleteCategory InventoryService.Tagging.CreateTag InventoryService.Tagging.EditTag InventoryService.Tagging.DeleteTag Sessions.ValidateSession StorageProfile.View |
|
k8s-manage-vm | VirtualMachine.Config.AddExistingDisk VirtualMachine.Config.AddNewDisk VirtualMachine.Config.AddRemoveDevice VirtualMachine.Config.AdvancedConfig VirtualMachine.Config.Annotation VirtualMachine.Config.CPUCount VirtualMachine.Config.ChangeTracking VirtualMachine.Config.DiskExtend VirtualMachine.Config.DiskLease VirtualMachine.Config.EditDevice VirtualMachine.Config.HostUSBDevice VirtualMachine.Config.ManagedBy VirtualMachine.Config.Memory VirtualMachine.Config.MksControl VirtualMachine.Config.QueryFTCompatibility VirtualMachine.Config.QueryUnownedFiles VirtualMachine.Config.RawDevice VirtualMachine.Config.ReloadFromPath VirtualMachine.Config.RemoveDisk VirtualMachine.Config.Rename VirtualMachine.Config.ResetGuestInfo VirtualMachine.Config.Resource VirtualMachine.Config.Settings VirtualMachine.Config.SwapPlacement VirtualMachine.Config.ToggleForkParent VirtualMachine.Config.Unlock VirtualMachine.Config.UpgradeVirtualHardware VirtualMachine.GuestOperations.Execute VirtualMachine.GuestOperations.Modify VirtualMachine.GuestOperations.ModifyAliases VirtualMachine.GuestOperations.Query VirtualMachine.GuestOperations.QueryAliases VirtualMachine.Hbr.ConfigureReplication VirtualMachine.Hbr.MonitorReplication VirtualMachine.Hbr.ReplicaManagement VirtualMachine.Interact.AnswerQuestion VirtualMachine.Interact.Backup VirtualMachine.Interact.ConsoleInteract VirtualMachine.Interact.CreateScreenshot VirtualMachine.Interact.CreateSecondary VirtualMachine.Interact.DefragmentAllDisks VirtualMachine.Interact.DeviceConnection VirtualMachine.Interact.DisableSecondary VirtualMachine.Interact.DnD VirtualMachine.Interact.EnableSecondary VirtualMachine.Interact.GuestControl VirtualMachine.Interact.MakePrimary VirtualMachine.Interact.Pause VirtualMachine.Interact.PowerOff VirtualMachine.Interact.PowerOn VirtualMachine.Interact.PutUsbScanCodes VirtualMachine.Interact.Record VirtualMachine.Interact.Replay VirtualMachine.Interact.Reset VirtualMachine.Interact.SESparseMaintenance VirtualMachine.Interact.SetCDMedia VirtualMachine.Interact.SetFloppyMedia VirtualMachine.Interact.Suspend VirtualMachine.Interact.TerminateFaultTolerantVM VirtualMachine.Interact.ToolsInstall VirtualMachine.Interact.TurnOffFaultTolerance VirtualMachine.Inventory.Create VirtualMachine.Inventory.CreateFromExisting VirtualMachine.Inventory.Delete VirtualMachine.Inventory.Move VirtualMachine.Inventory.Register VirtualMachine.Inventory.Unregister VirtualMachine.Namespace.Event VirtualMachine.Namespace.EventNotify VirtualMachine.Namespace.Management VirtualMachine.Namespace.ModifyContent VirtualMachine.Namespace.Query VirtualMachine.Namespace.ReadContent VirtualMachine.Provisioning.Clone VirtualMachine.Provisioning.CloneTemplate VirtualMachine.Provisioning.CreateTemplateFromVM VirtualMachine.Provisioning.Customize VirtualMachine.Provisioning.DeployTemplate VirtualMachine.Provisioning.DiskRandomAccess VirtualMachine.Provisioning.DiskRandomRead VirtualMachine.Provisioning.FileRandomAccess VirtualMachine.Provisioning.GetVmFiles VirtualMachine.Provisioning.MarkAsTemplate VirtualMachine.Provisioning.MarkAsVM VirtualMachine.Provisioning.ModifyCustSpecs VirtualMachine.Provisioning.PromoteDisks VirtualMachine.Provisioning.PutVmFiles VirtualMachine.Provisioning.ReadCustSpecs VirtualMachine.State.CreateSnapshot VirtualMachine.State.RemoveSnapshot VirtualMachine.State.RenameSnapshot VirtualMachine.State.RevertToSnapshot |
|
k8s-manage-volumes | Datastore.AllocateSpace Datastore.Browse Datastore.FileManagement |
|
k8s-manage-net-nodes | Network.Assign |
|
k8s-manage-cluster | Resource.AssignVMToPool VApp.Import |
|
k8s-file-management | Datastore.FileManagement |
|
k8s-packer-host | Host.Config.SystemManagement Resource.AssignVMToPool |
|
k8s-packer-vm | VApp.Export VirtualMachine.Config.AddExistingDisk VirtualMachine.Config.AddNewDisk VirtualMachine.Config.AddRemoveDevice VirtualMachine.Config.AdvancedConfig VirtualMachine.Config.Annotation VirtualMachine.Config.CPUCount VirtualMachine.Config.ChangeTracking VirtualMachine.Config.DiskExtend VirtualMachine.Config.DiskLease VirtualMachine.Config.EditDevice VirtualMachine.Config.HostUSBDevice VirtualMachine.Config.ManagedBy VirtualMachine.Config.Memory VirtualMachine.Config.MksControl VirtualMachine.Config.QueryFTCompatibility VirtualMachine.Config.QueryUnownedFiles VirtualMachine.Config.RawDevice VirtualMachine.Config.ReloadFromPath VirtualMachine.Config.RemoveDisk VirtualMachine.Config.Rename VirtualMachine.Config.ResetGuestInfo VirtualMachine.Config.Resource VirtualMachine.Config.Settings VirtualMachine.Config.SwapPlacement VirtualMachine.Config.ToggleForkParent VirtualMachine.Config.Unlock VirtualMachine.Config.UpgradeVirtualHardware VirtualMachine.Interact.AnswerQuestion VirtualMachine.Interact.Backup VirtualMachine.Interact.ConsoleInteract VirtualMachine.Interact.CreateScreenshot VirtualMachine.Interact.CreateSecondary VirtualMachine.Interact.DefragmentAllDisks VirtualMachine.Interact.DeviceConnection VirtualMachine.Interact.DisableSecondary VirtualMachine.Interact.DnD VirtualMachine.Interact.EnableSecondary VirtualMachine.Interact.GuestControl VirtualMachine.Interact.MakePrimary VirtualMachine.Interact.Pause VirtualMachine.Interact.PowerOff VirtualMachine.Interact.PowerOn VirtualMachine.Interact.PutUsbScanCodes VirtualMachine.Interact.Record VirtualMachine.Interact.Replay VirtualMachine.Interact.Reset VirtualMachine.Interact.SESparseMaintenance VirtualMachine.Interact.SetCDMedia VirtualMachine.Interact.SetFloppyMedia VirtualMachine.Interact.Suspend VirtualMachine.Interact.TerminateFaultTolerantVM VirtualMachine.Interact.ToolsInstall VirtualMachine.Interact.TurnOffFaultTolerance VirtualMachine.Inventory.Create VirtualMachine.Inventory.CreateFromExisting VirtualMachine.Inventory.Delete VirtualMachine.Inventory.Move VirtualMachine.Inventory.Register VirtualMachine.Inventory.Unregister VirtualMachine.Provisioning.Clone VirtualMachine.Provisioning.CloneTemplate VirtualMachine.Provisioning.CreateTemplateFromVM VirtualMachine.Provisioning.Customize VirtualMachine.Provisioning.DeployTemplate VirtualMachine.Provisioning.DiskRandomAccess VirtualMachine.Provisioning.DiskRandomRead VirtualMachine.Provisioning.FileRandomAccess VirtualMachine.Provisioning.GetVmFiles VirtualMachine.Provisioning.MarkAsTemplate VirtualMachine.Provisioning.MarkAsVM VirtualMachine.Provisioning.ModifyCustSpecs VirtualMachine.Provisioning.PromoteDisks VirtualMachine.Provisioning.PutVmFiles VirtualMachine.Provisioning.ReadCustSpecs VirtualMachine.State.CreateSnapshot VirtualMachine.State.RemoveSnapshot VirtualMachine.State.RenameSnapshot VirtualMachine.State.RevertToSnapshot |
|
k8s-cns-host | Host.Config.Storage |
|
k8s-cns-vm | VirtualMachine.Config.AddExistingDisk VirtualMachine.Config.AddRemoveDevice |
|
k8s-cns-vsphere | Cns.Searchable StorageProfile.View |
|
Read-only | System.Anonymous System.Read System.View |
Este rol ya está definido por defecto |
Asignar roles a usuarios y entidades
Una vez creado los roles es necesario asignarlos a cada objeto.
Objeto | Usuario/Grupo | Rol | Propagación |
---|---|---|---|
vSphere (raíz) | mw-csi |
k8s-cns-vsphere | No |
vSphere (raíz) | mw-terraform |
k8s-global-permissions | No |
Datacenter | mw-terraform |
k8s-datacenter | No |
Datacenter | mw-packer |
k8s-file-management | No |
Datacenter | mw-csi |
Read-only | No |
Datastore | mw-terraform y mw-packer |
k8s-manage-volumes | No |
Datastore (csi) | mw-csi |
k8s-file-management | No |
Cluster | mw-packer |
k8s-manage-cluster | No |
Cluster | mw-csi |
k8s-cns-host | No |
Cluster y Hosts o Resource Groups | mw-terraform |
k8s-manage-cluster | No |
Host (*) | mw-packer |
k8s-packer-host | No |
Hosts | mw-csi |
Read-only | No |
VM Folder | mw-terraform |
k8s-manage-vm | Sí |
VM Folder | mw-packer |
k8s-packer-vm | Sí |
VM Folder | mw-csi |
k8s-cns-vm | Sí |
vSphere Port Group o Network y Distributed Switch | mw-terraform y mw-packer |
k8s-manage-net-nodes | No |
$VSPHERE_PREPRODUCTION_HOST
.
De nuevo esto puede realizarse haciendo “click derecho” en los distintos objetos en la UI, o bien con govc, con el siguiente comando:
govc permissions.set -principal <nombre-usuario>@vsphere.local \
-role <nombre-rol> \
-propagate=[true | false] \
<path-a-la-entidad>
Algunos ejemplos de la tabla:
govc permissions.set -principal mw-csi@vsphere.local \
-role k8s-cns-vsphere \
-propagate=false \
/
govc permissions.set -principal mw-terraform@vsphere.local \
-role k8s-manage-vm
-propagate=true
/<datacenter-name>/vm/<folder-name>
Para revisar la dirección completa de cada entidad se puede utilizar:
govc find . -type <tipo>
Donde <tipo> es:
c ClusterComputeResource
d Datacenter
f Folder
g DistributedVirtualPortgroup
h HostSystem
m VirtualMachine
n Network
p ResourcePool
s Datastore
w DistributedVirtualSwitch
Verificación
Para ver los roles y permisos aplicados se puede utilizar:
# Listar roles
govc role.ls | grep k8s-
# Listar privilegios de un rol
govc role.ls <nombre-rol>
# Mostrar donde se ha aplicado el rol y para que usuarios
govc role.usage <nombre-rol>
Contamos con un script que automatiza la tarea de verificación que utiliza los comandos mencionados previamente junto con archivos de definiciones y permite corroborar que todos los privilegios han sido asignados correctamente. El mismo se encuentra en un repositorio privado de Mikroways, cuyo acceso será facilitado oportunamente.
Fuentes de referencia
- Roles propuestos por
capv
- El link de arriba es un seguimiento de un issue en GitHub donde se linea a un gist con un resumen hecho por alguien de la comunidad.
- OKD vsphere permissions
- Roles según vSphere CSI driver