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 puede configurarse fácilmente para gestionar un clúster.
En este artículo, cubriremos algunos comandos comunes de kubectl que ayudan en la administración diaria de Kubernetes.
Obtener kubectl
kubectl ya está instalado como parte de la configuración del clúster Kubernetes. En caso de que esté administrando un clúster desde un sistema remoto, puede instalarlo fácilmente para que funcione con cualquier configuración de clúster.
En un sistema 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 variable PATH
y hágalo ejecutable con el comando chmod x
.
En un equipo 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 luego descárguela sustituyendo {version}
por la última versión utilizando curl como:
$ curl -LO https://dl.k8s.io/release/{version}/bin/windows/amd64/kubectl.exe
Para la versión 1.20.0, éste es el comando curl:
$ curl -LO https://dl.k8s.io/release/v1.20.0/bin/windows/amd64/kubectl.exe
Si no dispone de curl en su sistema, también puede descargar el ejecutable kubectl utilizando su navegador como cualquier otra descarga.
Para otros métodos y plataformas compatibles, puede encontrar la guía oficial para obtener kubectl aquí.
Verifique la instalación de kubectl
Para verificar su 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 <x><x>[comando]</x></x> [TIPO] [NOMBRE] [banderas]
Establecer el contexto y la configuración
Antes de utilizar los comandos kubectl en un clúster Kubernetes, debemos establecer primero la configuración y el contexto. Puede hacerse 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 de 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=ruta/a/certfile] [--client-key=ruta/a/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, la entrada «cluster-admin», puede especificar el nombre de usuario y la contraseña como:
$ kubectl config set-credentials cluster-admin --username=[nombre de usuario] --password=[contraseña]
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 desea 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 puede definirse en un archivo YAML
o JSON
con extensión .yaml
o .yml
y .json
respectivamente.
Utilizando el archivo de manifiesto dado, podemos crear los recursos definidos mediante 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 recurso o recursos 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 del repositorio como:
$ kubectl create deployment [nombre-del-despliegue] --image=[nombre-de-la-imagen]
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 contenido YAML en CLI sin hacer referencia a un archivo de manifiesto real guardado, pruebe algo como
# Crear varios objetos YAML desde stdin
cat <<EOF | kubectl apply -f -
apiVersion: v1
tipo: Pod
metadatos:
name: busybox-sleep
spec:
contenedores:
- nombre: busybox
imagen: busybox
argumentos:
- sleep
- "1000000"
---
apiVersion: v1
tipo: Pod
metadatos:
nombre: busybox-sleep-less
spec:
contenedores:
- nombre: busybox
imagen: busybox
argumentos:
- sleep
- "1000"
EOF
Ver/encontrar recursos
kubectl proporciona el comando get
para listar los recursos desplegados, obtener sus detalles 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 los 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 la bandera -o
wide como:
$ kubectl get pods -o wide
La sintaxis para obtener detalles del despliegue es la siguiente
$ kubectl get deployment [nombre-del-despliegue]
Para obtener el contenido YAML de un pod, podemos utilizar la bandera -o yaml
como:
$ kubectl get pod [nombre-pod] -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 nodos [nombre-nodo]
O de forma similar para los pods como:
$ kubectl describe pods [nombre-pod]
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 probar:
$ 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 la bandera -o jsonpath
con la siguiente sintaxis:
$ kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'
Para obtener etiquetas adjuntas a un recurso, digamos pods, inténtelo:
$ kubectl get pods --show-labels
Para obtener una lista de eventos pero ordenada por fecha y hora, podemos utilizar la bandera -sort-by
como:
$ kubectl get events --sort-by=.metadata.creationTimestamp
Si queremos comparar el estado actual del clúster con el estado en el que estaría el clúster si se aplicara el manifiesto, utilizamos el comando diff
como:
$ kubectl diff -f ./manifiesto-archivo.yaml
Modificación de recursos
Los recursos desplegados se modificarán a menudo por cualquier cambio de configuración.
Para realizar una actualización continua de, por ejemplo, los contenedores «www» del despliegue «frontend» actualizando 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 retroceder a un despliegue anterior, utilice
$ kubectl rollout undo deployment/frontend
También podemos hacer rollback a una revisión específica especificando la bandera --to-revision
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 el reinicio rodante de, digamos, el despliegue «frontend», usamos:
$ 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 ocurrir que necesite forzar el reemplazo, borrar y luego volver a crear un recurso (NOTA: esto también causará una interrupción del servicio) lo que puede hacerse como:
$ kubectl replace --force -f [manifest-file]
Etiquetar un recurso (que admita etiquetas) es fácil y puede hacerse mediante:
$ 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]
El autoescalado de un despliegue es posible con:
$ kubectl autoscale deployment [dep-name] --min=[min-val] --max=[max-val]
Aquí, dep-name
es el nombre del despliegue a autoescalar y min-val
y max-val
denotan el valor mínimo y máximo a utilizar para el autoescalado.
Edición de recursos
Es posible editar un recurso API en su editor preferido con el comando edit
.
$ kubectl edit [api-nombre-recurso]
O para utilizar su propio editor alternativo, especifique KUBE_EDITOR
como:
KUBE_EDITOR="nano" kubectl edit [api-nombre-recurso]
Escalado 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, utilizamos
$ 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 el escalado basándonos 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 ser borrados. Con kubectl, podemos borrar los recursos existentes de varias maneras.
Para borrar un pod utilizando la especificación del archivo JSON, utilizamos:
$ kubectl delete -f ./pod.json
Podemos borrar 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 borrar recursos con una etiqueta específica, digamos nombre-etiqueta
, podemos usar
$ kubectl delete pods,services -l name=[nombre-etiqueta]
Para eliminar todos los pods y servicios contenidos en un espacio de nombres, utilice:
$ kubectl -n <x>[namespace]</x> delete pod,svc --all
Interacción con pods en ejecución
Podemos utilizar kubectl para obtener detalles sobre los pods en ejecución que nos ayuden a administrar un clúster Kubernetes.
Uno de los comandos comunes es obtener logs de un pod que puede hacerse como:
$ kubectl logs [pod-name]
O para volcar los logs de un pod con una etiqueta específica:
$ kubectl logs -l nombre=[nombre-etiqueta]
O para obtener los registros de un contenedor específico como:
$ kubectl logs -l name=[label-name] -c [container-name]
También podemos transmitir los registros como lo hacemos con el comando tail -f
de Linux con la bandera -f
de kubectl 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 utilice:
$ kubectl run nginx --image=nginx -n <x>[namespace]</x>
Puede adjuntarlo a un contenedor en ejecución con el comando attach
:
$ kubectl attach [nombre-vaina] -i
El reenvío de puertos puede realizarse 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 el inicio de sesión de un pod y obtener la salida utilice:
$ kubectl exec [pod-name] -- <x><x>[command</x></x>]
El comando anterior funciona si el pod contiene un único contenedor. Para pods con varios contenedores, utilice:
$ kubectl exec [nombre-vaina] -c [nombre-contenedor] -- <x><x>[</x></x>comando]
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 ello.
Para marcar un nodo como no programable, utilice
$ kubectl cordon [nombre-nodo]
Para drenar un nodo como parte de la preparación para el mantenimiento:
$ kubectl drenar [nombre-nodo]
Para volver a marcar el nodo como programable, utilice:
$ kubectl uncordon [nombre-nodo]
Para obtener métricas de rendimiento relacionadas con un nodo, podemos utilizar:
$ kubectl top nodo [nombre-nodo]
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 mediante:
$ kubectl cluster-info dump
O para volcar a un archivo utilice
$ kubectl cluster-info dump --output-directory=/ruta/al/estado-del-cluster
Conclusión
Kubernetes es la palabra de moda en la industria y saber cómo gestionarlo eficazmente siempre impulsará su carrera. 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 abarcar una visión resumida de lo que más puede hacer kubectl. Para explorarla con más detalle y comprobar todo lo que admite, consulte su documentación oficial aquí.