En este documento, se explica cómo mejorar la seguridad y la administración de tu clúster de Kubernetes aislando las cargas de trabajo de contenedores en grupos de nodos dedicados en Google Distributed Cloud (GDC) aislado. Aislar tus cargas de trabajo te brinda mayor control sobre tus Pods y reduce el riesgo de ataques de elevación de privilegios en tu clúster de Kubernetes. Para obtener más información sobre los beneficios y las limitaciones de los grupos de nodos dedicados, consulta la Descripción general del aislamiento de nodos.
Existen varios flujos de trabajo relacionados con el aislamiento de las cargas de trabajo de contenedores, incluidos los siguientes:
Aplica un taint y una etiqueta a un grupo de nodos: Aplica un taint y una etiqueta a un grupo de nodos para que rechace los Pods, a menos que estén etiquetados específicamente para ejecutarse allí.
Agrega una regla de tolerancia y afinidad de nodos: Aplica tolerancias y reglas a tus Pods para obligarlos a ejecutarse solo en el grupo de nodos designado.
Verifica que la separación funcione: Confirma que tus grupos de nodos contaminados solo ejecuten los Pods que etiquetaste para que se ejecuten allí.
Estos flujos de trabajo están dirigidos a públicos como los administradores de TI dentro del grupo de administradores de la plataforma, que son responsables de administrar los grupos de nodos de un clúster de Kubernetes, y los desarrolladores de aplicaciones dentro del grupo de operadores de aplicaciones, que son responsables de administrar las cargas de trabajo de contenedores. Para obtener más información, consulta Audiences for GDC air-gapped documentation.
Antes de comenzar
Antes de comenzar, asegúrate de haber realizado las siguientes tareas:
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
.Si es necesario, pídele al administrador de IAM de la organización que te otorgue el rol de desarrollador de clústeres de usuarios (
user-cluster-developer
), que no está vinculado a un espacio de nombres.
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.
Para agregar un taint y una etiqueta a un grupo de nodos nuevo, completa los siguientes pasos:
Edita la sección
nodePools
del recurso personalizadoCluster
directamente 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_VALUE
Reemplaza lo siguiente:
TAINT_KEY
: Es la parte de la clave de taint del par clave-valor asociado con una programación deTAINT_EFFECT
. Por ejemplo,workloadType
.TAINT_VALUE
: Es la porción del valor del taint del par clave-valor asociado con una programación deTAINT_EFFECT
. Por ejemplo,untrusted
.TAINT_EFFECT
: 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 desalojan 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 y 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
Cluster
para crear el grupo de nodos nuevo:kubectl apply -f cluster.yaml --kubeconfig MANAGEMENT_API_SERVER
Reemplaza
MANAGEMENT_API_SERVER
por la ruta de acceso al archivo kubeconfig del servidor de la API zonal en el que se aloja el clúster de Kubernetes. Si aún no generaste un archivo kubeconfig para el servidor de la API en tu zona de destino, consulta Recursos del servidor de la API de administración zonal para obtener más información.
Aplica un taint y una etiqueta a un grupo de nodos existente
Para aplicar una asociación o etiqueta a un grupo de nodos existente, debes aplicar los cambios a cada nodo existente. No puedes actualizar de forma dinámica la configuración de los grupos de nodos.
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_NAME
Reemplaza las siguientes variables:
KUBERNETES_CLUSTER_KUBECONFIG
: Es la ruta de acceso a kubeconfig del clúster de Kubernetes.NODE_POOL_NAME
: Es el nombre de tu grupo de nodos dedicados.
Toma nota del ID de cada nodo del grupo de nodos a partir del resultado.
Aplica los contaminantes a cada nodo del grupo de nodos:
kubectl taint nodes NODE_ID \ TAINT_KEY=TAINT_VALUE:TAINT_EFFECT \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG
Reemplaza las siguientes variables:
NODE_ID
: Es el ID del nodo trabajador en el grupo de nodos dedicado.TAINT_KEY=TAINT_VALUE
: Es un par clave-valor asociado con una programación deTAINT_EFFECT
. Por ejemplo,workloadType=untrusted
.TAINT_EFFECT
: 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 desalojan 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 y no se programa en el nodo si aún no se está ejecutando en él.
KUBERNETES_CLUSTER_KUBECONFIG
: Es la ruta de acceso a kubeconfig del clúster de Kubernetes.
Para cada nodo del grupo de nodos, aplica las etiquetas que corresponden a los selectores que definirás en tus cargas de trabajo de contenedores:
kubectl label NODE_ID \ LABEL_KEY:LABEL_VALUE \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG
Reemplaza 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 a kubeconfig del 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 indicarle a GDC que solo programe tus cargas de trabajo en ese grupo de nodos.
Para configurar tu carga de trabajo de contenedor para que se ejecute en el grupo de nodos dedicado, completa los siguientes pasos:
Agrega las siguientes secciones a la sección
.spec.template.spec
de tu archivo de manifiesto de carga de trabajo del contenedor, como un recurso personalizadoDeployment
:# Several lines of code are omitted here. spec: template: spec: 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" # Several lines of code are omitted here.
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 efecto:NoSchedule
: Los Pods que no toleran este taint no se programan en el nodo. Los Pods existentes no se desalojan 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 y 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
Deployment
agrega una tolerancia para el taintworkloadType=untrusted:NoExecute
y 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: SECRET
Actualiza tu carga de trabajo de contenedor:
kubectl apply -f deployment.yaml -n NAMESPACE \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG
Reemplaza las siguientes variables:
NAMESPACE
: Es el espacio de nombres del proyecto de tu carga de trabajo de contenedor.KUBERNETES_CLUSTER_KUBECONFIG
: Es la ruta de acceso a kubeconfig del 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_KUBECONFIG
Reemplaza las siguientes variables:
NAMESPACE
: Es el espacio de nombres del proyecto de tu carga de trabajo de contenedor.KUBERNETES_CLUSTER_KUBECONFIG
: Es la ruta de acceso a kubeconfig del clúster de Kubernetes.
El resultado es similar al siguiente:
pod/kube-abc-12tyuj pod/kube-abc-39oplef pod/kube-abc-95rzkap
Confirma 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 en contenedores con alta disponibilidad
- Cargas de trabajo de Kubernetes para HA