En este instructivo, se muestra cómo personalizar los nodos de un clúster de Google Kubernetes Engine (GKE) mediante DaemonSets. Un DaemonSet garantiza que todos los nodos (o los nodos seleccionados) ejecuten una copia de un Pod. Este enfoque te permite usar las mismas herramientas a fin de organizar las cargas de trabajo que usas para modificar los nodos de GKE.
Si las herramientas y los sistemas que usas cuando inicializas los clústeres son diferentes a las herramientas y a los sistemas que usas a fin de ejecutar las cargas de trabajo, aumenta el esfuerzo que se necesita para administrar el entorno. Por ejemplo, si usas una herramienta de administración de la configuración para inicializar los nodos del clúster, dependes de un procedimiento que está fuera del entorno de ejecución en el que se ejecuta el resto de las cargas de trabajo.
El objetivo de este instructivo es ayudar a los administradores de sistemas, los ingenieros de sistemas o los operadores de infraestructura a optimizar la inicialización de los clústeres de Kubernetes.
Para este instructivo, deberás estar familiarizado con las siguientes herramientas:
En este instructivo, aprenderás a usar etiquetas y selectores de Kubernetes a fin de elegir qué procedimiento de inicialización ejecutar en función de las etiquetas que se aplican a un nodo. En estos pasos, debes implementar un DaemonSet para ejecutarlo solo en los nodos que tienen aplicada la etiqueta default-init
. Sin embargo, a fin de demostrar la flexibilidad de este mecanismo, puedes crear otro grupo de nodos y aplicarles la etiqueta alternative-init
. En el clúster, podrías implementar otro DaemonSet configurado para ejecutarse solo en los nodos que tengan la etiqueta alternative-init
.
Además, puedes ejecutar varios procedimientos de inicialización en cada nodo, no solo uno. Puedes aprovechar este mecanismo para estructurar mejor los procedimientos de inicialización y separar de forma clara las prioridades de cada uno.
En este instructivo, como ejemplo, el procedimiento de inicialización realiza las siguientes acciones en cada nodo con la etiqueta default-init
:
- Conecta un disco adicional al nodo.
- Instala un conjunto de paquetes y bibliotecas mediante el administrador de paquetes del sistema operativo del nodo.
- Carga un conjunto de módulos de kernel de Linux.
Objetivos
En este instructivo, harás lo que se indica a continuación:
- Aprovisionar y configurar un clúster de GKE
- Preparar un descriptor DaemonSet para inicializar los nodos en el clúster
- Implementar el DaemonSet en el clúster
- Verificar que se hayan inicializado los nodos del clúster
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 finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.
Antes de comenzar
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
Inicia el entorno
En esta sección, harás lo siguiente:
- Habilita las API de Cloud necesarias.
- Aprovisiona una cuenta de servicio con privilegios limitados para los nodos en el clúster de GKE.
- Prepara el clúster de GKE.
- Otorga al usuario privilegios de administrador de clústeres.
Habilita las API de Cloud
Abre Cloud Shell
Selecciona el proyecto de Google Cloud:
gcloud config set project project-id
Reemplaza
project-id
por el ID del proyecto de Google Cloud que creaste o seleccionaste para este instructivo.Habilita la API de Google Kubernetes Engine:
gcloud services enable container.googleapis.com
Aprovisiona una cuenta de servicio para administrar clústeres de GKE
En esta sección, crearás una cuenta de servicio asociada a los nodos del clúster. En este instructivo, los nodos de GKE usan esta cuenta de servicio en lugar de la cuenta de servicio predeterminada. Como práctica recomendada, otorga a la cuenta de servicio solo las funciones y los permisos de acceso necesarios para ejecutar la aplicación.
Las funciones que se necesitan para la cuenta de servicio son las que se describen a continuación:
- Función de visualizador de Monitoring (
roles/monitoring.viewer
). Esta función proporciona acceso de solo lectura a la API y la consola de Cloud Monitoring. - Función de escritor de métricas de Monitoring (
roles/monitoring.metricWriter
). Esta función permite escribir datos de supervisión. - Función de escritor de registros (
roles/logging.logWriter
). Esta función otorga los permisos suficientes para escribir registros. - Función de usuario de cuenta de servicio (
roles/iam.serviceAccountUser
). Esta función otorga acceso a las cuentas de servicio en un proyecto. En este instructivo, el procedimiento de inicialización usa la identidad de la cuenta de servicio para ejecutar operaciones privilegiadas. - La función de administrador de Compute (
roles/compute.admin
). Esta función proporciona control total sobre todos los recursos de Compute Engine. En este instructivo, la cuenta de servicio necesita esta función para conectar discos adicionales a los nodos del clúster.
Para aprovisionar una cuenta de servicio, sigue estos pasos:
En Cloud Shell, inicializa una variable de entorno que almacene el nombre de la cuenta de servicio:
GKE_SERVICE_ACCOUNT_NAME=ds-init-tutorial-gke
Crea una cuenta de servicio:
gcloud iam service-accounts create "$GKE_SERVICE_ACCOUNT_NAME" \ --display-name="$GKE_SERVICE_ACCOUNT_NAME"
Inicializa una variable de entorno que almacene el nombre de la cuenta de correo electrónico de la cuenta de servicio:
GKE_SERVICE_ACCOUNT_EMAIL="$(gcloud iam service-accounts list \ --format='value(email)' \ --filter=displayName:"$GKE_SERVICE_ACCOUNT_NAME")"
Vincula las funciones de administración de identidades y accesos (IAM) a la cuenta de servicio:
gcloud projects add-iam-policy-binding \ "$(gcloud config get-value project 2> /dev/null)" \ --member serviceAccount:"$GKE_SERVICE_ACCOUNT_EMAIL" \ --role roles/compute.admin gcloud projects add-iam-policy-binding \ "$(gcloud config get-value project 2> /dev/null)" \ --member serviceAccount:"$GKE_SERVICE_ACCOUNT_EMAIL" \ --role roles/monitoring.viewer gcloud projects add-iam-policy-binding \ "$(gcloud config get-value project 2> /dev/null)" \ --member serviceAccount:"$GKE_SERVICE_ACCOUNT_EMAIL" \ --role roles/monitoring.metricWriter gcloud projects add-iam-policy-binding \ "$(gcloud config get-value project 2> /dev/null)" \ --member serviceAccount:"$GKE_SERVICE_ACCOUNT_EMAIL" \ --role roles/logging.logWriter gcloud projects add-iam-policy-binding \ "$(gcloud config get-value project 2> /dev/null)" \ --member serviceAccount:"$GKE_SERVICE_ACCOUNT_EMAIL" \ --role roles/iam.serviceAccountUser
Prepara el clúster de GKE
En esta sección, iniciarás el clúster de GKE, otorgarás permisos y finalizarás la configuración del clúster.
Un clúster con una cantidad relativamente baja de nodos pequeños de uso general es suficiente para demostrar el concepto de este instructivo. Debes crear un clúster con un grupo de nodos (el predeterminado). Luego, debes etiquetar todos los nodos en el grupo de nodos predeterminado con la etiqueta default-init
.
En Cloud Shell, crea e inicia un clúster de GKE regional:
gcloud container clusters create ds-init-tutorial \ --enable-ip-alias \ --image-type=ubuntu_containerd \ --machine-type=n1-standard-2 \ --metadata disable-legacy-endpoints=true \ --node-labels=app=default-init \ --node-locations us-central1-a,us-central1-b,us-central1-c \ --no-enable-basic-auth \ --no-issue-client-certificate \ --num-nodes=1 \ --region us-central1 \ --service-account="$GKE_SERVICE_ACCOUNT_EMAIL"
Implementa el DaemonSet
En esta sección, harás lo siguiente:
- Crear el ConfigMap que almacene el procedimiento de inicialización
- Implementar el DaemonSet que programe y ejecute el procedimiento de inicialización
El DaemonSet hace lo siguiente:
- Configura un volumen que hace que el contenido de ConfigMap esté disponible para los contenedores que controla DaemonSet.
- Configura los volúmenes para las áreas del sistema de archivos privilegiadas del nodo del clúster subyacente. Estas áreas permiten que los contenedores que programa DaemonSet interactúen directamente con el nodo que los ejecuta.
- Programa y ejecuta un contenedor init que ejecute el procedimiento de inicialización y, luego, finalice cuando se complete.
- Programa y ejecuta un contenedor que permanezca inactivo y no consuma recursos.
El contenedor inactivo garantiza que un nodo se inicialice solo una vez. Los DaemonSets están diseñados para que todos los nodos aptos ejecuten una copia de un Pod. Si usas un contenedor normal, ese contenedor ejecutará el procedimiento de inicialización y, luego, finalizará cuando se complete. Por diseño, el DaemonSet reprograma el Pod. Para evitar la “reprogramación continua”, el DaemonSet primero ejecuta el procedimiento de inicialización en un contenedor init y, luego, deja un contenedor en ejecución.
El siguiente procedimiento de inicialización contiene operaciones con y sin privilegios. Mediante chroot
, puedes ejecutar comandos como si los ejecutaras directamente en el nodo, no solo dentro de un contenedor.
Te recomendamos que revises con cuidado cada procedimiento de inicialización, ya que podría alterar el estado de los nodos del clúster. Solo un pequeño grupo de personas debe tener derecho a modificar esos procedimientos, debido a que estos pueden afectar en gran medida la disponibilidad y la seguridad de los clústeres.
Para implementar el ConfigMap y el DaemonSet, haz lo siguiente:
En Cloud Shell, cambia el directorio de trabajo al directorio
$HOME
:cd "$HOME"
Clona el repositorio de Git que contiene las secuencias de comandos y los archivos de manifiesto para implementar y configurar el procedimiento de inicialización:
git clone https://github.com/GoogleCloudPlatform/solutions-gke-init-daemonsets-tutorial
Cambia el directorio de trabajo al directorio del repositorio recién clonado:
cd "$HOME"/solutions-gke-init-daemonsets-tutorial
Crea un ConfigMap para guardar la secuencia de comandos de inicialización del nodo:
kubectl apply -f cm-entrypoint.yaml
Implementa el DaemonSet:
kubectl apply -f daemon-set.yaml
Verifica si se completó la inicialización del nodo:
kubectl get ds --watch
Espera a que se notifique que el DaemonSet está listo y actualizado, como lo indica un resultado similar al siguiente:
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE node-initializer 3 3 3 3 3 <none> 2h
Valida y verifica el procedimiento de inicialización
Después de que cada nodo del clúster marcado con la etiqueta default-init
ejecute el procedimiento de inicialización, puedes verificar los resultados.
Para cada nodo, el procedimiento de verificación comprobará la siguiente información:
- Que haya un disco adicional conectado y listo para usar.
- Que el administrador de paquetes del sistema operativo del nodo haya instalado los paquetes y las bibliotecas.
- Que estén cargados los módulos de kernel.
Ejecuta el procedimiento de verificación:
En Cloud Shell, ejecuta la secuencia de comandos de verificación:
kubectl get nodes -o=jsonpath='{range .items[?(@.metadata.labels.app=="default-init")]}{.metadata.name}{" "}{.metadata.labels.failure-domain\.beta\.kubernetes\.io/zone}{"\n"}{end}' | while IFS= read -r line ; do ./verify-init.sh $line < /dev/null; done
Espera a que la secuencia de comandos se ejecute y verifica que cada nodo se haya inicializado de forma correcta, como lo indica el resultado que se ve de la siguiente manera:
Verifying gke-ds-init-tutorial-default-pool-5464b7e3-nzjm (us-central1-c) configuration Disk configured successfully on gke-ds-init-tutorial-default-pool-5464b7e3-nzjm (us-central1-c) Packages installed successfully in gke-ds-init-tutorial-default-pool-5464b7e3-nzjm (us-central1-c) Kernel modules loaded successfully on gke-ds-init-tutorial-default-pool-5464b7e3-nzjm (us-central1-c) Verifying gke-ds-init-tutorial-default-pool-65baf745-0gwt (us-central1-a) configuration Disk configured successfully on gke-ds-init-tutorial-default-pool-65baf745-0gwt (us-central1-a) Packages installed successfully in gke-ds-init-tutorial-default-pool-65baf745-0gwt (us-central1-a) Kernel modules loaded successfully on gke-ds-init-tutorial-default-pool-65baf745-0gwt (us-central1-a) Verifying gke-ds-init-tutorial-default-pool-6b125c50-3xvl (us-central1-b) configuration Disk configured successfully on gke-ds-init-tutorial-default-pool-6b125c50-3xvl (us-central1-b) Packages installed successfully in gke-ds-init-tutorial-default-pool-6b125c50-3xvl (us-central1-b) Kernel modules loaded successfully on gke-ds-init-tutorial-default-pool-6b125c50-3xvl (us-central1-b)
Limpia
Para evitar que se apliquen cargos a la cuenta de Google Cloud por los recursos que usaste en este instructivo, puedes borrar el proyecto que creaste. Si creaste un proyecto dedicado a este instructivo, puedes borrarlo por completo. Si usaste un proyecto existente, pero no deseas borrarlo, sigue estos pasos para limpiar el proyecto.
Limpia el proyecto
Para limpiar un proyecto sin borrarlo, debes quitar los recursos que creaste en este instructivo.
En Cloud Shell, borra el clúster de GKE:
gcloud container clusters delete ds-init-tutorial --quiet --region us-central1
Borra los discos adicionales que creaste como parte de este procedimiento de inicialización de ejemplo:
gcloud compute disks list --filter="name:additional" --format="csv[no-heading](name,zone)" | while IFS= read -r line ; do DISK_NAME="$(echo $line | cut -d',' -f1)"; ZONE="$(echo $line | cut -d',' -f2)"; gcloud compute disks delete "$DISK_NAME" --quiet --zone "$ZONE" < /dev/null; done
Borra la cuenta de servicio:
gcloud iam service-accounts delete "$GKE_SERVICE_ACCOUNT_EMAIL" --quiet
Borra el directorio del repositorio clonado:
rm -rf "$HOME"/solutions-gke-init-daemonsets-tutorial
Borra el proyecto
La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Próximos pasos
- Obtén más información sobre GKE.
- Implementa una cadena de suministro de software segura.
- Obtén más información sobre cómo endurecer la seguridad del clúster de GKE.
- Explora arquitecturas de referencia, diagramas y prácticas recomendadas sobre Google Cloud. Consulta nuestro Cloud Architecture Center.