
Si trabajas con Kubernetes, probablemente kubectl sea una de las herramientas que más utilizas. Y cada vez que pasas mucho tiempo trabajando con una herramienta en particular, vale la pena estudiarla a fondo y aprender a usarla de manera efectiva.
Comando Traduje el artículo de Daniel Weibel, en el que encontrarás consejos y trucos para trabajar de manera eficiente con kubectl. También te ayudará a comprender mejor el funcionamiento de Kubernetes.
Según el autor, el objetivo del artículo es hacer que tu trabajo diario con Kubernetes sea no solo más eficiente, sino también más agradable.
Introducción: ¿Qué es kubectl?
Antes de aprender a utilizar kubectl de forma más eficaz, es necesario tener un entendimiento básico de qué es y cómo funciona.
Desde el punto de vista del usuario, kubectl es un panel de control que permite realizar operaciones en Kubernetes.
Desde un punto de vista técnico, kubectl es el cliente de la API de Kubernetes.
La API de Kubernetes es una API REST HTTP. Esta API es la verdadera interfaz de usuario de Kubernetes, a través de la cual se controla completamente. Esto significa que cada operación de Kubernetes se representa como un punto final de API y se puede ejecutar mediante una solicitud HTTP a ese punto final.
Por lo tanto, la principal tarea de kubectl es realizar solicitudes HTTP a la API de Kubernetes:

Kubernetes es un sistema completamente orientado a recursos. Esto significa que mantiene el estado interno de los recursos, y todas las operaciones de Kubernetes son operaciones CRUD.
Tú controlas completamente Kubernetes gestionando estos recursos, y Kubernetes determina qué hacer en función del estado actual de los recursos. Por esta razón, el acceso a la API de Kubernetes está organizado como una lista de tipos de recursos con las operaciones asociadas.
Veamos un ejemplo..
Supongamos que deseas crear un recurso ReplicaSet. Para hacerlo, describirás el ReplicaSet en un archivo llamado replicaset.yaml, luego ejecutarás el comando:
$ kubectl create -f replicaset.yamlComo resultado, se creará un recurso ReplicaSet. Pero, ¿qué sucede entre bastidores?
En Kubernetes, hay una operación para crear un ReplicaSet. Al igual que cualquier otra operación, se ofrece como un punto final de API. El punto final de API específico para esta operación es el siguiente:
POST /apis/apps/v1/namespaces/{namespace}/replicasetsLos puntos finales de API de todas las operaciones de Kubernetes se pueden encontrar en la (incluyendo ). Para realizar la solicitud real al punto final, primero debe agregar la URL del servidor API a las rutas de los puntos finales que se enumeran en la documentación de la API.
Por lo tanto, cuando ejecuta el comando anterior, kubectl envía una solicitud HTTP POST al punto final de API mencionado anteriormente. La definición del ReplicaSet que especificó en el archivo replicaset.yaml, se envía en el cuerpo de la solicitud.
Así es como kubectl funciona para todos los comandos que interactúan con el clúster de Kubernetes. En todos estos casos, kubectl simplemente envía solicitudes HTTP a los puntos finales API correspondientes de Kubernetes.
Tenga en cuenta que se puede gestionar completamente Kubernetes utilizando una herramienta como curl, enviando manualmente solicitudes HTTP a la API de Kubernetes. Kubectl simplemente facilita el uso de la API de Kubernetes.
Esta es la base de lo que es kubectl y cómo funciona. Pero hay algo más que todos los usuarios de kubectl deben saber sobre la API de Kubernetes. Vamos a sumergirnos brevemente en el mundo interno de Kubernetes.
El mundo interno de Kubernetes
Kubernetes consiste en un conjunto de componentes independientes que se ejecutan como procesos separados en los nodos del clúster. Algunos componentes funcionan en los nodos maestros, otros en los nodos de trabajo, y cada componente realiza su tarea específica.
Aquí están los componentes más importantes en los nodos maestros:
- Almacenamiento — almacena las definiciones de los recursos ().
- Servidor API — proporciona la API y gestiona el almacenamiento.
- Gestor de controladores — se asegura de que el estado de los recursos coincida con las especificaciones.
- Programador — programa pods en los nodos de trabajo.
Y aquí hay un componente muy importante en los nodos de trabajo:
- ha comenzado a utilizar — gestiona el lanzamiento de contenedores en el nodo de trabajo.
Para entender cómo trabajan juntos estos componentes, consideremos un ejemplo.
Supongamos que acaba de ejecutar kubectl create -f replicaset.yaml, después de lo cual kubectl realizó una solicitud HTTP POST al (enviando la definición del recurso ReplicaSet).
¿Qué sucede en el clúster?
- Después de ejecutar
kubectl create -f replicaset.yamlel servidor API guarda la definición de su recurso ReplicaSet en el almacenamiento:
- Luego se activa el controlador ReplicaSet en el gestor de controladores, que se encarga de crear, modificar y eliminar recursos del ReplicaSet:

- El controlador del ReplicaSet crea una definición de pod para cada réplica del ReplicaSet (según la plantilla del pod en la definición del ReplicaSet) y las guarda en el almacenamiento:

- Se inicia el programador que rastrea los pods que aún no han sido asignados a ningún nodo de trabajo:

- El programador elige un nodo de trabajo adecuado para cada pod y agrega esta información a la definición del pod en el almacenamiento:

- En el nodo de trabajo al que se ha asignado el pod, se inicia Kubelet, que rastrea los pods asignados a este nodo:

- Kubelet lee la definición del pod del almacenamiento y da órdenes al entorno de ejecución de contenedores, como Docker, para iniciar los contenedores en el nodo:

A continuación se presenta una versión textual de esta descripción.
La solicitud API al endpoint de creación de ReplicaSet es procesada por el servidor API. El servidor API autentica la solicitud y guarda la definición del recurso ReplicaSet en el almacenamiento.
Este evento activa el controlador de ReplicaSet, que es un subprocesso del controlador de gestores. El controlador de ReplicaSet supervisa la creación, actualización y eliminación de recursos ReplicaSet en el almacenamiento y recibe notificaciones de eventos cuando esto sucede.
La tarea del controlador de ReplicaSet es asegurar que haya el número requerido de pods de replicas de ReplicaSet. En nuestro ejemplo, no existen pods por el momento, así que el controlador de ReplicaSet crea estas definiciones de pod (de acuerdo con la plantilla de pod en la definición de ReplicaSet) y las guarda en el almacenamiento.
La creación de nuevos pods activa el programador, que rastrea las definiciones de pods que aún no han sido programadas para los nodos de trabajo. El programador elige un nodo de trabajo adecuado para cada pod y actualiza las definiciones de pod en el almacenamiento.
Tenga en cuenta que hasta este momento no se ha ejecutado ningún código de carga de trabajo en el clúster. Todo lo que se ha hecho hasta ahora, — es crear y actualizar recursos en el almacenamiento en el nodo maestro.
El último evento activa Kubelet, que supervisa los pods programados para sus nodos de trabajo. Kubelet del nodo de trabajo para el cual se han asignado sus pods de ReplicaSet debe instruir al entorno de ejecución de contenedores, como Docker, para que descargue las imágenes de contenedores requeridas y las inicie.
¡En este momento, finalmente se ha lanzado su aplicación ReplicaSet!
El papel de la API de Kubernetes
Como vio en el ejemplo anterior, los componentes de Kubernetes (excepto el servidor API y el almacenamiento) supervisan los cambios en los recursos en el almacenamiento y modifican la información sobre los recursos en el almacenamiento.
Por supuesto, estos componentes no interactúan directamente con el almacenamiento, sino únicamente a través de la API de Kubernetes.
Consideremos los siguientes ejemplos:
- El controlador ReplicaSet utiliza el endpoint de la API con el parámetro
verpara observar los cambios en los recursos del ReplicaSet. - El controlador ReplicaSet utiliza el endpoint de la API (crear pod) para crear pods.
- El programador utiliza el endpoint de la API (modificar pod) para actualizar los pods con información sobre el nodo de trabajo seleccionado.
Como puedes ver, esta es la misma API a la que se accede a través de kubectl. Utilizar la misma API para operar componentes internos y usuarios externos es un concepto fundamental del diseño de Kubernetes.
Ahora podemos resumir cómo funciona Kubernetes:
- El almacenamiento conserva el estado, es decir, los recursos de Kubernetes.
- El servidor de API proporciona una interfaz al almacenamiento en forma de API de Kubernetes.
- Todos los demás componentes y usuarios de Kubernetes leen, observan y manipulan el estado (recursos) de Kubernetes a través de la API.
Conocer estos conceptos ayudará a entender mejor kubectl y a utilizarlo al máximo.
Ahora veamos una serie de consejos y trucos específicos que pueden mejorar el rendimiento del trabajo con kubectl.
1. Acelerar la entrada mediante la autocompletación de comandos
Uno de los trucos más útiles, pero a menudo pasados por alto, para aumentar la productividad al trabajar con kubectl, es la autocompletación de comandos.
La autocompletación de comandos permite llenar automáticamente partes individuales de los comandos de kubectl usando la tecla Tab. Esto funciona para subcomandos, opciones y argumentos, incluyendo los más complejos, como los nombres de recursos.
Mira cómo funciona la autocompletación de comandos de kubectl:

La autocompletación de comandos funciona para las shells Bash y Zsh.
contiene instrucciones detalladas para configurar la autocompletación, pero a continuación proporcionaremos un breve resumen.
Cómo funciona la autocompletación de comandos
La autocompletación de comandos es una función de la shell que funciona mediante un script de autocompletación. El script de autocompletación es un guion de la shell que define el comportamiento de la autocompletación para un comando específico.
Kubectl genera automáticamente y muestra scripts de autocompletación para Bash y Zsh utilizando los siguientes comandos:
$ kubectl completion bashO:
$ kubectl completion zshTeóricamente, es suficiente con conectar la salida de estos comandos en la shell correspondiente, para que kubectl pueda autocompletar los comandos.
En la práctica, el método de conexión varía para Bash (incluidas las diferencias entre Linux y MacOS) y Zsh. A continuación, veremos todas estas opciones.
Bash en Linux
El script de complemento para Bash depende del paquete bash-completion, por lo que primero es necesario instalarlo:
$ sudo apt-get install bash-completionO:
$ yum install bash-completionPuedes comprobar que el paquete se ha instalado correctamente con el siguiente comando:
$ type _init_completion Si se muestra el código de la función de la terminal, entonces bash-completion está instalado correctamente. Si el comando devuelve un error de 'No encontrado', debes agregar la siguiente línea a tu archivo ~ /.bashrc:
$ source /usr/share/bash-completion/bash_completion Si necesitas agregar esta línea al archivo ~ /.bashrc o no, depende del gestor de paquetes que utilizaste para instalar bash-completion. Para APT es necesario, para YUM no.
Después de instalar bash-completion, es necesario configurar todo para que el script de complemento de kubectl se cargue en todas las sesiones de la terminal.
Una forma de hacerlo es agregar la siguiente línea a tu archivo ~ /.bashrc:
source <(kubectl completion bash) Otra forma es agregar el script de complemento de kubectl al directorio /etc/bash_completion.d (créalo si no existe):
$ kubectl completion bash >/etc/bash_completion.d/kubectl Todos los scripts de complemento en el directorio /etc/bash_completion.d se cargan automáticamente en bash-completion.
Ambas opciones son igualmente aplicables.
Después de reiniciar la terminal, la autocompletación de los comandos de kubectl funcionará.
Bash en MacOS
En MacOS, la configuración es un poco más complicada. El problema es que por defecto MacOS utiliza Bash versión 3.2, y el script de autocompletado de kubectl requiere una versión de Bash no inferior a 4.1 y no funciona en Bash 3.2.
El uso de una versión obsoleta de Bash en MacOS está relacionado con cuestiones de licencia. La versión 4 de Bash se distribuye bajo la licencia GPLv3, que Apple no admite.
Para configurar la autocompletación de kubectl en MacOS, necesitas instalar una versión más reciente de Bash. También puedes establecer Bash actualizado como tu terminal predeterminada, lo que evitará muchos problemas en el futuro. No es complicado, los detalles se proporcionan en el artículo ‘».
Antes de continuar, asegúrate de que estás utilizando una versión reciente de Bash (verifica la salida bash --version).
El script de autocompletado en Bash depende del proyecto , por lo que primero debes instalarlo.
Puedes instalar bash-completion usando :
$ brew install bash-completion@2 Aquí @2 indica la versión 2 de bash-completion. La autocompletación de kubectl requiere bash-completion v2, y bash-completion v2 requiere al menos Bash versión 4.1.
Salida del comando brew-install contiene una sección de Advertencias, en la que se indica que se debe añadir al archivo ~/.bash_profile:
export BASH_COMPLETION_COMPAT_DIR=/usr/local/etc/bash_completion.d
[[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && .
"/usr/local/etc/profile.d/bash_completion.sh" Sin embargo, recomiendo añadir estas líneas no en ~/.bash_profile, mientras que en ~~/.bashrc. En este caso, la autocompletación estará disponible no solo en el shell principal, sino también en los shells secundarios.
Después de reiniciar el shell, puedes verificar la correcta instalación con el siguiente comando:
$ type _init_completionSi en la salida ves una función shell, entonces todo está configurado correctamente.
Ahora necesitas habilitar la autocompletación de kubectl en todas las sesiones.
Una forma es añadir la siguiente línea a tu ~~/.bashrc:
source <(kubectl completion bash) La segunda forma es añadir el script de autocompletación a la carpeta /usr/local/etc/bash_completion.d:
$ kubectl completion bash
>/usr/local/etc/bash_completion.d/kubectlEste método funcionará solo si instalaste bash-completion mediante Homebrew. En este caso, bash-completion carga todos los scripts desde este directorio.
Si instalaste , no necesitas realizar el paso anterior, ya que el script de autocompletación se ubicará automáticamente en la carpeta /usr/local/etc/bash_completion.d durante la instalación. En este caso, la autocompletación de kubectl comenzará a funcionar tan pronto como instales bash-completion.
Al final, todas estas opciones son equivalentes.
Zsh
Los scripts de autocompletación para Zsh no requieren dependencias. Todo lo que se necesita es habilitarlos al cargar el shell.
Puedes hacerlo añadiendo una línea a tu ~/.zshrc archivo:
source <(kubectl completion zsh) Si obtuviste el error not found: compdef después de reiniciar tu shell, necesitas habilitar la función incorporada compdef. Se puede habilitar añadiendo al principio de tu archivo ~/.zshrc lo siguiente:
autoload -Uz compinit
compinit2. Vista rápida de especificaciones de recursos
Cuando creas definiciones de recursos YAML, necesitas conocer los campos y sus valores para esos recursos. Uno de los lugares para buscar esta información es en la documentación de la API, que contiene especificaciones completas de todos los recursos.
Sin embargo, cambiar al navegador web cada vez que necesitas buscar algo es incómodo. Por lo tanto, kubectl proporciona el comando kubectl explain, que muestra las especificaciones de todos los recursos directamente en tu terminal.
El formato del comando es el siguiente:
$ kubectl explain resource[.field]...El equipo mostrará la especificación del recurso o campo solicitado. La información mostrada es idéntica a la que se encuentra en la guía de la API.
funciona hasta que se finalice manualmente. Por lo tanto, puede ser útil la opción kubectl explain muestra solo el primer nivel de anidación de los campos.
Ver cómo se ve .
Se puede mostrar todo el árbol si se agrega la opción --recursive:
$ kubectl explain deployment.spec --recursiveSi no está seguro de qué recursos necesita exactamente, puede mostrarlos todos con el siguiente comando:
$ kubectl api-resources Este comando muestra los nombres de los recursos en forma plural, por ejemplo, despliegues en lugar de deployment. También muestra el nombre corto, por ejemplo deploy, para aquellos recursos que lo tienen. No se preocupe por estas diferencias. Todas estas variantes de nombres son equivalentes para kubectl. Es decir, puede usar cualquiera de ellos para kubectl explain.
Todos los siguientes comandos son equivalentes:
$ kubectl explain deployments.spec
# o
$ kubectl explain deployment.spec
# o
$ kubectl explain deploy.spec3. Use un formato de salida de columnas personalizado
Por defecto, el formato de salida del comando kubectl get:
$ kubectl get pods
NOMBRE LISTO ESTADO REINICIOS EDAD
engine-544b6b6467-22qr6 1/1 Ejecutándose 0 78d
engine-544b6b6467-lw5t8 1/1 Ejecutándose 0 78d
engine-544b6b6467-tvgmg 1/1 Ejecutándose 0 78d
web-ui-6db964458-8pdw4 1/1 Ejecutándose 0 78dEste formato es conveniente, pero contiene una cantidad limitada de información. En comparación con el formato completo de definición del recurso, aquí se muestran solo unos pocos campos.
En este caso, se puede usar un formato de salida de columnas personalizado. Permite definir qué datos mostrar. Puede mostrar cualquier campo del recurso en su propia columna.
El uso de un formato personalizado se define con las opciones:
-o custom-columns=:[,:]... Puede definir cada columna de salida como un par , donde — el nombre de la columna, y <jsonpath> — una expresión que define el campo del recurso.
Veamos un ejemplo simple:
$ kubectl get pods -o custom-columns='NOMBRE:metadata.name'
NOMBRE
engine-544b6b6467-22qr6
engine-544b6b6467-lw5t8
engine-544b6b6467-tvgmg
web-ui-6db964458-8pdw4La salida contiene una columna con los nombres de los pods.
La expresión en la opción selecciona los nombres de los pods del campo metadata.name. Esto se debe a que el nombre del pod se define en el campo secundario nombre del campo metadata en la descripción del recurso del pod. Puede encontrar más detalles en o escribir el comando kubectl explain pod.metadata.name.
Ahora supongamos que deseas agregar una columna adicional a la salida, por ejemplo, mostrando el nodo en el que se está ejecutando cada pod. Para ello, simplemente puedes añadir la especificación de columna correspondiente a la opción de columnas personalizadas:
$ kubectl get pods
-o custom-columns='NAME:metadata.name,NODE:spec.nodeName'
NAME NODE
engine-544b6b6467-22qr6 ip-10-0-80-67.ec2.internal
engine-544b6b6467-lw5t8 ip-10-0-36-80.ec2.internal
engine-544b6b6467-tvgmg ip-10-0-118-34.ec2.internal
web-ui-6db964458-8pdw4 ip-10-0-118-34.ec2.internal La expresión selecciona el nombre del nodo de spec.nodeName — cuando un pod se asigna a un nodo, su nombre se escribe en el campo spec.nodeName de la especificación del recurso del pod. Puedes consultar más información en la salida de kubectl explain pod.spec.nodeName.
Ten en cuenta que los campos de recursos de Kubernetes son sensibles a mayúsculas y minúsculas.
Puedes ver cualquier campo de recurso como una columna. Simplemente revisa la especificación del recurso y pruébalo con los campos que desees.
Pero primero, echemos un vistazo más de cerca a las expresiones de selección de campos.
Expresiones JSONPath
Las expresiones para seleccionar campos de recursos se basan en .
JSONPath es un lenguaje para extraer datos de documentos JSON. Seleccionar un solo campo es el caso de uso más simple de JSONPath. Tiene muchas más , que incluyen selectores, filtros, etc.
Kubectl explain admite un número limitado de capacidades de JSONPath. A continuación se describen las capacidades y algunos ejemplos de su uso:
# Выбрать все элементы списка
$ kubectl get pods -o custom-columns='DATA:spec.containers[*].image'
# Выбрать специфический элемент списка
$ kubectl get pods -o custom-columns='DATA:spec.containers[0].image'
# Выбрать элементы списка, попадающие под фильтр
$ kubectl get pods -o custom-columns='DATA:spec.containers[?(@.image!="nginx")].image'
# Выбрать все поля по указанному пути, независимо от их имени
$ kubectl get pods -o custom-columns='DATA:metadata.*'
# Выбрать все поля с указанным именем, вне зависимости от их расположения
$ kubectl get pods -o custom-columns='DATA:..image'El operador [] tiene un significado especial. Muchos campos de recursos de Kubernetes son listas, y este operador permite seleccionar elementos de estas listas. A menudo se utiliza con un comodín como [*] para seleccionar todos los elementos de la lista.
Ejemplos de aplicación
Las posibilidades de usar un formato de salida de columna personalizada son ilimitadas, ya que puedes mostrar cualquier campo o combinación de campos del recurso en la salida. Aquí hay algunos ejemplos de aplicaciones, pero siéntete libre de explorarlas por tu cuenta y encontrar aplicaciones útiles para ti.
- Mostrar imágenes de contenedores para pods:
$ kubectl get pods -o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image' NAME IMAGES engine-544b6b6467-22qr6 rabbitmq:3.7.8-management,nginx engine-544b6b6467-lw5t8 rabbitmq:3.7.8-management,nginx engine-544b6b6467-tvgmg rabbitmq:3.7.8-management,nginx web-ui-6db964458-8pdw4 wordpressEste comando muestra los nombres de las imágenes de contenedores para cada pod.
Recuerde que un pod puede contener múltiples contenedores, por lo que los nombres de las imágenes se mostrarán en una sola línea, separados por comas.
- Visualización de las zonas de disponibilidad de los nodos:
$ kubectl get nodes -o custom-columns='NOMBRE:metadata.name,ZONA:metadata.labels.failure-domain.beta.kubernetes.io/zone' NOMBRE ZONA ip-10-0-118-34.ec2.internal us-east-1b ip-10-0-36-80.ec2.internal us-east-1a ip-10-0-80-67.ec2.internal us-east-1bEste comando es útil si su clúster se encuentra en una nube pública. Muestra la zona de disponibilidad para cada nodo.
Una zona de disponibilidad es un concepto de nube que restringe la zona de replicación a una región geográfica.
Las zonas de disponibilidad para cada nodo se obtienen mediante una etiqueta especial — . Si el clúster se ejecuta en una nube pública, esta etiqueta se crea automáticamente y se llena con los nombres de las zonas de disponibilidad para cada nodo.
Las etiquetas no son parte de la especificación de recursos de Kubernetes, por lo que no encontrará información sobre ellas en . Sin embargo, se pueden ver (al igual que cualquier otra etiqueta) si se solicita información sobre los nodos en formato YAML o JSON:
$ kubectl get nodes -o yaml # o $ kubectl get nodes -o jsonEsta es una excelente manera de obtener más información sobre los recursos, además de estudiar las especificaciones de recursos.
4. Cambio fácil entre clústeres y namespaces
Cuando kubectl realiza una solicitud a la API de Kubernetes, primero lee el archivo kubeconfig para obtener todos los parámetros necesarios para la conexión.
Por defecto, el archivo kubeconfig es ~/.kube/config. Normalmente, este archivo se crea o se actualiza mediante un comando especial.
Cuando trabaja con varios clústeres, su archivo kubeconfig contiene los parámetros de conexión para todos estos clústeres. Necesita una forma de indicarle a kubectl con qué clúster está trabajando.
Dentro del clúster, puede crear varios namespaces, una especie de clúster virtual dentro del clúster físico. Kubectl también determina qué namespace usar según los datos del archivo kubeconfig. Por lo tanto, también necesita una forma de indicarle a kubectl con qué namespace trabajar.
En este capítulo, explicaremos cómo funciona esto y cómo lograr un funcionamiento efectivo.
Tenga en cuenta que puede tener varios archivos kubeconfig enumerados en la variable de entorno KUBECONFIG. En este caso, todos estos archivos se combinarán en una configuración común durante la ejecución. También puede cambiar el archivo kubeconfig predeterminado ejecutando kubectl con el parámetro --kubeconfig. Consulte .
Archivos kubeconfig
Veamos qué contiene exactamente el archivo kubeconfig:

Como puede ver, el archivo kubeconfig contiene un conjunto de contextos. Un contexto consiste en tres elementos:
- Cluster — URL del servidor API del clúster.
- User — credenciales de autenticación del usuario en el clúster.
- Namespace — espacio de nombres utilizado al unirse al clúster.
En la práctica, a menudo se utiliza un único contexto por clúster en su archivo kubeconfig. Sin embargo, puede tener varios contextos por clúster que difieren por usuario o espacio de nombres. No obstante, esta configuración con múltiples contextos es poco común, por lo que generalmente hay una correspondencia uno a uno entre clústeres y contextos.
En cualquier momento, uno de los contextos es el actual:

Cuando kubectl lee el archivo de configuración, siempre toma información del contexto actual. En el ejemplo anterior, kubectl se conectará al clúster Hare.
Por lo tanto, para cambiar a otro clúster, debe cambiar el contexto actual en el archivo kubeconfig:

Ahora kubectl se conectará al clúster Fox.
Para cambiar a otro espacio de nombres en el mismo clúster, debe cambiar el valor del elemento namespace para el contexto actual:

En el ejemplo anterior, kubectl utilizará el espacio de nombres Prod del clúster Fox (anteriormente se había configurado el espacio de nombres Test).
Tenga en cuenta que kubectl también proporciona los parámetros --cluster, --user, --namespace y --context, que permiten sobrescribir elementos individuales y el contexto actual, independientemente de lo que esté configurado en el archivo kubeconfig. Consulte opciones de kubectl.
Teóricamente, puede cambiar manualmente los parámetros en el archivo kubeconfig. Pero esto es inconveniente. Para facilitar estas operaciones, existen diversas utilidades que permiten cambiar parámetros de forma automática.
Utilice kubectx
Una utilidad muy popular para cambiar entre clústeres y espacios de nombres.
La herramienta proporciona comandos kubectx y kubens para cambiar el contexto actual y el espacio de nombres respectivamente.
Como se mencionó anteriormente, cambiar el contexto actual significa cambiar el clúster si solo tiene un contexto por clúster.
Aquí hay un ejemplo de la ejecución de estos comandos:

En esencia, estos comandos simplemente editan el archivo kubeconfig, como se describió anteriormente.
Para instalar kubectx, siga las instrucciones en
Ambos comandos admiten la autocomplete de nombres de contextos y espacios de nombres, lo que permite no tener que escribirlos completamente. Las instrucciones para configurar la completion automática .
Otra función útil kubectx es . Funciona junto con la herramienta , que debe instalarse por separado. La instalación de fzf automáticamente habilita el modo interactivo en kubectx. En modo interactivo, puede seleccionar el contexto y el espacio de nombres a través de una interfaz de búsqueda libre interactiva proporcionada por fzf.
Usando alias de la shell
No necesita herramientas separadas para cambiar el contexto actual y el espacio de nombres, porque kubectl también proporciona comandos para ello. Así, el comando kubectl config ofrece subcomandos para editar archivos kubeconfig.
Aquí hay algunos de ellos:
kubectl config get-contexts: lista todos los contextos;kubectl config current-context: obtener el contexto actual;kubectl config use-context: cambiar el contexto actual;kubectl config set-context: cambiar el elemento del contexto.
Sin embargo, usar estos comandos directamente no es muy conveniente porque son largos. Puede crear alias de shell para ellos que son fáciles de ejecutar.
He creado un conjunto de alias basados en estos comandos que proporcionan funcionalidad similar a kubectx. Aquí puedes ver su funcionamiento:

Tenga en cuenta que los alias utilizan fzf para proporcionar una interfaz de búsqueda libre interactiva (como en el modo interactivo de kubectx). Esto significa que necesita , para usar estos alias.
Aquí están las definiciones de los alias:
# Получить текущий контекст
alias krc='kubectl config current-context'
# Список всех контекстов
alias klc='kubectl config get-contexts -o name | sed "s/^/ /;|^ $(krc)$|s/ /*/"'
# Изменить текущий контекст
alias kcc='kubectl config use-context "$(klc | fzf -e | sed "s/^..//")"'
# Получить текущее пространство имен
alias krn='kubectl config get-contexts --no-headers "$(krc)" | awk "{print $5}" | sed "s/^$/default/"'
# Список всех пространств имен
alias kln='kubectl get -o name ns | sed "s|^.*/| |;|^ $(krn)$|s/ /*/"'
# Изменить текущее пространство имен
alias kcn='kubectl config set-context --current --namespace "$(kln | fzf -e | sed "s/^..//")"' Para instalar estos alias, debe agregar las definiciones anteriores a su archivo ~~/.bashrc o ~/.zshrc y reiniciar su shell.
Uso de plugins
Kubectl permite cargar plugins que se ejecutan de la misma manera que los comandos principales. Puede, por ejemplo, instalar el plugin kubectl-foo y ejecutarlo usando el comando kubectl foo.
Sería conveniente cambiar el contexto y el espacio de nombres de esta manera, por ejemplo, ejecutando kubectl ctx para cambiar el contexto y kubectl ns para cambiar el espacio de nombres.
Escribí dos plugins que hacen esto:
El funcionamiento de los plugins se basa en los alias de la sección anterior.
Así es como funcionan:

Tenga en cuenta que los plugins utilizan fzf para proporcionar una interfaz interactiva de búsqueda libre (como en el modo interactivo de kubectx). Esto significa que necesita, para usar estos alias.
Para instalar los plugins, debe descargar los scripts de shell con los nombres y en cualquier directorio de su variable PATH y hacerlos ejecutables, por ejemplo, con chmod +x. Inmediatamente después, podrá usar kubectl ctx y kubectl ns.
5. Abreviación de entrada con autoalias
Los alias de la línea de comandos son una buena manera de acelerar la entrada. El proyecto contiene alrededor de 800 abreviaturas para los comandos principales de kubectl.
Puede preguntarse: ¿cómo recordar 800 alias? Pero no es necesario recordar todos, ya que se construyen según un esquema simple que se presenta a continuación:

Por ejemplo:
- kgpooyaml — kubectl get pods oyaml
- ksysgsvcw — kubectl -n kube-system get svc w
- ksysrmcm — kubectl -n kube-system rm cm
- kgdepallsl — kubectl get deployment all sl
Como puede ver, los alias consisten en componentes, cada uno de los cuales representa un elemento determinado del comando kubectl. Cada alias puede tener un componente para el comando base, operación y recurso, y varios componentes para los parámetros. Simplemente "rellena" estos componentes de izquierda a derecha de acuerdo con el esquema anterior.
La descripción detallada actual se encuentra en . Allí también puede encontrar.
Por ejemplo, el alias kgpooyamlall es equivalente al comando kubectl get pods -o yaml --all-namespaces.
El orden relativo de las opciones no es importante: el comando kgpooyamlall es equivalente al comando kgpoalloyaml.
No es necesario utilizar todos los componentes como alias. Por ejemplo k, kg, klo, ksys, kgpo también se pueden usar. Además, en la línea de comandos se pueden combinar alias y comandos u opciones normales:
Por ejemplo:
- En lugar de
kubectl proxyse puede escribir comok proxy. - En lugar de
kubectl get rolesse puede escribir comokg roles(actualmente no existe un alias para el recurso Roles). - Para obtener datos de un pod específico, puede usar el comando
kgpo my-pod — kubectl get pod my-pod.
Tenga en cuenta que algunos alias requieren un argumento en la línea de comandos. Por ejemplo, el alias kgpol significa kubectl get pods -l. La opción -l requiere un argumento: la especificación de la etiqueta. Si usas un alias, se verá como kgpol app=ui.
Debido a que algunos alias requieren argumentos, los alias a, f y l deben usarse en último lugar.
En general, una vez que domines este esquema, podrás intuitivamente deducir los alias de los comandos que deseas ejecutar, ahorrando mucho tiempo en la entrada.
Instalación
Para instalar kubectl-aliases, necesitas descargar el archivo desde GitHub e incluirlo en el archivo ~~/.bashrc o ~/.zshrc:
source ~/.kubectl_aliasesAutocompletado
Como ya hemos mencionado, a menudo añades palabras adicionales al alias en la línea de comandos. Por ejemplo:
$ kgpooyaml test-pod-d4b77b989Si estás utilizando el autocompletado del comando kubectl, probablemente has usado el autocompletado para elementos como nombres de recursos. Pero, ¿se puede hacer esto cuando se utilizan alias?
Esta es una pregunta muy importante, porque si el autocompletado no funciona, perderás parte de las ventajas de los alias.
La respuesta depende de qué shell estás utilizando:
- Para Zsh, el autocompletado para alias funciona 'fuera de la caja'.
- Para Bash, desafortunadamente, se necesitan algunos pasos para hacer que el autocompletado funcione.
Habilitando el autocompletado para alias en Bash
El problema con Bash es que intenta completar (cada vez que presionas Tab) el alias, y no el comando al que hace referencia el alias (como lo hace Zsh). Dado que no tienes scripts de autocompletado para los 800 alias, el autocompletado no funciona.
Proyecto ofrece una solución general a este problema. Se conecta al mecanismo de autocompletado para alias, completa internamente el alias hasta el comando y devuelve las opciones de autocompletado para el comando completado. Esto significa que el autocompletado para el alias se comporta exactamente igual que para el comando completo.
Primero explicaré cómo instalar complete-alias y luego cómo configurarlo para habilitar el autocompletado para todos los alias de kubectl.
Instalando complete-alias
Primero que nada, complete-alias depende de . Por lo tanto, antes de instalar complete-alias, asegúrate de que bash-completion esté instalado. Las instrucciones de instalación fueron dadas anteriormente para Linux y MacOS.
Nota importante para usuarios de MacOS: al igual que el script de autocompletado de kubectl, complete-alias no funciona con Bash 3.2, que es el que se utiliza por defecto en MacOS. En particular, complete-alias depende de bash-completion v2 (brew install bash-completion@2), que requiere al menos Bash 4.1. Esto significa que para usar complete-alias en MacOS debes instalar una versión más reciente de Bash.
Necesitas descargar el script de y incluirlo en tu archivo ~~/.bashrc:
source ~/bash_completion.shDespués de reiniciar la terminal, complete-alias estará completamente instalado.
Habilitando la autocompletación para los alias de kubectl
Técnicamente, complete-alias proporciona la función de shell _complete_alias. Esta función verifica el alias y devuelve sugerencias de autocompletado para el comando del alias.
Para vincular la función a un alias específico, debes usar el mecanismo incorporado de Bash , para establecerlo _complete_alias como función de autocompletado para el alias.
Como ejemplo, tomemos el alias k, que representa el comando kubectl. Para establecerlo _complete_alias como función de autocompletado para este alias, debes ejecutar el siguiente comando:
$ complete -F _complete_alias k El resultado de esto es que cada vez que completes automáticamente el alias k, se llamará a la función _complete_alias, que verifica el alias y devuelve sugerencias de autocompletado para el comando. kubectl.
Como segundo ejemplo, tomemos el alias kg, que representa kubectl get:
$ complete -F _complete_alias kg De la misma manera que en el ejemplo anterior, cuando completes automáticamente kg, recibirás las mismas sugerencias de autocompletado que recibirías para kubectl get.
Ten en cuenta que puedes usar complete-alias para cualquier alias en tu sistema.
Por lo tanto, para habilitar la autocompletación para todos los alias de kubectl, debes ejecutar el comando mencionado anteriormente para cada uno de ellos. El siguiente fragmento hace exactamente eso, siempre que hayas instalado kubectl-aliases en ~/ .kubectl-aliases:
for _a in $(sed '/^alias /!d;s/^alias //;s/=.*$// ' ~/ .kubectl_aliases);
do
complete -F _complete_alias "$_a"
done Este fragmento de código debe ir en tu ~~/.bashrc, reiniciar la terminal y la autocompletación estará disponible para todos los 800 alias de kubectl.
6. Extensión de kubectl mediante plugins
Comenzando con , kubectl soporta , que permiten extender sus funciones con comandos adicionales.
Si estás familiarizado con , los plugins de kubectl están construidos bajo el mismo principio.
En este capítulo, hablaremos sobre cómo instalar plugins, dónde encontrarlos y cómo crear tus propios plugins.
Instalación de plugins
Los complementos de kubectl se distribuyen como archivos ejecutables simples con nombres del tipo kubectl-x. El prefijo kubectl- es obligatorio, seguido de un nuevo subcomando de kubectl, que permite invocar el complemento.
Por ejemplo, el complemento hello se distribuirá como un archivo llamado kubectl-hello.
Para instalar el complemento, es necesario copiar el archivo kubectl-x en cualquier directorio en su variable PATH y hacerlo ejecutable, por ejemplo usando chmod +x. Inmediatamente después, puede invocar el complemento usando kubectl x.
Puede usar el siguiente comando para listar todos los complementos que actualmente están instalados en su sistema:
$ kubectl plugin listEste comando también mostrará advertencias si tiene múltiples complementos con los mismos nombres, o si hay un archivo de complemento que no es ejecutable.
Buscar e instalar complementos usando Krew
Los complementos de kubectl son aptos para uso compartido o reutilizable como paquetes de software. Pero, ¿dónde se pueden encontrar complementos compartidos por otros?
está enfocado en proporcionar una solución unificada para compartir, buscar, instalar y gestionar complementos de kubectl. El proyecto se llama a sí mismo "el gestor de paquetes para complementos de kubectl" (Krew es similar a ).
Krew es una lista de complementos de kubectl que puede elegir e instalar. Además, Krew es también un complemento para kubectl.
Esto significa que la instalación de Krew funciona, en esencia, como la instalación de cualquier otro complemento de kubectl. Puede encontrar instrucciones detalladas en .
Los comandos más importantes de Krew:
# Поиск в списке плагинов
$ kubectl krew search [<query>]
# Посмотреть информацию о плагине
$ kubectl krew info <plugin>
# Установить плагин
$ kubectl krew install <plugin>
# Обновить все плагины до последней версии
$ kubectl krew upgrade
# Посмотреть все плагины, установленные через Krew
$ kubectl krew list
# Деинсталлировать плагин
$ kubectl krew remove <plugin>Tenga en cuenta que la instalación de complementos utilizando Krew no interfiere con la instalación de complementos de la manera estándar, como se describió anteriormente.
Tenga en cuenta que el comando kubectl krew list muestra solo los complementos que se han instalado utilizando Krew, mientras que el comando kubectl plugin list enumera todos los complementos, es decir, aquellos que se han instalado usando Krew y aquellos que se han instalado de otras maneras.
Buscar complementos en otros lugares
Krew es un proyecto joven, en este momento en su hay aproximadamente 30 complementos. Si no puede encontrar lo que necesita, puede buscar complementos en otro lugar, como en GitHub.
Recomiendo ver la sección de GitHub . Allí encontrará varias docenas de complementos disponibles que vale la pena explorar.
Escribir sus propios complementos
Puede hacerlo usted mismo — no es complicado. Solo necesita crear un archivo ejecutable que haga lo que necesita, nombrarlo como kubectl-x y configurarlo como se describió anteriormente.
El archivo puede ser un script bash, un script de python o una aplicación compilada en Go — no importa. La única condición es que debe ser ejecutable directamente en el sistema operativo.
Vamos a crear un ejemplo de complemento ahora mismo. En la sección anterior, utilizó el comando kubectl para listar los contenedores de cada pod. Puede convertir fácilmente este comando en un complemento que puede invocar, por ejemplo, usando kubectl img.
Cree un archivo kubectl-img users.module.ts
#!/bin/bash
kubectl get pods -o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image' Ahora haga que el archivo sea ejecutable con chmod +x kubectl-img y muévalo a cualquier directorio en su PATH. Justo después de eso, puede usar el complemento kubectl img.
Como se mencionó, los complementos de kubectl pueden estar escritos en cualquier lenguaje de programación o scripts. Si utiliza scripts de shell, la ventaja es que puede invocar fácilmente kubectl desde el complemento. Sin embargo, puede escribir complementos más complejos en lenguajes de programación reales, utilizando . Si usa Go, también puede utilizar , que existe específicamente para escribir complementos de kubectl.
Cómo compartir sus complementos
Si cree que sus complementos pueden ser útiles para otros, no dude en compartirlos en GitHub. Asegúrese de incluirlos en el tema .
También puede solicitar que su complemento se agregue a . Las instrucciones sobre cómo hacerlo se encuentran en .
Autocompletación de comandos
Actualmente, los complementos no soportan autocompletado. Es decir, debe escribir el nombre completo del complemento y los nombres completos de los argumentos.
En el repositorio de GitHub de kubectl, hay . Por lo tanto, es posible que esta función se implemente en algún momento en el futuro.
¡Buena suerte!!!
Lecturas adicionales sobre el tema:
- .
- .
- .
Fuente: habr.com







