Kubernetes es una plataforma de código abierto para administrar aplicaciones contenedores en un clúster de máquinas físicas o virtuales. La inspiración original para Kubernetes fue el sistema Borg de Google. Borg es un sistema de gestión de clúster que maneja cientos de miles de empleos y aplicaciones en los centros masivos de datos de Google. Kubernetes tenía la intención de ser una versión más amigable del sistema de administración de clúster que todos podían usar.
La popularidad de los contenedores en el proceso de desarrollo de software también hace que Kubernetes sea popular. En el antiguo proceso de desarrollo de software, las aplicaciones se implementaron en máquinas anfitrionas físicas. Los desarrolladores que trabajan en diferentes componentes de la aplicación necesarios para mantener un entorno cohesivo. Personal de operación y TI necesario para administrar cuidadosamente ejecutables, configuraciones y bibliotecas. Diferentes componentes de la aplicación podrían encontrarse con conflictos durante el proceso de integración. Además, el proceso fue susceptible a errores humanos y falta de comunicación.
Las máquinas virtuales (VM) ayudaron a aportar cierto nivel de confiabilidad al proceso. Pero aún era difícil administrar aplicaciones. Además, las máquinas virtuales son caras de mantener. Los contenedores cambiaron el paisaje. Con los contenedores, fue posible que los desarrolladores trabajen en diferentes componentes del mismo software para mantener entornos separados. Los contenedores son livianos, económicos y rápidos. Estos beneficios dieron lugar a la idea de desarrollar software utilizando microservicios donde cada contenedor sirve una tarea específica para la aplicación.
Con el aumento del uso de contenedores, Kubernetes se ha convertido en una herramienta efectiva para programar y ejecutar aplicaciones en grupos. Como plataforma, puede liberar a los desarrolladores de la carga de lidiar con cualquier tipo de máquinas. En lugar de diseñar infraestructuras centradas en el host con consideraciones físicas o virtuales de la máquina, los desarrolladores pueden comenzar a diseñar una infraestructura centrada en el contenedor. Kubernetes proporciona la capa necesaria de abstracción.
Parte 1: Conceptos
Los componentes maestros son los servicios de control para el clúster. Estos componentes manejan decisiones y eventos globales. Cualquier nodo en el clúster puede ejecutarlos. Sin embargo, asignar nodos particulares a estos componentes se considera una buena práctica.
Kube-APISERVER
El Kube-APISERVER sirve a la API de Kubernetes. La API de Kubernetes implementa una interfaz RESTful. Funciona como el puente entre varios componentes de Kubernetes como pods, servicios, controladores de replicación y otros. Es responsable de la coherencia de la comunicación entre la tienda ETCD y los contenedores implementados.
etcd
El ETCD es responsable de almacenar todos los datos del clúster de Kubernetes. El proyecto ETCD fue desarrollado por el equipo de CoreOS. Es una tienda liviana y distribuida de valor clave que utiliza la API HTTP/JSON. Los nodos en el clúster pueden usar datos de configuración del ETCD para descubrir servicios y recuperarse de los estados fallidos. Debido a la importancia de los datos, ETCD debe respaldarse correctamente.
gerente de controlador kube
El manager de Kube-Controller ejecuta varios controladores para proporcionar diferentes servicios. Por ejemplo, los controladores de nodo recuperan los nodos fallidos y los controladores de replicación mantienen el número correcto de PODS. Cada controlador se ejecuta como un hilo separado y depende de la información de ETCD para realizar sus tareas.
gerente de control de nubes
El manager de nube-controller proporciona controladores específicos de la nube. Se puede deshabilitar en el manager de Kube-Controller. La nube-controller-ganager se ha separado del núcleo para permitir que el núcleo de Kubernetes evolucione independientemente del código específico del proveedor de la nube. En el pasado, las dependencias estaban causando problemas.
scheduler
El Kube-Scheduler es responsable de la distribución de la carga de trabajo. Realiza un seguimiento de los requisitos de recursos y asigna nodos para los pods recién creados. También se encarga de la calidad de los requisitos de servicio.
complementos
Los complementos son pods y servicios utilizados para implementar características del clúster. Los usuarios pueden usar el Administrador de complementos para crear y mantener complementos. Algunos complementos importantes y útiles son DNS, interfaz de usuario web (tablero), monitoreo de recursos de contenedores y registro a nivel de clúster.
Una máquina de trabajadores en Kubernetes se llama nodo. Los componentes del nodo están presentes en cada nodo y manejan diferentes aspectos de la carga de trabajo.
kubelet
El servicio Kubelet en cada nodo es el agente principal. Realiza un seguimiento de las cápsulas asignadas a su nodo a través de Apiserver o archivo de configuración local. Se comunica con los componentes maestros para encontrar solicitudes de trabajo e informar el estado de su nodo.
kube-proxy
El Kube-Proxy es un pequeño servicio proxy en cada nodo para tratar con subnectores de host individuales. Puede realizar un equilibrio de carga rudimentaria para TCP y UDP.
estibador
Kubernetes dependen principalmente de Docker para ejecutar contenedores. Es capaz de crear aplicaciones a partir de imágenes de Docker.
rkt
Kubernetes también admite contenedores RKT. El soporte es actualmente experimental.
supervisor
El Supervisord se puede usar para monitorear y controlar Kubelets y contenedores Docker.
fluido
El Fluentd es un Deamon para proporcionar registro de nivel Custer.
Las cargas de trabajo de Kubernetes se pueden definir de la siguiente manera:
Vaina
Un Pod es una unidad fundamental en la carga de trabajo de Kubernetes. Los contenedores no se asignan individualmente a los hosts. Los grupos de contenedores, generalmente pertenecientes a una aplicación, se representan como una cápsula y el POD se implementa en el host como una sola unidad. Por supuesto, una vaina puede contener solo un contenedor. Esto generalmente es más común en Kubernetes. Sin embargo, los contenedores se agrupan en función de las necesidades de recursos y aplicaciones. La agrupación está destinada a optimizar el intercambio de recursos.
Controladores
Controladores como conjuntos de réplicas, controlador de replicación, implementaciones, conjuntos con estado, recolección de basura y trabajos cron ayudan a administrar cargas de trabajo de Kubernetes. Los controladores de replicación administran el número de vainas. Comienza y termina PODS para mantener el número correcto de vainas en ejecución. El controlador de implementación ayuda a cambiar de POD y objetos de implementación para alcanzar el estado de implementación deseado.
Servicios
Las vainas de Kubernetes se crean y se destruyen regularmente. Por lo tanto, es difícil realizar un seguimiento de ellos a través de direcciones IP. La naturaleza dinámica de las vainas les dificulta comunicarse entre sí. Un servicio funciona como una abstracción. Proporciona la política para llegar a un conjunto lógico de vainas. En Kubernetes, un servicio es un objeto de descanso. Los servicios simplifican el diseño del contenedor.
Etiquetas
Las etiquetas son una forma poderosa de realizar un seguimiento y administrar grupos de componentes de trabajo. Las etiquetas son pares de valor clave que funcionan como etiquetas arbitrarias para ayudar a obtener un control más fino sobre diferentes funciones del sistema.
Parte 2: Proyecto práctico
Minikube es un binario que configura un solo clúster de Kubernetes en una máquina local. En este proyecto, un nodo.La aplicación JS se convertirá en una imagen de contenedor Docker y la imagen se ejecutará en Minikube.
Instalación de Minikube, Kubectl, Hypervisor, NodeJS y Docker
Puede instalar la herramienta de línea de comandos Minikube y Kubernetes Kubectl en Mac OS X, Linux y Windows con varios hipervisores. Las instrucciones para diferentes sistemas operativos están disponibles aquí. Además, necesitará NodeJS instalados en su máquina para ejecutar el ejemplo de la aplicación Helloworld. Puedes instalar Docker aquí.
Comenzando un clúster
Use el siguiente comando para iniciar un clúster:
$ minikube comienza a iniciar Kubernetes locales V1.7.5 clúster ... comenzando VM ... Descarga de Minikube ISO 106.36 MB / 106.36 MB [============================================] 100.00% 0s obteniendo la dirección IP de VM ... Mover archivos al clúster ... Configuración de certificaciones ... conectando al clúster ... Configuración de KubeConfig ... Iniciar componentes del clúster ... Kubectl ahora está configurado para usar el clúster.
Use el comando a continuación para ver si el clúster se ejecuta correctamente:
$ kubectl cluster-info kubernetes maestro se ejecuta en https: // 192.168.99.100: 8443
Crear imagen de aplicación
Creemos un servidor.archivo js con el siguiente contenido:
var http = require ('http'); |
var handlerequest = function (solicitud, respuesta) |
consola.Log ('Solicitud de URL recibida:' + solicitud.url); |
respuesta.Writehead (200); |
respuesta.Fin ('Hola mundo!'); |
; |
var www = http.CreateServer (Handlerequest); |
www.escuchar (8080); |
Puede ejecutar el siguiente comando:
Servidor de nodo $.js
Y verifique si el servidor se ejecuta en http: // localhost: 8080. Deberías ver "Hola mundo!"Texto en la página web.
Convertir al contenedor Docker
En el mismo directorio que el servidor.JS crea un archivo DockerFile con el siguiente texto:
Desde el nodo: 6.9.2 |
Exponer 8080 |
Copiar servidor.js . |
Servidor de nodo CMD.js |
El DockerFile creará una imagen que comenzará desde el nodo: 6.9.2 Imagen en el Docker Hub.
Queremos ejecutar las imágenes de Docker localmente. Entonces, el siguiente comando le dirá a Docker que use Minikube Deamon para el almacenamiento de imágenes de Docker:
$ eval $ (Minikube Docker-ENV)
Puede usar Eval $ (Minikube Docker -Env -u) para cambiarlo de nuevo al valor predeterminado.
Ahora construamos la imagen de Docker:
$ Docker Build -t My -nodo: V1 . Enviar contexto de compilación a Docker Daemon 3.072kb Paso 1: Desde el nodo: 6.9.2 6.9.2: Tirando de la biblioteca/nodo 75a822cd78888: tirar completo 57de64c722267: tirar completo 4306be1e8943: tirar completo 871436AB7225: extraer completo 0110c26a367a: tirar completo 0FAF429D6C97D928C762CB36F1940F4456CE4BD33FBDC34DE94A5E043 Estado: descarga de imagen más nueva para nodo: 6.9.2 ---> faaadb4aaf9b Paso 2: Exponer 8080 ---> Ejecutando en DA7D251B3FD5 ---> 881F9FB69B2C Eliminar el contenedor intermedio DA7D251B3FD5 Paso 3: Copiar el servidor.js . ---> 0ACF61D9E75E Eliminar contenedor intermedio 3A4025539CF6 Paso 4: CMD Node Server.JS ---> Corriendo en 8AA9A4CBD723 ---> 41445E5C48FE Elegir el contenedor intermedio 8AA9A4CBD723 Construido con éxito 41445E5C48FE
Desplegar en el clúster
Para implementar my-nodo: v1, ejecute el siguiente comando:
$ kubectl ejecutar my-nodo --image = my-nodo: v1 --port = 8080 Implementación "My-nodo" creado
Creará una vaina en el clúster. Podemos verificar los estados de la POD con los siguientes comandos:
$ Kubectl Get Implements Nombre deseado UNA A LDAD MI-NODO MI-NODO MI-NODO DE AREA ANDA ACTUA ACTIVA ACTIVA ACTUALES
$ kubectl get pods nombre de estado listo para reiniciar la edad my-nodo-276881918-qth5s 1/1 en ejecución 0 1m
$ Kubectl Get Events LastSeen Firstseen Count Nombre de tipo Subobjeto Tipo Razón Mensaje de origen 32M 32M 1 Minikube Nodo Normal Normal Kube-Proxy, minikube iniciando kube-proxy-proxy. 32M 32M 1 Minikube Node Normal Kubelet, Minikube Kubelet de arranque. 32m 32m 2 minikube Node Normal NodeHasSufficientDisk kubelet, minikube Node minikube status is now: NodeHasSufficientDisk 32m 32m 2 minikube Node Normal NodeHasSufficientMemory kubelet, minikube Node minikube status is now: NodeHasSufficientMemory 32m 32m 2 minikube Node Normal NodeHasNoDiskPressure kubelet, minikube Node minikube status is now: NodeHasNoDiskPressure 32m 32m 1 minikube Node Normal NodeAllocatableEnforced kubelet, minikube Updated Node Allocatable limit across pods 32m 32m 1 minikube Node Normal RegisteredNode controllermanager Node minikube event: Registered Node minikube in NodeController 32m 32m 1 minikube Node Normal NodeReady kubelet, minikube Node minikube status is now: Nodeready 6M 6M 1 Minikube Node Normal RegistroDedNode Controlanderger Node Minikube Evento: Nodo registrado Minikube en NodeController 5M 5M 1 Minikube Node Normal KubelT,kubelet de arranque de minikube. 5m 5m 1 minikube Node Normal NodeAllocatableEnforced kubelet, minikube Updated Node Allocatable limit across pods 5m 5m 1 minikube Node Normal NodeHasSufficientDisk kubelet, minikube Node minikube status is now: NodeHasSufficientDisk 5m 5m 1 minikube Node Normal NodeHasSufficientMemory kubelet, minikube Node minikube status is now: NodeHasSufficientMemory 5m 5m 1 minikube Node Normal NodeHasNoDiskPressure kubelet, minikube Node minikube status is now: NodeHasNoDiskPressure 5m 5m 1 minikube Node Normal NodeNotReady kubelet, minikube Node minikube status is now: NodeNotReady 5m 5m 1 minikube Node Normal Starting kube-proxy, minikube Starting kube-proxy. 5m 5m 1 Minikube Node Normal Nodeready Kubelet, Minikube Node Minikube El estado es ahora: Nodeready 2M 2M 1 My-nodo-276881919-QTH5S Pod Normal Scheduler programado predeterminado asignó con éxito My-Node-256881918-QTH5S a Minikube 2M 2M 1 My-Node My-Nodod My-Node My-Nodod My-Nodod My-Node My-Node My-Node con éxito. -276881918-QTH5S Pod Normal exitoso Kubelet de Minikube MountVolume.Configuración lograda para el volumen "Predeterminado-R5PL1" 2M 2M 1 My-nodo-276881918-QTH5S POD.contenedores my-nodo kubelet trastado normal, imagen de contenedor minikube "my-nodo: v1" ya presente en la máquina 2m 2m 1 my-nodo-276881918-QTH5S Spec.contenedores my-nodo Kubelet creado normal, minikube creado contenedor 2m 2m 1 my-nodo-276881918-QTH5S POD SPEC.contenedores my-nodo Normal iniciado kubelet, minikube iniciado contenedor 2m 2m 1 my-nodo-276881918 replicAset Normal exitoso exitoso replicaset-controller creado POD: my-nodo-276881918-qTH5S 2m 2m 1 my my-nodio despliegue normal escalón de escalado réplica de arriba establecer my-nodo-276881918
Crear un servicio
Una vaina es inaccesible. Tienes que crear un servicio para que la cápsula sea accesible para el mundo. El siguiente comando debe crear el servicio necesario:
$ kubectl Expose implementment my-nodo --type = LoadBalancer Service "my-nodo" expuesto
Puede verificar el estado del servicio así:
$ KUBECTL GET SERVICIOS Nombre Cluster-IP External-IP Port (s) Age Kubernetes 10.0.0.1443/tcp 34m my-nodo 10.0.0.213 8080: 31460/tcp 31s
Si usa el siguiente comando, abrirá el servicio en un navegador web:
$ Minikube Servicio My-Node Apertura del servicio Kubernetes predeterminado/My-nodo en el navegador predeterminado ..
Puede verificar qué va en su POD con el comando "Logs" - Kubectl Logs [nameOfThePod].
$ kubectl registra my-nodo-276881918-QTH5s Solicitud de URL: / Solicitud de URL recibida: / Favicon.ICO
Los registros anteriores muestran las solicitudes realizadas en el servidor.Aplicación JS que se ejecuta en el clúster.
Limpiar
Puede eliminar el servicio y el POD con los siguientes comandos:
$ KUBECTL DELETE Servicio My-Node Service "My-Node" Eliminado $ KUBECTL DELETE Implementación My-nodo [/código] Implementación "My-nodo" Eliminado
Puedes detener el minikube:
$ minikube deja de detener el clúster de Kubernetes local ... la máquina se detuvo.
Kubernetes es un sistema vasto con capacidades a gran escala. La documentación de Kubernetes es el mejor lugar para aprender sobre esta poderosa tecnología.
Estudio adicional:
Documentación de Kubernetes: https: // kubernetes.io/documentos