{"id":4535,"date":"2020-09-14T14:20:09","date_gmt":"2020-09-14T14:20:09","guid":{"rendered":"https:\/\/bluetab.net\/?p=4535"},"modified":"2020-09-14T14:20:09","modified_gmt":"2020-09-14T14:20:09","slug":"espiando-a-tu-kubernetes-con-kubewath","status":"publish","type":"post","link":"https:\/\/bluetab.co.uk\/en\/2020\/09\/espiando-a-tu-kubernetes-con-kubewath\/","title":{"rendered":"Espiando a tu kubernetes con kubewatch"},"content":{"rendered":"<h1>Espiando a tu Kubernetes con Kubewatch<\/h1>\n<figure><a href=\"https:\/\/www.linkedin.com\/company\/bluetab-solutions\/?viewAsMember=true\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" width=\"300\" height=\"300\" src=\"https:\/\/bluetab.net\/wp-content\/uploads\/2020\/10\/avatarP-bluetab.jpg.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/bluetab.net\/wp-content\/uploads\/2020\/10\/avatarP-bluetab.jpg.png 300w, https:\/\/bluetab.net\/wp-content\/uploads\/2020\/10\/avatarP-bluetab.jpg-150x150.png 150w, https:\/\/bluetab.net\/wp-content\/uploads\/2020\/10\/avatarP-bluetab.jpg-75x75.png 75w\" sizes=\"(max-width: 300px) 100vw, 300px\"><\/a><\/figure>\n<h4><a href=\"https:\/\/www.linkedin.com\/company\/bluetab-solutions\/?viewAsMember=true\" target=\"_blank\" rel=\"noopener\">Bluetab<\/a><\/h4>\n<p>Share on twitter<br \/>\nShare on linkedin<\/p>\n<p>Desde la&nbsp;<strong>Pr\u00e1ctica Cloud<\/strong>&nbsp;queremos impulsar la adopci\u00f3n de la nube como forma de trabajo en el mundo de IT. Para ayudar en esta tarea, vamos a publicar multitud de art\u00edculos de buenas pr\u00e1cticas y casos de uso, otros hablar\u00e1n aquellos servicios clave dentro de la nube.<\/p>\n<p>En esta ocasi\u00f3n hablaremos de&nbsp;<strong>Kubewatch<\/strong>.<\/p>\n<h2>\u00bfQu\u00e9 es Kubewath?<\/h2>\n<p>Kubewatch es una utilidad desarrollada por&nbsp;<strong>Bitnami Labs<\/strong>&nbsp;que permite el env\u00edo de notificaciones a distintos sistemas de comunicaci\u00f3n.<\/p>\n<p>Los webhooks soportados son:<\/p>\n<ul>\n<li><em>Slack<\/em><\/li>\n<li><em>Hipchat<\/em><\/li>\n<li><em>Mattermost<\/em><\/li>\n<li><em>Flock<\/em><\/li>\n<li><em>Webhook<\/em><\/li>\n<li><em>Smtp<\/em><\/li>\n<\/ul>\n<h3>Integraci\u00f3n de kubewatch con Slack<\/h3>\n<p>Las im\u00e1genes disponibles est\u00e1n publicadas en el GitHub de&nbsp;<a href=\"https:\/\/hub.docker.com\/r\/bitnami\/kubewatch\">bitnami\/kubewatch<\/a><\/p>\n<p>Si quer\u00e9is, pod\u00e9is descargaros la \u00faltima versi\u00f3n para probarla en vuestro entorno local:<\/p>\n<pre><code class=\"language-python\">$ docker pull bitnami\/kubewatch <\/code><\/pre>\n<p>Una vez dentro del contenedor pod\u00e9is jugar con las opciones:<\/p>\n<pre><code class=\"language-python\">$ kubewatch -h\nKubewatch: A watcher for Kubernetes\nkubewatch is a Kubernetes watcher that publishes notifications\nto Slack\/hipchat\/mattermost\/flock channels. It watches the cluster\nfor resource changes and notifies them through webhooks.\nsupported webhooks:\n - slack\n - hipchat\n - mattermost\n - flock\n - webhook\n - smtp\nUsage:\n  kubewatch [flags]\n  kubewatch [command]\nAvailable Commands:\n  config      modify kubewatch configuration\n  resource    manage resources to be watched\n  version     print version\nFlags:\n  -h, --help   help for kubewatch\nUse \"kubewatch [command] --help\" for more information about a command. <\/code><\/pre>\n<h3>\u00bfDe qu\u00e9 tipos de recursos podemos obtener notificaciones?<\/h3>\n<ul>\n<li><a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/deployment\/\">Deployments<\/a><\/li>\n<li><a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/replicationcontroller\/\">Replication controllers<\/a><\/li>\n<li><a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/replicaset\/\">ReplicaSets<\/a><\/li>\n<li><a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/daemonset\/\">DaemonSets<\/a><\/li>\n<li><a href=\"https:\/\/kubernetes.io\/docs\/concepts\/services-networking\/service\/\">Services<\/a><\/li>\n<li><a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/pods\/pod\/\">Pods<\/a><\/li>\n<li><a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/job\/\">Jobs<\/a><\/li>\n<li><a href=\"https:\/\/kubernetes.io\/docs\/concepts\/configuration\/secret\/\">Secrets<\/a><\/li>\n<li><a href=\"https:\/\/kubernetes.io\/docs\/tasks\/configure-pod-container\/configure-pod-configmap\/\">Config<\/a><a href=\"https:\/\/kubernetes.io\/docs\/tasks\/configure-pod-container\/configure-pod-configmap\/\">M<\/a><a href=\"https:\/\/kubernetes.io\/docs\/tasks\/configure-pod-container\/configure-pod-configmap\/\">aps<\/a><\/li>\n<li><a href=\"https:\/\/kubernetes.io\/docs\/concepts\/storage\/persistent-volumes\/\">Persiste<\/a><a href=\"https:\/\/kubernetes.io\/docs\/concepts\/storage\/persistent-volumes\/\">nt<\/a>&nbsp;<a href=\"https:\/\/kubernetes.io\/docs\/concepts\/storage\/persistent-volumes\/\">volum<\/a><a href=\"https:\/\/kubernetes.io\/docs\/concepts\/storage\/persistent-volumes\/\">es<\/a><\/li>\n<li><a href=\"https:\/\/kubernetes.io\/docs\/concepts\/overview\/working-with-objects\/namespaces\/\">Namespaces<\/a><\/li>\n<li><a href=\"https:\/\/kubernetes.io\/docs\/concepts\/services-networking\/ingress-controllers\/\">Ingress controllers<\/a><\/li>\n<\/ul>\n<h3>\u00bfCu\u00e1ndo recibiremos una notificaci\u00f3n?<\/h3>\n<p>En cuanto haya una acci\u00f3n sobre alg\u00fan objeto de kubernetes, as\u00ed como creaci\u00f3n, destrucci\u00f3n o actualizaci\u00f3n.<\/p>\n<h3>Configuraci\u00f3n<\/h3>\n<p>En primer lugar, crearemos un canal de slack y le asociaremos un webhook. Para ello, iremos a la secci\u00f3n de Apps de Slack, buscaremos \u201c<strong>Incoming WebHooks<\/strong>\u201d y pulsaremos \u201cAdd to Slack\u201d:<\/p>\n<p><img decoding=\"async\" width=\"1024\" height=\"378\" src=\"https:\/\/bluetab.net\/wp-content\/uploads\/2020\/09\/slack_add_incoming_webhooks-1024x378.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/bluetab.net\/wp-content\/uploads\/2020\/09\/slack_add_incoming_webhooks-1024x378.png 1024w, https:\/\/bluetab.net\/wp-content\/uploads\/2020\/09\/slack_add_incoming_webhooks-300x111.png 300w, https:\/\/bluetab.net\/wp-content\/uploads\/2020\/09\/slack_add_incoming_webhooks-768x284.png 768w, https:\/\/bluetab.net\/wp-content\/uploads\/2020\/09\/slack_add_incoming_webhooks.png 1381w\" sizes=\"(max-width: 1024px) 100vw, 1024px\"><\/p>\n<p>En el caso de no tener a\u00fan un canal creado para este prop\u00f3sito daremos de alta uno nuevo:<\/p>\n<p><img decoding=\"async\" width=\"551\" height=\"540\" src=\"https:\/\/bluetab.net\/wp-content\/uploads\/2020\/09\/slack_create_channel.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/bluetab.net\/wp-content\/uploads\/2020\/09\/slack_create_channel.png 551w, https:\/\/bluetab.net\/wp-content\/uploads\/2020\/09\/slack_create_channel-300x294.png 300w, https:\/\/bluetab.net\/wp-content\/uploads\/2020\/09\/slack_create_channel-75x75.png 75w\" sizes=\"(max-width: 551px) 100vw, 551px\"><\/p>\n<p>En este ejemplo, el canal a crear se llamar\u00e1&nbsp;<strong>\u201ck8s-notifications\u201d<\/strong>. Posteriormente debemos configurar el webhook, yendo para ello al panel de \u201cIncoming WebHooks\u201d y a\u00f1adiendo una nueva configuraci\u00f3n donde tendremos que seleccionar el nombre del canal al que queremos enviar notificaciones. Una vez seleccionado, la configuraci\u00f3n nos devolver\u00e1 una&nbsp;<strong>\u00abWebhook URL\u00bb<\/strong>&nbsp;que ser\u00e1 la que utilicemos para configurar Kubewatch. Opcionalmente, tenemos la posibilidad de seleccionar el icono (opci\u00f3n&nbsp;<strong>\u00abCustomize Icon\u00bb<\/strong>) con el que visualizaremos la recepci\u00f3n de eventos y el nombre con el que llegar\u00e1n (opci\u00f3n&nbsp;<strong>\u201cCustomize Name\u201d<\/strong>).<\/p>\n<p><img decoding=\"async\" width=\"1024\" height=\"654\" src=\"https:\/\/bluetab.net\/wp-content\/uploads\/2020\/09\/slack_configure_webhook-1024x654.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/bluetab.net\/wp-content\/uploads\/2020\/09\/slack_configure_webhook-1024x654.png 1024w, https:\/\/bluetab.net\/wp-content\/uploads\/2020\/09\/slack_configure_webhook-300x192.png 300w, https:\/\/bluetab.net\/wp-content\/uploads\/2020\/09\/slack_configure_webhook-768x491.png 768w, https:\/\/bluetab.net\/wp-content\/uploads\/2020\/09\/slack_configure_webhook.png 1387w\" sizes=\"(max-width: 1024px) 100vw, 1024px\"><\/p>\n<p>En este punto ya estamos listos para configurar los recursos de kubernetes. En el&nbsp;<a href=\"https:\/\/github.com\/bitnami-labs\/kubewatch\">GitHub de Kubewatch<\/a>&nbsp;tenemos algunos ejemplos de manifiestos y tambi\u00e9n la opci\u00f3n de instalaci\u00f3n por&nbsp;<a href=\"https:\/\/helm.sh\/docs\/intro\/install\/\">Helm<\/a>. Sin embargo, aqu\u00ed construiremos los nuestros propios.<\/p>\n<p>En primer lugar, crearemos un fichero \u201ckubewatch-configmap.yml\u201d con el ConfigMap que servir\u00e1 para configurar el contenedor de kubewatch:<\/p>\n<pre><code class=\"language-python\">apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: kubewatch\ndata:\n  .kubewatch.yaml: |\n    handler:\n      webhook:\n        url: https:\/\/hooks.slack.com\/services\/&lt;your_webhook&gt;\n    resource:\n      deployment: true\n      replicationcontroller: true\n      replicaset: false\n      daemonset: true\n      services: true\n      pod: false\n      job: false\n      secret: true\n      configmap: true\n      persistentvolume: true\n      namespace: false <\/code><\/pre>\n<p>Simplemente tendremos que activar con&nbsp;<strong>\u201ctrue\u201d<\/strong>&nbsp;o desactivar con&nbsp;<strong>\u00abfalse\u00bb<\/strong>&nbsp;los tipos de recursos sobre los que queremos recibir notificaciones. Asimismo, establecemos la url del Incomming Webhook que dimos de alta previamente.<\/p>\n<p>Ahora, para que nuestro contenedor tenga acceso a los recursos de kubernetes a trav\u00e9s de su&nbsp;<a href=\"https:\/\/kubernetes.io\/docs\/concepts\/overview\/kubernetes-api\/\">api<\/a>&nbsp;vamos a dar de alta el fichero&nbsp;<strong>\u201ckubewatch-service-account.yml\u201d<\/strong>&nbsp;con un Service Account, un Cluster Role y un Cluster Role Binding:<\/p>\n<pre><code class=\"language-python\">kind: ClusterRole\napiVersion: rbac.authorization.k8s.io\/v1\nmetadata:\n  name: kubewatch\nrules:\n- apiGroups: [\"*\"]\n  resources: [\"pods\", \"pods\/exec\", \"replicationcontrollers\", \"namespaces\", \"deployments\", \"deployments\/scale\", \"services\", \"daemonsets\", \"secrets\", \"replicasets\", \"persistentvolumes\"]\n  verbs: [\"get\", \"watch\", \"list\"]\n---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: kubewatch\n  namespace: default\n---\napiVersion: rbac.authorization.k8s.io\/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: kubewatch\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: kubewatch\nsubjects:\n  - kind: ServiceAccount\n    name: kubewatch\n    namespace: default <\/code><\/pre>\n<p>Por \u00faltimo, crearemos un fichero&nbsp;<strong>\u201ckubewatch.yml\u201d<\/strong>&nbsp;para desplegar la aplicaci\u00f3n:<\/p>\n<pre><code class=\"language-python\">apiVersion: v1\nkind: Pod\nmetadata:\n  name: kubewatch\n  namespace: default\nspec:\n  serviceAccountName: kubewatch\n  containers:\n  - image: bitnami\/kubewatch:0.0.4\n    imagePullPolicy: Always\n    name: kubewatch\n    envFrom:\n      - configMapRef:\n          name: kubewatch\n    volumeMounts:\n    - name: config-volume\n      mountPath: \/opt\/bitnami\/kubewatch\/.kubewatch.yaml\n      subPath: .kubewatch.yaml\n  - image: bitnami\/kubectl:1.16.3\n    args:\n      - proxy\n      - \"-p\"\n      - \"8080\"\n    name: proxy\n    imagePullPolicy: Always\n  restartPolicy: Always\n  volumes:\n  - name: config-volume\n    configMap:\n      name: kubewatch\n      defaultMode: 0755 <\/code><\/pre>\n<p>Vemos que el valor de la clave \u201c<strong>mountPath<\/strong>\u201d ser\u00e1 la ruta del fichero donde se escribir\u00e1 la configuraci\u00f3n de nuestro ConfigMap dentro del contenedor (<strong>\/opt\/bitnami\/kubewatch\/.kubewatch.yaml<\/strong>). Podemos ampliar&nbsp;<a href=\"https:\/\/kubernetes.io\/docs\/tasks\/configure-pod-container\/configure-pod-configmap\/\">aqu\u00ed<\/a>&nbsp;la informaci\u00f3n sobre c\u00f3mo montar configuraciones en kubernetes. En este ejemplo, vemos que nuestro despliegue del aplicativo ser\u00e1 a trav\u00e9s de un \u00fanico pod. Evidentemente, en un sistema productivo tendr\u00edamos que definir un Deployment con el n\u00famero de r\u00e9plicas que consideremos convenientes para tenerlo as\u00ed siempre activo, aun en caso de p\u00e9rdida del pod.<\/p>\n<p>Una vez listos los manifiestos vamos a&nbsp;<a href=\"https:\/\/kubectl.docs.kubernetes.io\/pages\/app_management\/apply.html\">aplicarlos<\/a>&nbsp;a nuestro cl\u00faster:<\/p>\n<pre><code class=\"language-python\">$ kubectl apply  -f kubewatch-configmap.yml -f kubewatch-service-account.yml -f kubewatch.yml <\/code><\/pre>\n<p>En unos pocos segundos tendremos listo el servicio:<\/p>\n<pre><code class=\"language-python\">$ kubectl get pods |grep -w kubewatch\nkubewatch                                  2\/2     Running     0          1m <\/code><\/pre>\n<p>El pod de kubewatch tiene asociado dos contenedores:&nbsp;<strong>kubewatch<\/strong>&nbsp;y&nbsp;<strong>kube-proxy<\/strong>, este \u00faltimo para atacar a la API.<\/p>\n<pre><code class=\"language-python\">$   kubectl get pod kubewatch  -o jsonpath='{.spec.containers[*].name}'\nkubewatch proxy <\/code><\/pre>\n<p>Verificamos a trav\u00e9s de los logs que ambos contenedores han levantado correctamente y sin mensajes de error:<\/p>\n<pre><code class=\"language-python\">$ kubectl logs kubewatch kubewatch\n==&gt; Config file exists...\nlevel=info msg=\"Starting kubewatch controller\" pkg=kubewatch-daemonset\nlevel=info msg=\"Starting kubewatch controller\" pkg=kubewatch-service\nlevel=info msg=\"Starting kubewatch controller\" pkg=\"kubewatch-replication controller\"\nlevel=info msg=\"Starting kubewatch controller\" pkg=\"kubewatch-persistent volume\"\nlevel=info msg=\"Starting kubewatch controller\" pkg=kubewatch-secret\nlevel=info msg=\"Starting kubewatch controller\" pkg=kubewatch-deployment\nlevel=info msg=\"Starting kubewatch controller\" pkg=kubewatch-namespace\n... <\/code><\/pre>\n<pre><code class=\"language-python\">$ kubectl logs kubewatch proxy\nStarting to serve on 127.0.0.1:8080 <\/code><\/pre>\n<p>Podr\u00edamos igualmente acceder al contenedor de kubewatch para probar la cli, ver la configuraci\u00f3n, etc\u00e9tera:<\/p>\n<pre><code class=\"language-python\">$  kubectl exec -it kubewatch -c kubewatch \/bin\/bash <\/code><\/pre>\n<h3>\u00a1Ya tenemos listo nuestro notificador de eventos!<\/h3>\n<p>Ahora toca probar. Utilizaremos, por ejemplo, la creaci\u00f3n de un deployment para testear el correcto funcionamiento:<\/p>\n<pre><code class=\"language-python\">$ kubectl create deployment nginx-testing --image=nginx\n$ kubectl logs -f  kubewatch kubewatch\nlevel=info msg=\"Processing update to deployment: default\/nginx-testing\" pkg=kubewatch-deployment <\/code><\/pre>\n<p>Los logs ya nos avisan que se ha detectado el nuevo evento, as\u00ed que vamos a nuestro canal de slack para verificarlo:<\/p>\n<p><img decoding=\"async\" width=\"1024\" height=\"89\" src=\"https:\/\/bluetab.net\/wp-content\/uploads\/2020\/09\/slack_show_notification-1024x89.png\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/bluetab.net\/wp-content\/uploads\/2020\/09\/slack_show_notification-1024x89.png 1024w, https:\/\/bluetab.net\/wp-content\/uploads\/2020\/09\/slack_show_notification-300x26.png 300w, https:\/\/bluetab.net\/wp-content\/uploads\/2020\/09\/slack_show_notification-768x67.png 768w, https:\/\/bluetab.net\/wp-content\/uploads\/2020\/09\/slack_show_notification-1536x134.png 1536w, https:\/\/bluetab.net\/wp-content\/uploads\/2020\/09\/slack_show_notification.png 1546w\" sizes=\"(max-width: 1024px) 100vw, 1024px\"><\/p>\n<h3>\u00a1El evento ha sido notificado correctamente!<\/h3>\n<p>Ya podemos eliminar el deployment de prueba:<\/p>\n<pre><code class=\"language-python\">$ kubectl delete deploy nginx-testing <\/code><\/pre>\n<h3>Conclusiones<\/h3>\n<p>Evidentemente, Kubewatch no suple a los sistemas b\u00e1sicos de alerta y monitorizaci\u00f3n que todo orquestador productivo debe mantener, pero nos proporciona una manera f\u00e1cil y eficaz de&nbsp;<strong>ampliar nuestro control<\/strong>&nbsp;sobre la creaci\u00f3n y modificaci\u00f3n de los&nbsp;<strong>recursos en kubernetes<\/strong>. En este caso de ejemplo, hemos realizado una configuraci\u00f3n de kubewatch transversal a todo el cl\u00faster,&nbsp;<strong>\u201cespiando\u201d<\/strong>&nbsp;todo tipo de eventos, algunos quiz\u00e1 inservibles si mantenemos una plataforma como servicio, pues nos enterar\u00edamos de cada uno de los pods creados, eliminados o actualizados por cada equipo de desarrollo en su propio namespace, lo cual es usual, leg\u00edtimo y no aporta valor. Quiz\u00e1 sea m\u00e1s conveniente&nbsp;<strong>filtrar<\/strong>&nbsp;por los namespaces sobre cual queremos recibir notificaciones, como por ejemplo de&nbsp;<a href=\"https:\/\/kubernetes.io\/docs\/concepts\/overview\/working-with-objects\/namespaces\/\">kube-system<\/a>, que es donde albergaremos generalmente nuestros servicios administrativos y donde solo los administradores deben tener acceso. En ese caso, simplemente tendremos que especificar el&nbsp;<strong>namespace<\/strong>&nbsp;en nuestro ConfigMap:<\/p>\n<pre><code class=\"language-python\">apiVersion: v1\nkind: ConfigMap\nmetadata:\n  name: kubewatch\ndata:\n  .kubewatch.yaml: |\n    namespace: \"kube-system\"\n    handler:\n      webhook:\n        url: https:\/\/hooks.slack.com\/services\/&lt;your_webhook&gt;\n    resource:\n      deployment: true\n      replicationcontroller: true\n      replicaset: false <\/code><\/pre>\n<p>Otra utilidad interesante puede ser \u201cescuchar\u201d a nuestro cl\u00faster tras un&nbsp;<strong>ajuste signicativo de la configuraci\u00f3n<\/strong>&nbsp;como, por ejemplo, de nuestra estrategia de&nbsp;<strong>autoescalado<\/strong>, herramientas de integraci\u00f3n, etc\u00e9tera, pues siempre nos notificar\u00e1 los scale up y scale down, pudiendo ser interesante sobre todo en un momento inicial. En definitiva, Kubewatch ampl\u00eda el control sobre los cl\u00fasteres, siendo nosotros quienes decidamos el alcance que le damos. En sucesivos art\u00edculos veremos c\u00f3mo gestionar los logs y las m\u00e9tricas de forma productiva.<\/p>\n<h5>\u00bfQuieres saber m\u00e1s de lo que ofrecemos y ver otros casos de \u00e9xito?<\/h5>\n<p><a href=\"\/\" role=\"button\"><br \/>\nDESCUBRE BLUETAB<br \/>\n<\/a><br \/>\nShare on twitter<br \/>\nShare on linkedin<\/p>\n<p><b>SOLUCIONES, <\/b>SOMOS EXPERTOS<\/p>\n<p><a href=\"\/soluciones\/data-strategy\/\"><\/a><\/p>\n<p><a href=\"\/soluciones\/data-strategy\/\"><\/p>\n<h5>\n\t\t\t\t\t\tDATA STRATEGY<\/h5>\n<p><\/a><a href=\"\/soluciones\/data-strategy\/\">\t\t\t\t\t\t<\/a><br \/>\n<a href=\"\/soluciones\/data-fabric\/\"><\/a><\/p>\n<p><a href=\"\/soluciones\/data-fabric\/\"><\/p>\n<h5>\n\t\t\t\t\t\tDATA FABRIC<\/h5>\n<p><\/a><a href=\"\/soluciones\/data-fabric\/\">\t\t\t\t\t\t<\/a><br \/>\n<a href=\"\/soluciones\/augmented-analytics\/\"><\/a><\/p>\n<p><a href=\"\/soluciones\/augmented-analytics\/\"><\/p>\n<h5>\n\t\t\t\t\t\tAUGMENTED ANALYTICS<\/h5>\n<p><\/a><a href=\"\/soluciones\/augmented-analytics\/\">\t\t\t\t\t\t<\/a><\/p>\n<p>Te puede interesar<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Espiando a tu Kubernetes con Kubewatch Bluetab Share on twitter Share on linkedin Desde la&nbsp;Pr\u00e1ctica Cloud&nbsp;queremos impulsar la adopci\u00f3n de la nube como forma de trabajo en el mundo de IT. Para ayudar en esta tarea, vamos a publicar multitud de art\u00edculos de buenas pr\u00e1cticas y casos de uso, otros hablar\u00e1n aquellos servicios clave dentro [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":20758,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"elementor_header_footer","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[7,8,9],"tags":[],"class_list":["post-4535","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog-es","category-practices","category-tech"],"acf":[],"jetpack_featured_media_url":"https:\/\/bluetab.co.uk\/wp-content\/uploads\/2020\/09\/enlaces-linkedin-2.png","_links":{"self":[{"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/posts\/4535","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\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/comments?post=4535"}],"version-history":[{"count":0,"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/posts\/4535\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/media\/20758"}],"wp:attachment":[{"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/media?parent=4535"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/categories?post=4535"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bluetab.co.uk\/en\/wp-json\/wp\/v2\/tags?post=4535"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}