{"id":12241,"date":"2021-09-22T23:55:06","date_gmt":"2021-09-22T23:55:06","guid":{"rendered":"https:\/\/beta.bluetab.net\/gitops-kubernetes\/"},"modified":"2023-10-17T12:56:03","modified_gmt":"2023-10-17T12:56:03","slug":"gitops-kubernetes","status":"publish","type":"post","link":"https:\/\/bluetab.co.uk\/en\/gitops-kubernetes\/","title":{"rendered":"Desplegando una plataforma CI\/CD escalable con Jenkins y Kubernetes"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"12241\" class=\"elementor elementor-12241\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-b2ad9fe elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"b2ad9fe\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-7eac278\" data-id=\"7eac278\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-45481b1 elementor-widget elementor-widget-heading\" data-id=\"45481b1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Desplegando una plataforma CI\/CD escalable con Jenkins y Kubernetes<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-7843b8f elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"7843b8f\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-1a4ee60\" data-id=\"1a4ee60\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ceb86e7 elementor-position-left elementor-vertical-align-middle elementor-widget elementor-widget-image-box\" data-id=\"ceb86e7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image-box.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"elementor-image-box-wrapper\"><figure class=\"elementor-image-box-img\"><img decoding=\"async\" width=\"150\" height=\"150\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/lucas-150x150.png\" class=\"attachment-thumbnail size-thumbnail wp-image-12198 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/lucas-150x150.png 150w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/lucas-300x300.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/lucas-768x768.png 768w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/lucas-75x75.png 75w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/lucas.png 888w\" data-sizes=\"(max-width: 150px) 100vw, 150px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 150px; --smush-placeholder-aspect-ratio: 150\/150;\" \/><\/figure><div class=\"elementor-image-box-content\"><h4 class=\"elementor-image-box-title\">Lucas Calvo Berlanga<\/h4><p class=\"elementor-image-box-description\">Cloud Engineer<\/p><\/div><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-ed6cc51\" data-id=\"ed6cc51\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-173edbe elementor-share-buttons--view-icon elementor-share-buttons--skin-minimal elementor-share-buttons--shape-circle elementor-grid-0 elementor-share-buttons--color-official elementor-widget elementor-widget-share-buttons\" data-id=\"173edbe\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"share-buttons.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-grid\" role=\"list\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-grid-item\" role=\"listitem\">\n\t\t\t\t\t\t<div class=\"elementor-share-btn elementor-share-btn_twitter\" role=\"button\" tabindex=\"0\" aria-label=\"Share on twitter\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-share-btn__icon\">\n\t\t\t\t\t\t\t\t<i class=\"fab fa-twitter\" aria-hidden=\"true\"><\/i>\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-grid-item\" role=\"listitem\">\n\t\t\t\t\t\t<div class=\"elementor-share-btn elementor-share-btn_linkedin\" role=\"button\" tabindex=\"0\" aria-label=\"Share on linkedin\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-share-btn__icon\">\n\t\t\t\t\t\t\t\t<i class=\"fab fa-linkedin\" aria-hidden=\"true\"><\/i>\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-2b67acd\" data-id=\"2b67acd\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap\">\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-c738cdf elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"c738cdf\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-55b901d\" data-id=\"55b901d\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-7668b05 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"7668b05\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-592ef24\" data-id=\"592ef24\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-6010029 elementor-widget elementor-widget-theme-post-featured-image elementor-widget-image\" data-id=\"6010029\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"introduccion\" data-widget_type=\"theme-post-featured-image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"512\" src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/12-1024x512.png\" class=\"attachment-large size-large wp-image-17840\" alt=\"\" srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/12-1024x512.png 1024w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/12-300x150.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/12-768x384.png 768w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/12.png 1200w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4abbf0e elementor-widget elementor-widget-text-editor\" data-id=\"4abbf0e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>En este art\u00edculo de la\u00a0<a href=\"https:\/\/beta.bluetab.net\">pr\u00e1ctica cloud<\/a>\u00a0veremos c\u00f3mo crear una plataforma de CI\/CD de una forma totalmente automatizada. Para ello nos apoyaremos en una metodolog\u00eda GitOps para as\u00ed realizar nuestros despliegues de una forma m\u00e1s sencilla, escalable e industrializada.<\/p><p>La idea de este taller es crearnos un cluster de GKE donde tengamos desplegado Jenkins como nuestra pieza central de CI\/CD y que este vaya escalando en\u00a0<a href=\"https:\/\/plugins.jenkins.io\/kubernetes\/\">agentes<\/a>\u00a0de una forma totalmente automatizada para que seg\u00fan la demanda de ejecuciones de jobs nuestro cluster crezca o decrezca de una forma transparente para nosotros. Otra de las grandes ventajas de esta arquitectura es que podemos crear diferentes tipos de slaves para as\u00ed cubrir todo tipo de ejecuciones dentro de nuestra compa\u00f1\u00eda.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-bdf3b67 elementor-widget elementor-widget-image\" data-id=\"bdf3b67\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"991\" height=\"731\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jenkins-kubernetes.png\" class=\"attachment-large size-large wp-image-12051 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jenkins-kubernetes.png 991w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jenkins-kubernetes-300x221.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jenkins-kubernetes-768x567.png 768w\" data-sizes=\"(max-width: 991px) 100vw, 991px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 991px; --smush-placeholder-aspect-ratio: 991\/731;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-46f7430 elementor-widget elementor-widget-text-editor\" data-id=\"46f7430\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Los componentes\/herramientas que usaremos en este proyecto ser\u00e1n los siguientes:<\/p><ul><li><strong>Terraform.<\/strong><\/li><li><strong>GKE.<\/strong><\/li><li><strong>Jenkins.<\/strong><\/li><li><strong>Prometheus.<\/strong><\/li><li><strong>Grafana.<\/strong><\/li><li><strong>Slack.<\/strong><\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a182dd1 elementor-widget elementor-widget-heading\" data-id=\"a182dd1\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"objetivos\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Objetivos<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e272341 elementor-widget elementor-widget-text-editor\" data-id=\"e272341\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ol><li>Creaci\u00f3n de la las vpcs donde se desplegar\u00e1 la infraestructura.<\/li><li>Creaci\u00f3n de la infraestructura, en nuestro caso GKE, de una forma totalmente automatizada.<\/li><li>Despliegue de Jenkins como componente principal haciendo uso del provider del helm.<\/li><li>Configuraci\u00f3n de Jenkins usando el plugin de\u00a0<a href=\"https:\/\/www.jenkins.io\/projects\/jcasc\/\">Jcasc<\/a>.<\/li><li>Despliegue de prometheus para la monitorizaci\u00f3n de nuestro sistema haciendo uso de helm.<\/li><li>Despliegue de grafana para la monitorizaci\u00f3n de nuestro sistema haciendo uso de helm.<\/li><li>Configuraci\u00f3n de grafana haciendo uso de prometheus y unos dashboard configurados autom\u00e1ticamente.<\/li><li>Revisi\u00f3n de toda la infraestructura levantada y chequeo de la monitorizaci\u00f3n.<\/li><li>Ejecuci\u00f3n de un Job de ejemplo para ver el flujo completo.<\/li><li>Comprobar sistema de alertas tanto ca\u00edda de sistemas como de jobs completos.<\/li><li>Comprobar el escalado de nuestra infraestructura y de los componentes desplegados.<\/li><\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d89a293 elementor-widget elementor-widget-heading\" data-id=\"d89a293\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"into-terra\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Introducci\u00f3n a Terraform<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-539d95c elementor-widget elementor-widget-image\" data-id=\"539d95c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"246\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/terraform-header-1024x246.png\" class=\"attachment-large size-large wp-image-12078 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/terraform-header-1024x246.png 1024w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/terraform-header-300x72.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/terraform-header-768x184.png 768w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/terraform-header.png 1280w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/246;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-84f6117 elementor-widget elementor-widget-text-editor\" data-id=\"84f6117\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Terraform es una herramienta open-source para automatizar la creaci\u00f3n de infraestructura como c\u00f3digo. Para nuestro caso de uso usaremos Terraform tanto para desplegar la infraestructura, tanto GKE como la VPC donde se har\u00e1 el despliegue de este \u00faltimo.<\/p><p>Terraform no solo nos permite desplegar infraestructura como c\u00f3digo sino que tambi\u00e9n nos da la opci\u00f3n de usar otros provedores como el de Kubernetes para la creaci\u00f3n de namespace (entre otras muchas cosas) o la posibilidad de realizar despliegues de otros componentes dentro del cluster de GKE con el proveedor de Helm.\u00a0<a href=\"https:\/\/www.Terraform.io\">Terraform<\/a>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9d85896 elementor-widget elementor-widget-heading\" data-id=\"9d85896\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"into-gke\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Introducci\u00f3n a GKE<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3fb0f69 elementor-widget elementor-widget-image\" data-id=\"3fb0f69\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"900\" height=\"804\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/gke-header.png\" class=\"attachment-large size-large wp-image-12035 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/gke-header.png 900w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/gke-header-300x268.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/gke-header-768x686.png 768w\" data-sizes=\"(max-width: 900px) 100vw, 900px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 900px; --smush-placeholder-aspect-ratio: 900\/804;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cffc795 elementor-widget elementor-widget-text-editor\" data-id=\"cffc795\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>GKE es el servicio de Kubernetes gestionado y autoescalado por\u00a0<a href=\"https:\/\/cloud.google.com\/\">GCP<\/a>. Es donde se realizar\u00e1n todos los despliegues tanto de Jenkins como de la monitorizaci\u00f3n que tendr\u00e1 nuestra plataforma.\u00a0<a href=\"https:\/\/cloud.google.com\/kubernetes-engine\">GKE<\/a>. Este componente lo vamos a automatizar haciendo uso de Terraform donde se har\u00e1n las implementaciones necesarias para realizar el despliegue correctamente.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-76ac071 elementor-widget elementor-widget-heading\" data-id=\"76ac071\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"into-jenkins\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Introducci\u00f3n a Jenkins<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-46ab838 elementor-widget elementor-widget-image\" data-id=\"46ab838\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"330\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jenkins-header-1024x330.png\" class=\"attachment-large size-large wp-image-12049 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jenkins-header-1024x330.png 1024w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jenkins-header-300x97.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jenkins-header-768x247.png 768w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jenkins-header.png 1280w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/330;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7194037 elementor-widget elementor-widget-text-editor\" data-id=\"7194037\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Jenkins es nuestra pieza central de la plataforma de CI\/CD. Jenkins es una herramienta de construcci\u00f3n, implementaci\u00f3n y automatizaci\u00f3n de proyectos software. Para el despliegue de este componente nos apoyaremos en el provider de Helm de Terraform.\u00a0<a href=\"https:\/\/www.jenkins.io\/\">Jenkins<\/a>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ddec787 elementor-widget elementor-widget-heading\" data-id=\"ddec787\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"into-prome\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Introducci\u00f3n a Prometheus<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f885372 elementor-widget elementor-widget-image\" data-id=\"f885372\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"1015\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/prometheus-header-1024x1015.png\" class=\"attachment-large size-large wp-image-12070 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/prometheus-header-1024x1015.png 1024w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/prometheus-header-300x297.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/prometheus-header-150x150.png 150w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/prometheus-header-768x761.png 768w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/prometheus-header-1536x1523.png 1536w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/prometheus-header-2048x2030.png 2048w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/prometheus-header-75x75.png 75w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/1015;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3fd4aa7 elementor-widget elementor-widget-text-editor\" data-id=\"3fd4aa7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Prometheus es un sistema de monitorizaci\u00f3n que usaremos para comprobar el estado de todos los pods desplegados en nuestra plataforma, as\u00ed como para monitorizar el estado de nuestra infraestructura como tal(Picos de consumo, nodos ca\u00eddos&#8230;). Para el despliegue de este componente nos apoyaremos en el provider de Helm de Terraform.\u00a0<a href=\"https:\/\/prometheus.io\/\">Prometheus<\/a>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-eb81a6f elementor-widget elementor-widget-heading\" data-id=\"eb81a6f\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"into-grafa\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Introducci\u00f3n a Grafana<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cd4a49a elementor-widget elementor-widget-image\" data-id=\"cd4a49a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"240\" height=\"220\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/grafana-header.png\" class=\"attachment-large size-large wp-image-12043 lazyload\" alt=\"\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 240px; --smush-placeholder-aspect-ratio: 240\/220;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-aa30bc3 elementor-widget elementor-widget-text-editor\" data-id=\"aa30bc3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Grafana es nuestra herramienta de visualizaci\u00f3n de la monitorizaci\u00f3n. Nos decantamos por esta herramienta ya que se integra perfectamente con prometheus y nos permite crear dashboards personalizados de nuestra infraestructura. Para el despliegue de este componente nos apoyaremos en el provider de Helm de Terraform.\u00a0<a href=\"https:\/\/grafana.com\/\">Grafana<\/a>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-15c16fb elementor-widget elementor-widget-heading\" data-id=\"15c16fb\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"into-slack\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Introducci\u00f3n a Slack<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a975e9f elementor-widget elementor-widget-image\" data-id=\"a975e9f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"261\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/slack-header-1024x261.png\" class=\"attachment-large size-large wp-image-12072 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/slack-header-1024x261.png 1024w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/slack-header-300x76.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/slack-header-768x196.png 768w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/slack-header.png 1280w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/261;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9423609 elementor-widget elementor-widget-text-editor\" data-id=\"9423609\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Por \u00faltimo, haremos uso de slack como herramienta de envi\u00f3 de alertas tanto en la ejecuci\u00f3n de los jobs de Jenkins como alertas de monitorizaci\u00f3n de ca\u00eddas en alguno de los pods desplegados.\u00a0<a href=\"https:\/\/slack.com\">Slack<\/a><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1e2ea9f elementor-widget elementor-widget-heading\" data-id=\"1e2ea9f\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"pre-entorno\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Preparaci\u00f3n de entorno<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-bbd5bc2 elementor-widget elementor-widget-text-editor\" data-id=\"bbd5bc2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tPara la ejecuci\u00f3n de la plataforma CI\/CD ser\u00e1 necesario hacer la instalaci\u00f3n de estas herramientas:\n<ol>\n \t<li>Terraform. Aqu\u00ed se usa la versi\u00f3n v1.0. Se puede descargar\u00a0<a href=\"https:\/\/learn.hashicorp.com\/tutorials\/terraform\/install-cli\">aqu\u00ed<\/a>. Para instalar una versi\u00f3n anterior consultar\u00a0<a href=\"https:\/\/www.Terraform.io\/downloads.html\">aqu\u00ed<\/a>.<\/li>\n \t<li>Helm.\u00a0<a href=\"https:\/\/helm.sh\/docs\/intro\/install\/\">Gu\u00eda de instalaci\u00f3n de Helm<\/a>.<\/li>\n \t<li>GCP. Para la realizaci\u00f3n del taller ser\u00e1 necesario la creaci\u00f3n de una cuenta en\u00a0<a href=\"https:\/\/console.cloud.google.com\/\">GCP<\/a>.<\/li>\n<\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f9230c5 elementor-widget elementor-widget-image\" data-id=\"f9230c5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"761\" height=\"211\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/terraform-helm.png\" class=\"attachment-large size-large wp-image-12080 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/terraform-helm.png 761w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/terraform-helm-300x83.png 300w\" data-sizes=\"(max-width: 761px) 100vw, 761px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 761px; --smush-placeholder-aspect-ratio: 761\/211;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4c7dbb8 elementor-widget elementor-widget-heading\" data-id=\"4c7dbb8\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"clon-repo\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Clonaci\u00f3n de repositorio<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-da822d2 elementor-widget elementor-widget-text-editor\" data-id=\"da822d2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>El c\u00f3digo fuente est\u00e1 disponible en\u00a0<a href=\"https:\/\/github.com\/lucasberlang\/gitops-kubernetes-jenkins\/\">github<\/a>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3d847bb elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"3d847bb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>git clone https:\/\/github.com\/lucasberlang\/gitops-kubernetes-jenkins\/\r\ncd gitops-kubernetes-jenkins <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b2fce28 elementor-widget elementor-widget-heading\" data-id=\"b2fce28\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"indi-fiche\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">\u00cdndice de ficheros<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-24a80a2 elementor-widget elementor-widget-text-editor\" data-id=\"24a80a2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Dentro de la carpeta src tendremos todo el c\u00f3digo necesario para hacer el despliegue de nuestra infraestructura de una forma automatizada. En este apartado haremos un breve resumen de lo que contienen cada uno de los ficheros para que nuestro proyecto funcione.<\/p><ul><li><strong><a href=\"src\/providers.tf\">providers.tf<\/a><\/strong><\/li><\/ul><p>Definici\u00f3n de los proveedores que usaremos para hacer el despliegue con Terraform. En nuestro caso haremos uso del provider de Google, helm y kubernetes.<\/p><ul><li><strong><a href=\"src\/Terraform.tfvars\">terraform.tfvars<\/a><\/strong><\/li><\/ul><p>Variables que usaremos dentro de los m\u00f3dulos de Terraform.<\/p><ul><li><strong><a href=\"src\/variables.tf\">variables.tf<\/a><\/strong><\/li><\/ul><p>Definici\u00f3n de las variables que usaremos tanto en los m\u00f3dulos de Terraform como en los secretos que desplegaremos para hacer uso en Jenkins.<\/p><ul><li><strong><a href=\"src\/outputs.tf\">outputs.tf<\/a><\/strong><\/li><\/ul><p>Informaci\u00f3n del proyecto que nos interesa conocer.<\/p><ul><li><strong><a href=\"src\/main.tf\">main.tf<\/a><\/strong><\/li><\/ul><p>Contendr\u00e1 la l\u00f3gica realizada en Terraform para hacer el despliegue de los componentes de infraestructura que necesitamos, en este caso VPC y GKE. Para ello haremos uso de dos m\u00f3dulos desarrollados por\u00a0<a href=\"https:\/\/beta.bluetab.net\">Bluetab<\/a>.<\/p><ul><li><strong><a href=\"src\/kubernetes_secrets.tf\">kubernetes_secrets.tf<\/a><\/strong><\/li><\/ul><p>Archivo que contendr\u00e1 toda la informaci\u00f3n sensible que usaremos dentro de los despliegues que realizaremos (Grafana, Prometheus, Jenkins), como contrase\u00f1as, tokens, etc&#8230; .<\/p><ul><li><strong><a href=\"src\/helm_monitoring.tf\">helm_monitoring.tf<\/a><\/strong><\/li><\/ul><p>Archivo que contiene la configuraci\u00f3n que se realizar\u00e1 con el proveedor de Helm para el despliegue de los componentes Prometheus y Grafana.<\/p><ul><li><strong><a href=\"src\/helm_jenkins.tf\">helm_jenkins.tf<\/a><\/strong><\/li><\/ul><p>Archivo que contiene la configuraci\u00f3n que se realizar\u00e1 con el proveedor de Helm para el despliegue de los componentes Jenkins.<\/p><ul><li><strong><a href=\"src\/templates\/grafana.yaml\">grafana.yaml<\/a><\/strong><\/li><\/ul><p>En este archivo contiene la configuraci\u00f3n inicial que usar\u00e1 Helm cuando realicemos el despliegue de grafana.<\/p><ul><li><strong><a href=\"src\/templates\/prometheus.yaml\">prometheus.yaml<\/a><\/strong><\/li><\/ul><p>En este archivo contiene la configuraci\u00f3n inicial que usar\u00e1 Helm cuando realicemos el despliegue de prometheus.<\/p><ul><li><strong><a href=\"src\/templates\/jenkins.yaml\">jenkins.yaml<\/a><\/strong><\/li><\/ul><p>En este archivo contiene la configuraci\u00f3n inicial que usar\u00e1 Helm cuando realicemos el despliegue de jenkins.<\/p><ul><li><strong><a href=\"vars.example.env\">vars.example.env<\/a><\/strong><\/li><\/ul><p>Archivo que contendr\u00e1 todas las variables de entorno que usaremos en nuestro proyecto. En este caso le pasaremos las variables m\u00e1s sensibles como pueden ser la contrase\u00f1a de grafana o el token usado en slack para no tener que subirlo al repositorio.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7ac5ced elementor-widget elementor-widget-heading\" data-id=\"7ac5ced\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"confi-slack\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Configuraci\u00f3n de Slack<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-41792ed elementor-widget elementor-widget-text-editor\" data-id=\"41792ed\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ol><li>Primero de todo nos tendremos que registrar en\u00a0<a href=\"https:\/\/slack.com\/\">Slack<\/a>.<\/li><li>Una vez que tengamos el registro se deber\u00e1 seguir la gu\u00edan de configuraci\u00f3n de\u00a0<a href=\"https:\/\/my.slack.com\/services\/new\/jenkins-ci\">Slack con Jenkins<\/a>. De este paso solo necesitaremos el token de Slack que pasaremos como variable de entorno TF_VAR_slack_token.<\/li><li>Adem\u00e1s, nos crearemos un canal en Slack el cual pasaremos posteriormente como variable de entorno, TF_VAR_slack_channel.<\/li><li>Ser\u00e1 necesario tambi\u00e9n coger el nombre del dominio de slack y pas\u00e1rselo como variable,TF_VAR_team_domain.<\/li><li>Por \u00faltimo nos crearemos un webhook para el env\u00edo de alertas desde Prometheus. Para ello podemos seguir esta\u00a0<a href=\"https:\/\/slack.com\/intl\/es-es\/help\/articles\/115005265063-Webhooks-entrantes-para-Slack#cu243mo-configurar-webhooks-entrantes\">gu\u00eda<\/a>. De este paso solo necesitaremos el endpoint para luego pasarlo como variable de entorno, TF_VAR_slack_api_url.<\/li><\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c9900dd elementor-widget elementor-widget-heading\" data-id=\"c9900dd\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"confi-variables\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Configuraci\u00f3n de variables<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e3ab759 elementor-widget elementor-widget-text-editor\" data-id=\"e3ab759\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Antes de realizar la ejecuci\u00f3n de nuestro proyecto debemos definir una serie de variables de entorno que necesitaremos para el correcto funcionamiento de este. Para ello haremos uso del archivo\u00a0<a href=\"vars.example.env\">vars.example.env<\/a>\u00a0donde tenemos ya definidas las variables m\u00e1s importantes. Para efectos de la demo las \u00fanicas variables que se tendr\u00e1n que modificar son las siguientes:<\/p><ul><li><strong>TF_VAR_project_id:<\/strong>\u00a0el id del proyecto de la cuenta de GCP donde se realizar\u00e1 el despliegue de la infraestructura.<\/li><li><strong>TF_VAR_vault_addr:<\/strong>\u00a0se a\u00f1adir\u00e1 la direcci\u00f3n de vault para la autenticaci\u00f3n en el despliegue del proyecto de prueba. En caso de no tener vault se podr\u00e1 tambi\u00e9n configurar con las credenciales de Azure o crearse otra proyecto de ejemplo.<\/li><li><strong>TF_VAR_vault_token:<\/strong>\u00a0token de vault que se utilizar\u00e1 para autenticarse contra Azure en nuestro proyecto de demo. Igual que con la variable de arriba no ser\u00e1 necesaria si se configura el proyecto demo para autenticarse con las credenciales de Azure.<\/li><li><strong>TF_VAR_slack_api_url:<\/strong>\u00a0El endpoint de Slack que configuraremos para que se env\u00eden las alertas de nuestra plataforma.<\/li><li><strong>TF_VAR_slack_channel:<\/strong>\u00a0Canal de Slack donde se publicar\u00e1n los mensajes de las alertas.<\/li><li><strong>TF_VAR_slack_token:<\/strong>\u00a0El token de Slack que configuraremos para que se env\u00eden las alertas de nuestra plataforma.<\/li><li><strong>TF_VAR_team_domain:<\/strong>\u00a0El dominio de Slack que configuraremos para que se env\u00eden las alertas de nuestra plataforma.<\/li><li><strong>TF_VAR_user_grafana:<\/strong>\u00a0Nombre del usuario de Grafana que usaremos para loguearnos.<\/li><li><strong>TF_VAR_password_grafana:<\/strong>\u00a0Contrase\u00f1a para el usuario de Grafana definido anteriormente para hacer el login.<\/li><\/ul><p>Una vez se hayan configuradas todas estas variables se tendr\u00e1 que lanzar el siguiente comando para que queden como variables de entornos.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-493dd93 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"493dd93\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>source vars.example.env <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b7a8126 elementor-widget elementor-widget-heading\" data-id=\"b7a8126\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"confi-vpc\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Configuraci\u00f3n VPC<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a61428a elementor-widget elementor-widget-text-editor\" data-id=\"a61428a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Para la configuraci\u00f3n de la VPC haremos uso del m\u00f3dulo corporativo desarrollado por\u00a0<a href=\"https:\/\/beta.bluetab.net\">Bluetab<\/a>. Este m\u00f3dulo est\u00e1 publica en el repositorio de\u00a0<a href=\"https:\/\/github.com\/lucasberlang\/gcp-network\">github<\/a>\u00a0y est\u00e1 totalmente documentado por si se tiene alguna duda de su funcionamiento o se quiere realizar alguna modificaci\u00f3n en la VPC. Para que esto funcione lo \u00fanico que debemos de hacer es instanciar nuestro m\u00f3dulo con las variables necesarias para hacerle funcionar:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5f752b4 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"5f752b4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>module &quot;network&quot; {\r\n  source = &quot;git@github.com:lucasberlang\/gcp-network.git&quot;\r\n\r\n  project_id         = var.project_id\r\n  description        = var.description\r\n  enable_nat_gateway = true\r\n\r\n  intra_subnets = [\r\n    {\r\n      subnet_name           = &quot;private-subnet01&quot;\r\n      subnet_ip_cidr        = &quot;10.0.0.0\/16&quot;\r\n      subnet_private_access = false\r\n      subnet_region         = var.region\r\n    }\r\n  ]\r\n\r\n  secondary_ranges = {\r\n    private-subnet01 = [\r\n      {\r\n        range_name    = &quot;private-subnet01-01&quot;\r\n        ip_cidr_range = var.ip_range_pods\r\n      },\r\n      {\r\n        range_name    = &quot;private-subnet01-02&quot;\r\n        ip_cidr_range = var.ip_range_services\r\n      },\r\n    ]\r\n  }\r\n\r\n  labels = var.labels\r\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0ec2677 elementor-widget elementor-widget-text-editor\" data-id=\"0ec2677\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Lo \u00fanico necesario para ejecutar la creaci\u00f3n de la VPC ser\u00e1 el id del proyecto de GCP. Adem\u00e1s de desplegar la VPC con la creaci\u00f3n del m\u00f3dulo se realizar\u00e1 el despliegue de una subred a nuestra VPC con el direccionamiento 10.0.0.0\/16. Este es totalmente modificable as\u00ed como el nombre de la subred o la regi\u00f3n en donde se despliega. Tambi\u00e9n se han creado dos rangos secundarios de direccionamientos para los pods y servicios que desplegaremos en GKE.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-afa5aa0 elementor-widget elementor-widget-heading\" data-id=\"afa5aa0\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"confi-gke\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Configuraci\u00f3n GKE<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1376c0d elementor-widget elementor-widget-text-editor\" data-id=\"1376c0d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Para el despliegue del proyecto se ha optado por usar infraestructura totalmente gestionado, en este caso haremos uso de GKE. Para automatizar el despliegue usaremos el m\u00f3dulo corporativo desarrollado por\u00a0<a href=\"https:\/\/beta.bluetab.net\">Bluetab<\/a>. Este m\u00f3dulo est\u00e1 publica en el repositorio de\u00a0<a href=\"https:\/\/github.com\/lucasberlang\/gcp-gke\">github<\/a>\u00a0y esta totalmente documentado por si se tiene alguna duda de su funcionamiento o se quiere realizar alguna modificaci\u00f3n en el GKE. Para que esto funcione lo \u00fanico que debemos de hacer es instanciar nuestro m\u00f3dulo con las variables necesarias para hacerle funcionar:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8fb10e6 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"8fb10e6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>module &quot;gke&quot; {\r\n  source = &quot;git@github.com:lucasberlang\/gcp-gke.git&quot;\r\n\r\n  project_id              = var.project_id\r\n  name                    = &quot;gitops&quot;\r\n  regional                = true\r\n  region                  = var.region\r\n  network                 = module.network.network_name\r\n  subnetwork              = module.network.intra_subnet_names.0\r\n  ip_range_pods           = &quot;private-subnet01-01&quot;\r\n  ip_range_services       = &quot;private-subnet01-02&quot;\r\n  enable_private_endpoint = false\r\n  enable_private_nodes    = false\r\n  master_ipv4_cidr_block  = &quot;172.16.0.0\/28&quot;\r\n  kubernetes_version      = &quot;latest&quot;\r\n\r\n  master_authorized_networks = [\r\n    {\r\n      cidr_block   = module.network.intra_subnet_ips.0\r\n      display_name = &quot;VPC&quot;\r\n    },\r\n    {\r\n      cidr_block   = &quot;0.0.0.0\/0&quot;\r\n      display_name = &quot;shell&quot;\r\n    }\r\n  ]\r\n\r\n  node_pools = [\r\n    {\r\n      name         = &quot;default-node-pool&quot;\r\n      machine_type = &quot;n1-standard-4&quot;\r\n    },\r\n  ]\r\n\r\n  istio     = var.istio\r\n  dns_cache = var.dns_cache\r\n  labels    = var.labels\r\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7dbbbf5 elementor-widget elementor-widget-text-editor\" data-id=\"7dbbbf5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Como se puede observar en el c\u00f3digo la implementaci\u00f3n del m\u00f3dulo es bastante intuitivo solo ser\u00e1 necesario declarar algunas variables. Las variables m\u00e1s importantes son el tipo de instancia que usaran los node-pools y la subred donde se desplegar\u00e1 el cluster de GKE que para esto usaremos la red declarada anteriormente.<\/p><p>El funcionamiento de GKE en nuestra VPC ser\u00e1 este:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-880c323 elementor-widget elementor-widget-image\" data-id=\"880c323\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"758\" height=\"586\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/gke-master.png\" class=\"attachment-large size-large wp-image-12037 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/gke-master.png 758w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/gke-master-300x232.png 300w\" data-sizes=\"(max-width: 758px) 100vw, 758px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 758px; --smush-placeholder-aspect-ratio: 758\/586;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1358e3f elementor-widget elementor-widget-heading\" data-id=\"1358e3f\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"confi-jenkins\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Configuraci\u00f3n Jenkins<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-46dd642 elementor-widget elementor-widget-text-editor\" data-id=\"46dd642\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Para la configuraci\u00f3n de Jenkins como hemos dicho anteriormente usaremos el provider de Helm. Para hacer el despliegue nos crearemos un namespace llamado gitops donde se desplegar\u00e1 Jenkins. El fichero donde se har\u00e1 esta configuraci\u00f3n es\u00a0<a href=\".\/src\/helm_jenkins.tf\">helm_jenkins.tf<\/a>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f2b0cd8 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"f2b0cd8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>resource &quot;kubernetes_namespace&quot; &quot;jenkins&quot; {\r\n  metadata {\r\n    name = &quot;gitops&quot;\r\n  }\r\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-aefe4a2 elementor-widget elementor-widget-text-editor\" data-id=\"aefe4a2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Luego procederemos a hacer el despliegue de Jenkins con Helm.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-13ebbf6 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"13ebbf6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>data &quot;local_file&quot; &quot;helm_chart_values&quot; {\r\n  filename = &quot;${path.module}\/templates\/jenkins.yaml&quot;\r\n}\r\n\r\nresource &quot;helm_release&quot; &quot;jenkins&quot; {\r\n  name       = &quot;jenkins&quot;\r\n  repository = &quot;https:\/\/charts.jenkins.io&quot;\r\n  chart      = &quot;jenkins&quot;\r\n  version    = &quot;3.5.3&quot;\r\n  namespace  = kubernetes_namespace.jenkins.metadata.0.name\r\n  timeout    = 180\r\n\r\n  values = [data.local_file.helm_chart_values.content]\r\n\r\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-564441d elementor-widget elementor-widget-text-editor\" data-id=\"564441d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Cogeremos el chart del repositorio oficial de Jenkins y le pasaremos el fichero\u00a0<a href=\".\/src\/templates\/jenkins.yaml\">jenkins.yaml<\/a>\u00a0como configuraci\u00f3n inicial.<\/p><p>De este fichero vamos a destacar algunos puntos que hemos modificado para realizar una automatizaci\u00f3n de nuestro servicio.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a560225 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"a560225\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'> image: &quot;jenkins\/jenkins&quot;\r\n  imagePullPolicy: &quot;Always&quot;\r\n  adminSecret: true\r\n  adminUser: &quot;admin&quot;\r\n  jenkinsUrl: &quot;http:\/\/${kubernetes_endpoint}:80&quot; <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-91c1df6 elementor-widget elementor-widget-text-editor\" data-id=\"91c1df6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Se ha realizado la modificaci\u00f3n del nombre del adminUser para que sea m\u00e1s gen\u00e9rico y jenkinsUrl para que nos de el endpoint de Jenkins en el GKE cuando nos leguen las alertas de los jobs en el slack.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a94f345 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"a94f345\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>  containerEnv:\r\n    - name: kubernetes_endpoint\r\n      valueFrom:\r\n        secretKeyRef:\r\n            name: jenkins-k8s-config\r\n            key: kubernetes_endpoint\r\n    - name: gitlab_username\r\n      valueFrom:\r\n        secretKeyRef:\r\n            name: gitlab-credentials\r\n            key: gitlab_username\r\n    - name: gitlab_ssh_key\r\n      valueFrom:\r\n        secretKeyRef:\r\n            name: gitlab-credentials\r\n            key: gitlab_ssh_key\r\n    - name: vault_token\r\n      valueFrom:\r\n        secretKeyRef:\r\n            name: vault-credentials\r\n            key: vault_token\r\n    - name: vault_addr\r\n      valueFrom:\r\n        secretKeyRef:\r\n            name: vault-credentials\r\n            key: vault_addr\r\n    - name: arm_access_key\r\n      valueFrom:\r\n        secretKeyRef:\r\n            name: azure-credentials\r\n            key: arm_access_key\r\n    - name: slack_token\r\n      valueFrom:\r\n        secretKeyRef:\r\n            name: slack-credentials\r\n            key: slack_token\r\n    - name: team_domain\r\n      valueFrom:\r\n        secretKeyRef:\r\n            name: slack-credentials\r\n            key: team_domain            \r\n  servicePort: 80\r\n  serviceType: LoadBalancer <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f497db3 elementor-widget elementor-widget-text-editor\" data-id=\"f497db3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Estos son todos los secrets que hemos definido en el archivo\u00a0<a href=\".\/src\/kubernetes_secrets.tf\">kubernetes_secrets.tf<\/a>. Estos son necesarios para el correcto funcionamiento de Jenkins ya que haremos uso de muchos de estos secretos cuando realicemos la configuraci\u00f3n con el plugin de Jcasc de Jenkins.<\/p><p>Adem\u00e1s, en la configuraci\u00f3n del serviceType lo hemos definido como LoadBalancer externo y el servicePort 80 para que sea visible desde el exterior.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6ab09c7 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"6ab09c7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>installPlugins:\r\n    - kubernetes\r\n    - docker-custom-build-environment\r\n    - ansicolor\r\n    - aws-credentials\r\n    - azure-credentials\r\n    - gitlab-api\r\n    - gitlab-branch-source\r\n    - docker-java-api\r\n    - github-branch-source\r\n    - pipeline-graph-analysis\r\n    ... <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1b5f4a4 elementor-widget elementor-widget-text-editor\" data-id=\"1b5f4a4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Listado de todos los plugins que se instalar\u00e1n por defecto en la configuraci\u00f3n inicial de Jenkins.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9df208d elementor-widget elementor-widget-heading\" data-id=\"9df208d\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"litmuschaos\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Configuraci\u00f3n inicial de Jcasc<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7b62bb6 elementor-widget elementor-widget-text-editor\" data-id=\"7b62bb6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Jcasc es el plugin de configuraci\u00f3n como c\u00f3digo de Jenkins. Lo usaremos para hacer una serie de configuraciones previas como pueden ser:<\/p><ul><li><strong>Configuraci\u00f3n de los slaves:<\/strong><\/li><\/ul><p>Esta parte es donde definiremos la creaci\u00f3n de un cloud de kubernetes donde se desplegar\u00e1n todos nuestros pods cada vez que se lance una ejecuci\u00f3n de un job en nuestro Jenkins. Tambi\u00e9n configuraremos la imagen que se usar\u00e1 para desplegar cada slave y el namespace donde se realizar\u00e1 dicho despliegue. Para nuestro ejemplo usaremos una imagen ya modificada con la instalaci\u00f3n de Terraform y algunos componentes como el SDK de Google o el cli de azure (lucasbluetab\/jnlp-agent-Terraform-gcloud:latest). Adem\u00e1s, se configurar\u00e1 los recursos que gaste cada vez que se levante un pod en cualquier ejecuci\u00f3n de nuestros, consiguiendo as\u00ed una infraestructura totalmente escalable.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1629f50 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"1629f50\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>      cloud: |\r\n        jenkins:\r\n          clouds:\r\n            - kubernetes:\r\n                name: &quot;Terraform-executors&quot;\r\n                serverUrl: &quot;https:\/\/kubernetes.default&quot;\r\n                jenkinsTunnel: &quot;jenkins-agent:50000&quot;\r\n                jenkinsUrl: &quot;http:\/\/jenkins:80&quot;\r\n                skipTlsVerify: true\r\n                namespace: &quot;gitops&quot;\r\n                templates:\r\n                    - name: &quot;jenkins-jnlp&quot;\r\n                      namespace: &quot;gitops&quot;\r\n                      nodeUsageMode: NORMAL\r\n                      label: &quot;jnlp-exec&quot;\r\n                      containers:\r\n                        - name: &quot;jnlp&quot;\r\n                          image: &quot;jenkins\/jnlp-slave&quot;\r\n                          alwaysPullImage: false\r\n                          workingDir: &quot;\/home\/jenkins\/agent&quot;\r\n                          ttyEnabled: true\r\n                          command: &quot;&quot;\r\n                          args: &quot;&quot;\r\n                          resourceRequestCpu: &quot;500m&quot;\r\n                          resourceLimitCpu: &quot;1000m&quot;\r\n                          resourceRequestMemory: &quot;1Gi&quot;\r\n                          resourceLimitMemory: &quot;2Gi&quot;\r\n                      volumes:\r\n                        - emptyDirVolume:\r\n                            memory: false\r\n                            mountPath: &quot;\/tmp&quot;\r\n                      idleMinutes: &quot;1&quot;\r\n                      activeDeadlineSeconds: &quot;120&quot;\r\n                      slaveConnectTimeout: &quot;1000&quot;\r\n                    - name: &quot;Terraform&quot;\r\n                      namespace: &quot;gitops&quot;\r\n                      nodeUsageMode: NORMAL\r\n                      label: &quot;Terraform-exec&quot;\r\n                      containers:\r\n                        - name: &quot;Terraform&quot;\r\n                          image: &quot;lucasbluetab\/jnlp-agent-Terraform-gcloud:latest&quot;\r\n                          alwaysPullImage: false\r\n                          workingDir: &quot;\/home\/jenkins\/agent&quot;\r\n                          ttyEnabled: true\r\n                          command: &quot;\/bin\/sh -c&quot;\r\n                          args: &quot;cat&quot;\r\n                          resourceRequestCpu: &quot;100m&quot;\r\n                          resourceLimitCpu: &quot;500m&quot;\r\n                          resourceRequestMemory: &quot;500Mi&quot;\r\n                          resourceLimitMemory: &quot;1Gi&quot;\r\n                      volumes:\r\n                        - emptyDirVolume:\r\n                            memory: false\r\n                            mountPath: &quot;\/tmp&quot;\r\n                      podRetention: &quot;never&quot;\r\n                      activeDeadlineSeconds: &quot;900&quot;\r\n                      slaveConnectTimeout: &quot;1000&quot; <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-68fdf9a elementor-widget elementor-widget-text-editor\" data-id=\"68fdf9a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li><strong>Configuraci\u00f3n de las credenciales:<\/strong>\u00a0se definir\u00e1n todas las credenciales que se usar\u00e1n dentro de Jenkins, en nuestro caso las credenciales de Jenkins y alguna extras que podremos configurar si es necesario.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-790ed99 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"790ed99\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>      credentials: |\r\n          credentials:\r\n              system:\r\n                  domainCredentials:\r\n                  - credentials:\r\n                    - basicSSHUserPrivateKey:\r\n                        scope: GLOBAL\r\n                        id: &quot;GitLab&quot;\r\n                        username: ${gitlab_username}\r\n                        passphrase: &quot;&quot;\r\n                        privateKeySource:\r\n                          directEntry:\r\n                            privateKey: ${gitlab_ssh_key}\r\n                    - string:\r\n                        scope: GLOBAL\r\n                        id: vaultUrl\r\n                        secret: ${vault_addr}\r\n                    - string:\r\n                        scope: GLOBAL\r\n                        id: vaultToken\r\n                        secret: &quot;${vault_token}&quot;\r\n                    - string:\r\n                        scope: GLOBAL\r\n                        id: azureARMKey\r\n                        secret: &quot;${arm_access_key}&quot;\r\n                    - string:\r\n                        scope: GLOBAL\r\n                        id: slackToken\r\n                        secret: &quot;${slack_token}&quot;\r\n                    - string:\r\n                        scope: GLOBAL\r\n                        id: teamDomain\r\n                        secret: &quot;${team_domain}&quot; <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3332081 elementor-widget elementor-widget-text-editor\" data-id=\"3332081\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li><strong>Configuraci\u00f3n de Slack:<\/strong>\u00a0Aqu\u00ed se pasar\u00e1 la configuraci\u00f3n que realizamos en Jenkins en nuestro caso le indicaremos el dominio de nuestro Slack, para nuestras pruebas Bluetabmundo, y la sala por defecto donde se escribir\u00e1n todas las alertas que manden nuestros jobs. Para terminar, le pasaremos el token de Slack para que haga correctamente la conexi\u00f3n. Tanto el teamDomain como la room deber\u00e1n ser modificados con los que hab\u00e9is creado en el apartado de configuraci\u00f3n de Slack.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d4f400f elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"d4f400f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>      unclassified: |\r\n        unclassified:\r\n          slackNotifier:\r\n            teamDomain: bluetabmundo\r\n            room: &quot;#jenkins&quot;\r\n            tokenCredentialId: slackToken <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-35fd11b elementor-widget elementor-widget-text-editor\" data-id=\"35fd11b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li><strong>Arreglo de bugs:<\/strong>\u00a0Una de las ventajas m\u00e1s interesantes de Jcasc es que nos permite la utilizaci\u00f3n de scripts de groovy dentro de su configuraci\u00f3n. En nuestro caso crearemos un script para quitar un bug que salta en Jenkins al usar el plugin de de env-injector. B\u00e1sicamente este script nos quita un warning que no deber\u00eda salir pero por un bug de la versi\u00f3n del plugin salta.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e83672d elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"e83672d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>      scriptgroovy: |\r\n        groovy:\r\n          - script: &gt;\r\n              import jenkins.model.*;\r\n              import jenkins.security.*;\r\n              import hudson.security.*;\r\n              import hudson.model.*;\r\n              import static groovy.json.JsonOutput.*;\r\n              import hudson.ExtensionList;\r\n\r\n              ExtensionList&lt;UpdateSiteWarningsConfiguration&gt; configurations = ExtensionList.lookup(UpdateSiteWarningsConfiguration.class);\r\n              println configurations;\r\n              \r\n              UpdateSiteWarningsConfiguration configuration = configurations.get(0);\r\n              HashSet&lt;UpdateSite.Warning&gt; activeWarnings = new HashSet&lt;&gt;();\r\n              \r\n              activeWarnings.add(&#039;SECURITY-248&#039;);\r\n              \r\n              configuration.ignoredWarnings = activeWarnings;\r\n              \r\n              configuration.save(); <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cee5471 elementor-widget elementor-widget-text-editor\" data-id=\"cee5471\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li><strong>Uso de Jobdsl:<\/strong>\u00a0Con el plugin de Jcasc tambi\u00e9n lo podemos combinar con el plugin de Jobdsl que nos permite definirnos jobs cuando arranque nuestro Jenkins y as\u00ed tener ya creado todos nuestros principales jobs.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f9f62f3 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"f9f62f3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>      init-jobs: |\r\n            jobs:\r\n              - script: &gt;\r\n                  folder(&#039;Terraform&#039;)\r\n              - script: &gt;\r\n                  multibranchPipelineJob(&#039;Terraform\/azure-test&#039;) {\r\n                      branchSources {\r\n                          branchSource {\r\n                              source {\r\n                                  git {\r\n                                      remote(&#039;https:\/\/github.com\/lucasberlang\/Terraform-azure-test.git&#039;)\r\n                                  }\r\n                              }\r\n                              strategy {\r\n                                  defaultBranchPropertyStrategy {\r\n                                      props {\r\n                                          noTriggerBranchProperty()\r\n                                      }\r\n                                  }\r\n                              }\r\n                          }\r\n                      }\r\n                      configure {\r\n                          it \/ sources \/ data \/ &#039;jenkins.branch.BranchSource&#039; \/ source \/ traits {\r\n                            &#039;jenkins.plugins.git.traits.BranchDiscoveryTrait&#039;()\r\n                          }\r\n                      }\r\n                      triggers {\r\n                          periodic(60)\r\n                      }\r\n                  } <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5509703 elementor-widget elementor-widget-heading\" data-id=\"5509703\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"confi-prome\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Configuraci\u00f3n Prometheus<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8a5bb86 elementor-widget elementor-widget-text-editor\" data-id=\"8a5bb86\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Para la configuraci\u00f3n de Prometheus como hemos dicho anteriormente usaremos el provider de Helm. Para hacer el despliegue nos crearemos un namespace llamado monitoring donde se desplegar\u00e1 Prometheus. El fichero donde se har\u00e1 esta configuraci\u00f3n es\u00a0<a href=\".\/src\/helm_monitoring.tf\">helm_monitoring.tf<\/a>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5573148 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"5573148\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>resource &quot;kubernetes_namespace&quot; &quot;jenkins&quot; {\r\n  metadata {\r\n    name = &quot;gitops&quot;\r\n  }\r\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a848282 elementor-widget elementor-widget-text-editor\" data-id=\"a848282\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h4>Luego procederemos a hacer el despliegue de Prometheus con Helm.<\/h4>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2b7bc73 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"2b7bc73\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>data &quot;template_file&quot; &quot;file&quot; {\r\n  template = &quot;${file(&quot;${path.module}\/templates\/prometheus.yaml&quot;)}&quot;\r\n  vars = {\r\n    slack_api_url = &quot;${var.slack_api_url}&quot;\r\n    slack_channel = &quot;${var.slack_channel}&quot;\r\n  }\r\n}\r\n\r\nresource &quot;helm_release&quot; &quot;prometheus&quot; {\r\n  chart      = &quot;prometheus&quot;\r\n  name       = &quot;prometheus&quot;\r\n  namespace  = kubernetes_namespace.monitoring.metadata.0.name\r\n  repository = &quot;https:\/\/charts.helm.sh\/stable&quot;\r\n\r\n  values = [data.template_file.file.rendered]\r\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cdeaad9 elementor-widget elementor-widget-text-editor\" data-id=\"cdeaad9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Para ello haremos unas modificaciones en el template\u00a0<a href=\".\/src\/templates\/prometheus.yaml\">prometheus.yaml<\/a>\u00a0sustituyendo las variables slack_api_url y slack_channel dentro del fichero por las variables de entorno que le pasamos en el paso inicial. Estas variables ser\u00e1n usadas para el env\u00edo de alertas si existiera alg\u00fan problema en el cluster de GKE o el alg\u00fan pod desplegado en este.<\/p><p>De este fichero vamos a destacar algunos puntos que hemos modificado para realizar una automatizaci\u00f3n de nuestro servicio.<\/p><ul><li><strong>Configuraci\u00f3n del servicio:<\/strong>\u00a0Configuraremos el servicio de Prometheus como un ClusterIP para que solo sea visible dentro del cluster.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c921e65 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"c921e65\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>    type: ClusterIP <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1eca85b elementor-widget elementor-widget-text-editor\" data-id=\"1eca85b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li><strong>Configuraci\u00f3n de las alertas de Slack:<\/strong>\u00a0A\u00f1adiremos la configuraci\u00f3n de env\u00edo de alertas por si se cae alg\u00fan nodo de la infraestructura o hay alguna ca\u00edda de servicio como puede ser un fallo en el pod de Jenkins. Si sucede alguno de los dos puntos anteriores nos llegar\u00e1 una alerta a nuestro canal de Slack.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9d558bd elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"9d558bd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>alertmanagerFiles:\r\n  alertmanager.yml:\r\n    global:\r\n      slack_api_url: ${slack_api_url}\r\n\r\n    receivers:\r\n      - name: slack-notifications\r\n        slack_configs:\r\n          - channel: ${slack_channel}\r\n            send_resolved: true\r\n            icon_url: https:\/\/avatars3.githubusercontent.com\/u\/3380462\r\n            title: |\r\n              [{{ .Status | toUpper }}{{ if eq .Status &quot;firing&quot; }}:{{ .Alerts.Firing | len }}{{ end }}] {{ .CommonLabels.alertname }} for {{ .CommonLabels.job }}\r\n              {{- if gt (len .CommonLabels) (len .GroupLabels) -}}\r\n                {{&quot; &quot;}}(\r\n                {{- with .CommonLabels.Remove .GroupLabels.Names }}\r\n                  {{- range $index, $label := .SortedPairs -}}\r\n                    {{ if $index }}, {{ end }}\r\n                    {{- $label.Name }}=&quot;{{ $label.Value -}}&quot;\r\n                  {{- end }}\r\n                {{- end -}}\r\n                )\r\n              {{- end }}\r\n            text: |\r\n              {{ range .Alerts -}}\r\n              *Alert:* {{ .Annotations.title }}{{ if .Labels.severity }} - `{{ .Labels.severity }}`{{ end }}\r\n          \r\n              *Description:* {{ .Annotations.description }}\r\n          \r\n              *Details:*\r\n                {{ range .Labels.SortedPairs }} &bull; *{{ .Name }}:* `{{ .Value }}`\r\n                {{ end }}\r\n              {{ end }}\r\n\r\n    route:\r\n      group_wait: 10s\r\n      group_interval: 5m\r\n      receiver: slack-notifications\r\n      repeat_interval: 3h <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a8a5c27 elementor-widget elementor-widget-text-editor\" data-id=\"a8a5c27\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Aqu\u00ed es donde se har\u00e1 la sustituci\u00f3n de nuestro webhook de Slack(slack_api_url) configurado en el paso inicial y tambi\u00e9n la sustituci\u00f3n del canal donde va a escribir las alertas(slack_channel).<\/p><ul><li><strong>Configuraci\u00f3n de recolecci\u00f3n de logs:<\/strong>\u00a0por defecto Prometheus hace la recolecci\u00f3n de todos los logs de kubernetes al nivel de infraestructura. La \u00fanica modificaci\u00f3n que haremos es que recopile los logs del pod de Jenkins (Este funciona ya que hemos instalado el plugin de prometheus en Jenkins) as\u00ed recibiremos informaci\u00f3n valiosa de Jenkins que luego explotaremos con Grafana.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-10c3d94 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"10c3d94\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>      - job_name: &#039;jenkins&#039;\r\n        metrics_path: \/prometheus\r\n        static_configs:\r\n          - targets: [jenkins.gitops.svc.cluster.local:80] <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c1d5e82 elementor-widget elementor-widget-heading\" data-id=\"c1d5e82\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"confi-grafa\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Configuraci\u00f3n Grafana<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-22b4eac elementor-widget elementor-widget-text-editor\" data-id=\"22b4eac\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Como \u00faltimo paso realizaremos la configuraci\u00f3n de Grafana. Para esto como hemos dicho anteriormente usaremos el provider de Helm. Para hacer el despliegue usaremos el namespace creado anteriormente llamado monitoring donde se desplegar\u00e1 Grafana. El fichero donde se realizaremos el despliegue de Grafana es\u00a0<a href=\".\/src\/helm_monitoring.tf\">helm_monitoring.tf<\/a>.<\/p><p>Para realizar el despliegue con helm usaremos el siguiente c\u00f3digo:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-df465a8 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"df465a8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>data &quot;local_file&quot; &quot;helm_chart_grafana&quot; {\r\n  filename = &quot;${path.module}\/templates\/grafana.yaml&quot;\r\n}\r\n\r\nresource &quot;helm_release&quot; &quot;grafana&quot; {\r\n  chart      = &quot;grafana&quot;\r\n  name       = &quot;grafana&quot;\r\n  namespace  = kubernetes_namespace.monitoring.metadata.0.name\r\n  repository = &quot;https:\/\/charts.helm.sh\/stable&quot;\r\n\r\n  values = [data.local_file.helm_chart_grafana.content]\r\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-609d726 elementor-widget elementor-widget-text-editor\" data-id=\"609d726\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Todas las configuraciones iniciales de Grafana vienen modificadas en el template\u00a0<a href=\".\/src\/templates\/grafana.yaml\">grafana.yaml<\/a>.<\/p><p>Las configuraciones m\u00e1s importantes que hemos realizado en dicho archivo son las siguientes:<\/p><ul><li><strong>Configuraci\u00f3n del servicio:<\/strong>\u00a0el servicio de Grafana se levantar\u00e1 como LoadBalancer para que sea visible desde el exterior y lo podamos revisar desde nuestro navegador web.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0b94904 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"0b94904\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>service:\r\n  type: LoadBalancer\r\n  port: 80\r\n  targetPort: 3000\r\n    # targetPort: 4181 To be used with a proxy extraContainer\r\n  annotations: {}\r\n  labels: {}\r\n  portName: service <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ee26326 elementor-widget elementor-widget-text-editor\" data-id=\"ee26326\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li><strong>Configuraci\u00f3n de credenciales:<\/strong>\u00a0para loguearnos en Grafana haremos uso del\u00a0<a href=\"src\/kubernetes_secrets.tf\">secret de kubernetes grafana-secrets<\/a>\u00a0que hemos definido con usuario y contrase\u00f1a.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2b64c37 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"2b64c37\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>admin:\r\n  existingSecret: grafana-credentials\r\n  userKey: adminUser\r\n  passwordKey: adminPassword <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ac0272e elementor-widget elementor-widget-text-editor\" data-id=\"ac0272e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li><strong>Configuraci\u00f3n del datasource:<\/strong>\u00a0como configuraci\u00f3n inicial tambi\u00e9n a\u00f1adiremos Prometheus como fuente de datos en Grafana. Para ello tendremos que a\u00f1adir la url interna de prometheus, en nuestro caso ser\u00e1 el nombre del servicio (prometheus-server) m\u00e1s el namespace donde esta desplegado (monitoring) y por \u00faltimo la\u00a0<a href=\"https:\/\/cloud.google.com\/kubernetes-engine\/docs\/concepts\/service-discovery\">resoluci\u00f3n del DNS en GKE<\/a>.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dea1d2d elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"dea1d2d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>datasources:\r\n datasources.yaml:\r\n   apiVersion: 1\r\n   datasources:\r\n   - name: Prometheus\r\n     type: prometheus\r\n     url: http:\/\/prometheus-server.monitoring.svc.cluster.local\r\n     isDefault: true <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b841b79 elementor-widget elementor-widget-text-editor\" data-id=\"b841b79\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li><p><strong>Configuraci\u00f3n de los dashboards:<\/strong>\u00a0a\u00f1adiremos unos dashboards inciales cuando se levante el servicio de Grafana. Estos dashboards ser\u00e1n los siguientes:<\/p><ul><li><p>Jenkins-Performance: Encargado de la monitorizaci\u00f3n del servicio de Jenkins a nivel de ejecuci\u00f3n de jobs y de uso de recursos.<\/p><\/li><li><p>Kubernetes-nodes: Monitorizaci\u00f3n de la infraestructura de GKE.<\/p><\/li><li><p>kubernetes-cluster: Monitorizaci\u00f3n de la infraestructura de GKE.<\/p><\/li><\/ul><\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4a03bc7 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"4a03bc7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>dashboards:\r\n  default:\r\n    Jenkins-Performance:\r\n      gnetId: 14764\r\n      revision: 1\r\n      datasource: Prometheus\r\n    Kubernetes-nodes:\r\n      gnetId: 315\r\n      revision: 3\r\n      datasource: Prometheus\r\n    Kubernetes-cluster:\r\n      gnetId: 6417\r\n      revision: 1\r\n      datasource: Prometheus <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cb4dd1f elementor-widget elementor-widget-heading\" data-id=\"cb4dd1f\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"despli-infra\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Despliegue de la infraestructura<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5ba1198 elementor-widget elementor-widget-text-editor\" data-id=\"5ba1198\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Una vez realizado el paso de\u00a0<a href=\"#configuraci%C3%B3n-de-variables\"><strong>configuraci\u00f3n de variables<\/strong><\/a>\u00a0pasaremos a realizar el despliegue de toda la infraestructura (GKE y VPC) y de todos los componentes que vamos a desplegar (Jenkins, Prometheus y Grafana).<\/p><p>Para ello al tenerlo todo configurado con Terraform solo debemos ejecutar los siguientes comandos dentro de nuestro proyecto:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c50552a elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"c50552a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>cd src\/\r\nterraform init\r\nterraform apply <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-16d057e elementor-widget elementor-widget-text-editor\" data-id=\"16d057e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Una vez ejecutado los comandos anteriores la salida esperada de nuestro proyecto ser\u00e1 la siguiente:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-481ff92 elementor-widget elementor-widget-image\" data-id=\"481ff92\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1000\" height=\"310\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/output-terraform.png\" class=\"attachment-large size-large wp-image-12066 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/output-terraform.png 1000w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/output-terraform-300x93.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/output-terraform-768x238.png 768w\" data-sizes=\"(max-width: 1000px) 100vw, 1000px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1000px; --smush-placeholder-aspect-ratio: 1000\/310;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5af9a86 elementor-widget elementor-widget-text-editor\" data-id=\"5af9a86\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h4 id=\"revisi%C3%B3n-de-la-infraestructura\"><strong>Revisi\u00f3n de la infraestructura<\/strong><\/h4><p>Una vez desplegado toda la infraestructura empezaremos a hacer la revisi\u00f3n de todo lo desplegado para ello nos conectaremos al cluster de GKE de la siguiente forma:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7777334 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"7777334\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>gcloud container clusters get-credentials $cluster_name --region $region --project $project_id <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-905906e elementor-widget elementor-widget-text-editor\" data-id=\"905906e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Para ello se deber\u00e1 sustituir las variables cluster_name por el nombre del cluster, region por la regi\u00f3n donde se ha desplegado el cluster de GKE y la variable project_id haciendo referencia al proyecto donde se desplegar\u00e1.<\/p><p>Una vez conectado al cluster de GKE haremos una revisi\u00f3n de los nodos desplegados:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1e4dffb elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"1e4dffb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>kubectl get nodes <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cf1607a elementor-widget elementor-widget-text-editor\" data-id=\"cf1607a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Esto nos devolver\u00e1:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f2c256b elementor-widget elementor-widget-image\" data-id=\"f2c256b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"892\" height=\"117\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/nodes-kubernetes.png\" class=\"attachment-large size-large wp-image-12064 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/nodes-kubernetes.png 892w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/nodes-kubernetes-300x39.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/nodes-kubernetes-768x101.png 768w\" data-sizes=\"(max-width: 892px) 100vw, 892px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 892px; --smush-placeholder-aspect-ratio: 892\/117;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-76776db elementor-widget elementor-widget-text-editor\" data-id=\"76776db\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>As\u00ed como pods y servicios que tenemos disponibles:As\u00ed como pods y servicios que tenemos disponibles:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ff6f0ea elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"ff6f0ea\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>kubectl get pods,svc -n gitops\r\nkubectl get pods,svc -n monitoring <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a9bef55 elementor-widget elementor-widget-text-editor\" data-id=\"a9bef55\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Con la siguiente salida:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-572879c elementor-widget elementor-widget-image\" data-id=\"572879c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1009\" height=\"434\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/pods-svc-kubernetes.png\" class=\"attachment-large size-large wp-image-12068 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/pods-svc-kubernetes.png 1009w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/pods-svc-kubernetes-300x129.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/pods-svc-kubernetes-768x330.png 768w\" data-sizes=\"(max-width: 1009px) 100vw, 1009px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1009px; --smush-placeholder-aspect-ratio: 1009\/434;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d489dee elementor-widget elementor-widget-text-editor\" data-id=\"d489dee\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h4 id=\"revisi%C3%B3n-de-jenkins\"><strong>Revisi\u00f3n de Jenkins<\/strong><\/h4><p>Una vez hemos verificado nuestra infraestructura vamos a realizar la revisi\u00f3n de Jenkins.<\/p><p>Con la informaci\u00f3n sacada del servicio de jenkins accederemos a la interfaz web donde nos tendremos que loguear, en nuestro caso 34.79.219.11.<\/p><p>Para sacar la contrase\u00f1a de nuestro usuario de Jenkins tendremos que ejecutar el siguiente comando:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3ab5e38 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"3ab5e38\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>JENKINS_PASSWORD=$(kubectl get secret jenkins -n gitops -o jsonpath=&quot;{.data.jenkins-admin-password}&quot; | base64 --decode);echo\r\necho $JENKINS_PASSWORD <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5038986 elementor-widget elementor-widget-text-editor\" data-id=\"5038986\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p id=\"revisi%C3%B3n-de-jenkins\">Esto nos devolver\u00e1 la contrase\u00f1a y ya podremos hacer el login:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-53c6c86 elementor-widget elementor-widget-image\" data-id=\"53c6c86\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"486\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jenkins-ui-1024x486.png\" class=\"attachment-large size-large wp-image-12056 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jenkins-ui-1024x486.png 1024w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jenkins-ui-300x142.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jenkins-ui-768x365.png 768w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jenkins-ui.png 1365w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/486;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c711bc5 elementor-widget elementor-widget-text-editor\" data-id=\"c711bc5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Como se puede observar una vez dentro de Jenkins tenemos la configuraci\u00f3n que hemos realizado con Jcasc y la creaci\u00f3n del job que hemos definido con JobDsl.<\/p><h4 id=\"revisi%C3%B3n-de-grafana\"><strong>Revisi\u00f3n de Grafana<\/strong><\/h4><p>Para la revisi\u00f3n de Grafana debemos acceder tambi\u00e9n a la interfaz web y loguearnos. La direcci\u00f3n de la interfaz web la podemos observar con el comando de kubectl lanzado anteriormente en nuestro caso es 34.140.61.173.<\/p><p>Para loguearnos usaremos la informaci\u00f3n que pasamos por nuestras variables de entorno, TF_VAR_password_grafana y TF_VAR_user_grafana.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ab3b6c3 elementor-widget elementor-widget-image\" data-id=\"ab3b6c3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"489\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/grafana-ui-1024x489.png\" class=\"attachment-large size-large wp-image-12045 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/grafana-ui-1024x489.png 1024w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/grafana-ui-300x143.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/grafana-ui-768x366.png 768w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/grafana-ui.png 1358w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/489;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a1e1445 elementor-widget elementor-widget-text-editor\" data-id=\"a1e1445\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Podemos comprobar que la configuraci\u00f3n que hemos a\u00f1adido al template de creaci\u00f3n de datasources y dashboards es correcta.<\/p><ul><li><strong>Datasources:<\/strong><\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c8cd067 elementor-widget elementor-widget-image\" data-id=\"c8cd067\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"493\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/grafana-datasources-ui-1024x493.png\" class=\"attachment-large size-large wp-image-12041 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/grafana-datasources-ui-1024x493.png 1024w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/grafana-datasources-ui-300x144.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/grafana-datasources-ui-768x370.png 768w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/grafana-datasources-ui.png 1351w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/493;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0aab28c elementor-widget elementor-widget-text-editor\" data-id=\"0aab28c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li><strong>Dashboards:<\/strong><\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2619241 elementor-widget elementor-widget-image\" data-id=\"2619241\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"489\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/grafana-dashboards-ui-1024x489.png\" class=\"attachment-large size-large wp-image-12039 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/grafana-dashboards-ui-1024x489.png 1024w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/grafana-dashboards-ui-300x143.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/grafana-dashboards-ui-768x367.png 768w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/grafana-dashboards-ui.png 1359w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/489;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1041f24 elementor-widget elementor-widget-heading\" data-id=\"1041f24\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"job\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Job de prueba<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b45690f elementor-widget elementor-widget-text-editor\" data-id=\"b45690f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Para nuestro ejemplo usaremos un proyecto que desplegar\u00e1 un resource group en Azure, se encuentra en el siguiente\u00a0<a href=\"https:\/\/github.com\/lucasberlang\/terraform-azure-test\">repositorio<\/a>.<\/p><p>Lo m\u00e1s destacable de este proyecto es la definici\u00f3n de nuestro pipeline de ejecuci\u00f3n:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-32ac34f elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"32ac34f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>pipeline {\r\n  agent {\r\n      label &quot;terraform-exec&quot;\r\n  }\r\n stages {\r\n  stage(&#039;checkout&#039;) {\r\n   steps {\r\n    container(&#039;terraform&#039;) {\r\n     echo &quot;La rama de la que se va a hacer el checkout es: master&quot;\r\n     git branch: &quot;master&quot;, url: &#039;https:\/\/github.com\/lucasberlang\/terraform-azure-test.git&#039;\r\n    }\r\n   }\r\n  }\r\n   stage(&#039;Review Terraform version&#039;) {\r\n    steps {\r\n    container(&#039;terraform&#039;) {\r\n      sh &#039;terraform --version&#039;\r\n    }\r\n    }\r\n   }\r\n   stage(&#039;Terraform init&#039;) {\r\n    steps {\r\n    container(&#039;terraform&#039;) {\r\n      sh &#039;terraform init -upgrade&#039;\r\n    }\r\n   }\r\n   }\r\n  stage(&#039;Terraform plan infrastructure&#039;) {\r\n    steps {\r\n    container(&#039;terraform&#039;) {\r\n     withCredentials([string(credentialsId: &#039;vaultUrl&#039;, variable: &#039;VAULT_ADDR&#039;),\r\n     string(credentialsId: &#039;vaultToken&#039;, variable: &#039;VAULT_TOKEN&#039;)\r\n     ]) {\r\n      sh &#039;export VAULT_ADDR=${VAULT_ADDR} &amp;&amp; export VAULT_TOKEN=${VAULT_TOKEN} &amp;&amp; terraform plan&#039;\r\n     slackSend channel: &quot;#practica-cloud-deployments&quot;,color: &#039;#BADA55&#039;, message: &quot;Plan completed! Do you approve deployment? ${env.RUN_DISPLAY_URL}&quot;\r\n     }\r\n    }\r\n   }\r\n  }\r\n  stage(&#039;Approval&#039;) {\r\n   when{\r\n    not {\r\n     branch &#039;poc&#039;\r\n    }\r\n   }\r\n   steps {\r\n    container(&#039;terraform&#039;) {\r\n     script {\r\n     def userInput = input(id: &#039;confirm&#039;, message: &#039;Apply Terraform?&#039;, parameters: [ [$class: &#039;BooleanParameterDefinition&#039;, defaultValue: false, description: &#039;Apply terraform&#039;, name: &#039;confirm&#039;] ])\r\n     }\r\n    }\r\n   }\r\n  }\r\n  stage(&#039;Terraform Apply&#039;) {\r\n    steps {\r\n    container(&#039;terraform&#039;) {\r\n     withCredentials([string(credentialsId: &#039;vaultUrl&#039;, variable: &#039;VAULT_ADDR&#039;),\r\n     string(credentialsId: &#039;vaultToken&#039;, variable: &#039;VAULT_TOKEN&#039;)\r\n     ]) {\r\n      sh &#039;export VAULT_ADDR=${VAULT_ADDR} &amp;&amp; export VAULT_TOKEN=${VAULT_TOKEN} &amp;&amp; terraform apply -auto-approve&#039;\r\n     slackSend color: &#039;#BADA55&#039;, message: &quot;Apply completed! Build logs from jenkins server ${env.RUN_DISPLAY_URL}&quot;\r\n     }\r\n    }\r\n    }\r\n  }\r\n  stage(&#039;Waiting to review the infrastructure&#039;) {\r\n    steps {\r\n    container(&#039;terraform&#039;) {\r\n     slackSend channel: &quot;#practica-cloud-deployments&quot;, color: &#039;#BADA55&#039;, message: &quot;Waiting 5 minutes before destroy the infrastructure!&quot;\r\n     sh &#039;sleep 300&#039;\r\n    }\r\n   }\r\n    \r\n  }\r\n  stage(&#039;Destroy Infra&#039;) {\r\n    steps {\r\n    container(&#039;terraform&#039;) {\r\n     withCredentials([string(credentialsId: &#039;vaultUrl&#039;, variable: &#039;VAULT_ADDR&#039;),\r\n     string(credentialsId: &#039;vaultToken&#039;, variable: &#039;VAULT_TOKEN&#039;)\r\n     ]) {\r\n      sh &#039;export VAULT_ADDR=${VAULT_ADDR} &amp;&amp; export VAULT_TOKEN=${VAULT_TOKEN} &amp;&amp; terraform destroy -auto-approve&#039;\r\n     slackSend channel: &quot;#practica-cloud-deployments&quot;, color: &#039;#BADA55&#039;, message: &quot;Destroy completed! Build logs from jenkins server ${env.RUN_DISPLAY_URL}&quot;\r\n     }\r\n    }\r\n    }\r\n  }\r\n }\r\n} <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3306b39 elementor-widget elementor-widget-text-editor\" data-id=\"3306b39\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>En el pipeline se han definido las siguientes stages:<\/p><ul><li><strong>Checkout:<\/strong>\u00a0se har\u00e1 el checkoput de nuestro proyecto.<\/li><li><strong>Review Terraform Version:<\/strong>\u00a0revisaremos la versi\u00f3n de terraform desplegada en nuestro contenedor agente.<\/li><li><strong>Terraform init:<\/strong>\u00a0stage de inicializaci\u00f3n de entorno.<\/li><li><strong>Terraform plan infrastructure:<\/strong>\u00a0revisi\u00f3n de la infraestructura a desplegar en nuestro caso un resource group de Azure.<\/li><li><strong>Approval:<\/strong>\u00a0paso de aprobaci\u00f3n manual para comprobar si la infraestructura a desplegar es correcta.<\/li><li><strong>Terraform Apply:<\/strong>\u00a0ejecuci\u00f3n y creaci\u00f3n de toda la infraestructura que vamos a realizar en Azure.<\/li><li><strong>Waiting to review the infrastructure:<\/strong>\u00a0solo como para la demo haremos una espera de 5 minutos para revisar toda nuestra infraestructura.<\/li><li><strong>Destroy Infra:<\/strong>\u00a0destrucci\u00f3n de toda la infraestructura una vez esperado estos 5 minutos.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-00cde0a elementor-widget elementor-widget-heading\" data-id=\"00cde0a\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"ejec-end\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Ejecuci\u00f3n end to end<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-557d059 elementor-widget elementor-widget-text-editor\" data-id=\"557d059\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Una vez realizado todas las comprobaciones pertinentes vamos a ejecutar el job de prueba en Jenkins para ver como escala nuestra plataforma as\u00ed como el env\u00edo de alertas y la monitorizaci\u00f3n que realizaremos en Grafana.<\/p><p>Accederemos a nuestro job de prueba y lo ejecutaremos, d\u00e1ndole al bot\u00f3n construir ahora:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-edf61e6 elementor-widget elementor-widget-image\" data-id=\"edf61e6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"491\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jobs-jenkins-running-1024x491.png\" class=\"attachment-large size-large wp-image-12058 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jobs-jenkins-running-1024x491.png 1024w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jobs-jenkins-running-300x144.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jobs-jenkins-running-768x368.png 768w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jobs-jenkins-running.png 1343w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/491;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-da64dbb elementor-widget elementor-widget-text-editor\" data-id=\"da64dbb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Una vez que el job esta lanzado podemos comprobar c\u00f3mo se instancia un nuevo agente de Jenkins para nuestra ejecuci\u00f3n teniendo as\u00ed una infraestructura totalmente escalable:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-bcf1141 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"bcf1141\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>watch -n 1 kubectl get pods -n gitops <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9a5ae48 elementor-widget elementor-widget-image\" data-id=\"9a5ae48\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"855\" height=\"210\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/slaves-running.png\" class=\"attachment-large size-large wp-image-12076 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/slaves-running.png 855w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/slaves-running-300x74.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/slaves-running-768x189.png 768w\" data-sizes=\"(max-width: 855px) 100vw, 855px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 855px; --smush-placeholder-aspect-ratio: 855\/210;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-569e2bd elementor-widget elementor-widget-text-editor\" data-id=\"569e2bd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Cuando el job este ejecutando podemos observar c\u00f3mo nos van a ir llegando alertas autom\u00e1ticamente al Slack. La primera alerta llegar\u00e1 en el stage de approval donde nos pedir\u00e1 Jenkins que revisemos la infraestructura que vamos a desplegar y si es correcta aprobaremos el cambio:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-84850f5 elementor-widget elementor-widget-image\" data-id=\"84850f5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"711\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/slack-job-alert-1024x711.png\" class=\"attachment-large size-large wp-image-12074 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/slack-job-alert-1024x711.png 1024w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/slack-job-alert-300x208.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/slack-job-alert-768x533.png 768w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/slack-job-alert.png 1520w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/711;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-aafc6eb elementor-widget elementor-widget-text-editor\" data-id=\"aafc6eb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Y una vez que entremos en el link de slack nos saltar\u00e1 directamente la interfaz de blueocean:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1442905 elementor-widget elementor-widget-image\" data-id=\"1442905\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"499\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/approval-blue-jenkins-1024x499.png\" class=\"attachment-large size-large wp-image-12084 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/approval-blue-jenkins-1024x499.png 1024w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/approval-blue-jenkins-300x146.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/approval-blue-jenkins-768x374.png 768w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/approval-blue-jenkins.png 1326w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/499;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a026fdd elementor-widget elementor-widget-text-editor\" data-id=\"a026fdd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Una vez aprobado el cambio se realizar\u00e1 el despliegue en nuestra cuenta de Azure, donde podemos revisar que esta todo correcto y el resource group, en nuestro caso example-test, se ha desplegado correctamente:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7e3e7f7 elementor-widget elementor-widget-image\" data-id=\"7e3e7f7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"457\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/azure-resource-group-1024x457.png\" class=\"attachment-large size-large wp-image-12023 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/azure-resource-group-1024x457.png 1024w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/azure-resource-group-300x134.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/azure-resource-group-768x343.png 768w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/azure-resource-group.png 1331w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/457;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c382940 elementor-widget elementor-widget-text-editor\" data-id=\"c382940\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Por \u00faltimo podemos observar todas las alertas que hemos recibido en nuestro canal de Slack las cuales nos avisaran en el stage de approval, waiting y destroy de la infra:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0562f4c elementor-widget elementor-widget-image\" data-id=\"0562f4c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"732\" height=\"223\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/all-alerts-slack.png\" class=\"attachment-large size-large wp-image-12082 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/all-alerts-slack.png 732w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/all-alerts-slack-300x91.png 300w\" data-sizes=\"(max-width: 732px) 100vw, 732px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 732px; --smush-placeholder-aspect-ratio: 732\/223;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9bf71e9 elementor-widget elementor-widget-heading\" data-id=\"9bf71e9\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"escala\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Escalabilidad de la soluci\u00f3n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f77c1b1 elementor-widget elementor-widget-text-editor\" data-id=\"f77c1b1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Una vez que hemos comprobado que nuestra soluci\u00f3n est\u00e1 totalmente automatizada y que funciona correctamente vamos a comprobar la escalabilidad de nuestra plataforma.<\/p><p>Para ello lo que vamos a hacer es lanzar m\u00faltiples ejecuciones de nuestro job de Jenkins para ver c\u00f3mo va desplegando la soluci\u00f3n tanto a nivel de agentes (Levantar\u00e1 un pod por ejecuci\u00f3n) como la escalabilidad de nuestros nodos cuando tengamos m\u00e1s peticiones y consumo de memoria y CPU.<\/p><p>El primer paso ser\u00e1 ejecutar m\u00faltiples jobs desde la interfaz web:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7952075 elementor-widget elementor-widget-image\" data-id=\"7952075\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"593\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/multiple-jobs-jenkins-1024x593.png\" class=\"attachment-large size-large wp-image-12060 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/multiple-jobs-jenkins-1024x593.png 1024w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/multiple-jobs-jenkins-300x174.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/multiple-jobs-jenkins-768x445.png 768w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/multiple-jobs-jenkins-1536x890.png 1536w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/multiple-jobs-jenkins.png 1807w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/593;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-aa7cd81 elementor-widget elementor-widget-text-editor\" data-id=\"aa7cd81\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Como se puede observar nuestros pods ir\u00e1n escalando seg\u00fan el n\u00famero de ejecuciones que tenemos:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-03edcd9 elementor-widget elementor-widget-image\" data-id=\"03edcd9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"844\" height=\"409\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/multiple-pods-slaves.png\" class=\"attachment-large size-large wp-image-12062 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/multiple-pods-slaves.png 844w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/multiple-pods-slaves-300x145.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/multiple-pods-slaves-768x372.png 768w\" data-sizes=\"(max-width: 844px) 100vw, 844px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 844px; --smush-placeholder-aspect-ratio: 844\/409;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5ff03e5 elementor-widget elementor-widget-text-editor\" data-id=\"5ff03e5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Para ver como escala a nivel de m\u00e1quinas usaremos el siguiente comando:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-57e4fba elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"57e4fba\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>watch -n 1 kubectl get nodes <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e7d4bf6 elementor-widget elementor-widget-image\" data-id=\"e7d4bf6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"888\" height=\"177\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/auto-scale-nodes.png\" class=\"attachment-large size-large wp-image-12021 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/auto-scale-nodes.png 888w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/auto-scale-nodes-300x60.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/auto-scale-nodes-768x153.png 768w\" data-sizes=\"(max-width: 888px) 100vw, 888px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 888px; --smush-placeholder-aspect-ratio: 888\/177;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fe85485 elementor-widget elementor-widget-text-editor\" data-id=\"fe85485\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Como se puede observar se ha agregado un nuevo nodo hace 23 segundos por lo que nuestra plataforma es capaz de ir escalando seg\u00fan las peticiones que se realicen desde nuestro Jenkins.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ab6b010 elementor-widget elementor-widget-heading\" data-id=\"ab6b010\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"monito\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Monitorizaci\u00f3n de la plataforma<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a752bea elementor-widget elementor-widget-text-editor\" data-id=\"a752bea\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Dado que hemos realizado tanto la configuraci\u00f3n de Grafana como la de Prometheus vamos a hacer uso de nuestros dashboards predefinidos para monitorizar la plataforma en Grafana y el env\u00edo de alertas con Prometheus.<\/p><h4 id=\"dashboards\"><strong>Dashboards<\/strong><\/h4><p>Estos dashboards que hemos creado son los siguientes:<\/p><ul><li><strong>Jenkins: Performance and Health Overview:<\/strong>\u00a0dashboard con informaci\u00f3n relativa a nuestras ejecuciones en Jenkins, n\u00famero de jobs, memoria utilizada&#8230; .<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1be93e9 elementor-widget elementor-widget-image\" data-id=\"1be93e9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"543\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jenkins-monitoring-1024x543.png\" class=\"attachment-large size-large wp-image-12053 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jenkins-monitoring-1024x543.png 1024w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jenkins-monitoring-300x159.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jenkins-monitoring-768x408.png 768w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jenkins-monitoring-1536x815.png 1536w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jenkins-monitoring.png 1826w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/543;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8b3a2af elementor-widget elementor-widget-text-editor\" data-id=\"8b3a2af\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li><strong>Kubernetes Cluster:<\/strong>\u00a0en este dahsboard tendremos informaci\u00f3n del cluster de kubernetes a nivel de pods corriendo en el cluster memoria consumida por pod etc.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0062011 elementor-widget elementor-widget-image\" data-id=\"0062011\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"564\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/cluster-kubernetes-monitoring-1024x564.png\" class=\"attachment-large size-large wp-image-12027 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/cluster-kubernetes-monitoring-1024x564.png 1024w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/cluster-kubernetes-monitoring-300x165.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/cluster-kubernetes-monitoring-768x423.png 768w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/cluster-kubernetes-monitoring-1536x847.png 1536w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/cluster-kubernetes-monitoring.png 1827w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/564;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ce38f79 elementor-widget elementor-widget-text-editor\" data-id=\"ce38f79\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li><strong>Kubernetes Cluster:<\/strong>\u00a0en el \u00faltimo dahsboard se mostrar\u00e1 gr\u00e1ficos de picos de red, CPUs y memoria a nivel de m\u00e1quinas en el Cluster de GKE.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-248f128 elementor-widget elementor-widget-image\" data-id=\"248f128\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"599\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/cluster-cpu-monitoring-1024x599.png\" class=\"attachment-large size-large wp-image-12025 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/cluster-cpu-monitoring-1024x599.png 1024w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/cluster-cpu-monitoring-300x175.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/cluster-cpu-monitoring-768x449.png 768w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/cluster-cpu-monitoring-1536x898.png 1536w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/cluster-cpu-monitoring.png 1755w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/599;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b1c7d27 elementor-widget elementor-widget-heading\" data-id=\"b1c7d27\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Alertas del sistema<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9f2385a elementor-widget elementor-widget-text-editor\" data-id=\"9f2385a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Adem\u00e1s de alertas cuando se ejecuta un job tambi\u00e9n se hemos realizado la configuraci\u00f3n de alertas de la infraestructura v\u00eda Prometheus. Este nos enviar\u00e1 alertas cuando el pod de Jenkins este ca\u00eddo o alguno de los nodos del cluster se caiga.<\/p><p>Para hacerlo un poco m\u00e1s ilustrativo usaremos el ejemplo de autoescalado que hemos realizado antes para que Prometheus nos env\u00ede una alerta cuando empiece a quitarse m\u00e1quinas porque el cluster de GKE detecte que no se est\u00e1 consumiendo tanta memoria.<\/p><p>Cuando hicimos la prueba de\u00a0<a href=\"#escalabilidad-de-la-soluci%C3%B3n\"><strong>autoescalado<\/strong><\/a>\u00a0vimos como se hab\u00eda agregado un nuevo nodo llamado gke-go-euw2-bk-sca-g-default-node-poo-c9c04d95-sgmz. Este despu\u00e9s del pico de ejecuciones de jobs en Jenkins se auto eliminar\u00e1 ya que no tendremos tanta actividad en nuestro GKE.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-619b0de elementor-widget elementor-widget-image\" data-id=\"619b0de\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"892\" height=\"117\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/nodes-kubernetes.png\" class=\"attachment-large size-large wp-image-12064 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/nodes-kubernetes.png 892w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/nodes-kubernetes-300x39.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/nodes-kubernetes-768x101.png 768w\" data-sizes=\"(max-width: 892px) 100vw, 892px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 892px; --smush-placeholder-aspect-ratio: 892\/117;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-104b527 elementor-widget elementor-widget-text-editor\" data-id=\"104b527\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Prometheus al detectar que nuestro nodo ha desaparecido nos enviar\u00e1 una alerta de nodo ca\u00eddo autom\u00e1ticamente a Slack.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7ff18c5 elementor-widget elementor-widget-image\" data-id=\"7ff18c5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"712\" height=\"807\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/down-scale-nodes-alert.png\" class=\"attachment-large size-large wp-image-12033 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/down-scale-nodes-alert.png 712w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/down-scale-nodes-alert-265x300.png 265w\" data-sizes=\"(max-width: 712px) 100vw, 712px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 712px; --smush-placeholder-aspect-ratio: 712\/807;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d816823 elementor-widget elementor-widget-text-editor\" data-id=\"d816823\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>As\u00ed sabremos de una forma totalmente automatizada si nuestra infraestructura ha sufrido alg\u00fan problema.<\/p><p>Para el caso de los pods lo que vamos a provocar es una ca\u00edda del componente de Jenkins para que as\u00ed Prometheus nos env\u00ede una alerta de pod ca\u00eddo.<\/p><p>Para ello lo que vamos a realizar es la destrucci\u00f3n del pod de Jenkins para provocar una ca\u00edda del servicio:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-86f41e7 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"86f41e7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>kubectl delete pod jenkins-0 -n gitops <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-aede8ce elementor-widget elementor-widget-text-editor\" data-id=\"aede8ce\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Una vez que el pod este eliminado se arrancar\u00e1 autom\u00e1ticamente:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-513e7b2 elementor-widget elementor-widget-image\" data-id=\"513e7b2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"551\" height=\"151\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/delete-pod-jenkins.png\" class=\"attachment-large size-large wp-image-12029 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/delete-pod-jenkins.png 551w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/delete-pod-jenkins-300x82.png 300w\" data-sizes=\"(max-width: 551px) 100vw, 551px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 551px; --smush-placeholder-aspect-ratio: 551\/151;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-daf1332 elementor-widget elementor-widget-text-editor\" data-id=\"daf1332\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Y pasado un minuto Prometheus nos avisar\u00e1 de la ca\u00edda del servicio de Jenkins y de su posterior recuperaci\u00f3n:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d5094b6 elementor-widget elementor-widget-image\" data-id=\"d5094b6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"677\" height=\"426\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jenkins-delete-alert.png\" class=\"attachment-large size-large wp-image-12047 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jenkins-delete-alert.png 677w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/jenkins-delete-alert-300x189.png 300w\" data-sizes=\"(max-width: 677px) 100vw, 677px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 677px; --smush-placeholder-aspect-ratio: 677\/426;\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-039ae4e elementor-widget elementor-widget-heading\" data-id=\"039ae4e\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"elimina\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Eliminaci\u00f3n de recursos<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c31d281 elementor-widget elementor-widget-text-editor\" data-id=\"c31d281\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>El \u00faltimo paso que haremos tras probar el \u00e9xito de nuestra plataforma CI\/CD ser\u00e1 realizar la destrucci\u00f3n de todos sus componentes para ello ejecutaremos el siguiente comando:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f3b03d0 elementor-widget elementor-widget-elementor-syntax-highlighter\" data-id=\"f3b03d0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"elementor-syntax-highlighter.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<pre><code class='language-python'>cd src\/\r\nterraform destroy <\/code><\/pre><script>\nif (!document.getElementById('syntaxed-prism')) {\n\tvar my_awesome_script = document.createElement('script');\n\tmy_awesome_script.setAttribute('src','https:\/\/bluetab.co.uk\/wp-content\/plugins\/syntax-highlighter-for-elementor\/assets\/prism2.js');\n\tmy_awesome_script.setAttribute('id','syntaxed-prism');\n\tdocument.body.appendChild(my_awesome_script);\n} else {\n\twindow.Prism && Prism.highlightAll();\n}\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-01852ba elementor-widget elementor-widget-heading\" data-id=\"01852ba\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"conclusion\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Conclusi\u00f3n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-acd7863 elementor-widget elementor-widget-text-editor\" data-id=\"acd7863\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Es de sobra conocido la importancia de automatizar el ciclo de vida del desarrollo software pero en este art\u00edculo le hemos querido dar una vuelta m\u00e1s a esta automatizaci\u00f3n consiguiendo industrializar toda nuestra plataforma CI\/CD. Para ello hemos automatizado tanto el levantamiento de toda nuestra infraestructura con Terraform as\u00ed como la configuraci\u00f3n inicial de nuestras tres piezas centrales Jenkins, Prometheus y Grafana.<\/p><p>Haciendo uso de plugin como Jcasc conseguimos automatizar toda la configuraci\u00f3n inicial de Jenkins que muchas veces es bastante tediosa de hacer de arranque. Esto nos permite que si alguna vez hay una ca\u00edda de nuestro servicio siempre mantendremos una configuraci\u00f3n base en este, evitando tiempos de configuraci\u00f3n que al final se reduce en tiempo de espera para el usuario.<\/p><p>Adem\u00e1s, a\u00f1adiendo una monitorizaci\u00f3n inicial tanto con Prometheus como con Grafana somos capaces de crear un sistema de avisos que nos ayude a comprobar y chequear el correcto comportamiento de toda nuestra plataforma para as\u00ed poder evitar futuras incidencias.<\/p><p>Por \u00faltimo el uso de GKE en este tipo de plataformas consiguen un ahorro de costes bastante importante en nuestra organizaci\u00f3n ya que nos da la posibilidad de tener un autoescalado dependiendo del uso que se est\u00e9 realizando sobre nuestra plataforma, pudiendo as\u00ed tener picos de gran carga sin tener un deterioro del servicio.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-65c3381 elementor-widget elementor-widget-spacer\" data-id=\"65c3381\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-f668113 nav-column elementor-hidden-phone\" data-id=\"f668113\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-0508221 nav-post elementor-widget elementor-widget-text-editor\" data-id=\"0508221\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h6><strong>Navegaci\u00f3n<\/strong><\/h6><p><a href=\"#introduccion\">Introducci\u00f3n<\/a><\/p><p><a href=\"#objetivos\">Objetivos<\/a><\/p><p><a href=\"#into-terra\">Introducci\u00f3n a Terraform<\/a><\/p><p><a href=\"#into-gke\">Introducci\u00f3n a GKE<\/a><\/p><p><a href=\"#into-jenkins\">Introducci\u00f3n a Jenkins<\/a><\/p><p><a href=\"#into-prome\">Introducci\u00f3n a Prometheus<\/a><\/p><p><a href=\"#into-grafa\">Introducci\u00f3n a Grafana<\/a><\/p><p><a href=\"#into-slack\">Introducci\u00f3n a Slack<\/a><\/p><p><a href=\"#pre-entorno\">Preparaci\u00f3n de entorno<\/a><\/p><p><a href=\"#clon-repo\">Clonaci\u00f3n de repositorio<\/a><\/p><p><a href=\"#indi-fiche\">\u00cdndice de ficheros<\/a><\/p><p><a href=\"#confi-slack\">Configuraci\u00f3n de Slack<\/a><\/p><p><a href=\"#confi-variables\">Configuraci\u00f3n de variables<\/a><\/p><p><a href=\"#confi-vpc\">Configuraci\u00f3n VPC<\/a><\/p><p><a href=\"#confi-gke\">Configuraci\u00f3n GKE<\/a><\/p><p><a href=\"#confi-jenkins\">Configuraci\u00f3n Jenkins<\/a><\/p><p><a href=\"#confi-prome\">Configuraci\u00f3n Prometheus<\/a><\/p><p><a href=\"#confi-grafa\">Configuraci\u00f3n Grafana<\/a><\/p><p><a href=\"#despli-infra\">Despliegue de la infraestructura<\/a><\/p><p><a href=\"#job\">Job de prueba<\/a><\/p><p><a href=\"#ejec-end\">Ejecuci\u00f3n end to end<\/a><\/p><p><a href=\"#escala\">Escalabilidad de la soluci\u00f3n<\/a><\/p><p><a href=\"#monito\">Monitorizaci\u00f3n de la plataforma<\/a><\/p><p><a href=\"#elimina\">Eliminaci\u00f3n de recursos<\/a><\/p><p><a href=\"#conclusion\">Conclusi\u00f3n<\/a><\/p><p><a href=\"#autor\">Autor<\/a><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-09395a3 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"09395a3\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2ba3c08\" data-id=\"2ba3c08\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-f18d1b8 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"f18d1b8\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-b490454\" data-id=\"b490454\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a76f07c elementor-widget elementor-widget-heading\" data-id=\"a76f07c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h5 class=\"elementor-heading-title elementor-size-default\">\u00bfQuieres saber m\u00e1s de lo que ofrecemos y ver otros casos de \u00e9xito?<\/h5>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7365ecc elementor-align-center elementor-widget elementor-widget-button\" data-id=\"7365ecc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"\/es\/\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">DESCUBRE BLUETAB<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-7a7e9b1 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"7a7e9b1\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-0225831\" data-id=\"0225831\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap\">\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-816937f\" data-id=\"816937f\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-756365e elementor-share-buttons--view-icon elementor-share-buttons--skin-minimal elementor-share-buttons--shape-circle elementor-grid-0 elementor-share-buttons--color-official elementor-widget elementor-widget-share-buttons\" data-id=\"756365e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"share-buttons.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-grid\" role=\"list\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-grid-item\" role=\"listitem\">\n\t\t\t\t\t\t<div class=\"elementor-share-btn elementor-share-btn_twitter\" role=\"button\" tabindex=\"0\" aria-label=\"Share on twitter\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-share-btn__icon\">\n\t\t\t\t\t\t\t\t<i class=\"fab fa-twitter\" aria-hidden=\"true\"><\/i>\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-grid-item\" role=\"listitem\">\n\t\t\t\t\t\t<div class=\"elementor-share-btn elementor-share-btn_linkedin\" role=\"button\" tabindex=\"0\" aria-label=\"Share on linkedin\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-share-btn__icon\">\n\t\t\t\t\t\t\t\t<i class=\"fab fa-linkedin\" aria-hidden=\"true\"><\/i>\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-92da4e0 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"92da4e0\" data-element_type=\"section\" data-e-type=\"section\" id=\"autor\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-873c04e\" data-id=\"873c04e\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2c534ae elementor-position-left elementor-vertical-align-middle elementor-widget elementor-widget-image-box\" data-id=\"2c534ae\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image-box.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"elementor-image-box-wrapper\"><figure class=\"elementor-image-box-img\"><img decoding=\"async\" width=\"150\" height=\"150\" data-src=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/lucas-150x150.png\" class=\"attachment-thumbnail size-thumbnail wp-image-12198 lazyload\" alt=\"\" data-srcset=\"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/lucas-150x150.png 150w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/lucas-300x300.png 300w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/lucas-768x768.png 768w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/lucas-75x75.png 75w, https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/lucas.png 888w\" data-sizes=\"(max-width: 150px) 100vw, 150px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 150px; --smush-placeholder-aspect-ratio: 150\/150;\" \/><\/figure><div class=\"elementor-image-box-content\"><h4 class=\"elementor-image-box-title\">Lucas Calvo Berlanga<\/h4><p class=\"elementor-image-box-description\">Cloud Engineer<\/p><\/div><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-8a3a205\" data-id=\"8a3a205\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap\">\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-e6097d2 elementor-section-full_width elementor-section-height-default elementor-section-height-default\" data-id=\"e6097d2\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-a66a650\" data-id=\"a66a650\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-38e61b8 elementor-widget elementor-widget-text-editor\" data-id=\"38e61b8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><b>SOLUCIONES, <\/b>SOMOS EXPERTOS<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-9975abb elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"9975abb\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-e5edefb\" data-id=\"e5edefb\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-0628f91 elementor-cta--skin-cover elementor-cta--valign-middle elementor-animated-content elementor-bg-transform elementor-bg-transform-zoom-in elementor-widget elementor-widget-call-to-action\" data-id=\"0628f91\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"call-to-action.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<a class=\"elementor-cta\" href=\"\/es\/soluciones\/data-strategy\/\">\n\t\t\t\t\t<div class=\"elementor-cta__bg-wrapper\">\n\t\t\t\t<div class=\"elementor-cta__bg elementor-bg lazyload\" style=\"background-image:inherit;\" role=\"img\" aria-label=\"strategy-opt\" data-bg-image=\"url(https:\/\/bluetab.co.uk\/wp-content\/uploads\/2020\/10\/strategy-opt.jpg)\"><\/div>\n\t\t\t\t<div class=\"elementor-cta__bg-overlay\"><\/div>\n\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-cta__content\">\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<h5 class=\"elementor-cta__title elementor-cta__content-item elementor-content-item elementor-animated-item--grow\">\n\t\t\t\t\t\tDATA STRATEGY\t\t\t\t\t<\/h5>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-8724c63\" data-id=\"8724c63\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-bc8b25d elementor-cta--skin-cover elementor-cta--valign-middle elementor-animated-content elementor-bg-transform elementor-bg-transform-zoom-in elementor-widget elementor-widget-call-to-action\" data-id=\"bc8b25d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"call-to-action.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<a class=\"elementor-cta\" href=\"\/es\/soluciones\/data-fabric\/\">\n\t\t\t\t\t<div class=\"elementor-cta__bg-wrapper\">\n\t\t\t\t<div class=\"elementor-cta__bg elementor-bg lazyload\" style=\"background-image:inherit;\" role=\"img\" aria-label=\"fabric-opt\" data-bg-image=\"url(https:\/\/bluetab.co.uk\/wp-content\/uploads\/2020\/10\/fabric-opt.jpg)\"><\/div>\n\t\t\t\t<div class=\"elementor-cta__bg-overlay\"><\/div>\n\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-cta__content\">\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<h5 class=\"elementor-cta__title elementor-cta__content-item elementor-content-item elementor-animated-item--grow\">\n\t\t\t\t\t\tDATA FABRIC\t\t\t\t\t<\/h5>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-inner-column elementor-element elementor-element-ddc996d\" data-id=\"ddc996d\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-1d384cf elementor-cta--skin-cover elementor-cta--valign-middle elementor-animated-content elementor-bg-transform elementor-bg-transform-zoom-in elementor-widget elementor-widget-call-to-action\" data-id=\"1d384cf\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"call-to-action.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<a class=\"elementor-cta\" href=\"\/es\/soluciones\/augmented-analytics\/\">\n\t\t\t\t\t<div class=\"elementor-cta__bg-wrapper\">\n\t\t\t\t<div class=\"elementor-cta__bg elementor-bg lazyload\" style=\"background-image:inherit;\" role=\"img\" aria-label=\"AUGMENTED-ANALYTICS-opt\" data-bg-image=\"url(https:\/\/bluetab.co.uk\/wp-content\/uploads\/2020\/10\/AUGMENTED-ANALYTICS-opt.jpg)\"><\/div>\n\t\t\t\t<div class=\"elementor-cta__bg-overlay\"><\/div>\n\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-cta__content\">\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<h5 class=\"elementor-cta__title elementor-cta__content-item elementor-content-item elementor-animated-item--grow\">\n\t\t\t\t\t\tAUGMENTED ANALYTICS\t\t\t\t\t<\/h5>\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-f61bae8\" data-id=\"f61bae8\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-f3fe106 elementor-widget elementor-widget-text-editor\" data-id=\"f3fe106\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Te puede interesar<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Desplegando una plataforma CI\/CD escalable con Jenkins y Kubernetes Lucas Calvo Berlanga Cloud Engineer Share on twitter Share on linkedin En este art\u00edculo de la&nbsp;pr\u00e1ctica cloud&nbsp;veremos c\u00f3mo crear una plataforma de CI\/CD de una forma totalmente automatizada. Para ello nos apoyaremos en una metodolog\u00eda GitOps para as\u00ed realizar nuestros despliegues de una forma m\u00e1s sencilla, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":17840,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"elementor_header_footer","format":"standard","meta":{"inline_featured_image":false,"_uag_custom_page_level_css":"","_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"content-sidebar","footnotes":""},"categories":[19,668,633],"tags":[],"class_list":{"0":"post-12241","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-blog","8":"category-practices-en","9":"category-tech-en","10":"entry"},"uagb_featured_image_src":{"full":["https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/12.png",1200,600,false],"thumbnail":["https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/12-150x150.png",150,150,true],"medium":["https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/12-300x150.png",300,150,true],"medium_large":["https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/12-768x384.png",768,384,true],"large":["https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/12-1024x512.png",1024,512,true],"1536x1536":["https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/12.png",1200,600,false],"2048x2048":["https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/12.png",1200,600,false],"sidebar-featured":["https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/12-75x75.png",75,75,true],"genesis-singular-images":["https:\/\/bluetab.co.uk\/wp-content\/uploads\/2021\/09\/12-702x526.png",702,526,true]},"uagb_author_info":{"display_name":"Bluetab","author_link":"https:\/\/bluetab.co.uk\/en\/author\/user\/"},"uagb_comment_info":0,"uagb_excerpt":"Desplegando una plataforma CI\/CD escalable con Jenkins y Kubernetes Lucas Calvo Berlanga Cloud Engineer Share on twitter Share on linkedin En este art\u00edculo de la&nbsp;pr\u00e1ctica cloud&nbsp;veremos c\u00f3mo crear una plataforma de CI\/CD de una forma totalmente automatizada. Para ello nos apoyaremos en una metodolog\u00eda GitOps para as\u00ed realizar nuestros despliegues de una forma m\u00e1s sencilla,&hellip;","_links":{"self":[{"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/posts\/12241","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/comments?post=12241"}],"version-history":[{"count":1,"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/posts\/12241\/revisions"}],"predecessor-version":[{"id":12242,"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/posts\/12241\/revisions\/12242"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/media\/17840"}],"wp:attachment":[{"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/media?parent=12241"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/categories?post=12241"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/tags?post=12241"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}