PuppetConf 2016. Kubernetes para administradores de sistemas. Parte 1

Soy administrador de sistemas, trato con computadoras, y hoy hablaremos de Kubernetes. Trataré de profundizar en el tema, considerando los problemas que el administrador del sistema puede resolver con esta aplicación, y también tocaré algunos aspectos de la operación de Puppet, que parecen encajar en este mundo con la ayuda de un nuevo conjunto de abstracciones para que la aplicación funcione.
Hace cinco o seis años, Luis Andre Barroso y Urs Hoesl en el artículo "Centro de datos como computadora" sugirieron que deberíamos percibir el centro de datos como una computadora masiva. Es necesario abstraerse del hecho de que el centro de datos consta de máquinas separadas y considerarlo como una entidad lógica. Tan pronto como intente utilizar esta idea en la práctica, puede aplicar los principios de creación de sistemas distribuidos y computación distribuida a los centros de datos.



Para tratar el centro de datos como una computadora, necesita un sistema operativo. Se ve muy similar al que usa en una computadora separada, pero debe tener una interfaz diferente, ya que no necesita acceso a una máquina separada y no necesita acceso al núcleo. Entonces, pensemos en el centro de datos como una gran computadora. Hoy te diré qué hacer si pareces estar privado de la capacidad de controlar cualquier máquina que use SSH. No podrá iniciar sesión, y aunque algunas personas creen que sin esto es imposible controlar el sistema, le diré cuánto se puede hacer con Kubernetes. Primero, debe pensar en Kubernetes como un marco para construir plataformas distribuidas.



Esto no significa que después de descargar Kubernetes, obtendrá una interfaz de usuario que le proporcionará todo lo que desea hacer con el sistema. No, esta es solo la base para crear las herramientas que necesita para ejecutar su infraestructura. Le mostraré cómo crear integración usando Let's Encrypt Certificate Authority para automatizar el proceso de certificación para mi aplicación usando Kubernetes como marco.



Mucha gente pregunta exactamente para qué sirve Kubernetes. Trabajé con Puppet Labs durante muchos años y vi que esta cosa se instaló en computadoras para proporcionar al sistema una API que no existía hasta ahora. En lugar de Bash, scripts YAML y cosas similares, Puppet proporcionó un usuario DSL que le permitió interactuar con las máquinas mediante programación sin scripts de shell. La diferencia entre Kubernetes es que se encuentra por encima del nivel de "hierro". Centrémonos no tanto en la automatización y abstracción de este sistema como en las relaciones, o en el contrato, entre nuestra infraestructura y aplicaciones que vamos a extraer de cualquier nodo. En Kubernetes, no asignamos ninguna aplicación a las máquinas, no existe un "manifiesto de nodo", el planificador considera los nodos individuales simplemente como recursos del centro de datos,representando una gran computadora.

Preguntas: "¿Kubernetes se ejecuta en OpenStack, en VMware, en Bare Metal, en la nube?" no tiene sentido La pregunta correcta es: "¿Puedo ejecutar el agente Kubernetes para recuperar estos recursos?" Y la respuesta será "sí". Porque el funcionamiento de esta aplicación es completamente independiente de la plataforma que elija.



Kubernetes es una plataforma independiente. Kubernetes es declarativo de la misma manera que Puppet. Por lo tanto, está informando para qué aplicación la va a usar; en este ejemplo, es nginx. Este es un contrato entre usted, el desarrollador y Kubernetes como un medio para crear imágenes de contenedor.

Me gusta usar la analogía con la empresa de mensajería FedEx: no puede arrastrarles un carro completo de cosas y esperar hasta que lo resuelvan y lo envíen a donde debería estar. Tienen una regla: empaca tus cosas en una caja. Una vez que lo haga, le enviarán su caja y podrán saber cuándo llegará a su destino. "Si no tiene una caja, entonces no podrá trabajar con nuestro sistema".

Por lo tanto, cuando trabaje con contenedores, es inútil discutir lo que tiene (Python, Java y / o algo más, no importa), simplemente tome todas sus dependencias y colóquelas en el contenedor. Muchas personas dicen acerca de los contenedores que parecen resolver los problemas de toda la infraestructura. Sin embargo, el problema es que las personas no perciben los contenedores como dos cosas diferentes de lo que realmente son. Lo primero es la idea de un formato de empaquetado, lo segundo es la idea de un tiempo de ejecución de contenedor. Estas son dos cosas diferentes que no requieren necesariamente las mismas herramientas.

¿Cuál de los presentes creó los contenedores? ¿Y quién usa Puppet para construir contenedores? Así es, ¡tampoco estoy de acuerdo con esto! Puedes decir: “¿Cómo es eso? ¡Estás en la conferencia de Títeres, tienes que estar de acuerdo! La razón por la que no estoy de acuerdo con la idea de construir contenedores en Puppet es esta: no sé si la necesitamos, porque las cosas que necesitamos para crear una imagen son diferentes de las que necesitamos para iniciar el proceso de producción.

Pensemos en ello como la construcción de una tubería de software y echemos un vistazo a este Dockerfile. Cierra los ojos a aquellos que nunca han visto estos archivos, porque para ti pueden parecer intimidantes. Este archivo muestra cómo crear una aplicación Ruby on Rails, una aplicación Ruby con un marco Rails.



Dice "FROM ruby ​​2.3.1", que probablemente insertará todo el sistema operativo en el contenedor, en este caso, la imagen básica de alpine-linux Ruby. ¿Alguien sabe por qué incorporamos imágenes de Ubuntu o Red Hat en estos contenedores? La mayoría de las personas no saben qué son las dependencias, y utilizan un enfoque casual, simplemente llenando todo el sistema operativo en un contenedor para asegurarse de que tienen sus dependencias en algún lugar dentro. Entonces, después de haber creado esta cosa, debe ejecutarla solo una vez. De aquí proviene el malentendido: si esto no funciona, cambie la línea de código hasta que funcione. ¡Sólo revisa! No necesita ser demasiado inteligente con estos archivos, su objetivo es crear una representación fuera de línea de su aplicación con todas las dependencias. Esto es solo una muleta que usamos desde Ubuntu como punto de partida.

Si acaba de crear la aplicación y la lanzó, usaría algo así como un enlace estático. Sin dependencias del host, en su contenedor solo tendría un archivo binario de un archivo Docker de una sola línea y sin imágenes básicas. De hecho, es solo una transferencia de cosas a las que estamos acostumbrados. Vea cómo se verá esta asamblea.



Anteriormente creé este archivo, pero generalmente parece un intento de construir todo Internet. Tengo un poco de miedo de esta asamblea, porque no estoy seguro de que Internet local pueda manejar a Ruby. Mira lo que pasó.



¿Qué le parece este volumen de 1 concierto? Además, el archivo fuente, es decir, su propia aplicación, puede ocupar, digamos, solo 100 kB. Entonces, ¿cómo conseguimos un gigabyte completo? Esto se debe a que utilizamos herramientas ineficientes para crear aplicaciones independientes. Todos ellos están diseñados para ejecutarse en computadoras y usar bibliotecas dinámicas cargadas desde el entorno externo.

Ahora intentaremos hacer lo que hacemos en un teléfono móvil: versiones portátiles de aplicaciones para las cuales existe un contrato entre usted y la infraestructura. Tan pronto como tengamos dicho contrato, podremos decirle al sistema exactamente lo que debe hacer, y no le importará qué hacer.

No tiene ninguna aplicación especial, especialmente creada. Encontré compañías que dicen: "¡tenemos una aplicación especial!". Digo: "Supongamos lo que hace: comienza, se une al puerto, recibe tráfico, hace algo con los datos", y ellos son: "Wow, ¿cómo lo sabes?" Lo sé, porque no hay nada especial aquí.

Entonces, tomamos la muestra que colocamos en el contenedor y la enviamos al servidor API. A continuación, debemos convertir esto en algo que funcione en nuestra máquina. Sin embargo, para recopilar recursos de la máquina, necesitamos instalar varias cosas: un tiempo de ejecución del contenedor para el archivo Docker, un agente que entiende cómo comunicarse con el asistente para ejecutar todo lo necesario, cuál debería ser la respuesta del sistema para que la aplicación comience a funcionar . Este agente simplemente está observando: no hay intervalos de 30 segundos, verificaciones repetidas, nada de eso. Simplemente observa, diciendo: "si hay trabajo para mí, hágamelo saber y comenzaré y le informaré constantemente sobre el estado del proceso", para que sepa que funciona.



Tan pronto como lo hagamos en automóvil, necesitamos un programador. ¿Cuántas personas usan el planificador? ¡Todos tienen que levantar la mano! Es lo mismo que la respuesta a la pregunta: "¿cuál de ustedes tiene una computadora portátil con más de un procesador de un solo núcleo?". De hecho, cuando hago una pregunta sobre el planificador, la mayoría no levanta la mano.

Cuando comienzas tu proceso en una máquina, algo debe elegir qué procesador usar. ¿A quién funciona esto? Así es, el núcleo. Ahora les explicaré lo que es un planificador. La forma más rápida de hacerlo es jugar Tetris. Lo primero que discutiremos es la implementación automática.



¿Cuántos de ustedes han usado una implementación completamente automática? Claramente, creo que es por eso que estamos todos aquí. Entonces, presiono el botón, los bloques comienzan a caer desde arriba, y ahora puedes ir a tomar una cerveza. Pero observe lo que sucede a la izquierda y a la derecha: su procesador y su memoria se convierten en basura.



Esto sucede porque la mayoría de las personas no usan más del 5% de los recursos informáticos. Automatiza procesos, pero pierde una tonelada de dinero. Trabajo como proveedor de servicios en la nube, tengo grandes reservas de recursos, pero es horrible cuando las personas gastan dinero de manera similar.

Cuando use el programador, por analogía con Tetris, controle el campo de juego y controle cada bloque, dirigiéndolo al lugar correcto, es decir, use los recursos de la máquina de la manera más óptima. Kubernetes usa un par de algoritmos para esto. El algoritmo principal se llama Bin Packing; el mismo "Tetris" ayudará a comprenderlo. Kubernetes recibe una carga de trabajo de varias formas y tamaños, y nuestra tarea es empacarlo en máquinas de manera óptima.

Nuestro objetivo es reutilizar todos los recursos disponibles a medida que avanza el trabajo. No todas las cargas de trabajo son iguales, por lo que es difícil colocarlas en la misma caja. Pero en Kubernetes, cuando aparece una "parte" de la carga de trabajo (o el bloque Tetris, si continuamos con nuestra analogía), siempre existe el clúster correcto donde puede colocarlo y ejecutarlo. Y como con cualquier procesamiento por lotes, una vez completada la tarea, recuperamos todos los recursos ocupados anteriormente para que podamos usarlos en futuras tareas.

Como vivimos no en el juego, sino en el mundo real, tienes soluciones desarrolladas hace muchos años. Luego se convierte en administrador del sistema, los empleadores le muestran su producción y observa que su implementación no es lo suficientemente buena.



Puede instalar administradores de clúster en partes de sus máquinas y dejar que administren ciertos recursos. En este caso particular, puede usar Kubernetes, que comenzará a llenar los espacios vacíos de su Tetris a medida que avanza.
Deje que quienes trabajan en la industria levanten la mano. Sí, este es un clásico llamado salario. Suponga que tiene varios problemas en su empresa. La primera es que todo está escrito en Java o incluso en COBOL, generalmente nadie está listo para esto.

El segundo problema que se encuentra a menudo en las empresas es el DBMS de Oracle. Esto es así, que se encuentra en la parte posterior del software y dice: "¡No intentes automatizar nada!". Si automatiza el software, su costo aumentará. Por lo tanto, no hay automatización: ¡estamos promoviendo nuestro ecosistema de consultoría!

Por lo general, en tales circunstancias, las personas preguntan si Kubernetes simplemente puede usarse para resolver estos problemas. Respondo: "no", porque en una situación similar a perder en Tetris, nada te ayudará. Debe hacer otra cosa, a saber, usar el planificador.
Ahora que tenemos un programador que comprende con éxito las cargas de trabajo, simplemente puede poner todo en cuadros y el programador comenzará su trabajo.



Hablemos de las entidades clave de Kubernetes. En primer lugar, se trata de vainas Pods, que son una colección de contenedores. En la mayoría de los casos, una aplicación consta de más de un componente. Puede adjuntarse una aplicación escrita sin scripts Java, pero es posible que desee usar nginx para completar TLS y solo un proxy en el fondo de la aplicación, y luego estas cosas deben conectarse entre sí, ya que son dependencias codificadas. Una dependencia poco acoplada es una base de datos que usted escala independientemente.



La segunda cosa importante es el Controlador de replicación, que es un administrador de los procesos que ocurren en el clúster de Kubernetes. Le permite crear múltiples instancias de hogares y controlar su estado.

Cuando dice que desea iniciar algún proceso, significa que funcionará todo el tiempo en algún lugar del clúster.

El tercer elemento importante es el Servicio, un conjunto de hogares colaborativos. Su implementación se basa en la determinación dinámica del estado deseado: dónde deberían funcionar las aplicaciones, con qué dirección IP, etc., por lo que necesita algún tipo de servicio.

El cuarto elemento son los repositorios de Volúmenes, que pueden verse como directorios disponibles para contenedores en el hogar. Kubernetes tiene diferentes tipos de volúmenes que determinan cómo se crea esta tienda y qué contiene. El concepto de Volumen también estaba presente en Docker, pero el problema era que el almacenamiento allí estaba limitado a un hogar específico. Tan pronto como Under dejó de existir, Volume desapareció con él.

El almacenamiento que crea Kubernetes no se limita a ningún contenedor. Admite cualquiera o todos los contenedores desplegados dentro del hogar. Una ventaja clave de Kubernetes Volume es su soporte para varios tipos de almacenamiento que Pod puede usar simultáneamente.

Veamos qué es un contenedor. Este es el formato de imagen en el que se empaqueta nuestra aplicación con todas las dependencias, y la configuración principal del entorno de tiempo de ejecución, que muestra cómo debería funcionar esta aplicación. Estos son dos elementos diferentes, aunque puede incluir todo lo que desee en este elemento, en particular, el Sistema de archivos raíz como un archivo tar comprimido Tarball que contiene muchos archivos de configuración para un sistema específico.



Entonces podemos realizar la distribución, un proceso que es familiar para todos: aquí se usa RPM u otro sistema de repositorio. Tomas todas estas cosas y las pones en el repositorio. Este proceso es muy similar a lo que hacemos con los paquetes del sistema operativo, solo para contenedores que se crean a partir de imágenes.



Pod le permite componer todo lo que nuestra aplicación lógica necesita. Una aplicación lógica es una herramienta para administrar múltiples aplicaciones dentro del mismo perfil del sistema. Un sub es un paquete de recursos que incluye uno o más contenedores y almacenamientos, un espacio de nombres común y una dirección IP por sub. Las bóvedas se pueden distribuir entre contenedores.



En general, el diseño del hogar se asemeja a una máquina virtual. Asegura que la aplicación se iniciará y se detendrá como una unidad atómica. La siguiente diapositiva muestra cómo se ve el controlador de replicación. Si envío esta declaración al servidor y digo: "¡Hola, quiero que funcione una réplica de la aplicación Foo!", El controlador la creará a partir de la plantilla y la enviará al planificador, que colocará la aplicación en el Nodo 1. No especificamos en qué máquina debería ejecutarse, aunque podemos hacerlo. Ahora aumente el número de réplicas a 3.



¿Qué acciones espera del sistema si falla una de las máquinas? En este caso, el controlador de replicación llevará el estado actual del sistema al estado deseado, moviéndolo debajo del contenedor desde la tercera máquina que no funciona a la segunda.



No es necesario profundizar en este proceso y dirigirlo; confiando el trabajo al controlador, puede estar seguro de que la aplicación estará asegurada adecuadamente al monitorear constantemente los cambios en el estado actual de la infraestructura y tomar decisiones que garanticen que el sistema esté funcionando.

Estas cosas se adelantan a su tiempo: simplemente le dice al sistema: "¡Quiero que estas tres máquinas funcionen!", Y aquí es donde termina su control. Este enfoque es muy diferente de los scripts y la automatización pura, cuando realmente necesita administrar lo que está sucediendo en este momento para influir en la decisión futura. No puede codificar todo esto sin la capacidad de recibir información entrante para responder a la situación correctamente. El enfoque descrito anteriormente le brinda esta oportunidad.
¿Cómo imagina la configuración, el concepto de archivos de configuración para servicios? Mucha gente no dice nada sobre este tema cuando se trata de contenedores, pero aún necesitamos configuración, ¡no desaparece en ningún lado!

Kubernetes también usa el concepto Secretos, que se usa para almacenar y transferir datos cifrados entre gerentes y nodos Nods.

Nunca ejecutamos Puppet en un contenedor porque no hay razón para hacerlo. Puede usar Puppet para generar un archivo de configuración, pero aún así desea almacenarlo en Kubernetis porque le permite distribuirlo usando el tiempo de ejecución. Veamos como se ve.



En este ejemplo, creamos un secreto a partir de un archivo y lo guardamos en el servidor API de Kubernetes. Puede imaginar que reemplazó esta parte con algo como Puppet, que utiliza la plantilla eRB y los datos ocultos para completar el contenido del secreto; no importa quién lo haga, pero puede hacerlo de todos modos.

Una vez que el secreto está en su lugar, puede servir como un enlace para crear una implementación que diga: "¡Quiero usar este secreto!" En este caso, Kubernetes hace lo siguiente.



Crea un pod, toma datos del secreto, lo coloca en un sistema de archivos temporal y lo presenta como un contenedor, al igual que Puppet crea una copia en una máquina. Esto sigue el ciclo de vida de la aplicación, y cuando la aplicación muere, la configuración desaparece con ella. Si necesita 10,000 instancias de aplicación, deberá crear e inyectar en menos de 10,000 sistemas de archivos temporales.

Los servicios le permiten ejecutar todos estos elementos en un clúster y sincronizarlos con otro punto final. De hecho, un servicio es un grupo de hogares que funcionan como un solo hogar. Contiene una dirección IP y un puerto permanentes, proporciona integración en DNS, utiliza el equilibrio de carga y se actualiza cuando cambia el firmware.



Ahora veamos la colaboración de los componentes conceptuales de Kubernetes. Tenemos ladrillos y configuraciones de Lego que deben interactuar entre sí. Si tiene la intención de ejecutar una base de datos en un clúster, entonces realmente puede hacerlo en Kubernetes. Muchos dicen que no podrá ejecutar aplicaciones con estado en contenedores, pero esto es completamente incorrecto.

Si piensa en cómo funcionan los hipervisores, puede comprender que hacen casi lo mismo que usted: crea una máquina virtual, el programador la traslada al hipervisor y conecta el almacenamiento. A veces trabaja con almacenamiento local que proviene del hipervisor, y no hay razones por las cuales los contenedores no puedan hacer lo mismo.

Sin embargo, el problema con los contenedores es que la mayoría de las personas no están acostumbradas a tener una lista explícita de rutas de archivos que deben proporcionar a la aplicación. La mayoría de las personas no podrán decirle exactamente los dispositivos y archivos que necesita el almacén de datos. Empacan todo en contenedores y, como resultado, no sale nada bueno. Por lo tanto, no crea que los contenedores no son capaces de ejecutar aplicaciones de ahorro de estado; puede hacerlo muy bien.



En la diapositiva, verá un ejemplo de Ruby-on-Rails, y antes de que podamos usar nuestra aplicación, necesitamos migrar la base de datos. Vayamos a la demostración en vivo del programa. Para llevar a cabo la implementación, utilizo MY_SQL, y se ven muchos datos en la pantalla.



Te estoy mostrando todo esto porque, como administrador del sistema, tienes que entender muchas cosas. En esta implementación, refino algunos de los metadatos de mi aplicación, pero lo principal que resaltaré en gris: quiero iniciar 1 copia de la aplicación mysql y usar el contenedor mysql versión 5.6.32.



Tenga en cuenta que aquí selecciono algunos secretos de Kubernetes como enlaces, que en este caso voy a inyectar como variables de entorno. Más tarde le mostraré otro caso cuando los insertemos en el sistema de archivos. Por lo tanto, no necesito "hornear" secretos en mi configuración. La siguiente línea importante es el bloque de recursos.



No puedes jugar Tetris hasta que sepas el tamaño de los bloques. Muchas personas comienzan a implementar sin usar límites de recursos para este proceso. Como resultado, la RAM está completamente obstruida y usted "apila" todo el servidor.

22:09 min

Continuará muy pronto ...


Un poco de publicidad :)


Gracias por estar con nosotros. ¿Te gustan nuestros artículos? ¿Quieres ver más materiales interesantes? Apóyenos haciendo un pedido o recomendando a sus amigos VPS basado en la nube para desarrolladores desde $ 4.99 , un análogo único de servidores de nivel básico que inventamos para usted: toda la verdad sobre VPS (KVM) E5-2697 v3 (6 núcleos) 10GB DDR4 480GB SSD 1Gbps desde $ 19 o cómo dividir el servidor? (las opciones están disponibles con RAID1 y RAID10, hasta 24 núcleos y hasta 40GB DDR4).

Dell R730xd 2 veces más barato en el centro de datos Equinix Tier IV en Amsterdam? ¡Solo tenemos 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV desde $ 199 en los Países Bajos!Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - ¡desde $ 99! Lea sobre Cómo construir un edificio de infraestructura. clase c con servidores Dell R730xd E5-2650 v4 que cuestan 9,000 euros por un centavo?

All Articles