
ofrece una interfaz de terminal para la interacción con clústeres de Kubernetes. El objetivo de este proyecto de código abierto es facilitar la navegación en las aplicaciones en K8s, su monitoreo y gestión. K9s monitorea constantemente los cambios en Kubernetes y sugiere comandos rápidos para trabajar con los recursos observados.
El proyecto está escrito en Go y existe desde hace más de un año y medio: el primer commit se realizó el 1 de febrero de 2019. Al momento de redactar este artículo, cuenta con más de 9000 estrellas en y alrededor de 80 contribuyentes. ¿Veamos qué puede hacer k9s?
Instalación y ejecución
Es una aplicación cliente (en relación con el clúster de Kubernetes) que se puede iniciar más fácilmente como una imagen de Docker:
docker run --rm -it -v $KUBECONFIG:/root/.kube/config quay.io/derailed/k9sTambién hay paquetes listos para instalar para algunas distribuciones de Linux y otros sistemas operativos. En general, para sistemas Linux se puede instalar el archivo binario:
sudo wget -qO- https://github.com/derailed/k9s/releases/download/v0.22.0/k9s_Linux_x86_64.tar.gz | tar zxvf - -C /tmp/
sudo mv /tmp/k9s /usr/local/binNo hay requisitos específicos para el clúster K8s en sí. Según los comentarios, la aplicación funciona incluso con versiones antiguas de Kubernetes, como la 1.12.
La aplicación se inicia utilizando la configuración estándar .kube/config — de manera similar a como lo hace kubectl.
Navegación
Por defecto, se abre una ventana con el namespace estándar que está configurado para el contexto. Es decir, si has especificado kubectl config set-context --current --namespace=test, se abrirá el namespace test. (Sobre el cambio de contextos/namespaces, ver más abajo.)

El cambio a modo comando se realiza presionando «:». A partir de ahí, se puede gestionar la operación de k9s mediante comandos; por ejemplo, para ver la lista de StatefulSets (en el namespace actual), se puede ingresar :sts.
![]()
Para algunos otros recursos de Kubernetes:
-
:ns— Namespaces; -
:deploy— Deployments; -
:ing— Ingresses; -
:svc— Services.
Para mostrar una lista completa de tipos de recursos disponibles para ver, existe el comando :aliases.
Es conveniente ver también la lista de comandos disponibles mediante combinaciones de teclas rápidas en la ventana actual: simplemente presiona «?».

Además, k9s tiene modo de búsqueda, al que se puede acceder simplemente ingresando «/». Con esto, se busca dentro del contenido de la ventana actual. Supongamos que has ingresado :ns, tienes abierta la lista de namespaces. Si hay demasiados, para no desplazarte demasiado hacia abajo, basta con ingresar en la ventana de namespaces. /mynamespace.
Para buscar por etiquetas, se pueden seleccionar todos los pods en el espacio de nombres deseado y luego ingresar, por ejemplo, / -l app=whoami. Obtendremos una lista de pods con esa etiqueta:
![]()
La búsqueda funciona en todos los tipos de ventanas, incluyendo logs, visualización de manifiestos YAML y describe para recursos — más detalles sobre estas capacidades, véase abajo.
¿Cómo se ve en general la secuencia de acciones para la navegación?
Con el comando :ctx se puede seleccionar el contexto:

Para seleccionar el namespace, ya existe el comando mencionado anteriormente :ns, y luego se puede utilizar la búsqueda para el espacio deseado: /test.
Si ahora seleccionamos el recurso que nos interesa (por ejemplo, el mismo StatefulSet), aparecerá la información correspondiente: cuántos pods están en ejecución con un resumen de los mismos.
![]()
Quizás solo nos interesen los pods — entonces es suficiente con ingresar :pod. En el caso de ConfigMaps (:cm — para la lista de estos recursos) se puede seleccionar el objeto que interesa y presionar «u», después de lo cual K9s indicará quién lo está utilizando (este CM).
Otra característica conveniente para visualizar recursos es su «rayos X» (XRay view). Este modo se activa con el comando :xray RESOURCE y… es más fácil mostrar cómo funciona que explicarlo. Aquí hay una ilustración para StatefulSets:

(Cada uno de estos recursos se puede editar, modificar, realizar) describe.)
Y aquí está el Deployment con Ingress:

Trabajando con recursos
Se puede obtener información sobre cada recurso en YAML o su describe presionando las combinaciones de teclas correspondientes («y» y «d», respectivamente). Por supuesto, hay aún más operaciones básicas: su lista y combinaciones de teclas están siempre a la vista gracias a la conveniente «cabecera» en la interfaz (se oculta presionando Ctrl + e).

Al editar cualquier recurso («e» después de seleccionarlo) se abre el editor de texto que se ha definido en las variables de entorno (export EDITOR=vim).
Así es como se ve la descripción detallada de un recurso (describe):

Tal salida (o la salida que muestra el manifiesto YAML del recurso) se puede guardar con la combinación de teclas habitual Ctrl + s. Dónde se guardará, se sabrá a través del mensaje de K9s:
Log /tmp/k9s-screens-root/kubernetes/Describe-1601244920104133900.yml guardado exitosamente! De los archivos de respaldo creados, también se pueden restaurar recursos, eliminando antes las etiquetas y anotaciones del sistema. Para esto, será necesario ir al directorio con ellos (:dir /tmp), después de lo cual se seleccionará el archivo necesario y se aplicará. aplicar.
Por cierto, en cualquier momento se puede regresar a un ReplicaSet anterior si hay problemas con el actual. Para ello, hay que seleccionar el RS necesario (:rs de su lista):

… y ejecutar rollback mediante Ctrl + l. Debemos recibir una notificación de que todo ha salido bien:
k9s/whoami-5cfbdbb469 se ha revertido correctamenteY para escalar réplicas, solo hay que presionar «s» (scale) y seleccionar el número deseado de instancias:

Se puede acceder a cualquiera de los contenedores mediante shell: para ello, navega al pod deseado, presiona «s» (shell) y selecciona el contenedor.
Otras capacidades
Por supuesto, también se admite la visualización de logs («l» para el recurso seleccionado). Para ver nuevos logs, no es necesario presionar Enter constantemente: basta con marcar («m»), y luego se rastrearán solo los nuevos mensajes.

También en esta ventana se puede seleccionar el rango de tiempo para mostrar los logs:
- la tecla «1» — por 1 minuto;
- «2» — 5 minutos;
- «3» — 15 minutos;
- «4» — 30 minutos;
- «5» — 1 hora;
- «0» — por toda la duración de vida del pod.
Un modo especial de funcionamiento de Pulse (el comando :pulse) muestra información general sobre el clúster de Kubernetes:

En él se puede ver la cantidad de recursos y su estado (los que están en verde tienen estado En ejecución).
Otra función interesante de K9s se llama Popeye. Esta verifica todos los recursos según ciertos criterios de validez y muestra un «ranking» resultante con explicaciones. Por ejemplo, se puede observar que faltan límites o requests, o que algún contenedor puede ejecutarse como root...

Hay soporte básico para Helm. Por ejemplo, así se pueden ver los releases desplegados en el clúster:
:helm all # todos
:helm $namespace # en un espacio de nombres específico
Benchmark
En K9s incluso han integrado — es un generador de carga sencillo para servidores HTTP, alternativa al más conocido ab (ApacheBench).
Para activarlo, será necesario habilitar port-forward en el pod. Para ello, selecciona el pod y presiona Shift + f, accede al submenú port-forward usando el alias «pf».

Después de seleccionar el puerto y presionar Ctrl + b, se iniciará el benchmark. Los resultados se guardan en /tmp y están disponibles para una visualización posterior en K9s.


Para cambiar la configuración del benchmark, hay que crear el archivo $HOME/.k9s/bench-.yml (se determina para cada clúster).
NB: Es importante que la extensión de todos los archivos YAML en el directorio .k9s sea exactamente .yml (.yaml no funciona correctamente).
Ejemplo de configuración:
referencias:
por defecto:
# Número de hilos
concurrencia: 2
# Número de solicitudes
solicitudes: 1000
contenedores:
# Configuraciones para el contenedor con la referencia
# El contenedor se define como namespace/pod-name:container-name
default/nginx:nginx:
concurrencia: 2
solicitudes: 10000
http:
ruta: /
método: POST
cuerpo:
{"foo":"bar"}
encabezado:
Aceptar:
- text/html
Content-Type:
- application/json
servicios:
# Se puede realizar referencia en servicios de tipo NodePort y LoadBalancer
# Sintaxis: namespace/service-name
default/nginx:
concurrencia: 5
solicitudes: 500
http:
método: GET
ruta: /auth
auth:
usuario: flant
contraseña: s3cr3tp455w0rd
Interfaz
El tipo de columnas para las listas de recursos se modifica creando un archivo $HOME/.k9s/views.yml. Ejemplo de su contenido:
k9s:
vistas:
v1/pods:
columnas:
- EDAD
- NAMESPACE
- NOMBRE
- IP
- NODO
- ESTADO
- LISTO
v1/services:
columnas:
- EDAD
- NAMESPACE
- NOMBRE
- TIPO
- CLUSTER-IP
Sin embargo, falta una columna de etiquetas, lo cual hay .
La clasificación por columnas se realiza con combinaciones de teclas:
- Shift + n — por nombre;
- Shift + o — por nodos;
- Shift + i — por IP;
- Shift + a — por tiempo de vida del contenedor;
- Shift + t — por número de reinicios;
- Shift + r — por estado de preparación;
- Shift + c — por consumo de CPU;
- Shift + m — por consumo de memoria.
Si a alguien no le gusta el esquema de color por defecto, en K9s incluso se soportan . Ejemplos listos (7 en total) están disponibles . Aquí hay un ejemplo de uno de esos temas (en la marina):

Plugins
Finalmente, permiten expandir las capacidades de K9s. Personalmente, en mi trabajo usé solo uno de ellos — kubectl get all -n $namespace.
Esto se vería de la siguiente manera. Creamos un archivo $HOME/.k9s/plugin.yml con este contenido:
plugin:
get-all:
atajo: g
confirmar: false
descripción: obtener todo
ámbitos:
- todo
comando: sh
fondo: false
args:
- -c
- "kubectl -n $NAMESPACE get all -o wide | less"Ahora puedes cambiar al espacio de nombres y presionar "g" para ejecutar con el comando correspondiente:

Entre los plugins hay, por ejemplo, integraciones con kubectl-jq y la herramienta para ver los registros .
Conclusión
A mi parecer, K9s ha resultado muy conveniente de usar: es bastante rápido acostumbrarse a buscar todo lo necesario sin utilizar kubectl. Me impresionó la visualización de registros y su guardado, la edición rápida de recursos, la velocidad general de funcionamiento*, y el modo Popeye resultó útil. Mencionan también las capacidades de crear plugins y personalizar la aplicación según tus necesidades.
* Aunque con un gran volumen de registros también noté un funcionamiento lento de K9s. En esos momentos, la utilidad consumía 2 núcleos de Intel Xeon E312xx y a veces podía llegar a bloquearse.
¿Qué falta en este momento? Un retroceso rápido a la versión anterior (no hablo de RS) sin necesidad de cambiar de directorio. Además, la recuperación solo se realiza para durante el recurso: si eliminaste una anotación o una etiqueta, tendrás que eliminar y restaurar todo el recurso (aquí es donde se necesita cambiar de directorio). Otro pequeño detalle: falta la fecha de estas 'copias de seguridad' guardadas.
P.D.
También puedes leer en nuestro blog:
- «»;
- «»;
- «».
Fuente: habr.com
