En entradas anteriores se ha hablado del orquestador de contenedores Kubernetes.
Este soporte lógico, también conocido por su denominación inglesa más popular “K8s”, es una plataforma de sistema distribuido de código libre para la automatización del despliegue, ajuste de escala y manejo de aplicaciones en contenedores que fue originalmente diseñado por Google y donado a la Cloud Native Computing Foundation (parte de la Linux Foundation), y que soporta diferentes entornos para la ejecución de contenedores, incluido Docker.
Kubernetes automatiza muchos de los procesos manuales involucrados en la implementación, la gestión y la escalabilidad de las aplicaciones en contenedores. Por otra parte, permite distribuir y gestionar las aplicaciones heredadas, creadas en la nube y en contenedores según sea necesario, así como aquellas que se rediseñan con una estructura de microservicios en todos los entornos, los cuales incluyen los proveedores principales de nube privada y pública.
Para operar con este orquestador de contenedores se suele usar la consola de órdenes, empleando comandos.
La principal herramienta de línea de comandos es kubectl, que sirve para crear cápsulas para que ejecuten contenedores, empleando servicios para agruparlas bajo una misma IP "permanente".
Para ello se pueden usar comandos imperativos, con los que un usuario opera directamente sobre objetos activos en un clúster. El usuario proporciona operaciones al comando principal como argumentos o indicadores (run, expose o label); de este modo, éste le dice exactamente a Kubernetes qué desea que haga.
Sin embargo, este tipo de comandos se usan muy poco, puesto que este orquestador de contenedores apuesta por un modelo declarativo en el cual el usuario "declara" distintos objetos y su estado final y deja que Kubernetes se encargue de llegar a dicho estado.
Por otra parte, este tipo de comandos están muy limitado, por lo que no es posible hacer con él varias tareas.
Los comandos, tanto imperativos como declarativos, más relevantes de este orquestador de contenedores son:
- kubectl version: Muestra la versión de kubectl [versión del cliente ("Client Version", en inglés) y la versión de Kubernetes del clúster ("Server Version", en inglés).
- kubectl get nodes: Lista los nodos del clúster del usuario del contexto actual (“--context <nombre del contexto>”, la salida es específica del contexto indicado).
- kubectl config get-contexts: Lista los distintos contextos de configuración que se tengan.
- kubectl config current-context: Muestra el contexto actual.
- kubectl config use-context <nombre del contexto>: Cambia el contexto actual y establece uno nuevo.
- kubectl --kubeconfig=mi-fichero <comando de kubcetl>: Permite indicar la ubicación del archivo "kubeconfig" a usar. El mencionado fichero se localiza en el directorio ".kube" dentro del perfil del usuario y se llama "config". A pesar de que un mismo fichero "kubeconfig" puede contener (y muchas veces contiene) la información de varios contextos, a veces es posible que tener más de un fichero "kubeconfig". Se debe pasar la ruta entera del fichero "kubeconfig" a usar. Si se usa una ruta relativa, se asume a partir del directorio desde donde se ejecuta kubectl.
- kubectl delete pod <nombre de la cápsula>: Elimina una cápsula.
- kubectl run <nombre de la cápsula> --image=<ruta de la imagen del contenedor>: Crea una cápsula con un contenedor a partir de la imagen indicada.
- kubectl expose pod <nombre de la cápsula> --name <nombre del servicio> --port <puerto>: Crea un servicio con una cápsula concreta que posee un puerto dado.
- kubectl get services: Muestra los servicios y sus IPs.
- kubectl apply -f <nombre de la cápsula>: Aplica una cápsula.
- kubectl get pod: Muestra las cápsulas activas (“-o wide”, muestra la IP de una cápsula).
- kubectl exec <nombre de la cápsula> -it – <nombre del intérprete de comandos>: Enlaza a una cápsula.
- kubectl logs <nombre de la cápsula>: Muestra los registros de un contenedor (todo aquello que el contenedor escribe en "stdout/stderr") que se ejecuta en una cápsula (“-l <etiqueta=valor>" para ver el de las cápsulas con la etiqueta y el valor indicados).
- kubectl describe <objeto> <nombre del objeto>: Muestra los detalles de todos los eventos relevantes que han sucedido en un objeto de Kubernetes.
- kubectl taint node <nombre del nodo> <clave>=<valor>:<efecto>: Aplica o quita una mancha a un nodo (un nodo manchado no puede ejecutar cápsulas). El nombre de una mancha siempre tiene la forma "clave=valor". El efecto define qué afectación tiene dicha mancha sobre las cápsulas que se estén ejecutando en el nodo cuando se aplica: "NoSchedule" [el programador ("scheduler", en inglés) no ejecutará nuevas cápsulas en este nodo, pero las cápsulas existentes se seguirán ejecutando], "NoExecute" [el programador no ejecutará nuevas cápsulas en este nodo y las cápsulas existentes serán desalojadas ("evicted", en inglés) del nodo. Desalojar una cápsula significa que sus contenedores se detienen y si la cápsula estaba controlada por un despliegue, ese despliegue creará otra cápsula nueva para reemplazar al desalojado]; si se añade el símbolo menos al final del comando (por ejemplo, NoSchedule-) se elimina la mancha.
- kubectl label <nombre de la cápsula>: Permite añadir, eliminar o modificar una etiqueta (metainformación que se puede añadir a los objetos de Kubernetes).
- kubectl get pods --show-labels: Muestra las etiquetas existentes.
- kubectl create deployment <nombre del deployment> --image=>nombre de la imagen del contenedor de la cápsula>: Crear un despliegue a partir de una imagen de contenedor dada.
- kubectl get deployments: Lista los despliegues de un nodo.
- kubectl scale deploy/<nombre de desplegador> --replicas=<número de réplicas>: Escala un desplegador [objeto de "alto nivel" pensado, específicamente, para el despliegue de aplicaciones (cápsulas en este contexto) sin estado. Al igual que ReplicaSet, un desplegador permite ejecutar N cápsulas (réplicas) todos ellos idénticos y garantizar que hay N en todo momento).
- kubectl rollout status <nombre de despliegue>: Muestra el estado de una actualización continua ("rolling update", en inglés; sustituye cápsulas viejas por las nuevas con un despliegue).
- kubectl rollout history <nombre de deployment>: Indica las versiones de despliegue. La columna "CHANGE-CAUSE" muestra el motivo de la versión, mas si no se ha hecho nada, aparecerá siempre a "<NONE>".
- kubectl create cm <nombre del config map> --from-literal <clave>=<valor>: Crea un mapa de configuración ("config map", en inglés). Se pueden usar tantos --from-literal como claves se necesiten que tenga el mapa de configuración. Permite tanto pasar el nombre de un fichero existente y crea una clave cuyo nombre es el nombre del fichero (sin su ruta) y el valor, el contenido del fichero como pasar un nombre de clave y un nombre de fichero (en formato "nombre=fichero"), y entonces crea una clave del nombre indicado y cuyo contenido es el contenido del fichero.
- kubectl describe cm <nombre del config map>: Muestra el contenido del mapa de configuración.
- kubectl get cm: Muestra los mapas de configuración activos.
- kubectl get secrets: Muestra los secretos de un clúster (“-o yaml” para obtener la definición YAML del mismo).
- kubectl create secret generic my_secret --from-literal password=PassW0rD: Crea un secreto genérico.
- kubectl create secret docker-registry <nombre> --docker-username <inicio de sesión> --docker-password <contraseña> --docker-server <dns-registro>: Crea un secreto en el clúster destinado para aquellos secretos que guardan credenciales para que Kubernetes pueda autenticarse contra registros de imágenes privados.
- kubectl expose (-f FILENAME | TYPE NAME) [--port=puerto] [--protocol=TCP|UDP|SCTP] [--target-port=número o nombre] [--name=nombre] [--external-ip=IP externa del servicio] [--type=tipo]: Crea un servicio. Hay 3 tipos: Servicio ClusterIP (inaccesible desde fuera del clúster), Servicio NodePort (accesible a través de un puerto en concreto de los nodos. orquestador de contenedores abrirá un puerto en los nodos del clúster y accediendo a cualquier nodo por ese puerto estará respondiendo el servicio), y Servicio LoadBalancer [pensado para ser usado en Kubernetes que se ejecutan en entornos de nube. Hay tres maneras de acceder a un servicio LoadBalancer: usando la IP externa del balanceador y el puerto del servicio, usando la IP de cualquier nodo (si se tiene acceso a ellos) y el nodeport o usando la ClusterIP y el puerto del servicio desde dentro del clúster. Cuando se crea un servicio de tipo LoadBalancer, este se expone a través de un balanceador de carga propio de la nube. Es decir, toda esa configuración que en las instalaciones ("on premises", en inglés) es manual, en la nube está automatizada. Por supuesto, eso requiere que cada Kubernetes de la nube (GKE en Google Cloud o AKS en Azure, por ejemplo) tenga un módulo específico encargado de realizar esa configuración. Este módulo debe implementar una interfaz que define este orquestador de contenedores, pero la implementación es propia de cada nube].
- kubectl get ing: Lista los recursos ingress (colección de reglas que permiten que conexiones externas accedan a servicios del clúster).
- kubectl describe ing <nombre del recurso ingress>: Muestra, entre otras cosas, la información de las rutas que define un recurso ingress.
- kubectl port-forward <nombre de la cápsula> <puerto local>:<puerto de la cápsula>: Crea un túnel TCP entre la máquina del usuario y la cápsula de forma que el primero podrá acceder a un puerto de la cápsula usando localhost y un puerto de la máquina del usuario.
- kubectl port-forward svc/<nombre del servicio> <puerto local>:<puerto remoto>: Lo mismo que el comando anterior pero sobre un servicio. Además, en el caso de que el servicio tenga varias cápsulas por debajo, siempre se usará la primera cápsula.
Pueden probarse algunos de los comandos en Killercoda (página de red que permite al usuario acceso instantáneo a una máquina virtual con Linux en la nube, y le permite probar comandos de aplicaciones sin tener que instalar programas en un ordenador).
Aguardo que la presente entrada haya sido interesante para el lector. De ser así, espero que éste la comente y/o la comparta, por favor.
No hay comentarios:
Publicar un comentario
Deje aquí su comentario, si no puede comentar, pruebe a hacerlo desde otro navegador de red u otro equipo.