Puedes usar ComputeClasses de Google Kubernetes Engine (GKE) para crear nodos que cumplan con varios requisitos de carga de trabajo. Los Pods pueden usar ComputeClasses para crear hardware. Según la clase de procesamiento, es posible que ese hardware tenga una gran demanda, esté disponible de forma limitada o sea relativamente costoso para tu empresa. En este instructivo, se muestra cómo usar el RBAC de Kubernetes y las ValidatingAdmissionPolicies para restringir la creación, el borrado, la modificación y la selección de ComputeClasses.
Estas restricciones pueden ayudarte a evitar situaciones como las siguientes:
- Los Pods que no necesitan hardware especializado, como GPU o TPU, seleccionan ComputeClasses que solicitan ese hardware.
- Una entidad no autorizada crea o modifica ComputeClasses para obtener acceso al hardware reservado para cargas de trabajo críticas.
En este documento, se usa un ejemplo de ValidatingAdmissionPolicy que bloquea tipos comunes de uso inadecuado, como tolerancias de comodín de ComputeClass o la selección de ComputeClass específicas no permitidas. Puedes modificar la política ValidatingAdmissionPolicy para satisfacer los requisitos específicos de tu organización, como bloquear las cargas de trabajo de ciertos equipos para que no usen ComputeClasses.
Objetivos
- Usa un ValidatingAdmissionPolicy para limitar las ComputeClasses que los Pods pueden seleccionar en cada espacio de nombres a una lista aprobada.
- Usa el control de acceso basado en roles (RBAC) para restringir quién puede crear, modificar o borrar ComputeClasses en tus clústeres.
Costos
En este documento, usarás los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costos en función del uso previsto,
usa la calculadora de precios.
Cuando completes las tareas que se describen en este documento, podrás borrar los recursos que creaste para evitar que se te siga facturando. Para obtener más información, consulta Realiza una limpieza.
Antes de comenzar
- Accede a tu cuenta de Google Cloud . Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
-
Instala Google Cloud CLI.
-
Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init -
Crea o selecciona un Google Cloud proyecto.
Roles necesarios para seleccionar o crear un proyecto
- Selecciona un proyecto: Para seleccionar un proyecto, no se requiere un rol de IAM específico. Puedes seleccionar cualquier proyecto en el que se te haya otorgado un rol.
-
Crear un proyecto: Para crear un proyecto, necesitas el rol de Creador de proyectos (
roles/resourcemanager.projectCreator), que contiene el permisoresourcemanager.projects.create. Obtén más información para otorgar roles.
-
Crea un Google Cloud proyecto:
gcloud projects create PROJECT_ID
Reemplaza
PROJECT_IDpor un nombre para el proyecto Google Cloud que estás creando. -
Selecciona el proyecto Google Cloud que creaste:
gcloud config set project PROJECT_ID
Reemplaza
PROJECT_IDpor el nombre de tu proyecto de Google Cloud .
-
Si usas un proyecto existente en esta guía, verifica que tengas los permisos necesarios para completarla. Si creaste un proyecto nuevo, ya tienes los permisos necesarios.
-
Verifica que la facturación esté habilitada para tu proyecto de Google Cloud .
Habilita la API de Kubernetes Engine:
Roles necesarios para habilitar las APIs
Para habilitar las APIs, necesitas el rol de IAM de administrador de Service Usage (
roles/serviceusage.serviceUsageAdmin), que contiene el permisoserviceusage.services.enable. Obtén más información para otorgar roles.gcloud services enable container.googleapis.com
-
Instala Google Cloud CLI.
-
Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init -
Crea o selecciona un Google Cloud proyecto.
Roles necesarios para seleccionar o crear un proyecto
- Selecciona un proyecto: Para seleccionar un proyecto, no se requiere un rol de IAM específico. Puedes seleccionar cualquier proyecto en el que se te haya otorgado un rol.
-
Crear un proyecto: Para crear un proyecto, necesitas el rol de Creador de proyectos (
roles/resourcemanager.projectCreator), que contiene el permisoresourcemanager.projects.create. Obtén más información para otorgar roles.
-
Crea un Google Cloud proyecto:
gcloud projects create PROJECT_ID
Reemplaza
PROJECT_IDpor un nombre para el proyecto Google Cloud que estás creando. -
Selecciona el proyecto Google Cloud que creaste:
gcloud config set project PROJECT_ID
Reemplaza
PROJECT_IDpor el nombre de tu proyecto de Google Cloud .
-
Si usas un proyecto existente en esta guía, verifica que tengas los permisos necesarios para completarla. Si creaste un proyecto nuevo, ya tienes los permisos necesarios.
-
Verifica que la facturación esté habilitada para tu proyecto de Google Cloud .
Habilita la API de Kubernetes Engine:
Roles necesarios para habilitar las APIs
Para habilitar las APIs, necesitas el rol de IAM de administrador de Service Usage (
roles/serviceusage.serviceUsageAdmin), que contiene el permisoserviceusage.services.enable. Obtén más información para otorgar roles.gcloud services enable container.googleapis.com
- Si usas una shell local, instala el componente
kubectl:gcloud components install kubectl
- Asegúrate de tener un clúster de GKE que use la versión 1.30 o posterior. También puedes crear un clúster de Autopilot para este instructivo.
- Configura tu clúster para Grupos de Google para RBAC:
- Configura el grupo
gke-security-groupsen tu dominio. - Habilita Grupos de Google para RBAC en tu clúster.
Para obtener más información, consulta Cómo configurar tus Grupos de Google.
- Configura el grupo
Roles obligatorios
Para obtener los permisos que
necesitas para crear políticas de RBAC y objetos de Kubernetes en tu clúster,
pídele a tu administrador que te otorgue el
rol de IAM de administrador de Kubernetes Engine (role/container.admin)
en tu proyecto.
Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.
También puedes obtener los permisos necesarios a través de roles personalizados o cualquier otro rol predefinido.
Prepare el entorno
Para preparar tu clúster para las tareas de creación y verificación de este instructivo, sigue estos pasos:
Conéctate a tu clúster:
gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATIONReemplaza lo siguiente:
CLUSTER_NAME: El nombre de tu clúster.CONTROL_PLANE_LOCATION: Es la región o zona del plano de control del clúster, comous-central1ous-central1-a.
Crea un espacio de nombres para usar en este instructivo. También puedes usar cualquier espacio de nombres existente en el clúster.
kubectl create namespace computeclass-vap-tutorialCrea una política de RBAC que otorgue acceso para administrar ValidatingAdmissionPolicies y ValidatingAdmissionPolicyBindings:
Guarda el siguiente manifiesto como
validatingadmissionpolicy-editor.yaml:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: validatingadmissionpolicy-editor rules: - apiGroups: ["admissionregistration.k8s.io"] resources: ["validatingadmissionpolicies","validatingadmissionpolicybindings"] verbs: ["get", "list", "create", "update", "patch", "delete"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: edit-validatingadmissionpolicies subjects: - kind: User name: USER_ACCOUNT apiGroup: rbac.authorization.k8s.io roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: validatingadmissionpolicy-editorReemplaza
USER_ACCOUNTpor la dirección de correo electrónico de tu cuenta de usuario.Crea la política de RBAC:
kubectl apply -f validatingadmissionpolicy-editor.yaml
Crea un objeto ComputeClass en tu clúster. Si el clúster ya tiene un ComputeClass, omite este paso.
Guarda el siguiente manifiesto como
access-computeclass.yaml:apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: access-restriction-class spec: priorities: - machineFamily: e2 nodePoolAutoCreation: enabled: true whenUnsatisfiable: ScaleUpAnywayCrea la ComputeClass:
kubectl apply -f access-computeclass.yaml
Crea una ValidatingAdmissionPolicy
Para restringir las ComputeClasses que pueden seleccionar los Pods, crea una ValidatingAdmissionPolicy y aplícala en un espacio de nombres específico. Usas la especificación de ValidatingAdmissionPolicy para controlar cómo los Pods pueden seleccionar ComputeClasses. En los siguientes pasos, se muestra cómo crear y aplicar esta política:
Guarda el siguiente manifiesto de ValidatingAdmissionPolicy como
restrict-computeclass-usage-vap.yaml:apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingAdmissionPolicy metadata: name: restrict-computeclass-usage spec: failurePolicy: Fail # If an internal error occurs, deny the request. variables: # Check whether the admission request is for a Deployment. - name: isDeployment expression: "object.kind == 'Deployment'" # Get the Pod specification from the admission request by reading the # spec.template.spec field for Deployments or the spec field for static Pods. - name: podSpec expression: "variables.isDeployment ? object.spec.template.spec : object.spec" # Check whether a node selector or an affinity rule that explicitly requests a # disallowed ComputeClass. - name: hasForbiddenNodeSelectorOrAffinity expression: >- (has(variables.podSpec.nodeSelector) && variables.podSpec.nodeSelector['cloud.google.com/compute-class'] == 'COMPUTECLASS_NAME') || (has(variables.podSpec.affinity) && has(variables.podSpec.affinity.nodeAffinity) && has(variables.podSpec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution) && variables.podSpec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms.exists(term, has(term.matchExpressions) && term.matchExpressions.exists( exp, exp.key == 'cloud.google.com/compute-class' && exp.operator == 'In' && exp.values.exists(v, v == 'COMPUTECLASS_NAME') ) )) # Check whether the Pod has a toleration for the taint that corresponds to a # disallowed ComputeClass. - name: hasForbiddenComputeClassToleration expression: >- has(variables.podSpec.tolerations) && variables.podSpec.tolerations.exists(t, t.key == 'cloud.google.com/compute-class' && (t.operator == 'Exists' || (t.operator == 'Equal' && t.value == 'COMPUTECLASS_NAME')) && has(t.effect) && t.effect == 'NoSchedule') # Check whether the Pod has a toleration that could match any taint. - name: hasWildcardToleration expression: >- has(variables.podSpec.tolerations) && variables.podSpec.tolerations.exists(t, (t.operator == 'Exists' && !(has(t.key) && t.key != '')) ) # Trigger the ValidatingAdmissionPolicy when Pods or Deployments are created or # updated. matchConstraints: resourceRules: - apiGroups: [""] apiVersions: ["v1"] operations: ["CREATE", "UPDATE"] resources: ["pods"] - apiGroups: ["apps"] apiVersions: ["v1"] operations: ["CREATE", "UPDATE"] resources: ["deployments"] # Validate whether any of the expressions in the variables section evaluate to # true. validations: - expression: >- !(variables.hasForbiddenNodeSelectorOrAffinity || variables.hasForbiddenComputeClassToleration || variables.hasWildcardToleration) message: >- Pods and Deployments in this namespace cannot request ComputeClass COMPUTECLASS_NAME or use wildcard tolerations.Reemplaza
COMPUTECLASS_NAMEpor el nombre de un ComputeClass que deseas evitar que seleccionen los Pods.Esta ValidatingAdmissionPolicy tiene las siguientes propiedades:
- Son activadores para Pods estáticos o Pods en objetos Deployment.
Busca Pods que hagan cualquiera de las siguientes acciones:
- Usa un selector de nodos o una regla de afinidad de nodos para seleccionar de forma explícita una ComputeClass específica no permitida.
- Usa una tolerancia que corresponda a un taint de nodo para una ComputeClass específica no permitida.
- Usa una tolerancia que coincida con todos los taints de nodos del clúster.
Esta ValidatingAdmissionPolicy es un ejemplo. Puedes usar expresiones para activar la política según tus propias condiciones, como impedir que los Pods que tienen etiquetas específicas seleccionen ciertas ComputeClasses.
Crea el objeto ValidatingAdmissionPolicy:
kubectl apply -f restrict-computeclass-usage-vap.yamlGuarda el siguiente ValidatingAdmissionPolicyBinding como
restrict-computeclass-usage-binding.yaml:apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingAdmissionPolicyBinding metadata: name: restrict-computeclass-usage-binding spec: policyName: restrict-computeclass-usage validationActions: ["Deny","Audit"] matchResources: namespaceSelector: matchLabels: kubernetes.io/metadata.name: computeclass-vap-tutorial # Replace with the name of any namespace in the cluster.Este ValidatingAdmissionPolicyBinding aplica la ValidatingAdmissionPolicy del paso anterior en el espacio de nombres
computeclass-vap-tutorial. Los valores del campovalidationActionsrechazan los Pods o las implementaciones que incumplen la ValidatingAdmissionPolicy y agregan una entrada al registro de auditoría de Kubernetes.Crea el ValidatingAdmissionPolicyBinding:
kubectl apply -f restrict-computeclass-usage-binding.yaml
Configura políticas de RBAC
Además de usar un ValidatingAdmissionPolicy para evitar que las cargas de trabajo usen ciertas ComputeClasses, usa RBAC para evitar que las entidades principales no autorizadas creen y modifiquen las ComputeClasses en tu clúster. En los siguientes pasos, se muestra cómo otorgar acceso a ComputeClasses a un grupo específico de usuarios con Grupos de Google para RBAC:
Crea un grupo para los editores de ComputeClass:
En la Consola del administrador de Google, ve a la página Grupos.
Haz clic en Crear grupo.
En la página Detalles del grupo, haz lo siguiente:
- En el campo Nombre del grupo, especifica
computeclass-editors. - En el campo Correo electrónico del grupo, especifica
computeclass-editors. - Selecciona la casilla de verificación Seguridad.
- Haz clic en Siguiente.
- En el campo Nombre del grupo, especifica
En la página Tipo de acceso, en la columna Miembros del grupo, verifica que esté seleccionada la casilla de verificación Quién puede ver a los miembros.
Haz clic en Crear grupo.
En el menú de navegación, haz clic en Directorio > Grupos.
Coloca el cursor sobre la fila gke-security-groups y, luego, haz clic en Agregar miembros.
En el cuadro de diálogo Add members to gke-security-groups, especifica
computeclass-editorsy selecciona ese grupo en los resultados.Haz clic en Agregar al grupo.
Agrega las direcciones de correo electrónico de los usuarios autorizados al grupo
computeclass-editors.Guarda el siguiente ClusterRole como
computeclass-editor-clusterrole.yaml:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: computeclass-editor rules: - apiGroups: ["cloud.google.com"] resources: ["computeclasses"] verbs: ["create","update"]Crea el ClusterRole:
kubectl apply -f computeclass-editor-clusterrole.yamlGuarda el siguiente ClusterRoleBinding como
computeclass-editor-role-binding.yaml:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: computeclass-editor-role-binding subjects: - kind: Group name: computeclass-editors@GROUP_DOMAIN apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: computeclass-editor apiGroup: rbac.authorization.k8s.io # Required for role referencesReemplaza
GROUP_DOMAINpor el nombre de dominio del grupocomputeclass-editors.Crea el ClusterRoleBinding:
kubectl apply -f computeclass-editor-role-binding.yaml
Verifica tus restricciones
En las siguientes secciones, se muestra cómo verificar que las restricciones que configuraste en las secciones anteriores funcionen según lo previsto. Si configuras tus propias restricciones en ValidatingAdmissionPolicies o políticas de RBAC, prueba las restricciones creando una carga de trabajo que incumpla esas políticas.
Verifica el ValidatingAdmissionPolicy
Guarda cualquiera de los siguientes manifiestos, cada uno de los cuales incumple una condición diferente de ValidatingAdmissionPolicy:
Deployment que usa un selector de nodos para seleccionar una ComputeClass no permitida:
apiVersion: apps/v1 kind: Deployment metadata: name: disallowed-computeclass-deployment namespace: computeclass-vap-tutorial spec: replicas: 1 selector: matchLabels: app: forbidden-selector-app template: metadata: labels: app: forbidden-selector-app spec: containers: - name: my-app-container image: nginx:latest # The node selector triggers the policy. nodeSelector: cloud.google.com/compute-class: COMPUTECLASS_NAMEDeployment que tiene una tolerancia para una ComputeClass no permitida:
apiVersion: apps/v1 kind: Deployment metadata: name: disallowed-computeclass-deployment-toleration namespace: computeclass-vap-tutorial spec: replicas: 1 selector: matchLabels: app: forbidden-selector-app template: metadata: labels: app: forbidden-selector-app spec: containers: - name: my-app-container image: nginx:latest tolerations: - key: cloud.google.com/compute-class operator: Equal value: COMPUTECLASS_NAME effect: NoScheduleDeployment que tiene una regla de afinidad de nodos para una ComputeClass no permitida:
apiVersion: apps/v1 kind: Deployment metadata: name: disallowed-computeclass-deployment-toleration namespace: computeclass-vap-tutorial spec: replicas: 1 selector: matchLabels: app: forbidden-selector-app template: metadata: labels: app: forbidden-selector-app spec: containers: - name: my-app-container image: nginx:latest affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: cloud.google.com/compute-class operator: In values: - COMPUTECLASS_NAMEPod que tiene una tolerancia para cualquier taint de nodo en el clúster:
apiVersion: v1 kind: Pod metadata: name: disallowed-computeclass-deployment-toleration namespace: computeclass-vap-tutorial spec: containers: - name: my-app-container image: nginx:latest tolerations: - operator: Exists effect: NoSchedule
Crea la carga de trabajo de prueba:
kubectl apply -f PATH_TO_WORKLOAD_MANIFESTEl resultado es similar a lo siguiente:
Error from server (BadRequest): admission webhook "validation-policy.kubernetes.io" denied the request: Pods and Deployments in this namespace cannot request ComputeClass COMPUTECLASS_NAME or use wildcard tolerations.
Verifica la configuración de RBAC
Para verificar tu configuración de RBAC, sigue estos pasos:
Autentícate en el clúster con las credenciales de un usuario que sea miembro del grupo
computeclass-editors.Verifica si el usuario puede crear una ComputeClass:
kubectl auth can-i create computeclasses.cloud.google.com \ --as=MEMBER_USERReemplaza
MEMBER_USERpor la dirección de correo electrónico de un usuario que sea miembro del grupo.El resultado es
yes.Autentícate en el clúster con las credenciales de un usuario que no sea miembro del grupo
computeclass-editors.Verifica si el usuario puede crear una ComputeClass:
kubectl auth can-i create computeclasses.cloud.google.com \ --as=NON_MEMBER_USERReemplaza
NON_MEMBER_USERpor la dirección de correo electrónico de un usuario que no sea miembro del grupo.El resultado es
no.
Si el resultado del comando kubectl auth can-i es yes para un usuario que no es miembro del grupo, verifica lo siguiente:
- El grupo
computeclass-editorses miembro del grupogke-security-groups. - La dirección de correo electrónico del grupo en tu ClusterRoleBinding es la dirección de correo electrónico exacta del grupo, como
computeclass-editors@example.com.
Realiza una limpieza
Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.
Si implementas las políticas de ValidatingAdmissionPolicy y RBAC de este instructivo en un clúster de producción, GKE bloqueará los Pods entrantes y las solicitudes a la API que incumplan las políticas. Para mantener activas estas políticas, omite esta sección. En las siguientes secciones, se muestra cómo borrar el proyecto o los recursos individuales si seguiste este instructivo en un entorno de aprendizaje o pruebas.
Borra el proyecto
Borra un Google Cloud proyecto:
gcloud projects delete PROJECT_ID
Borra los recursos individuales
Borra la ComputeClass que creaste:
kubectl delete computeclass access-restriction-classBorra ValidatingAdmissionPolicy y ValidatingAdmissionPolicyBinding:
kubectl delete validatingadmissionpolicy restrict-computeclass-usage kubectl delete validatingadmissionpolicybinding restrict-computeclass-usage-bindingBorra los ClusterRoles y los ClusterRoleBindings:
kubectl delete clusterroles \ computeclass-editor validatingadmissionpolicy-editor kubectl delete clusterrolebindings \ computeclass-editor-role-binding edit-validatingadmissionpoliciesBorra el espacio de nombres de ejemplo:
kubectl delete namespace computeclass-vap-tutorial
¿Qué sigue?
- Revisa las prácticas recomendadas para la seguridad del clúster
- Explora arquitecturas de referencia, diagramas y prácticas recomendadas sobre Google Cloud. Consulta nuestro Cloud Architecture Center.