Libro blanco: Trilio Site Recovery (TSR) — Recuperación ante desastres para máquinas virtuales nativas de Kubernetes

Kubernetes, a menudo escrito como K8s para abreviar, es una de las principales plataformas de orquestación de contenedores. Proporciona un marco sólido para que los desarrolladores y los equipos de TI administren aplicaciones en contenedores grandes y complejas.  

La plataforma expone API RESTful a través de una interfaz de plano de control de kube-apiserver Componente para ayudar a gestionar y operar objetos. Se puede acceder al punto final de la API a través de la utilidad de línea de comandos kubectl o mediante el panel de control de K8s, ambos incluidos como parte de la distribución de Kubernetes. La utilidad kubectl proporciona una interfaz simple y potente para acceder al plano de control de K8s para crear, actualizar y eliminar recursos de K8s.

En este artículo, abordamos los casos de uso más comunes de kubectl y su sintaxis de línea de comandos. Analizamos las prácticas recomendadas para interactuar con el clúster K8s y algunos pasos de solución de problemas para la implementación de su aplicación. También explicamos cómo realizar copias de seguridad y recuperaciones de su clúster de Kubernetes.

Comandos de uso común de Kubectl

Antes de analizar las mejores prácticas para usar kubectl, familiaricémonos con algunos comandos de kubectl comúnmente utilizados y las tareas que realizan en la administración de recursos de Kubernetes.

Tenga en cuenta que algunos comandos presentados en una sección marcada al final de la tabla utilizan el Complemento KrewEl repositorio de complementos de Krew ofrece varias herramientas para mejorar su experiencia con kubectl al simplificar el descubrimiento, la instalación y la administración de implementaciones. 

Comando

Descripción

Comandos básicos de Kubectl: obtención de información

Información del clúster de Kubectl

Ver información del clúster

kubectl obtener nodos

Ver todos los nodos

kubectl consigue vainas

Ver todos los pods

kubectl obtiene servicios

Vea todos nuestros servicios

kubectl obtiene implementaciones

Ver todas las implementaciones

Gestión de pods

Ejecutar kubectl –imagen=

Crear un Pod

kubectl eliminar pod

Eliminar un Pod

kubectl describe pod

Describir una vaina

registros de kubectl

Salida de registro de un pod

kubectl exec -it — /bin/sh

Iniciar un shell interactivo en un pod

Gestión de la implementación

kubectl crea una implementación –imagen=

Crear una implementación

Implementación a escala de Kubectl –réplicas=

Escalar una implementación

kubectl establece la implementación de imágenes/ =

Actualizar una implementación

Eliminar implementación de kubectl

Eliminar una implementación

Service Management

Implementación de Kubectl Exposure –tipo= –puerto=

Crear un servicio

kubectl describe el servicio

Ver detalles de un servicio

servicio de eliminación de kubectl

Eliminar un servicio

Los espacios de nombres

kubectl obtiene espacios de nombres

Listar todos los espacios de nombres

kubectl crea un espacio de nombres

Crear un espacio de nombres

kubectl eliminar espacio de nombres

Eliminar un espacio de nombres

configuración de kubectl set-context –current –namespace=

Cambiar el contexto a un espacio de nombres

Configuración y gestión

kubectl aplicar -f .yaml

Aplicar una configuración desde el archivo

kubectl eliminar -f .yaml

Eliminar recursos de un archivo de configuración

kubectl obtener todo

Ver configuraciones actuales

kubectl obtener -o yaml

Ver la configuración de un recurso

Comandos de resolución de problemas

kubectl obtiene eventos

Eventos

kubectl describe pod

Ver el estado del pod

kubectl exec -it —

Ejecutar un comando en un pod

registros de kubectl -f

Sigue los registros de un pod en tiempo real

cápsula superior kubectl

Mostrar el uso de recursos para los pods

Nodo superior de kubectl

Mostrar el uso de recursos para los nodos

Gestión de nodos

kubectl obtener nodos

Ver todos los nodos

Cordón Kubectl

Marcar un nodo como no programable

drenaje kubectl

Desalojar todos los pods de un nodo

kubectl descordonar

Marcar un nodo como programable

Complementos de Krew

Instalación ordenada de kubectl krew

Formato kubectl obtener Salida para una mejor legibilidad.

Árbol de instalación de kubectl krew

Visualizar jerarquías y relaciones de recursos

Implementación del árbol de kubectl

Muestra una vista de árbol de una implementación, que muestra sus pods asociados, conjuntos de réplicas y otros objetos relacionados

Instalación de ctx de kubectl krew

Para administrar y cambiar entre múltiples contextos de Kubernetes.

Recursos de instalación de kubectl krew

Ver solicitudes de recursos y límites para pods y contenedores.

Resumen de las mejores prácticas de kubectl

Buenas prácticas

Descripción

Utilice espacios de nombres

Aislar diferentes entornos, equipos o aplicaciones dentro del mismo clúster.

Etiquetar y anotar recursos

Aplique etiquetas en todos los recursos para facilitar la gestión, el filtrado y la agrupación.

Utilice configuraciones declarativas

Defina el estado deseado en los archivos YAML y utilice el comando kubectl apply para crear o actualizar recursos.

Establecer límites de recursos

Establezca solicitudes y límites de recursos en sus contenedores para evitar el aprovisionamiento excesivo o la falta de recursos.

Introducción a los componentes de Kubernetes

Antes de entrar en detalles sobre kubectl, aquí hay una lista de los componentes de K8s con los que la utilidad de línea de comandos puede interactuar a través de API: 

  • Racimo: Un clúster de Kubernetes es un grupo de computadoras interconectadas llamadas nodos que administran y ejecutan aplicaciones en contenedores.
  • Nodo: Un nodo puede ser una máquina física o virtual administrada por el plano de control de K8s. Un nodo aloja componentes como kubelet, un entorno de ejecución de contenedores y el proxy kube, que son necesarios para ejecutar pods.
  • Vaina: Un pod es un conjunto de contenedores que actúan como una sola unidad y brindan servicio a una sola aplicación. Los contenedores comparten recursos de un pod, como un volumen de almacenamiento y la dirección IP asignada al pod. 
  • Despliegue: Una implementación es un objeto declarativo que administra las réplicas y el estado de una aplicación. Una implementación define la cantidad de réplicas de una aplicación y la imagen que utilizan los contenedores de la aplicación.
  • Servicio: Un servicio es un método para exponer aplicaciones que se ejecutan en pods en una red. Un objeto de servicio proporciona la dirección IP y el puerto para que los clientes accedan a los servicios y también puede realizar el equilibrio de carga para una aplicación que se ejecuta en varios pods.
  • Espacio de nombres: Un espacio de nombres proporciona una separación lógica de los recursos dentro de un clúster de K8s. Puede dividir los recursos entre varios usuarios o equipos que trabajan en diferentes proyectos. 

Protección de datos automatizada y recuperación inteligente de Kubernetes

Realice copias de seguridad seguras centradas en aplicaciones de contenedores, máquinas virtuales, timón y operadores

Utilice instantáneas preparadas previamente para probar, transformar y restaurar instantáneamente durante la recuperación

Escale con flujos de trabajo de copia de seguridad y restauración basados ​​en políticas totalmente automatizados

Comandos de Kubectl y sintaxis básica

La utilidad kubectl requiere un archivo de configuración para interactuar con las API de Kubernetes. De forma predeterminada, el archivo se llama config y se coloca en el camino $HOME/.kube/configCon kubectl, puede crear nuevos recursos (como pods), obtener la lista de recursos existentes (como la lista de servicios), describir un recurso específico (como una implementación) o eliminar un recurso de K8s (como un espacio de nombres).

Sintaxis de comandos de Kubectl

La utilidad kubectl tiene la siguiente sintaxis de línea de comandos:

kubectl [comando] [TIPO] [NOMBRE] [banderas]
  • [mando] es el nombre de la operación que desea realizar, como crear, eliminar, obtener o describir.
  • [ESCRIBE] es el tipo de recurso en el que desea operar, como pod, implementación o servicio.
  • [NOMBRE] es el nombre del recurso sobre el que desea operar.
  • [banderas] se utilizan para argumentos adicionales a la línea de comando, como especificar el formato de salida del comando o filtrar recursos según etiquetas.

Obtener ayuda desde la línea de comandos

Hay muchos recursos disponibles en Internet que pueden ayudarle a comprender kubectl y sus distintas opciones. También hay disponible una breve ayuda con la línea de comandos:

$ kubectl --help kubectl controla el administrador de clústeres de Kubernetes. Encuentre más información en: https://kubernetes.io/docs/reference/kubectl/ Comandos básicos (principiante): create Crea un recurso desde un archivo o desde la entrada estándar exposed Toma un controlador de replicación, servicio, implementación . .

Puede obtener ayuda con un comando específico de la siguiente manera:

$ kubectl get --help Muestra uno o varios recursos. . . Ejemplos: # Enumera todos los pods en formato de salida ps kubectl get pods . .

Habilitar el autocompletado de kubectl

Si está utilizando un shell bash de Linux, puede habilitar el autocompletado para el comando kubectl de la siguiente manera:

$ kubectl finalización bash | \ sudo tee /etc/bash_completion.d/kubectl > /dev/null $ fuente /etc/bash_completion.d/kubectl

Comandos básicos de Kubectl: obtención de información

Comencemos con algunos comandos básicos sobre cómo obtener información sobre el clúster de Kubernetes y los recursos que se ejecutan en la plataforma.

Mostrar la dirección del plano de control y los servicios del clúster:

$ kubectl cluster-info El plano de control de Kubernetes se está ejecutando en https://127.0.0.1:6443

Mostrar todos los nodos y sus estados:

$ kubectl get nodes NOMBRE ESTADO ROLES EDAD VERSIÓN node1 Ready control-plane 60d v1.29.5 node2 Ready 21d v1.29.5

Ver todos los pods:

$ kubectl get pods NOMBRE LISTO ESTADO REINICIO EDAD nginx-7854ff8877-q9bxc 1/1 En ejecución 0 21d

Ver todos los servicios:

$ kubectl get services NOMBRE TIPO IP DEL CLÚSTER IP EXTERNA PUERTO(S) EDAD kubernetes ClusterIP 10.233.0.1 443/TCP 60d

Ver todas las implementaciones:

$ kubectl get deployments NOMBRE LISTO ACTUALIZADO DISPONIBLE EDAD nginx 1/1 1 1 60d

Pasos para la implementación del servidor web

Ahora enumeraremos los pasos y comandos para crear una implementación de servidor web NGINX en Kubernetes, incluida la creación de un espacio de nombres separado, la implementación de tres conjuntos de réplicas, la exposición del servicio y algunos pasos de solución de problemas.

Pasos del proceso de implementación

Crear un espacio de nombres

Según las mejores prácticas, se recomienda crear un espacio de nombres separado para cada aplicación.

$ kubectl crear espacio de nombres nginx-namespace espacio-de-nombres/nginx-namespace creado

Cambiar el contexto a un espacio de nombres

De forma predeterminada, el comando kubectl interactúa con los recursos en el la página predeterminada espacio de nombres. Para interactuar con recursos en otros espacios de nombres, puede utilizar el modificador de línea de comandos -norte o cambiar el contexto para que no sea necesario especificarlo -n parámetro con cada comando. 

Contexto "[email protected]" modificado.

Crear una implementación

A continuación, cree un archivo YAML de implementación y defina el estado requerido de la aplicación. Cree un archivo llamado Implementación de nginx.yaml con las especificaciones del contenedor y la cantidad de réplicas. Especifique los límites mínimos y máximos de recursos en los contenedores:

apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: nginx-namespace spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: contenedores: - name: nginx image: nginx:latest ports: - contenedorPort: 80 recursos: solicitudes: memoria: "64Mi" cpu: "250m" límites: memoria: "128Mi" cpu: "500m"

A continuación, aplique la implementación de la siguiente manera:

$ kubectl apply -f nginx-deployment.yaml deployment.apps/nginx-deployment creado

Escalar la implementación

Puede aumentar o disminuir la cantidad de réplicas del contenedor después de la implementación:

Implementación a escala de kubectl nginx-deployment --replicas=4 deployment.apps/nginx-deployment scaled

Crea un servicio

Crea un archivo llamado servicio nginx.yaml con el siguiente contenido:

apiVersion: v1 kind: Service metadata: name: nginx-service namespace: nginx-namespace spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancer

Ahora crea el servicio usando aplicar kubectl:

$ kubectl apply -f nginx-service.yaml servicio/nginx-service creado

Pasos para solucionar problemas

Si la aplicación no funciona como se espera en el clúster K8s, puede usar los siguientes comandos para verificar el estado de los recursos creados en el clúster y revisar los registros en busca de errores.

Compruebe el estado de la implementación. El siguiente comando mostrará el estado de las réplicas junto con el tiempo que lleva ejecutándose la implementación.

$ kubectl get deployments -n nginx-namespace NOMBRE LISTO ACTUALIZADO DISPONIBLE EDAD nginx-deployment 3/3 3 3 21h

Obtenga el estado de la implementación de nginx, junto con su historial, configuración y cualquier evento asociado con la implementación.

$ kubectl describe deployment nginx-deployment -n nginx-namespace Nombre: nginx-deployment Espacio de nombres: nginx-namespace CreationTimestamp: Sáb, 31 Ago 2024 06:08:00 +0000 Etiquetas: Anotaciones: deployment.kubernetes.io/revision: 1 Selector: app=nginx Réplicas: 3 deseadas | 3 actualizadas | 3 en total | 3 disponibles | 0 no disponibles . .

Verifique el estado de los conjuntos de réplicas dentro de un espacio de nombres.

$ kubectl get replicasets -n nginx-namespace NOMBRE DESEADO ACTUAL LISTO EDAD nginx-deployment-7c79c4bf97 3 3 3 21h

Muestra el estado y la antigüedad de todos los pods en un espacio de nombres.

$ kubectl get pods -n nginx-namespace NOMBRE LISTO ESTADO REINICIO EDAD nginx-deployment-7c79c4bf97-c8rkj 1/1 En ejecución 0 21 h nginx-deployment-7c79c4bf97-xz49p 1/1 En ejecución 0 21 h nginx-deployment-7c79c4bf97-zg292 1/1 En ejecución 0 21 h

Verifique el estado actual, la configuración y los eventos relacionados con un pod específico.

$ kubectl describe pod nginx-deployment-7c79c4bf97-c8rkj -n nginx-namespace Nombre: nginx-deployment-7c79c4bf97-c8rkj Espacio de nombres: nginx-namespace Prioridad: 0 Cuenta de servicio: predeterminada Nodo: node4/10.20.20.67 Hora de inicio: sáb., 31 ago. 2024 06:08:00 +0000 Etiquetas: app=nginx pod-template-hash=7c79c4bf97 . .

Comprobar los registros de un pod:

$ kubectl logs nginx-deployment-7c79c4bf97-c8rkj -n nginx-namespace 2024/08/31 06:08:04 [aviso] 1#1: usando el método de evento "epoll" 2024/08/31 06:08:04 [aviso] 1#1: nginx/1.27.1 2024/08/31 06:08:04 [aviso] 1#1: creado por gcc 12.2.0 (Debian 12.2.0-14) 2024/08/31 06:08:04 [aviso] 1#1: SO: Linux 5.15.0-107-generic 2024/08/31 06:08:04 [aviso] 1#1: getrlimit(RLIMIT_NOFILE): 65535:65535 2024/08/31 06:08:04 [aviso] 1#1: iniciar procesos de trabajo 2024/08/31 06:08:04 [aviso] 1#1: iniciar proceso de trabajo 29 2024/08/31 06:08:04 [aviso] 1#1: iniciar proceso de trabajo 30

Enumere los servicios en el espacio de nombres, el tipo, las direcciones IP internas y externas y los puertos expuestos. Puede obtener más detalles de un servicio específico.

$ kubectl get services -n nginx-namespace NOMBRE TIPO IP-CLÚSTER IP-EXTERNA PUERTO(S) EDAD nginx-service LoadBalancer 10.233.54.48 80:31455/TCP $ kubectl describe service nginx-service -n nginx-namespace Nombre: nginx-service Espacio de nombres: nginx-namespace Etiquetas: Anotaciones: Selector: app=nginx Tipo: LoadBalancer Política de familia de IP: SingleStack . .

Comprobar eventos en busca de errores:

$ kubectl get events -A ESPACIO DE NOMBRES VISTO POR ÚLTIMA VEZ TIPO RAZÓN OBJETO MENSAJE predeterminado 116 s Normal NodeHasSufficientMemory node/node3 El estado del nodo node3 ahora es: NodeHasSufficientMemory kube-system 35 m Advertencia Pod/kube-apiserver-node1 no saludable La sonda de preparación falló: la sonda HTTP falló con el código de estado: 500 . .

Ejecute comandos interactivos en los pods y verifique la conectividad:

$ kubectl exec -it nginx-deployment-7c79c4bf97-zg292 \ -n espacio-de-nombres-nginx -- curl http://servicio-nginx ¡Bienvenido a nginx! ¡Bienvenido a nginx!

Limpiar

Una vez que terminemos con nuestra aplicación, podemos hacer una limpieza de todos los recursos creados anteriormente para que podamos hacer espacio para otras aplicaciones.

Eliminar el servicio:

$ kubectl delete service nginx-service -n nginx-namespace servicio "nginx-service" eliminado

Eliminar la implementación:

$ kubectl delete deployment nginx-deployment -n nginx-namespace deployment.apps "nginx-deployment" eliminado

Eliminar el espacio de nombres:

$ kubectl delete namespace nginx-namespace espacio de nombres "nginx-namespace" eliminado

Copia de seguridad y restauración de Kubernetes con Trilio

¿Qué es Trilio para Kubernetes (T4K)?

Trilio es una solución de protección y respaldo de datos nativa de la nube para entornos de Kubernetes. Trilio proporciona definiciones de recursos personalizadas (CRD) que amplían las capacidades de la API de K8s para administrar y automatizar las operaciones de respaldo y restauración de aplicaciones e infraestructura. Puede crear copias de seguridad y restaurarlas mediante la consola de administración o usar archivos de definición YAML para el flujo de trabajo. 

En esta sección, utilizaremos kubectl para crear destinos de copia de seguridad y restauración para un entorno K8s de nivel superior. Para abreviar, suponemos que T4K está instalado con su licencia verificada.

Crear un destino de respaldo

En el ejemplo, utilizaremos el almacenamiento de AWS S3 como destino de la copia de seguridad. Necesitamos definir las credenciales de acceso para AWS. 

Crea un archivo llamado muestra-secreto.yaml con los secretos requeridos:

apiVersion: v1 kind: Secret metadata: name: sample-secret type: Opaco stringData: accessKey: AKIAS5B35DGFSTY7T55D secretKey: xWBupfGvkgkhaH8ansJU1wRhFoGoWFPmhXD6/vVDcode

Utilice kubectl para crear el recurso de secretos:

$ kubectl apply -f muestra-secreto.yaml

Créar un demostración-s3-target.yaml archivo que define el depósito AWS S3 como un destino de respaldo utilizando el secreto creado anteriormente:

apiVersion: triliovault.trilio.io/v1 kind: Target metadatos: nombre: demo-s3-target especificación: tipo: ObjectStore proveedor: AWS objectStoreCredentials: región: us-east-1 bucketName: trilio-browser-test credentialSecret: nombre: sample-secret espacio de nombres: TARGET_NAMESPACE capacidad de umbral: 5Gi

Ahora crea el recurso de destino usando kubectl:

$ kubectl apply -f demo-s3-target.yaml

Creación de un plan de respaldo y copia de seguridad

El siguiente paso es definir un plan de respaldo utilizando el destino S3 definido anteriormente. Cree un archivo llamado ns-backupplan.yaml con el recurso de destino creado anteriormente:

apiVersion: triliovault.trilio.io/v1 kind: BackupPlan metadata: name: ns-backupplan spec: backupConfig: target: namespace: predeterminado nombre: demo-s3-target

Crear el recurso del plan de respaldo:

$ kubectl apply -f ns-backupplan.yaml

Para verificar que el plan de respaldo se creó correctamente y verificar su estado:

$ kubectl obtener planes de respaldo

El comando anterior ayuda a confirmar si el plan de respaldo se creó correctamente a través de una salida de confirmación como la siguiente:

NOMBRE ESTADO EDAD ns-backupplan Completado hace 2 h

Puede definir una política para programar copias de seguridad con una frecuencia específica. Cree un archivo llamado programa de muestra.yaml:

tipo: "Política" apiVersion: "triliovault.trilio.io/v1" metadatos: nombre: "programación de muestra" especificación: tipo: "Programación" ScheduleConfig: programación: - "0 0 * * *" - "0 */1 * * *" - "0 0 * * 0" - "0 0 1 * *" - "0 0 1 1 *"

Ahora aplique la política de programación:

$ kubectl apply -f muestra-programación.yaml

Luego de realizar la programación, necesitamos definir el período de retención de las copias de seguridad utilizando el archivo retención de muestra.yaml:

apiVersion: triliovault.trilio.io/v1 tipo: Metadatos de política: nombre: especificación de retención de muestra: tipo: Retención predeterminada: falsa configuración de retención: última: 2 semanal: 1 día de la semana: miércoles mensual: 1 fecha del mes: 15 mes del año: marzo anual: 1

Y ahora crea la política de retención:

$ kubectl apply -f muestra-retención.yaml

Verifique que la política de retención se haya creado correctamente:

$ kubectl obtener políticas

La salida devuelve la lista de políticas que están activas:

NOMBRE EDAD retención de muestra 1m

Por último, cree el recurso de respaldo para una aplicación de muestra utilizando el archivo ejemplo-copia-de-seguridad.yaml:

apiVersion: triliovault.trilio.io/v1 kind: Backup metadata: name: sample-backup spec: type: Full backupPlan: name: sample-application namespace: predeterminado

Y crea el recurso de respaldo usando kubectl:

$ kubectl apply -f sample-backup.yaml

Verifique que la copia de seguridad se haya creado correctamente y verifique su estado:

$ kubectl obtener copias de seguridad

Un ejemplo de la salida podría verse así:

NOMBRE ESTADO EDAD sample-backup Completado 5m 

Creando una restauración

Para las operaciones de restauración, utilice la consola de administración de Trilio o cree un recurso de restauración personalizado utilizando archivos YAML. Vamos a crear un archivo llamado muestra-restore.yaml Para la copia de seguridad que creamos arriba:

apiVersion: triliovault.trilio.io/v1 kind: Restaurar metadatos: nombre: sample-restore especificación: origen: tipo: Copia de seguridad copia de seguridad: nombre: sample-backup espacio de nombres: predeterminado

Cree el recurso de restauración utilizando kubectl:

$ kubectl apply -f sample-restore.yaml

Verifique que la restauración se haya creado correctamente y verifique su estado:

$ kubectl get restaura

Un ejemplo de la salida podría verse así:

NOMBRE ESTADO EDAD muestra-restauración Completada 2m

Últimos pensamientos

En Kubernetes, kubectl es la navaja suiza que brinda a sus usuarios la potencia y la utilidad para realizar una amplia gama de tareas, desde inspeccionar los recursos del clúster K8s hasta implementar aplicaciones y solucionar problemas. Kubectl se puede utilizar para ejecutar comandos interactivos, así como para aplicar operaciones a través de código declarativo que se alinea con las mejores prácticas de operaciones en la nube. Kubectl brinda a los desarrolladores y operadores las capacidades para administrar K8s con simplicidad y eficiencia.

Tabla de contenido

¿Te gusta este artículo?

Suscríbete a nuestro boletín de LinkedIn para recibir más contenido educativo

Descripción general de privacidad

Este sitio web utiliza cookies para que podamos brindarle la mejor experiencia de usuario posible. La información de cookies se almacena en su navegador y realiza funciones tales como reconocerlo cuando regrese a nuestro sitio web y ayudar a nuestro equipo a comprender qué secciones del sitio web le resultan más interesantes y útiles.