Geekflare recibe el apoyo de nuestra audiencia. Podemos ganar comisiones de afiliación de los enlaces de compra en este sitio.
En DevOps Última actualización: 14 de septiembre de 2023
Compartir en:
Escáner de seguridad de aplicaciones web Invicti - la única solución que ofrece verificación automática de vulnerabilidades con Proof-Based Scanning™.

Kubernetes, también conocido como K8S, es una popular herramienta de orquestación de contenedores para gestionar y escalar infraestructuras en contenedores.

kubectl es la herramienta CLI común que utilizamos para consultar y gestionar un clúster Kubernetes. kubectl utiliza la interfaz API de Kubernetes para ver, controlar y gestionar el clúster. Es compatible con diferentes plataformas y se puede configurar fácilmente para gestionar un clúster.

En este artículo, vamos a cubrir algunos comandos kubectl comunes que ayudan en el día a día de la administración de Kubernetes.

Obtener kubectl

kubectl ya está instalado como parte de la configuración del clúster Kubernetes. En caso de que esté gestionando un clúster desde un sistema remoto, puede instalarlo fácilmente para que funcione con cualquier configuración de clúster.

En un Linux puede utilizar el siguiente comando para obtener la última versión de kubectl:

$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"

Asegúrese de colocar el binario descargado en una ubicación fija, añada la ubicación a su PATH y hacerlo ejecutable con chmod +x mando.

En un Windows puede descargar la última versión disponible de kubectl obteniendo primero la última versión estable de https://dl.k8s.io/release/stable.txt

Y, a continuación, descárguelo sustituyendo {version} con la última versión utilizando curl como:

$ curl -LO https://dl.k8s.io/release/{version}/bin/windows/amd64/kubectl.exe

Para v 1.20.0, aquí está el comando curl:

$ curl -LO https://dl.k8s.io/release/v1.20.0/bin/windows/amd64/kubectl.exe

Si no tienes curl en tu sistema, también puedes descargar el ejecutable kubectl usando tu navegador como cualquier otra descarga.

Para otros métodos y plataformas soportados, puedes encontrar la guía oficial para obtener kubectl aquí.

Verificar la configuración de kubectl

Para comprobar la configuración de kubectl, puede ejecutar el comando de versión como:

$ kubectl version --client

La sintaxis general para el uso de kubectl es:

$ kubectl [command] [TYPE] [NAME] [flags]

Establecer contexto y configuración

Antes de utilizar los comandos kubectl en un clúster Kubernetes, primero tenemos que establecer la configuración y el contexto. Se puede hacer con el propio comando kubectl.

Para ver la configuración actual de kubectl, utilice:

$ kubectl config view

Para listar todos los contextos disponibles:

$ kubectl config get-contexts

Para obtener el contexto actual para kubectl:

$ kubectl config current-context

Podemos cambiar el contexto en uso utilizando:

$ kubectl config use-context [cluster-name]

Para autorizar que se añada un nuevo usuario en kubeconf:

$ kubectl config set-credentials NAME [--client-certificate=path/to/certfile] [--client-key=path/to/keyfile] [--token=bearer_token] [--username=basic_user] [--password=basic_password]

Por ejemplo, para establecer sólo el campo "client-key" en el "cluster-admin" sin tocar otros valores, podemos utilizar:

$ kubectl config set-credentials cluster-admin --client-key=~/.kube/admin.key

O, como otro ejemplo, para establecer la autenticación básica para, digamos "cluster-admin" entrada, puede especificar el nombre de usuario y contraseña como:

$ kubectl config set-credentials cluster-admin --username=[username] --password=[password]

Si desea incrustar los datos del certificado de cliente en la entrada "cluster-admin", la sintaxis cambia a:

$ kubectl config set-credentials cluster-admin --client-certificate=~/.kube/admin.crt --embed-certs=true

Si quieres que kubectl utilice un espacio de nombres específico y lo guarde para todos los comandos kubectl posteriores en ese contexto:

$ kubectl config set-context --current --namespace=[NAMESPACE]

Creación de objetos

kubectl se utiliza para desplegar diferentes objetos soportados en un clúster Kubernetes. Su manifiesto se puede definir en un YAML o JSON archivo con extensión .yaml o .yml y .json respectivamente.

Usando el archivo de manifiesto dado, podemos crear recursos definidos usando el siguiente comando:

$ kubectl apply -f [manifest.yaml]

O para especificar varios archivos YAML, utilice:

$ kubectl apply -f [manifest1.yaml] [manifest2.yaml]

Para crear un(os) recurso(s) en todos los archivos de manifiesto presentes en un directorio:

$ kubectl apply -f ./dir

O para crear recursos a partir de una URL:

$ kubectl apply -f [URL]

O directamente desde el nombre de la imagen desde el repositorio como:

$ kubectl create deployment [deployment-name] --image=[image-name]

Por ejemplo, para desplegar una única instancia del servidor web Nginx:

$ kubectl create deployment nginx --image=nginx

Por último, para desplegar recursos directamente escribiendo el comando YAML en CLI sin hacer referencia a un archivo de manifiesto real guardado, intente algo como:

# Create multiple YAML objects from stdin
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: busybox-sleep
spec:
containers:
- name: busybox
image: busybox
args:
- sleep
- "1000000"
---
apiVersion: v1
kind: Pod
metadata:
name: busybox-sleep-less
spec:
containers:
- name: busybox
image: busybox
args:
- sleep
- "1000"
EOF

Ver/encontrar recursos

kubectl proporciona get para enumerar los recursos desplegados, obtener sus datos y saber más sobre ellos.

Para listar todos los servicios en el espacio de nombres por defecto, utilice:

$ kubectl get services

Del mismo modo, para listar pods en todos los espacios de nombres, la sintaxis será:

$ kubectl get pods --all-namespaces

Si necesitamos listar más detalles de los pods desplegados, utilice -o wide bandera como:

$ kubectl get pods -o wide

La sintaxis para obtener los detalles del despliegue es la siguiente:

$ kubectl get deployment [deployment-name]

Para obtener el contenido YAML de un pod, podemos utilizar -o yaml bandera como:

$ kubectl get pod [pod-name] -o yaml

A menudo necesitamos obtener detalles sobre los recursos de Kubernetes. El comando describe de kubectl ayuda a obtener esos detalles.

Podemos obtener más detalles sobre un nodo como:

$ kubectl describe nodes [node-name]

O similarmente para vainas como:

$ kubectl describe pods [pod-name]

kubectl permite ordenar la salida en función de un campo concreto. Para listar los servicios ordenados por nombre de servicio, utilice:

$ kubectl get services --sort-by=.metadata.name

O para obtener todos los pods en ejecución en el espacio de nombres, podemos intentar:

$ kubectl get pods --field-selector=status.phase=Running

Para obtener sólo las IP externas de todos los nodos, si están asignadas, podemos utilizar -o jsonpath con la siguiente sintaxis:

$ kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'

Para obtener etiquetas adjuntas a un recurso, por ejemplo, pods, pruebe:

$ kubectl get pods --show-labels

Para obtener una lista de eventos ordenada por fecha y hora, podemos utilizar -sort-by bandera como:

$ kubectl get events --sort-by=.metadata.creationTimestamp

Si queremos comparar el estado actual del cluster con el estado en el que estaría el cluster si se aplicara el manifiesto, utilizamos diff comando como:

$ kubectl diff -f ./manifest-file.yaml

Modificación de recursos

Los recursos desplegados se modifican a menudo por cualquier cambio de configuración.

Para realizar una actualización continua de, digamos "www" contenedores de, digamos "frontend" despliegue mediante la actualización de su imagen, podemos utilizar:

$ kubectl set image deployment/frontend www=image:v2

Podemos comprobar el historial de despliegues incluyendo la revisión como:

$ kubectl rollout history deployment/frontend

O para volver a un despliegue anterior, utilice:

$ kubectl rollout undo deployment/frontend

También podemos retroceder a una revisión específica especificando --to-revision bandera como:

$ kubectl rollout undo deployment/frontend --to-revision=2

Y para comprobar el estado de la actualización rodante, utilizamos:

$ kubectl rollout status -w deployment/frontend

Para reiniciar, por ejemplo, el despliegue del "frontend", utilice:

$ kubectl rollout restart deployment/frontend

Podemos especificar un manifiesto JSON para reemplazar un pod pasándolo a la entrada estándar como se muestra a continuación:

$ cat pod.json | kubectl replace -f -

Puede suceder que necesite forzar el reemplazo, borrar y luego volver a crear un recurso (NOTA: esto también causará una interrupción del servicio) que se puede hacer como:

$ kubectl replace --force -f [manifest-file]

Etiquetar un recurso (que admite etiquetas) es fácil y puede hacerse utilizando:

$ kubectl label pods [pod-name] new-label=[label]

Del mismo modo, se puede añadir una anotación a un recurso utilizando:

$ kubectl annotate pods [pod-name] icon-url=[url]

Autoescalar un despliegue es posible con:

$ kubectl autoscale deployment [dep-name] --min=[min-val] --max=[max-val]

Toma, dep-name es el nombre de la implantación que se va a autoescalar y min-val y max-val indica el valor mínimo y máximo que se utilizará para el autoescalado.

Recursos de edición

Es posible editar un recurso API en su editor preferido con edit mando.

$ kubectl edit [api-resource-name]

O para utilizar su propio editor alternativo, especifique KUBE_EDITOR como:

KUBE_EDITOR="nano" kubectl edit [api-resource-name]

Ampliación de recursos

El escalado de recursos es una de las características soportadas por Kubernetes y kubectl facilita esta tarea.

Para escalar un conjunto de réplicas llamado, digamos foo a 3, usamos:

$ kubectl scale --replicas=3 rs/foo

O en su lugar, podemos hacer referencia a un archivo YAML de manifiesto para especificar el recurso que se va a escalar como:

$ kubectl scale --replicas=3 -f foo.yaml

Además, podemos realizar un escalado basado en el estado actual del despliegue como:

$ kubectl scale --current-replicas=2 --replicas=3 deployment/nginx

Eliminación de recursos

Los recursos creados necesitarán eventualmente algunas modificaciones o su eliminación. Con kubectl, podemos eliminar los recursos existentes de varias maneras.

Para eliminar un pod utilizando la especificación del archivo JSON, utilizamos:

$ kubectl delete -f ./pod.json

Podemos eliminar pods y servicios con los mismos nombres pod-name y service-name como:

$ kubectl delete pod,service [pod-name] [service-name]

Si los recursos están etiquetados y necesitamos eliminar recursos con una etiqueta específica, digamos label-namepodemos usar:

$ kubectl delete pods,services -l name=[label-name]

Para eliminar todos los pods y servicios contenidos en un espacio de nombres, utilice:

$ kubectl -n [namespace] delete pod,svc --all

Interacción con Pods en ejecución

Podemos usar kubectl para obtener detalles sobre pods en ejecución que nos ayuden a administrar un clúster Kubernetes.

Uno de los comandos comunes es obtener los registros de un pod que se puede hacer como:

$ kubectl logs [pod-name]

O para volcar pod logs con una etiqueta específica:

$ kubectl logs -l name=[label-name]

O para obtener los registros de un contenedor específico como:

$ kubectl logs -l name=[label-name] -c [container-name]

También podemos transmitir registros como hacemos con Linux tail -f con el comando -f bandera también:

$ kubectl logs -f [pod-name]

Ejecutar un pod de forma interactiva se puede hacer con kubectl como:

$ kubectl run -i --tty busybox --image=busybox -- sh

O para ejecutar un pod en un espacio de nombres específico:

$ kubectl run nginx --image=nginx -n [namespace]

Puede adjuntarlo a un contenedor en ejecución con attach mando:

$ kubectl attach [pod-name] -i

El reenvío de puertos se puede hacer para un pod en tiempo de ejecución con el siguiente comando:

$ kubectl port-forward [pod-name] [local-machine-port]:[pod-port]

Para ejecutar algo directamente en un inicio de sesión pod y obtener el uso de salida:

$ kubectl exec [pod-name] -- [command]

El comando anterior funciona si el pod contiene un único contenedor. Para pods con varios contenedores, utilice:

$ kubectl exec [pod-name] -c [container-name] -- [command]

Para mostrar las métricas de rendimiento de un pod determinado y sus contenedores, podemos utilizar:

$ kubectl top pod [pod-name] --containers

O para ordenarlo por una medida digamos CPU o memoria, podemos lograrlo usando:

$ kubectl top pod [pod-name] --sort-by=cpu

Interacción con los nodos y el clúster

kubectl puede interactuar con los nodos y el clúster. Estos son algunos de los comandos que kubectl utiliza para lo mismo.

Para marcar un nodo como no programable, utilice:

$ kubectl cordon [node-name]

Drenar un nodo como parte de la preparación para el mantenimiento:

$ kubectl drain [node-name]

Para volver a marcar el nodo como programable, utilice:

$ kubectl uncordon [node-name]

Para obtener métricas de rendimiento relacionadas con un nodo, podemos utilizar:

$ kubectl top node [node-name]

Para obtener detalles sobre el clúster actual:

$ kubectl cluster-info

Además, podemos volcar el estado del clúster a la salida estándar utilizando:

$ kubectl cluster-info dump

O para volcar a un archivo de uso:

$ kubectl cluster-info dump --output-directory=/path/to/cluster-state

Conclusión

Kubernetes kubectl es la interfaz principal para interactuar con un clúster Kubernetes y este artículo ha demostrado lo potente que es esta herramienta en manos de un usuario experimentado.

Aún así, sólo podemos cubrir una visión resumida de lo que kubectl puede hacer. Para conocerlo con más detalle y comprobar todo lo que admite, consulte su documentación oficial aquí.

  • Abhishek Nair
    Autor
Gracias a nuestros patrocinadores
Más lecturas sobre DevOps
Potencia tu negocio
Algunas de las herramientas y servicios que le ayudarán a hacer crecer su negocio.
  • Invicti utiliza el Proof-Based Scanning™ para verificar automáticamente las vulnerabilidades identificadas y generar resultados procesables en tan solo unas horas.
    Pruebe Invicti
  • Web scraping, proxy residencial, gestor de proxy, desbloqueador web, rastreador de motores de búsqueda, y todo lo que necesita para recopilar datos web.
    Pruebe Brightdata
  • Monday.com es un sistema operativo de trabajo todo en uno que te ayuda a gestionar proyectos, tareas, trabajo, ventas, CRM, operaciones, flujos de trabajo y mucho más.
    Prueba el lunes
  • Intruder es un escáner de vulnerabilidades en línea que encuentra puntos débiles de ciberseguridad en su infraestructura, para evitar costosas violaciones de datos.
    Prueba Intruder