Los grupos de nodos dedicados en Google Distributed Cloud (GDC) aislado te permiten aislar las cargas de trabajo de contenedores para fortalecer la seguridad del clúster de Kubernetes y controlar la ubicación de los Pods. Esta separación ayuda a reducir el riesgo de ataques de elevación de privilegios. Para configurar grupos dedicados, aplica taints y etiquetas, haz que coincidan con las tolerancias de las cargas de trabajo y las reglas de afinidad de nodos, y verifica la programación.
Este documento está dirigido a los administradores de TI del grupo de administradores de plataformas que administran clústeres de Kubernetes y a los desarrolladores del grupo de operadores de aplicaciones que ejecutan contenedores. Para obtener más información, consulta Descripción general del aislamiento de nodos y Públicos de la documentación de GDC aislado.
Antes de comenzar
Para completar las tareas de este documento, debes solicitar los permisos necesarios y preparar tu entorno.
Solicita roles de IAM
Debes tener roles específicos para obtener los permisos que necesitas para aislar las cargas de trabajo de contenedores en tu clúster de Kubernetes. Los roles que necesitas dependen de si trabajas en un clúster compartido con alcance de organización o en un clúster estándar con alcance de proyecto. Para obtener más información, consulta Configuraciones de clústeres de Kubernetes.
Roles de clúster compartidos
Comunícate con el administrador de la organización de IAM para solicitar los siguientes roles para aplicar taints y etiquetar un grupo de nodos en un clúster compartido:
Administrador de clústeres de usuario (
user-cluster-admin): Crea, borra, edita o visualiza los recursos de un clúster compartido alojado en el servidor de la API de administración. Este rol proporciona acceso a los grupos de nodos del clúster compartido.Desarrollador de clústeres de usuario (
user-cluster-developer): Crea, borra, edita o visualiza un clúster compartido. Este rol proporciona acceso a las APIs del plano de datos alojadas en el clúster compartido.
Estos roles no están vinculados a un espacio de nombres.
Roles de clúster estándar
Comunícate con el administrador de proyectos de IAM para solicitar los siguientes roles que te permitan aplicar taints y etiquetar un grupo de nodos en un clúster estándar:
Administrador de clústeres (
cluster-admin): Crea, borra, edita o visualiza todos los recursos de un clúster estándar. Este rol proporciona acceso a las APIs del plano de datos alojadas en el clúster estándar que rigen los recursos del clúster.Desarrollador de clústeres (
cluster-developer): Crea, borra, edita o visualiza un clúster estándar. Este rol proporciona acceso a las APIs del plano de datos alojadas en el clúster estándar que rigen el clúster.Administrador de clústeres estándar (
standard-cluster-admin): Crea, borra, edita o visualiza los recursos de un clúster estándar alojado en el servidor de la API de administración. Este rol proporciona acceso a los grupos de nodos del clúster de Standard.
Estos roles están vinculados al espacio de nombres de tu proyecto.
Prepara el entorno
Para ejecutar comandos en un clúster de Kubernetes con la API, asegúrate de tener los siguientes recursos:
Accede y genera el archivo kubeconfig para el clúster de Kubernetes.
Usa la ruta de acceso de kubeconfig del clúster de Kubernetes para reemplazar
KUBERNETES_CLUSTER_KUBECONFIGen estas instrucciones.Accede y genera el archivo kubeconfig para el servidor de la API de administración.
Usa la ruta de acceso de kubeconfig del servidor de la API de administración para reemplazar
MANAGEMENT_API_SERVERen estas instrucciones.Elige un nombre específico para el taint de nodo y la etiqueta de nodo que deseas usar para los grupos de nodos dedicados. Por ejemplo,
workloadType=untrusted.
Aplica un taint y una etiqueta a un grupo de nodos nuevo
Cuando aplicas un taint o una etiqueta a un grupo de nodos nuevo, todos los nodos, incluidos los que se agreguen más adelante, obtendrán automáticamente los taints y las etiquetas especificados. No puedes quitar un taint o una etiqueta de un grupo de nodos después de aplicarlo.
Para agregar un taint y una etiqueta a un grupo de nodos nuevo, completa los siguientes pasos:
Edita la sección
nodePoolsdel recurso personalizadoClusterdirectamente cuando crees el grupo de nodos:nodePools: # Several lines of code are omitted here. - machineTypeName: n2-standard-2-gdc name: nodepool-1 nodeCount: 3 taints: - key: "TAINT_KEY" value: "TAINT_VALUE" effect: "TAINT_EFFECT" labels: LABEL_KEY: LABEL_VALUEReemplaza lo siguiente:
TAINT_KEY: Es la parte de la clave de la tacha del par clave-valor asociado con unaTAINT_EFFECTde programación. Por ejemplo,workloadType.TAINT_VALUE: Es la parte del valor de la tolerancia del par clave-valor asociado con una programaciónTAINT_EFFECT. Por ejemplo,untrusted.TAINT_EFFECT: Es uno de los siguientes valores de efecto:NoSchedule: Los Pods que no toleran este taint no se programan en el nodo. Los Pods existentes no se expulsan del nodo.PreferNoSchedule: Kubernetes evita la programación de Pods que no toleran este taint en el nodo.NoExecute: El Pod se desaloja del nodo si ya se está ejecutando en este. No se programa en el nodo si aún no se está ejecutando en él.
LABEL_KEY: LABEL_VALUE: Son los pares clave-valor para las etiquetas de nodo, que corresponden a los selectores que especificas en los manifiestos de cargas de trabajo.
Aplica el recurso
Clusterpara crear el nuevo grupo de nodos:kubectl apply -f cluster.yaml --kubeconfig MANAGEMENT_API_SERVERReemplaza
MANAGEMENT_API_SERVERpor la ruta de acceso de kubeconfig del servidor de la API zonal en el que se aloja el clúster de Kubernetes.
Aplica un taint y una etiqueta a un grupo de nodos existente
Para aplicar un taint o una etiqueta a un grupo de nodos existente, debes aplicar los cambios a cada nodo existente. No puedes actualizar de forma dinámica las configuraciones de los grupos de nodos.
No puedes quitar un taint o una etiqueta de un grupo de nodos después de aplicarlo.
Para agregar un taint y una etiqueta a un grupo de nodos existente, completa los siguientes pasos:
Enumera los nodos del grupo de nodos dedicado:
kubectl get node --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG \ -l baremetal.cluster.gke.io/node-pool=NODE_POOL_NAMEReemplaza las siguientes variables:
KUBERNETES_CLUSTER_KUBECONFIG: Es la ruta de acceso de kubeconfig para el clúster de Kubernetes.NODE_POOL_NAME: Es el nombre de tu grupo de nodos dedicado.
Toma nota de cada ID de nodo de todos los nodos del grupo de nodos del resultado.
Para cada nodo del grupo de nodos, aplica los taints:
kubectl taint nodes NODE_ID \ TAINT_KEY=TAINT_VALUE:TAINT_EFFECT \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIGReemplaza las siguientes variables:
NODE_ID: Es el ID del nodo trabajador en el grupo de nodos dedicado.TAINT_KEY=TAINT_VALUE: un par clave-valor asociado con una programación deTAINT_EFFECT. Por ejemplo,workloadType=untrusted.TAINT_EFFECT: uno de los siguientes valores de efectos:NoSchedule: Los Pods que no toleran este taint no se programan en el nodo. Los Pods existentes no se expulsan del nodo.PreferNoSchedule: Kubernetes evita la programación de Pods que no toleran este taint en el nodo.NoExecute: El Pod se desaloja del nodo si ya se está ejecutando en este. No se programa en el nodo si aún no se está ejecutando en él.
KUBERNETES_CLUSTER_KUBECONFIG: Es la ruta de acceso de kubeconfig para el clúster de Kubernetes.
Para cada nodo del grupo de nodos, aplica las etiquetas que correspondan a los selectores que definirás en tus cargas de trabajo de contenedores:
kubectl label NODE_ID \ LABEL_KEY:LABEL_VALUE \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIGReemplaza las siguientes variables:
NODE_ID: Es el ID del nodo trabajador en el grupo de nodos dedicado.LABEL_KEY:LABEL_VALUE: Son los pares clave-valor para las etiquetas de nodo, que corresponden a los selectores que especificas en los manifiestos de cargas de trabajo.KUBERNETES_CLUSTER_KUBECONFIG: Es la ruta de acceso de kubeconfig para el clúster de Kubernetes.
Agrega una regla de tolerancia y afinidad de nodos
Después de aplicar un taint al grupo de nodos dedicado, ninguna carga de trabajo puede programarlo, a menos que tenga una tolerancia correspondiente al taint que agregaste. Agrega la tolerancia a la especificación de tus cargas de trabajo para permitir que esos Pods se programen en tu grupo de nodos con taints.
Si etiquetaste el grupo de nodos dedicado, también puedes agregar una regla de afinidad de nodos para indicar a GDC que solo programe las cargas de trabajo en ese grupo de nodos.
Para configurar la carga de trabajo del contenedor de modo que se ejecute en el grupo de nodos dedicado, completa los siguientes pasos:
Agrega las siguientes secciones a la sección
.spec.template.specdel archivo de manifiesto de la carga de trabajo del contenedor, como un recurso personalizadoDeployment:tolerations: - key: TAINT_KEY operator: Equal value: TAINT_VALUE effect: TAINT_EFFECT affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: LABEL_KEY operator: In values: - "LABEL_VALUE"Reemplaza lo siguiente:
TAINT_KEY: La clave de taint que aplicaste al grupo de nodos dedicado.TAINT_VALUE: Es el valor de taint que aplicaste a tu grupo de nodos dedicado.TAINT_EFFECT: uno de los siguientes valores de efectos:NoSchedule: Los Pods que no toleran este taint no se programan en el nodo. Los Pods existentes no se expulsan del nodo.PreferNoSchedule: Kubernetes evita la programación de Pods que no toleran este taint en el nodo.NoExecute: El Pod se desaloja del nodo si ya se está ejecutando en este. No se programa en el nodo si aún no se está ejecutando en él.
LABEL_KEY: Es la clave de etiqueta de nodo que aplicaste a tu grupo de nodos dedicado.LABEL_VALUE: Es el valor de la etiqueta de nodo que aplicaste a tu grupo de nodos dedicado.
Por ejemplo, el siguiente recurso
Deploymentagrega una tolerancia para el taintworkloadType=untrusted:NoExecutey una regla de afinidad de nodos para la etiqueta de nodoworkloadType=untrusted:kind: Deployment apiVersion: apps/v1 metadata: name: my-app namespace: default labels: app: my-app spec: replicas: 1 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: tolerations: - key: workloadType operator: Equal value: untrusted effect: NoExecute affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: workloadType operator: In values: - "untrusted" containers: - name: my-app image: harbor-1.org-1.zone1.google.gdc.test/harborproject/my-app ports: - containerPort: 80 imagePullSecrets: - name: SECRETActualiza la carga de trabajo de tu contenedor:
kubectl apply -f deployment.yaml -n NAMESPACE \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIGReemplaza las siguientes variables:
NAMESPACE: Es el espacio de nombres de tu carga de trabajo de contenedor. En el caso de los clústeres compartidos, debe ser un espacio de nombres del proyecto. Para los clústeres estándar, puede ser cualquier espacio de nombres.KUBERNETES_CLUSTER_KUBECONFIG: Es la ruta de acceso de kubeconfig para el clúster de Kubernetes.
GDC vuelve a crear los Pods afectados. La regla de afinidad de nodos fuerza a los Pods al grupo de nodos dedicado que creaste. La tolerancia solo permite que se coloquen esos Pods en los nodos.
Verifica que la separación funcione
Verifica que los Pods que designaste se estén ejecutando en el grupo de nodos etiquetado.
Obtén una lista de los Pods en el espacio de nombres determinado:
kubectl get pods -o=wide -n NAMESPACE \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIGReemplaza las siguientes variables:
NAMESPACE: Es el espacio de nombres de tu carga de trabajo de contenedor. En el caso de los clústeres compartidos, debe ser un espacio de nombres del proyecto. Para los clústeres estándar, puede ser cualquier espacio de nombres.KUBERNETES_CLUSTER_KUBECONFIG: Es la ruta de acceso de kubeconfig para el clúster de Kubernetes.
El resultado es similar al siguiente:
pod/kube-abc-12tyuj pod/kube-abc-39oplef pod/kube-abc-95rzkapConfirma que tus cargas de trabajo se ejecuten en el grupo de nodos dedicado.
¿Qué sigue?
- Cargas de trabajo de contenedores en GDC
- Implementa una aplicación de contenedor con alta disponibilidad
- Cargas de trabajo de Kubernetes para alta disponibilidad