{"id":96965,"date":"2020-10-15T14:42:53","date_gmt":"2020-10-15T12:42:53","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/operator-v-kubernetes-dlya-upravleniya-klasterami-bd-vladislav-klimenko-altinity-2019"},"modified":"2020-10-15T14:42:53","modified_gmt":"2020-10-15T12:42:53","slug":"operator-v-kubernetes-dlya-upravleniya-klasterami-bd-vladislav-klimenko-altinity-2019","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/operator-v-kubernetes-dlya-upravleniya-klasterami-bd-vladislav-klimenko-altinity-2019","title":{"rendered":"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/56e002c7408c4708e39ece867f84171e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>El informe se centra en cuestiones pr\u00e1cticas del desarrollo de un operador en Kubernetes, el dise\u00f1o de su arquitectura y los principios b\u00e1sicos de funcionamiento.<\/p>\n<p><\/p>\n<p>En la primera parte del informe, abordaremos:<\/p>\n<p><\/p>\n<ul>\n<li>qu\u00e9 es un operador en Kubernetes y por qu\u00e9 es necesario;<\/li>\n<li>c\u00f3mo el operador simplifica la gesti\u00f3n de sistemas complejos;<\/li>\n<li>qu\u00e9 puede hacer un operador y qu\u00e9 no puede hacer.<\/li>\n<\/ul>\n<p><\/p>\n<p>A continuaci\u00f3n, pasaremos a discutir la estructura interna del operador. Revisaremos la arquitectura y el funcionamiento del operador paso a paso. Analizaremos en detalle:<\/p>\n<p><\/p>\n<ul>\n<li>la interacci\u00f3n entre el operador y Kubernetes;<\/li>\n<li>qu\u00e9 funciones asume el operador y qu\u00e9 delega en Kubernetes.<\/li>\n<\/ul>\n<p><\/p>\n<p>Analizaremos la gesti\u00f3n de shards y r\u00e9plicas de bases de datos en Kubernetes.<br \/>\nLuego, discutiremos preguntas sobre el almacenamiento de datos:<\/p>\n<p><\/p>\n<ul>\n<li>c\u00f3mo trabajar con almacenamiento persistente desde la perspectiva del operador;<\/li>\n<li>los obst\u00e1culos de usar almacenamiento local.<\/li>\n<\/ul>\n<p><\/p>\n<p>En la parte final del informe, examinaremos ejemplos pr\u00e1cticos de aplicaci\u00f3n <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Altinity\/clickhouse-operator\">clickhouse-operator<\/a><\/noindex> con Amazon o Google Cloud Service. El informe se basa en el desarrollo y la experiencia de operaci\u00f3n de un operador para ClickHouse.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Video:<\/p>\n<p>\n<center><div class=\"youtube-placeholder\" data-id=\"z2aARjKDg4w\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/z2aARjKDg4w\/hqdefault.jpg\" alt=\"Reproducir video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<p>Me llamo Vladislav Klimenko. Hoy quer\u00eda hablar sobre nuestra experiencia en el desarrollo y operaci\u00f3n de un operador, espec\u00edficamente se trata de un operador especializado para gestionar cl\u00fasteres de bases de datos. Usaremos <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Altinity\/clickhouse-operator\">ClickHouse-operator<\/a><\/noindex> para gestionar el cl\u00faster de ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/cc297a3edb3b2a5e30d0dc2725de4011.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfPor qu\u00e9 tenemos la oportunidad de hablar sobre el operador y ClickHouse?<\/p>\n<p><\/p>\n<ul>\n<li>Nos dedicamos al soporte y desarrollo de ClickHouse. <\/li>\n<li>Actualmente tratamos de aportar poco a poco nuestro granito de arena al desarrollo de ClickHouse. Y somos los segundos despu\u00e9s de Yandex en la cantidad de cambios realizados en ClickHouse. <\/li>\n<li>Hacemos esfuerzos por realizar proyectos adicionales para el ecosistema de ClickHouse. <\/li>\n<\/ul>\n<p><\/p>\n<p>Sobre uno de esos proyectos, me gustar\u00eda hablar. Se trata del ClickHouse-operator para Kubernetes. <\/p>\n<p><\/p>\n<p>En mi informe, me gustar\u00eda abordar dos temas: <\/p>\n<p><\/p>\n<ul>\n<li>El primer tema es c\u00f3mo funciona nuestro operador para gestionar bases de datos ClickHouse en Kubernetes. <\/li>\n<li>El segundo tema es c\u00f3mo funciona cualquier operador, es decir, c\u00f3mo interact\u00faa con Kubernetes. <\/li>\n<\/ul>\n<p><\/p>\n<p>Estos dos temas se entrelazar\u00e1n a lo largo de toda mi presentaci\u00f3n. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4cc9790e18e70ae1ccde2cf39ef4ef00.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfA qui\u00e9n le interesar\u00e1 escuchar lo que intento contar?<\/p>\n<p><\/p>\n<ul>\n<li>Ser\u00e1 especialmente interesante para quienes operan operadores. <\/li>\n<li>O para aquellos que quieren crear el suyo propio, para entender c\u00f3mo funciona internamente, c\u00f3mo interact\u00faa el operador con Kubernetes y cu\u00e1les son los posibles obst\u00e1culos. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/07545f7a0171b610697c519d4aa9cd43.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Para entender mejor lo que vamos a discutir hoy, ser\u00eda \u00fatil saber c\u00f3mo funciona Kubernetes y tener una preparaci\u00f3n b\u00e1sica en tecnolog\u00edas de la nube. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/eff56cc3e83fde3d3e64d73d41b07417.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfQu\u00e9 es ClickHouse? Es una base de datos columnar especializada en el procesamiento en l\u00ednea de consultas anal\u00edticas. Y es completamente de c\u00f3digo abierto. <\/p>\n<p><\/p>\n<p>Y necesitamos saber solo dos cosas. Hay que entender que es una base de datos, por lo que lo que voy a contar ser\u00e1 aplicable pr\u00e1cticamente a cualquier base de datos. Y que el sistema de gesti\u00f3n de bases de datos ClickHouse escala muy bien, proporcionando pr\u00e1cticamente una escalabilidad lineal. Por lo tanto, el estado del cl\u00faster es algo natural para ClickHouse. Y nos interesa discutir c\u00f3mo mantener un cl\u00faster de ClickHouse en Kubernetes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5eb1ff5026c492117bf2467b10de7053.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfPara qu\u00e9 se necesita all\u00ed? \u00bfPor qu\u00e9 no podemos seguir explot\u00e1ndolo de forma independiente? Las respuestas son en parte t\u00e9cnicas y en parte organizativas. <\/p>\n<p><\/p>\n<ul>\n<li>En la pr\u00e1ctica, cada vez m\u00e1s nos encontramos en la situaci\u00f3n en la que, en grandes empresas, pr\u00e1cticamente todos los componentes ya est\u00e1n en Kubernetes. Las bases de datos quedan fuera. <\/li>\n<li>Y cada vez m\u00e1s surge la pregunta: \"\u00bfEs posible integrarlas dentro?\". Por eso, las grandes empresas intentan maximizar la unificaci\u00f3n de la gesti\u00f3n para poder manejar r\u00e1pidamente sus almacenes de datos. <\/li>\n<li>Y esto ayuda especialmente si se necesita la m\u00e1xima posibilidad de replicar lo mismo en un nuevo lugar, es decir, la m\u00e1xima portabilidad.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/99312e74bd7ed4031128c7ec872f6a68.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfQu\u00e9 tan simple o complicado es? Claro que se puede hacer manualmente. Pero no es tan sencillo, porque se suma la complejidad de gestionar Kubernetes, adem\u00e1s de la especificidad de ClickHouse. Y se produce una agregaci\u00f3n. <\/p>\n<p><\/p>\n<p>Y todo esto genera un conjunto bastante grande de tecnolog\u00edas, cuya gesti\u00f3n se vuelve ya bastante complicada, porque Kubernetes trae sus preguntas diarias sobre la explotaci\u00f3n, y ClickHouse trae las suyas. Especialmente si tenemos varios ClickHouse, y necesitamos estar constantemente trabajando con ellos. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/ca10b805b2744d1a5283f96b0ac1cc11.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Con ClickHouse, en una configuraci\u00f3n din\u00e1mica, hay un n\u00famero considerable de preguntas que generan una carga constante en DevOps:<\/p>\n<p><\/p>\n<ul>\n<li>Cuando queremos cambiar algo en ClickHouse, por ejemplo, a\u00f1adir una r\u00e9plica o un shard, tenemos que llevar a cabo la gesti\u00f3n de configuraci\u00f3n. <\/li>\n<li>Luego hay que cambiar el esquema de datos, porque ClickHouse tiene una manera espec\u00edfica de fragmentar. Es necesario desglosar el esquema de datos y configurar las configuraciones. <\/li>\n<li>Se debe configurar la monitorizaci\u00f3n. <\/li>\n<li>Recopilaci\u00f3n de registros para nuevos fragmentos, para nuevas r\u00e9plicas. <\/li>\n<li>Preocuparse por la recuperaci\u00f3n.<\/li>\n<li>Y el reinicio. <\/li>\n<\/ul>\n<p><\/p>\n<p>Son trabajos rutinarios que ser\u00eda muy deseable facilitar en la operaci\u00f3n.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2461e861ca1d2f2344ead9decf85a97e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kubernetes ayuda bien en la operaci\u00f3n, pero en aspectos b\u00e1sicos del sistema. <\/p>\n<p><\/p>\n<p>Kubernetes facilita y automatiza cosas como:<\/p>\n<p><\/p>\n<ul>\n<li>La recuperaci\u00f3n.<\/li>\n<li>El reinicio. <\/li>\n<li>La gesti\u00f3n del sistema de almacenamiento.<\/li>\n<\/ul>\n<p><\/p>\n<p>Esto es bueno, es la direcci\u00f3n correcta, pero no tiene idea completa de c\u00f3mo operar un cl\u00faster de bases de datos. <\/p>\n<p><\/p>\n<p>Se quiere m\u00e1s, se desea que toda la base de datos funcione en Kubernetes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6564e9f29d5d518925c8593bca978345.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Se busca algo como un gran bot\u00f3n m\u00e1gico rojo, que al presionarlo despliegue y mantenga un cl\u00faster a lo largo de todo su ciclo de vida, con tareas diarias que deben resolverse. Un cl\u00faster ClickHouse en Kubernetes.<\/p>\n<p><\/p>\n<p>Y hemos tratado de crear una soluci\u00f3n que ayude a facilitar el trabajo. Este es el ClickHouse-operator para Kubernetes de Altinity.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4ff80c6fc59069ec900d545096ad978d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Un operador es un programa cuya tarea principal es gestionar otros programas, es decir, es un gestor. <\/p>\n<p><\/p>\n<p>Y contiene plantillas de comportamiento. Esto se puede denominar conocimientos codificados del \u00e1rea tem\u00e1tica. <\/p>\n<p><\/p>\n<p>Y su tarea principal es facilitar la vida del DevOps y reducir el micromanagement, para que \u00e9l (DevOps) ya piense en t\u00e9rminos de alto nivel, es decir, que no se dedique a gestionar cada detalle manualmente. <\/p>\n<p><\/p>\n<p>Y el operador es un robot asistente que se ocupa de las microtareas y ayuda al DevOps.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0824a1fa710e8c4f45406aa7f596b977.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfPara qu\u00e9 se necesita un operador? Se destaca especialmente en dos cuestiones:<\/p>\n<p><\/p>\n<ul>\n<li>Cuando el especialista que trabaja con ClickHouse no tiene suficiente experiencia, pero ya es necesario gestionar ClickHouse, el operador facilita la operaci\u00f3n y permite gestionar un cl\u00faster de ClickHouse con una configuraci\u00f3n bastante compleja, sin profundizar demasiado en los detalles de c\u00f3mo funciona todo internamente. Simplemente se le dan tareas de alto nivel y esto funciona. <\/li>\n<li>Y la segunda tarea en la que se destaca m\u00e1s es cuando se necesita automatizar un gran n\u00famero de tareas est\u00e1ndar. Despeja microtareas de los administradores de sistemas. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f1cb11156d57f560d0b6c82700ac6ff8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Esto es m\u00e1s necesario para aquellos que reci\u00e9n comienzan su camino o para los que necesitan dedicarse mucho a la automatizaci\u00f3n. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/128e7d9ff1ce0c535f98be66aedb1060.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfEn qu\u00e9 se diferencia el enfoque basado en operadores de otros sistemas? Existe Helm. Tambi\u00e9n ayuda a instalar ClickHouse, se pueden dibujar helm charts que incluso instalan un cl\u00faster completo de ClickHouse. Entonces, \u00bfcu\u00e1l es la diferencia entre un operador y, por ejemplo, Helm?<\/p>\n<p><\/p>\n<p>La principal diferencia fundamental es que Helm es gesti\u00f3n de paquetes, mientras que el operador va un paso m\u00e1s all\u00e1. Esto cubre todo el ciclo de vida. No se trata solo de instalaci\u00f3n, incluye tareas diarias como escalado, particionamiento, es decir, todo lo que debe hacerse durante el ciclo de vida (si es necesario, tambi\u00e9n la eliminaci\u00f3n) lo resuelve el operador. Intenta automatizar y gestionar todo el ciclo de vida del software. Esta es su diferencia fundamental frente a otras soluciones disponibles. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e26b57c8caf8437f683d7afbfa127ebd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Esta fue la parte introductoria, sigamos adelante. <\/p>\n<p><\/p>\n<p>\u00bfC\u00f3mo construimos nuestro operador? Intentamos abordar la cuesti\u00f3n para gestionar el cl\u00faster de ClickHouse como un \u00fanico recurso. <\/p>\n<p><\/p>\n<p>Aqu\u00ed a la izquierda de la imagen tenemos los datos de entrada. Este es un YAML con la especificaci\u00f3n del cl\u00faster, que se transmite de manera cl\u00e1sica a Kubernetes a trav\u00e9s de kubectl. All\u00ed, nuestro operador lo capta, hace su magia y el resultado es este esquema. Esta es la implementaci\u00f3n de ClickHouse en Kubernetes.<\/p>\n<p><\/p>\n<p>Y a continuaci\u00f3n, iremos viendo poco a poco c\u00f3mo funciona exactamente el operador, qu\u00e9 tareas est\u00e1ndar se pueden resolver. Solo analizaremos tareas est\u00e1ndar porque tenemos un tiempo limitado. Y no se hablar\u00e1 de todo lo que el operador puede resolver. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/b40401931b58988058419d4495dbb1bb.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Partamos de la pr\u00e1ctica. Nuestro proyecto es completamente open source, por lo que se puede ver en GitHub c\u00f3mo funciona. Y tambi\u00e9n se puede partir de la consideraci\u00f3n de que, si solo se desea iniciar, el Quick Start Guide es un buen punto de partida.<\/p>\n<p><\/p>\n<p>Si se desea profundizar en los detalles, nos esforzamos por mantener la documentaci\u00f3n en un estado m\u00e1s o menos aceptable. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9414d7c3aa94b6ad999e150f0ac25a97.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Comencemos con una tarea pr\u00e1ctica. La primera tarea, desde la que todos queremos empezar, es ejecutar el primer ejemplo de cualquier manera. \u00bfC\u00f3mo ejecutar ClickHouse utilizando un operador, incluso sin saber muy bien c\u00f3mo funciona? Escribimos un manifiesto, ya que toda comunicaci\u00f3n con k8s se realiza a trav\u00e9s de manifiestos.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3e97cd235827460693ed95fb3598d31d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Este es un manifiesto complicado. Lo que est\u00e1 resaltado en rojo es lo que debemos enfatizar. Estamos pidiendo al operador que cree un cl\u00faster llamado demo.<\/p>\n<p><\/p>\n<p>Por ahora, estos son ejemplos b\u00e1sicos. El almacenamiento a\u00fan no se describe, pero volveremos al almacenamiento m\u00e1s adelante. Por ahora, observaremos el desarrollo del cl\u00faster en din\u00e1mica.<\/p>\n<p><\/p>\n<p>Hemos creado este manifiesto. Se lo proporcionamos a nuestro operador. \u00c9l trabaj\u00f3 y realiz\u00f3 la magia.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/502e64fbe6ed7d04b2aecb7d51abc7f9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Miremos en la consola. Tres componentes llaman nuestra atenci\u00f3n: un Pod, dos Services y un StatefulSet.<\/p>\n<p><\/p>\n<p>El operador ha trabajado y podemos ver qu\u00e9 es lo que ha creado. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/67faf120e21e5113680ccff9c71b00f1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Crea aproximadamente este esquema. Tenemos un StatefulSet, un Pod, ConfigMap para cada r\u00e9plica, ConfigMap para todo el cl\u00faster. Es imprescindible contar con servicios como puntos de entrada al cl\u00faster. <\/p>\n<p><\/p>\n<p>Los servicios son el servicio Load Balancer central y, adem\u00e1s, se puede tener uno para cada r\u00e9plica y cada shard. <\/p>\n<p><\/p>\n<p>As\u00ed es como se ve nuestro cl\u00faster b\u00e1sico. Consiste en una \u00fanica nodo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f235ada45ee58b517c0e041f795ae122.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sigamos adelante, vamos a complicar las cosas. Necesitamos shardear el cl\u00faster.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/992836a00434c64fb4616c1c4cc4df97.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nuestras tareas est\u00e1n aumentando, est\u00e1 surgiendo din\u00e1mica. Queremos agregar un shard. Seguimos el desarrollo. Modificamos nuestra especificaci\u00f3n. Indicamos que queremos dos shards. <\/p>\n<p><\/p>\n<p>Este es el mismo archivo que se desarrolla din\u00e1micamente con el crecimiento del sistema. No hay almacenamiento, pero se ver\u00e1 en detalle m\u00e1s adelante, es un tema aparte.<\/p>\n<p><\/p>\n<p>Proporcionamos el operador YAML y observamos qu\u00e9 sucede. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8ddb5845cae160098470208f51b5da7c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>El operador pens\u00f3 y cre\u00f3 las siguientes entidades. Ya tenemos dos Pods, tres Services y, inesperadamente, 2 StatefulSets. \u00bfPor qu\u00e9 2 StatefulSets?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/26eb734ff1a195de2ceaab842b472ee4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>En el esquema estaba as\u00ed: este es nuestro estado inicial, cuando ten\u00edamos un pod.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/657838b0d378121fdd66ad3ff8168600.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ahora se ve as\u00ed. Por ahora, todo es simple, se ha duplicado. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f039a7046f1c56fbdad6b5a26a519b10.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfY por qu\u00e9 se convirti\u00f3 en dos StatefulSets? Aqu\u00ed hay que desviarse y discutir c\u00f3mo Kubernetes maneja los Pods.<\/p>\n<p><\/p>\n<p>Hay un objeto llamado StatefulSet, que permite crear un conjunto de Pods a partir de una plantilla. Aqu\u00ed el factor clave es el Template. Y se pueden ejecutar muchos Pods a partir de un mismo template en un StatefulSet. La frase clave aqu\u00ed es 'muchos Pods de una misma plantilla'.<\/p>\n<p><\/p>\n<p>Y hab\u00eda una gran tentaci\u00f3n de hacer todo el cl\u00faster, empaquet\u00e1ndolo en un solo StatefulSet. Esto funcionar\u00e1, no hay ning\u00fan problema con eso. Pero hay un matiz. Si queremos construir un cl\u00faster heterog\u00e9neo, es decir, de varias versiones de ClickHouse, aqu\u00ed empiezan nuestras preguntas. S\u00ed, StatefulSet puede hacer un rolling update, s\u00ed, se puede implementar una nueva versi\u00f3n, explicando que solo se deben intentar actualizar no m\u00e1s de ciertos nodos al mismo tiempo.<\/p>\n<p><\/p>\n<p>Pero si extrapolamos la tarea y decimos que queremos hacer un cl\u00faster completamente heterog\u00e9neo y que no deseamos cambiar de una versi\u00f3n antigua a una nueva mediante un rolling update, sino que simplemente queremos crear un cl\u00faster heterog\u00e9neo tanto en t\u00e9rminos de diferentes versiones de ClickHouse como en diferentes tipos de almacenamiento. Queremos, por ejemplo, hacer algunas r\u00e9plicas en discos separados, en discos lentos; en general, construir completamente un cl\u00faster heterog\u00e9neo. Y debido a que StatefulSet crea una soluci\u00f3n estandarizada a partir de una plantilla, no es posible hacerlo. <\/p>\n<p><\/p>\n<p>Despu\u00e9s de reflexionar un poco, se tom\u00f3 la decisi\u00f3n de hacerlo de esta manera. Cada r\u00e9plica est\u00e1 en su propio StatefulSet. Hay algunas desventajas en esta soluci\u00f3n, pero en la pr\u00e1ctica, todo esto est\u00e1 completamente encapsulado por el operador. Y hay un mont\u00f3n de ventajas. Podemos construir completamente el cl\u00faster que queramos, por ejemplo, absolutamente heterog\u00e9neo. Por lo tanto, en el cl\u00faster, donde tenemos dos shards con una r\u00e9plica cada uno, tendremos 2 StatefulSets y 2 Pods precisamente porque elegimos este enfoque debido a las razones mencionadas anteriormente para poder construir un cl\u00faster heterog\u00e9neo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4b7ae92a545f9bb6cc5f0136df87207f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Volvamos a las tareas pr\u00e1cticas. En nuestro cl\u00faster, es necesario configurar usuarios, es decir, se necesita realizar alguna configuraci\u00f3n de ClickHouse en Kubernetes. El operador proporciona todas las posibilidades para esto. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6a65aa78293c0b40230cf24efc58e55a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Se puede escribir directamente en YAML lo que queremos. Todas las opciones de configuraci\u00f3n se mapean directamente de este YAML a las configuraciones de ClickHouse, que luego se distribuyen por todo el cl\u00faster.<\/p>\n<p><\/p>\n<p>Tambi\u00e9n se puede escribir as\u00ed. Esto es solo un ejemplo. La contrase\u00f1a se puede hacer cifrada. Se admiten absolutamente todas las opciones de configuraci\u00f3n de ClickHouse. Aqu\u00ed solo hay un ejemplo. <\/p>\n<p><\/p>\n<p>La configuraci\u00f3n del cl\u00faster se distribuye como ConfigMap. En la pr\u00e1ctica, la actualizaci\u00f3n del ConfigMap no ocurre de inmediato, por lo que si el cl\u00faster es grande, el proceso de empuje de la configuraci\u00f3n lleva alg\u00fan tiempo. Pero todo esto es muy conveniente en operaci\u00f3n.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2e42d19d7a558e3b8d4bbb51fe5bd08b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Complicamos la tarea. El cl\u00faster se est\u00e1 desarrollando. Queremos replicar los datos. Es decir, ya tenemos dos shards, cada uno con una r\u00e9plica, y los usuarios configurados. Estamos creciendo y queremos encargarnos de la replicaci\u00f3n.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4c97e5e6ca9cb66d3a94fb8cfe610186.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfQu\u00e9 necesitamos para la replicaci\u00f3n? <\/p>\n<p><\/p>\n<p>Necesitamos ZooKeeper. En ClickHouse, la replicaci\u00f3n se basa en ZooKeeper. ZooKeeper es necesario para que varias r\u00e9plicas de ClickHouse tengan consenso sobre qu\u00e9 bloques de datos existen en qu\u00e9 instancia de ClickHouse. <\/p>\n<p><\/p>\n<p>Se puede usar cualquier ZooKeeper. Si la empresa tiene un ZooKeeper externo, se puede utilizar. Si no, se puede instalar desde nuestro repositorio. Hay un instalador que facilita todo esto. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/6cc40951a19b982abf578836edf569d3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y el esquema de interacci\u00f3n de todo el sistema resulta ser as\u00ed. Tenemos Kubernetes como plataforma. En \u00e9l se ejecuta el operador de ClickHouse. Aqu\u00ed he representado a ZooKeeper. Y el operador interact\u00faa tanto con ClickHouse como con ZooKeeper. Es decir, se genera una interacci\u00f3n. <\/p>\n<p><\/p>\n<p>Y todo esto es necesario para que ClickHouse replique los datos con \u00e9xito en k8s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4fc37aee850acd20517fa3d7562f0165.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ahora echemos un vistazo a la propia tarea, a c\u00f3mo se ver\u00e1 el manifiesto para la replicaci\u00f3n.<\/p>\n<p><\/p>\n<p>Agregamos dos secciones a nuestro manifiesto. La primera es de d\u00f3nde obtener ZooKeeper, que puede estar dentro de Kubernetes o ser externo. Es solo una descripci\u00f3n. Y pedimos r\u00e9plicas. Es decir, queremos dos r\u00e9plicas. En total, deber\u00edamos tener 4 pods. Recuerden que en cuanto al almacenamiento, volveremos a eso m\u00e1s adelante. El almacenamiento es una historia aparte. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/afb8c974d0587a4ad87d6ba36bbe5e3b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>As\u00ed era antes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/909ffd258dbce718ddf529a1a753de6f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>As\u00ed se ve ahora. Se agregan las r\u00e9plicas. La cuarta no cab\u00eda, creemos que puede haber muchas. Y a un lado se agrega ZooKeeper. Los esquemas se complican. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c33b37fc7fc72f51276e5e98b9ec2134.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y ha llegado el momento de agregar la siguiente tarea. Vamos a a\u00f1adir Almacenamiento Persistente. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f28d14901a713eca413a52ec6ea21ac5.jpeg\" style=\"display:block;margin: 0 auto;\" \/>En cuanto al Almacenamiento Persistente, tenemos varias opciones de ejecuci\u00f3n.<\/p>\n<p><\/p>\n<p>En caso de que estemos ejecutando en un proveedor de la nube, por ejemplo, utilizando Amazon o Google, hay una gran tentaci\u00f3n de aprovechar el almacenamiento en la nube. Es muy conveniente, es bueno. <\/p>\n<p><\/p>\n<p>Y hay una segunda opci\u00f3n. Es para almacenamiento local, cuando tenemos discos locales en cada nodo. Esta opci\u00f3n es mucho m\u00e1s complicada de implementar, pero es m\u00e1s eficiente. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/483ee5c08b62e987620bf54fd32a44b4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Veamos qu\u00e9 tenemos en relaci\u00f3n al almacenamiento en la nube.<\/p>\n<p><\/p>\n<p>Tiene ventajas. Es muy f\u00e1cil de configurar. Simplemente pedimos al proveedor de la nube que nos proporcione un almacenamiento de cierta capacidad y clase. Las clases son definidas por los proveedores. <\/p>\n<p><\/p>\n<p>Y hay una desventaja. Para algunos, esta no es una desventaja cr\u00edtica. Por supuesto, habr\u00e1 algunas sobrecargas de rendimiento. Es muy conveniente en el trabajo, confiable, pero hay ciertas ca\u00eddas de rendimiento potenciales.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8e82430b64477f91640078ff4eacb47e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y dado que ClickHouse se centra precisamente en el rendimiento, se puede incluso decir que aprovecha todo lo que puede, por lo que muchos clientes intentan extraer el m\u00e1ximo rendimiento.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8638fe37b848a98ce8326218d368baa3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y para extraer el m\u00e1ximo, necesitamos almacenamiento local.<\/p>\n<p><\/p>\n<p>Kubernetes proporciona tres abstracciones para usar almacenamiento local en Kubernetes. Estas son: <\/p>\n<p><\/p>\n<ul>\n<li>EmptyDir<\/li>\n<li>HostPath.<\/li>\n<li>Local<\/li>\n<\/ul>\n<p><\/p>\n<p>Veamos en qu\u00e9 se diferencian y en qu\u00e9 se parecen. <\/p>\n<p><\/p>\n<p>En primer lugar, en los tres enfoques tenemos almacenamiento: son discos locales que est\u00e1n en el mismo nodo f\u00edsico de k8s. Pero tienen algunas diferencias.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/79afb620a0c9a1552b47240b405fedc9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Empecemos con lo m\u00e1s simple, es decir, con emptyDir. \u00bfQu\u00e9 es esto en la pr\u00e1ctica? Es cuando pedimos a nuestra especificaci\u00f3n que el sistema de contenedorizaci\u00f3n (la mayor\u00eda de las veces, Docker) nos proporcione acceso a una carpeta en el disco local.<\/p>\n<p><\/p>\n<p>En la pr\u00e1ctica, Docker crea en alg\u00fan lugar de su propio camino una carpeta temporal, la llama con un hash largo y proporciona una interfaz de acceso a ella. <\/p>\n<p><\/p>\n<p>\u00bfC\u00f3mo funcionar\u00e1 esto en t\u00e9rminos de rendimiento? Funcionar\u00e1 a la velocidad del disco local, es decir, hay acceso completo a su disco duro. <\/p>\n<p><\/p>\n<p>Pero esta opci\u00f3n tiene una desventaja. La persistencia en este caso es bastante dudosa. Al primer movimiento de Docker con los contenedores, la persistencia se pierde. Si Kubernetes decidiera por alguna raz\u00f3n mover este Pod a otro disco, los datos se perder\u00edan. <\/p>\n<p><\/p>\n<p>Este enfoque es bueno para pruebas, porque ya muestra una velocidad normal, pero no es adecuado para algo serio. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0b60f80fc9ea0e2c1820021bcd9e1382.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Por eso hay un segundo enfoque. Este es hostPath. Si miras la diapositiva anterior y esta, puedes ver una sola diferencia. Nuestra carpeta ha salido de Docker directamente a la nodo de Kubernetes. Aqu\u00ed es un poco m\u00e1s simple. Simplemente especificamos el camino en el sistema de archivos local donde nos gustar\u00eda almacenar nuestros datos. <\/p>\n<p><\/p>\n<p>Las ventajas de este m\u00e9todo son claras. Es un verdadero almacenamiento persistente, de hecho, cl\u00e1sico. Los datos se registrar\u00e1n en el disco en una direcci\u00f3n espec\u00edfica. <\/p>\n<p><\/p>\n<p>Tambi\u00e9n hay desventajas. La complejidad de gesti\u00f3n. Nuestro Kubernetes puede querer mover un Pod a otro nodo f\u00edsico. Y aqu\u00ed es donde entra en juego DevOps. Debe explicar correctamente a todo el sistema que estos pods solo se pueden mover a nodos en los que tengas algo montado por estos caminos, y no m\u00e1s de un nodo a la vez. Esto es bastante complicado. <\/p>\n<p><\/p>\n<p>Con este prop\u00f3sito, hemos creado plantillas en nuestro operador para ocultar toda esta complejidad. Y podr\u00eda simplemente decir: \"Quiero que tenga una instancia de ClickHouse en cada nodo f\u00edsico y en tal ruta\". <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9f64c19bccc8b187d6af112eda896b25.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pero esta necesidad no solo nos concierne a nosotros, por lo que los caballeros de Kubernetes tambi\u00e9n comprenden que a la gente le gustar\u00eda tener acceso a discos f\u00edsicos, y por eso proporcionan un tercer nivel.<\/p>\n<p><\/p>\n<p>Se llama local. La diferencia con la diapositiva anterior es pr\u00e1cticamente ninguna. Solo que antes hab\u00eda que realizar manualmente el proceso, que no se pod\u00edan mover estos pods de nodo a nodo porque deb\u00edan estar conectados a un disco f\u00edsico local en una ruta espec\u00edfica, y ahora todo ese conocimiento se encapsula en Kubernetes. Y resulta mucho m\u00e1s f\u00e1cil de configurar.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/140c43be34dd7015c0bf4cfd0a0bb384.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Regresamos a nuestra tarea pr\u00e1ctica. Volvamos a la plantilla YAML. Aqu\u00ed tenemos un almacenamiento real. Hemos regresado a esto. Estamos definiendo un cl\u00e1sico VolumeClaim template como en k8s. Y describimos qu\u00e9 almacenamiento queremos.<\/p>\n<p><\/p>\n<p>Despu\u00e9s de esto, k8s solicitar\u00e1 almacenamiento. Nos lo asignar\u00e1 en StatefulSet. Y al final esto quedar\u00e1 a disposici\u00f3n de ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/960e666486ed09cebd83235d43f83970.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ten\u00eda un esquema como este. Nuestro Almacenamiento Persistente estaba en rojo, lo que indicaba que deber\u00eda hacerse. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a989df489e3a9fef6a4fbf7b93c489a6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y ahora se vuelve verde. Ahora el esquema del cl\u00faster ClickHouse en k8s est\u00e1 completamente finalizado. Tenemos shards, r\u00e9plicas, ZooKeeper, hay un verdadero Persistente, que se implementa de una forma u otra. El esquema ya es completamente funcional. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/c409ee5da6309a67904394d968ed4906.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Seguimos avanzando. Nuestro cl\u00faster est\u00e1 en desarrollo. Y Alexey se esfuerza, lanzando una nueva versi\u00f3n de ClickHouse.<\/p>\n<p><\/p>\n<p>Surge la tarea pr\u00e1ctica: probar la nueva versi\u00f3n de ClickHouse en nuestro cl\u00faster. Y, por supuesto, no queremos implementarla en su totalidad, quisi\u00e9ramos instalar una nueva versi\u00f3n en alg\u00fan rinc\u00f3n lejano, o tal vez no solo una nueva versi\u00f3n, sino dos a la vez, porque salen con frecuencia. <\/p>\n<p><\/p>\n<p>\u00bfQu\u00e9 podemos decir al respecto?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/48ed52d393d977d0cfaa9320bd02ed1e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aqu\u00ed tenemos la oportunidad justa. Son plantillas de pod. Se puede detallar, nuestro operador permite construir un cl\u00faster heterog\u00e9neo. Es decir, configurando desde todas las r\u00e9plicas en grupo, hasta cada r\u00e9plica personal en la versi\u00f3n de ClickHouse que queremos, y la versi\u00f3n de almacenamiento que deseamos. Podremos configurar completamente un cl\u00faster de la manera que nos necesite. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4949ecd8119cb4ec0f4bad9bf27fa74e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ahora nos adentraremos un poco m\u00e1s. Hasta ahora, hemos hablado de c\u00f3mo funciona el ClickHouse-operator en relaci\u00f3n a la especificidad de ClickHouse.<\/p>\n<p><\/p>\n<p>Ahora me gustar\u00eda hablar brevemente sobre c\u00f3mo funciona cualquier operador en general, as\u00ed como de c\u00f3mo interact\u00faa con K8s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5ca9c2a23c54b2a81ac0a8bba88d5e65.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Comencemos con la interacci\u00f3n con K8s. \u00bfQu\u00e9 sucede cuando hacemos kubectl apply? A trav\u00e9s de la API en etcd aparecen nuestros objetos. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4b9eaedeb0f34d10398ba0187f09fef9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Por ejemplo, los objetos b\u00e1sicos de Kubernetes: pod, StatefulSet, servicio, y as\u00ed sucesivamente. <\/p>\n<p><\/p>\n<p>Sin embargo, a\u00fan no ocurre nada f\u00edsico. Estos objetos deben materializarse en el cl\u00faster. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/3c49dc1b0067347d5fc415ef9b87642d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Para esto, aparece el controlador. El controlador es un componente especial de k8s que puede materializar estas descripciones. Sabe c\u00f3mo y qu\u00e9 hacer f\u00edsicamente. Sabe c\u00f3mo iniciar contenedores y qu\u00e9 debe configurarse para que el servidor funcione. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/d951eb0f7bacf519566b0ef6cf9bc100.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y materializa nuestros objetos en K8s.<\/p>\n<p><\/p>\n<p>Pero queremos operar no solo con pods y StatefulSets, sino que queremos crear un ClickHouseInstallation, es decir, un objeto del tipo ClickHouse, para operarlo como un todo. Hasta ahora, esa posibilidad no existe. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1594921ac5dd9384ce81ceae92f5cda9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pero K8s tiene algo muy agradable. Queremos que haya una entidad compleja que re\u00fana nuestro cl\u00faster formado por pods y StatefulSets. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/04f86706f506fa91e365d45537dd9def.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfY qu\u00e9 debemos hacer para esto? En primer lugar, entra en escena la Custom Resource Definition. \u00bfQu\u00e9 es esto? Es una descripci\u00f3n para K8s de que tendr\u00e1s otro tipo de datos, que queremos agregar un recurso personalizado que ser\u00e1 complejo dentro de pods y StatefulSets. Esta es la descripci\u00f3n de la estructura de datos. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f02ae12ef3ab5db974234b14e38792ac.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tambi\u00e9n lo enviamos all\u00ed a trav\u00e9s de kubectl apply. Kubernetes lo recibi\u00f3 con gusto. <\/p>\n<p><\/p>\n<p>Y ahora tenemos la posibilidad de registrar un recurso personalizado llamado ClickHouseInstallation en el almacenamiento del objeto en etcd.<\/p>\n<p><\/p>\n<p>Pero por el momento no suceder\u00e1 nada m\u00e1s. Es decir, si ahora creamos un archivo YAML que hemos discutido con la descripci\u00f3n de shards, r\u00e9plicas y decimos \"kubectl apply\", Kubernetes lo aceptar\u00e1, lo colocar\u00e1 en etcd y dir\u00e1: \"Perfecto, pero no s\u00e9 qu\u00e9 hacer con \u00e9l. No s\u00e9 c\u00f3mo gestionar ClickHouseInstallation\". <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7c2f9f3f81b83c987a3bd72a881d0d91.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Por lo tanto, necesitamos a alguien que ayude a Kubernetes a gestionar un nuevo tipo de datos. A la izquierda tenemos un controlador integrado de Kubernetes que trabaja con tipos de datos est\u00e1ndar. A la derecha debe aparecer un controlador personalizado que sabe trabajar con tipos de datos personalizados. <\/p>\n<p><\/p>\n<p>Y su nombre alternativo es operador. Lo he destacado aqu\u00ed fuera de Kubernetes porque puede ejecutarse fuera de K8s. La mayor\u00eda de las veces, por supuesto, todos los operadores se ejecutan en Kubernetes, pero nada impide que se ejecute externamente, por eso aqu\u00ed se ha presentado fuera. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7aa3a1b67d0def5ba752dff56baeebbf.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y, por su parte, el controlador personalizado, tambi\u00e9n conocido como operador, interact\u00faa con Kubernetes a trav\u00e9s de la API. Ya sabe c\u00f3mo interactuar con la API. Y ya sabe c\u00f3mo materializar un esquema complejo a partir de un recurso personalizado que deseamos crear. Precisamente para eso sirve el operador. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a5f773ddc3663f24d5379955da9c3037.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfC\u00f3mo funciona el operador? Vamos a echar un vistazo al lado derecho para descubrir c\u00f3mo lo hace. Vamos a averiguar c\u00f3mo el operador materializa todo esto y c\u00f3mo contin\u00faa la interacci\u00f3n con K8s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/08a8d8dbcb35117a0eb3320589c6ff8d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>El operador es un programa. Su enfoque es basado en eventos. El operador, a trav\u00e9s de la API de Kubernetes, se suscribe a eventos. En la API de Kubernetes hay puntos de entrada donde se puede suscribir a eventos. Y si algo cambia en K8s, Kubernetes env\u00eda eventos a todos los interesados, es decir, quien est\u00e9 suscrito a ese punto de API recibir\u00e1 las notificaciones.<\/p>\n<p><\/p>\n<p>El operador se suscribe a eventos y debe realizar alguna reacci\u00f3n. Su tarea es reaccionar a los eventos que aparecen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9f0664a4151e6e7f6f8575a3e54372e9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Los eventos se generan a trav\u00e9s de ciertas actualizaciones. Nuestro archivo YAML con la descripci\u00f3n de ClickHouseInstallation llega. A trav\u00e9s de kubectl apply, fue a etcd. All\u00ed se activ\u00f3 un evento, y este evento lleg\u00f3 al operador de ClickHouse. El operador recibi\u00f3 esta descripci\u00f3n. Y debe hacer algo al respecto. Si ha llegado una actualizaci\u00f3n al objeto ClickHouseInstallation, entonces es necesario actualizar el cl\u00faster. Y la tarea del operador es actualizar el cl\u00faster. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/0952bdd391a72aa15bf66af4ce69f4af.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfQu\u00e9 hace? Primero, es necesario elaborar un plan de acci\u00f3n sobre qu\u00e9 haremos con esta actualizaci\u00f3n. Las actualizaciones pueden ser muy peque\u00f1as, es decir, peque\u00f1as en la ejecuci\u00f3n de YAML, pero pueden llevar a grandes cambios en el cl\u00faster. Por lo tanto, el operador crea un plan y luego se adhiere a \u00e9l.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/79caaa43b6fd9f3e2eb1afe44ecb2df9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c9l comienza a implementar esta estructura seg\u00fan el plan, para materializar pods, servicios, es decir, hacer lo que es su tarea principal. Es como construir un cl\u00faster de ClickHouse en Kubernetes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e91576a26d6b758a68ae0b35cbe01897.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ahora, hablemos de algo interesante. Esta es la divisi\u00f3n de responsabilidades entre Kubernetes y el operador, es decir, qu\u00e9 hace Kubernetes, qu\u00e9 hace el operador y c\u00f3mo interact\u00faan entre s\u00ed. <\/p>\n<p><\/p>\n<p>Kubernetes se encarga de las cosas del sistema, es decir, de un conjunto b\u00e1sico de objetos que se puede interpretar como de \u00e1mbito del sistema. Kubernetes sabe c\u00f3mo iniciar pods, c\u00f3mo reiniciar contenedores, c\u00f3mo montar vol\u00famenes, c\u00f3mo trabajar con ConfigMap, es decir, todo lo que se puede denominar sistema. <\/p>\n<p><\/p>\n<p>Los operadores operan en dominios espec\u00edficos. Cada operador se crea para su propio dominio espec\u00edfico. Nosotros hicimos uno para ClickHouse.<\/p>\n<p><\/p>\n<p>Y el operador interact\u00faa precisamente en t\u00e9rminos del dominio espec\u00edfico, como agregar una r\u00e9plica, crear un esquema, configurar la supervisi\u00f3n. As\u00ed se produce esta divisi\u00f3n.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/9dc07d9c29d5dfd538343aadb751e4c0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Veamos un ejemplo pr\u00e1ctico de c\u00f3mo ocurre esta divisi\u00f3n de responsabilidades cuando realizamos la acci\u00f3n de agregar una r\u00e9plica. <\/p>\n<p><\/p>\n<p>Al operador llega la tarea: agregar una r\u00e9plica. \u00bfQu\u00e9 hace el operador? El operador calcular\u00e1 que necesita crear un nuevo StatefulSet, en el que se deben describir ciertas plantillas, reclamos de volumen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/7a31f2f76a3bdda87e4bccf0e04fe4a8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c9l prepara todo esto y lo pasa a K8s. Indica que necesita ConfigMap, StatefulSet, Volumen. Kubernetes lo procesa. Materializa las unidades b\u00e1sicas con las que operaci\u00f3n. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/2be6892234cc12b056962265c13dba07.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y luego entra nuevamente en juego el ClickHouse-operator. Ya tiene un pod f\u00edsico, sobre el cual se puede trabajar. Y ClickHouse-operator nuevamente trabaja en t\u00e9rminos del dominio espec\u00edfico. Es decir, para incluir una r\u00e9plica en el cl\u00faster, primero hay que configurar el esquema de datos que existe en este cl\u00faster. Y, en segundo lugar, esta r\u00e9plica debe incluirse en la supervisi\u00f3n para que sea monitoreada de manera efectiva. Esto lo configura el operador. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/790616342b98b347fa67e0100754c8b6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y solo despu\u00e9s de eso, entra en juego ClickHouse, es decir, otra entidad de nivel superior. Esta ya es una base de datos. Tiene su propia instancia, una r\u00e9plica configurada, que est\u00e1 lista para unirse al cl\u00faster.<\/p>\n<p><\/p>\n<p>La cadena de ejecuci\u00f3n y separaci\u00f3n de responsabilidades al agregar una r\u00e9plica es bastante larga.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5ec79cfa2b45fadbe25f4d9fe8d2ec5d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Continuamos con nuestras tareas pr\u00e1cticas. Si ya existe un cl\u00faster, podemos llevar a cabo la migraci\u00f3n de la configuraci\u00f3n. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/a52aee0d4350b8da00cdb4b525df80ad.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hicimos que en el XML existente, que ClickHouse entiende, se pueda trasmitir a trav\u00e9s.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/91abb1d3b0a14f2118361403a74e14c1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Se puede hacer un ajuste fino de ClickHouse. Justo el despliegue zonificado es de lo que habl\u00e9 al explicar hostPath y almacenamiento local. Es c\u00f3mo hacer correctamente un despliegue zonificado.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/fde502f30223e04a918f4fd598c3dd9f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La siguiente tarea pr\u00e1ctica es la monitorizaci\u00f3n.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4e685fba7883075105c0164a778c51e1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Si nuestro cl\u00faster cambia, debemos ajustar peri\u00f3dicamente la monitorizaci\u00f3n. <\/p>\n<p><\/p>\n<p>Veamos el esquema. Ya hemos revisado las flechas verdes. Ahora veamos las flechas rojas. As\u00ed es como queremos monitorizar nuestro cl\u00faster. C\u00f3mo las m\u00e9tricas del cl\u00faster de ClickHouse llegan a Prometheus y luego a Grafana.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1210c1423f99d48a20e06e855bf48a72.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfY cu\u00e1l es la dificultad con la monitorizaci\u00f3n? \u00bfPor qu\u00e9 se considera un logro? La complejidad radica en la din\u00e1mica. Cuando tenemos un solo cl\u00faster y es est\u00e1tico, se puede configurar la monitorizaci\u00f3n una vez y no volver a preocuparse.<\/p>\n<p><\/p>\n<p>Pero si tenemos muchos cl\u00fasteres, o si algo cambia constantemente, el proceso es din\u00e1mico. Y estar continuamente reconfigurando la monitorizaci\u00f3n es una p\u00e9rdida de recursos y tiempo, es decir, simplemente pereza. Esto debe automatizarse. La dificultad est\u00e1 precisamente en la din\u00e1mica del proceso. Y el operador lo automatiza muy bien. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/48a7264f1228671e0c483c8211a71eb3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfC\u00f3mo ha evolucionado nuestro cl\u00faster? Al principio era as\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/8a8c7b6cd5562deb315368e1e8e1c976.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Luego fue as\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/1a3e915fbadf3aa5f3b33d337f36e76e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Al final, se convirti\u00f3 en esto. <\/p>\n<p><\/p>\n<p>Y la monitorizaci\u00f3n se realiza autom\u00e1ticamente por el operador. Un \u00fanico punto de entrada. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/e079e65bf8deff43a81d8ffde938a709.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Y solo miramos en el panel de Grafana c\u00f3mo est\u00e1 la vida interna de nuestro cl\u00faster. <\/p>\n<p><\/p>\n<p>Por cierto, el panel de Grafana tambi\u00e9n se distribuye con nuestro operador directamente en los fuentes. Se puede conectar y usar. Este pantallazo me lo dieron nuestros DevOps.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4ad1c2899dd845d0ba4185bdf758468c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfA d\u00f3nde nos gustar\u00eda avanzar? Esto es:<\/p>\n<p><\/p>\n<ul>\n<li>Desarrollar la automatizaci\u00f3n de pruebas. La tarea principal es la prueba automatizada de nuevas versiones. <\/li>\n<li>Tambi\u00e9n queremos automatizar la integraci\u00f3n con ZooKeeper. Y est\u00e1 en nuestros planes integrarnos con ZooKeeper-operator. Es decir, para ZooKeeper se ha escrito un operador y tiene sentido que ambos operadores comiencen a integrarse para construir una soluci\u00f3n m\u00e1s conveniente. <\/li>\n<li>Queremos hacer comprobaciones de vida m\u00e1s complejas. <\/li>\n<li>He destacado en verde lo que se aproxima: la herencia de Templates - LISTO, es decir, con la pr\u00f3xima versi\u00f3n del operador ya tendremos herencia de plantillas. Esta es una herramienta poderosa que permite construir configuraciones complejas a partir de fragmentos. <\/li>\n<li>Y queremos la automatizaci\u00f3n de tareas complejas. La principal de ellas es el Re-sharding. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/f232c0aab389be5069e5c7886e265c01.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hagamos un resumen intermedio. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/62f7814994af0441ba5a82de4e9780d7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfQu\u00e9 obtenemos al final? \u00bfVale la pena o no? \u00bfEs necesario intentar llevar la base de datos a Kubernetes y aplicar el operador en general y el operador Alitnity en particular?<\/p>\n<p><\/p>\n<p>Al final obtenemos:<\/p>\n<p><\/p>\n<ul>\n<li>Una simplificaci\u00f3n y automatizaci\u00f3n significativas de la configuraci\u00f3n, despliegue y mantenimiento. <\/li>\n<li>Monitoreo incorporado de inmediato. <\/li>\n<li>Y plantillas codificadas listas para usar en situaciones complejas. Ya no es necesario hacer manualmente acciones como agregar una r\u00e9plica. Esto lo hace el operador. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/aebccd7a2dc55f14645f79f89f7b7458.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Solo queda una \u00faltima pregunta. Ya tenemos la base de datos en Kubernetes, virtualizaci\u00f3n. \u00bfQu\u00e9 pasa con el rendimiento de esta soluci\u00f3n, especialmente considerando que ClickHouse est\u00e1 optimizado para el rendimiento?<\/p>\n<p><\/p>\n<p>La respuesta es: \u00a1todo est\u00e1 bien! No entrar\u00e9 en detalles, este es un tema para otra presentaci\u00f3n. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/ffc230941f0ae24926186db4d8d68ade.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pero existe un proyecto como TSBS. \u00bfCu\u00e1l es su tarea principal? Es una prueba de bases de datos para medir el rendimiento. Es un intento de comparar lo similar con lo similar. <\/p>\n<p><\/p>\n<p>\u00bfC\u00f3mo funciona? Se genera un conjunto de datos. Luego, este conjunto de datos se ejecuta en diferentes bases de datos utilizando el mismo conjunto de pruebas. Cada base de datos resuelve un problema de la manera que puede. Y despu\u00e9s se pueden comparar los resultados. <\/p>\n<p><\/p>\n<p>Ya admite una gran cantidad de bases de datos. He destacado tres principales. Son:<\/p>\n<p><\/p>\n<ul>\n<li>TimescaleDB.<\/li>\n<li>InfluxDB.<\/li>\n<li>ClickHouse.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/5b4733534a4e6e36fb7788127adc6e86.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tambi\u00e9n se realiz\u00f3 una comparaci\u00f3n con otra soluci\u00f3n similar. La comparaci\u00f3n fue con RedShift. Se realiz\u00f3 la comparaci\u00f3n en Amazon. ClickHouse tambi\u00e9n supera a todos en este aspecto. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/44cc8dedc07a02fe1ed5aad3e17a579c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00bfQu\u00e9 conclusiones se pueden extraer de lo que he contado?<\/p>\n<p><\/p>\n<ul>\n<li>Es posible usar bases de datos en Kubernetes. Probablemente se puedan usar cualquier tipo de base de datos, pero en general parece que s\u00ed se puede. Definitivamente se puede usar ClickHouse en Kubernetes con la ayuda de nuestro operador. <\/li>\n<li>El operador ayuda a automatizar procesos y realmente simplifica la vida.<\/li>\n<li>El rendimiento es normal.<\/li>\n<li>Y nos parece que esto es algo que se puede y se debe utilizar. <\/li>\n<\/ul>\n<p><\/p>\n<p>\u00a1C\u00f3digo abierto \u2013 \u00fananse!<\/p>\n<p><\/p>\n<p>Como ya mencion\u00e9, el operador es un producto completamente de c\u00f3digo abierto, por lo que ser\u00eda muy bueno que la mayor cantidad posible de personas lo utilizara. \u00a1\u00dananse! \u00a1Los esperamos a todos!<\/p>\n<p><\/p>\n<p>\u00a1Gracias a todos!<\/p>\n<p><\/p>\n<p>Preguntas<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019)\" src=\"\/wp-content\/uploads\/2020\/10\/4afe8b10c4f103c2a9a295511e4eb69a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>\u00a1Gracias por la presentaci\u00f3n! Me llamo Anton. Soy de la empresa SEMrush. Estoy interesado en el tema del registro. Se escucha sobre monitoreo, pero no sobre registro, si hablamos del cl\u00faster en su totalidad. Nosotros, por ejemplo, tenemos un cl\u00faster montado en hardware. Y utilizamos registro centralizado, recolectamos datos est\u00e1ndar en un solo lugar. Y luego sacamos de ah\u00ed los datos que nos interesan.<\/em> <\/p>\n<p><\/p>\n<p>Buena pregunta, es decir, el registro est\u00e1 en la lista de tareas pendientes. Nuestro operador a\u00fan no lo automatiza. A\u00fan est\u00e1 en desarrollo, el proyecto es bastante joven. Entendemos la necesidad del registro. Este tambi\u00e9n es un tema muy importante. Y probablemente no es menos importante que el monitoreo. Pero lo primero en la lista para su implementaci\u00f3n fue el monitoreo. El registro vendr\u00e1. Naturalmente, estamos tratando de automatizar todos los aspectos de la vida del cl\u00faster. Por lo tanto, la respuesta es que en este momento el operador, desafortunadamente, no puede hacerlo, pero est\u00e1 en nuestros planes, lo haremos. Si hay deseos de unirse, por favor, un pull request.<\/p>\n<p><\/p>\n<p><em>\u00a1Hola! \u00a1Gracias por la presentaci\u00f3n! Tengo una pregunta est\u00e1ndar relacionada con los Vol\u00famenes Persistentes. Cuando creamos una configuraci\u00f3n con este operador, \u00bfc\u00f3mo determina el operador en qu\u00e9 nodo se ha montado un disco o carpeta en particular? \u00bfDebemos explicarle que, por favor, coloque nuestro ClickHouse solo en esos nodos donde hay un disco?<\/em><\/p>\n<p><\/p>\n<p>Hasta donde entiendo, esta pregunta es una continuaci\u00f3n del almacenamiento local, especialmente la parte relacionada con hostPath. Se trata de c\u00f3mo explicarle a todo el sistema que el pod debe ejecutarse espec\u00edficamente en un nodo determinado, donde tenemos un disco f\u00edsico conectado, que est\u00e1 montado en una ruta espec\u00edfica. Esta es toda una secci\u00f3n que toqu\u00e9 de manera muy superficial, porque la respuesta es bastante extensa. <\/p>\n<p><\/p>\n<p>En resumen, se ve as\u00ed. Necesitamos, por supuesto, hacer el aprovisionamiento de estos vol\u00famenes. En este momento, no hay aprovisionamiento din\u00e1mico en el almacenamiento local, por lo que los DevOps deben crear los discos, es decir, estos vol\u00famenes. Y deben explicarle a Kubernetes sobre el aprovisionamiento, que tendr\u00e1s vol\u00famenes persistentes de tal clase, que est\u00e1n en tales nodos. Luego, ser\u00e1 necesario explicarle a Kubernetes que los pods que requieren tal clase de almacenamiento local deben ser programados solo en esos nodos, bas\u00e1ndose en las etiquetas. Para estos fines, el operador tiene la posibilidad de asignar alguna etiqueta y una por instancia de host. Y resultar\u00e1 que los pods ser\u00e1n enrutados por Kubernetes para ejecutarse solo en nodos que cumplen con los requisitos de las etiquetas, dicho de manera simple. Los administradores asignan etiquetas y hacen el aprovisionamiento de discos manualmente. Y entonces se escala.<\/p>\n<p><\/p>\n<p>Y precisamente la tercera opci\u00f3n local ayuda a facilitar esto un poco. Como ya hice \u00e9nfasis, es un trabajo detallado de configuraci\u00f3n, que al final ayuda a obtener el rendimiento m\u00e1ximo.<\/p>\n<p><\/p>\n<p><em>Tengo una segunda pregunta relacionada con esto. Kubernetes fue dise\u00f1ado de tal manera que no nos importa si perdemos un nodo o no. \u00bfQu\u00e9 debemos hacer en este caso si hemos perdido el nodo donde tenemos un shard?<\/em><\/p>\n<p><\/p>\n<p>S\u00ed, Kubernetes fue inicialmente posicionado con la idea de que nuestra relaci\u00f3n con nuestros pods es como la de ganado, pero aqu\u00ed cada disco se convierte en algo as\u00ed como una mascota. Hay un problema en que no podemos simplemente desecharlos. Y el desarrollo de Kubernetes va en la direcci\u00f3n de que no es posible tratar esto completamente de manera filos\u00f3fica, como si fueran recursos totalmente desechables.<\/p>\n<p><\/p>\n<p>Ahora una pregunta pr\u00e1ctica. \u00bfQu\u00e9 hacer si has perdido un nodo en el que estaba el disco? Aqu\u00ed la tarea se resuelve a un nivel m\u00e1s alto. En el caso de ClickHouse, tenemos r\u00e9plicas que operan a un nivel superior, es decir, al nivel de ClickHouse.<\/p>\n<p><\/p>\n<p>\u00bfCu\u00e1l es la disposici\u00f3n resultante? DevOps es responsable de que no se pierdan los datos. Debe configurar correctamente la replicaci\u00f3n y debe asegurarse de que la replicaci\u00f3n se ejecute. En la r\u00e9plica a nivel de ClickHouse, los datos deben estar duplicados. Esta no es la tarea que resuelve el operador. Y no es la tarea que resuelve Kubernetes mismo. Esto es a nivel de ClickHouse.<\/p>\n<p><\/p>\n<p>\u00bfQu\u00e9 hacer si se ha ca\u00eddo un nodo f\u00edsico? Entonces, ser\u00e1 necesario instalar uno nuevo, correctamente provisionar el disco en \u00e9l y aplicar las etiquetas. Despu\u00e9s de eso, cumplir\u00e1 con los requisitos para que Kubernetes pueda ejecutar una instancia de pod en \u00e9l. Kubernetes lo iniciar\u00e1. De hecho, no tienes suficientes pods para el requerido. Pasar\u00e1 por el ciclo que te mostr\u00e9. Y en el nivel m\u00e1s alto, ClickHouse entender\u00e1 que ha entrado una r\u00e9plica que a\u00fan est\u00e1 vac\u00eda y a la que hay que empezar a transferir datos. Es decir, este proceso todav\u00eda est\u00e1 mal automatizado. <\/p>\n<p><\/p>\n<p><em>\u00a1Gracias por la presentaci\u00f3n! Cuando ocurren problemas, se cae el operador y se reinicia, y en ese momento llegan eventos, \u00bfc\u00f3mo los manejas?<\/em><\/p>\n<p><\/p>\n<p>\u00bfQu\u00e9 suceder\u00e1 si el operador se ha ca\u00eddo y se reinici\u00f3? <\/p>\n<p><\/p>\n<p><em>S\u00ed. Y en ese momento llegaron eventos.<\/em> <\/p>\n<p><\/p>\n<p>La tarea de qu\u00e9 hacer en este caso se divide parcialmente entre el operador y Kubernetes. Kubernetes tiene la capacidad de reproducir el evento que ocurri\u00f3. Lo reproduce. Y la tarea del operador es asegurarse de que, cuando se le haga replay del registro de eventos, esos eventos sean idempotentes. Y que la entrada repetida del mismo evento no rompa nuestro sistema. Y nuestro operador cumple con esta tarea. <\/p>\n<p><\/p>\n<p><em>\u00a1Hola! \u00a1Gracias por la presentaci\u00f3n! Dmitry Zavyalov, de la empresa<\/em> <em>Sm\u00e9dova. \u00bfEst\u00e1 prevista la adici\u00f3n a la operaci\u00f3n de la capacidad de configuraci\u00f3n con haproxy? Me interesa alg\u00fan otro balanceador adem\u00e1s del est\u00e1ndar, que sea inteligente y entienda que all\u00ed realmente est\u00e1 ClickHouse.<\/em> <\/p>\n<p><\/p>\n<p>\u00bfEst\u00e1s hablando de Ingress?<\/p>\n<p><\/p>\n<p><em>S\u00ed, reemplaza Ingress por haproxy. En haproxy se puede especificar la topolog\u00eda del cl\u00faster, donde est\u00e1n las r\u00e9plicas.<\/em><\/p>\n<p><\/p>\n<p>Por el momento no hemos pensado en ello. Si lo necesitas y puedes explicar por qu\u00e9 es necesario, se podr\u00eda implementar, especialmente si decides participar. Con mucho gusto considerar\u00edamos la opci\u00f3n. Respuesta breve: no, actualmente no tenemos esa funcionalidad. Gracias por la sugerencia, lo evaluaremos. Y si adem\u00e1s explicas el caso de uso y por qu\u00e9 es necesario en la pr\u00e1ctica, por ejemplo, creas issues en GitHub, ser\u00eda genial.<\/p>\n<p><\/p>\n<p><em>Ya existe.<\/em><\/p>\n<p><\/p>\n<p>Bien. Estamos abiertos a cualquier propuesta. Y haproxy se a\u00f1ade a la lista de tareas pendientes. La lista de tareas pendientes sigue creciendo, no disminuye por ahora. Pero eso es bueno, significa que el producto es demandado.<\/p>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/523378\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0414\u043e\u043a\u043b\u0430\u0434 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0432 Kubernetes, \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0435\u0433\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c: \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0432 Kubernetes \u0438 \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u043d\u0443\u0436\u0435\u043d; \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438; \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442, \u0430 \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442. \u0414\u0430\u043b\u0435\u0435, \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":96966,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-96965","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/operator-v-kubernetes-dlya-upravleniya-klasterami-bd-vladislav-klimenko-altinity-2019\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0432 Kubernetes \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u043c\u0438 \u0411\u0414. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019) | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/operator-v-kubernetes-dlya-upravleniya-klasterami-bd-vladislav-klimenko-altinity-2019\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-10-15T12:42:53+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-10-15T12:42:53+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Operador en Kubernetes para la gesti\u00f3n de cl\u00fasteres de bases de datos. Vladislav Klimenko (Altinity, 2019) | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/operator-v-kubernetes-dlya-upravleniya-klasterami-bd-vladislav-klimenko-altinity-2019","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0432 Kubernetes \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u043c\u0438 \u0411\u0414. \u0412\u043b\u0430\u0434\u0438\u0441\u043b\u0430\u0432 \u041a\u043b\u0438\u043c\u0435\u043d\u043a\u043e (Altinity, 2019) | ProHoster","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/operator-v-kubernetes-dlya-upravleniya-klasterami-bd-vladislav-klimenko-altinity-2019","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-10-15T12:42:53+00:00","article:modified_time":"2020-10-15T12:42:53+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"96965","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:29:25","updated":"2022-09-30 17:40:21","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/96965","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=96965"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/96965\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/96966"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=96965"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=96965"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=96965"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}