{"id":2115,"date":"2021-01-05T12:42:20","date_gmt":"2021-01-05T11:42:20","guid":{"rendered":"https:\/\/geko2.factoryfy.com\/es\/?p=3313"},"modified":"2021-11-04T09:35:37","modified_gmt":"2021-11-04T08:35:37","slug":"kubectl-plugins","status":"publish","type":"post","link":"https:\/\/geko.cloud\/es\/kubectl-plugins\/","title":{"rendered":"Kubectl Plugins en solo 3 pasos"},"content":{"rendered":"<div style=\"display: none;\"><\/div>\n<div style=\"display: none;\"><\/div>\n<div style=\"display: none;\"><\/div>\n<h2>Introducci\u00f3n<\/h2>\n<p class=\"aLF-aPX-K0-aPE\">Muchas veces para realizar nuestras tareas diarias nos vemos en la situaci\u00f3n de tener que crear herramientas propias para resolver problemas o situaciones a medida. En esta entrada voy a mostrar lo f\u00e1cil que es y c\u00f3mo podemos crear un <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/extend-kubectl\/kubectl-plugins\/\">plugin para kubectl<\/a>.<\/p>\n<p class=\"aLF-aPX-K0-aPE\">Un<strong> plugin<\/strong> es simplemente un programa ejecutable que permite extender la funcionalidad de <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-kubectl\/\">kubectl<\/a>, permitiendonos implementar nuestros propios subcomandos. Es importante mencionar que podemos hacerlo en el lenguaje que m\u00e1s nos guste: Bash, Python, Go, etc&#8230;<\/p>\n<h3>\u00bfQu\u00e9 necesitamos?<\/h3>\n<p class=\"aLF-aPX-K0-aPE\">Existen ciertas condiciones que debemos cumplir para que nuestro <strong>plugin<\/strong> funcione:<\/p>\n<ol>\n<li class=\"aLF-aPX-K0-aPE\">El nombre del archivo debe comenzar con \u00abkubectl-\u00bb y no debe contener extensi\u00f3n.<\/li>\n<li class=\"aLF-aPX-K0-aPE\">El archivo debe ser ejecutable.<\/li>\n<li class=\"aLF-aPX-K0-aPE\">Debe encontrarse ubicado en nuestro <strong>PATH<\/strong><\/li>\n<\/ol>\n<p>Y esta es toda la instalaci\u00f3n que requerir\u00e1. Simple, \u00bfno?<\/p>\n<p class=\"aLF-aPX-K0-aPE\">Podemos ver qu\u00e9<strong>\u00a0plugins<\/strong> tenemos disponibles utilizando:<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">kubectl plugin list<\/pre>\n<\/div>\n<p class=\"aLF-aPX-K0-aPE\">Este comando buscar\u00e1 dentro de <strong>PATH<\/strong> todos los archivos ejecutables que cumplan con el nombre requerido.<\/p>\n<h2>\u00a1Manos a la obra!<\/h2>\n<h3>Creamos un entorno\u00a0 de pruebas<\/h3>\n<p class=\"aLF-aPX-K0-aPE\">Hagamos un simple <strong>plugin<\/strong>, m\u00e1s entretenido que el trivial \u00abHola Mundo!\u00bb, que env\u00ede los logs de todos pods corriendo a una salida \u00fanica para poder visualizar dicha salida de manera conjunta. Para hacerlo m\u00e1s entretenido agregaremos el nombre del pod colorido por cada l\u00ednea de log en el output. Y adem\u00e1s podremos seleccionar con las teclas num\u00e9ricas de 1 a N (donde N es el en\u00e9simo pod: 1 &lt; N &lt; 10 por simpleza), filtrar <em>on-the-fly<\/em> y ver solamente la salida de ese pod. \u00a1Y todo esto lo haremos en Bash!<\/p>\n<p class=\"aLF-aPX-K0-aPE\">Para esta demo vamos a usar una imagen de docker <a href=\"https:\/\/hub.docker.com\/r\/kscarlett\/nginx-log-generator\">nginx-log-generator<\/a> que genera fake-logs del <strong>Nginx<\/strong>. Primero crearemos un <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/deployment\/\">deployment de kubernetes<\/a> que contendra los pods. Creamos un nuevo archivo llamado fake-logs.yaml con el siguiente contenido:<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">apiVersion: apps\/v1\r\nkind: Deployment\r\nmetadata:\r\n  name: my-fake-logger\r\nspec:\r\n  template:\r\n    metadata:\r\n      name: logger-1\r\n      labels:\r\n        app: logger\r\n    spec:\r\n      containers:\r\n        - name: logger\r\n          image: kscarlett\/nginx-log-generator\r\n  replicas: 3\r\n  selector:\r\n    matchLabels:\r\n      app: logger<\/pre>\n<\/div>\n<p class=\"aLF-aPX-K0-aPE\">Y aplicamos el deployment:<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">kubectl create -f fake-logs.yaml\r\n<\/pre>\n<\/div>\n<p>Podemos comprobar que nuestros nuestro <em>deploy<\/em> esta funcionando:<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">$ kubectl get pods\r\nNAME                              READY   STATUS    RESTARTS   AGE\r\nmy-fake-logger-66dcffbccd-6kx8b   1\/1     Running   4          6d2h\r\nmy-fake-logger-66dcffbccd-7q4tm   1\/1     Running   1          3d1h\r\nmy-fake-logger-66dcffbccd-cff4s   1\/1     Running   1          3d1h\r\n\r\n$ kubectl get deploy\r\nNAME             READY   UP-TO-DATE   AVAILABLE   AGE\r\nmy-fake-logger   3\/3     3            3           6d2h\r\n\r\n<\/pre>\n<\/div>\n<h3 class=\"aLF-aPX-K0-aPE\">Creamos el plugin:<\/h3>\n<p><strong>Primero: <\/strong>Crearemos el archivo de nuestro<strong> plugin<\/strong> llamado <strong>kubectl-demo<\/strong> con el siguiente <em>script<\/em>.<\/p>\n<p>&nbsp;<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">#!\/bin\/bash\r\ntrap ctrl_c INT\r\nfunction ctrl_c() {\r\n  echo \"**************************************** Bye Bye ****************************************\"\r\n  for pid in ${PIDS[@]}\r\n  do\r\n      kill -TERM $pid \r\n  done\r\n  rm $NAMED_PIPE\r\n  rm $sync\r\n  exit 0\r\n}\r\n\r\nfunction colorize() {\r\n\r\n  pod=$1\r\n  counter=$2\r\n  # colors from 31 to 39\r\n  pre_colour=\"\\033[3${counter}m\"\r\n  post_colour=\"\\033[0m\"\r\n  if [ \"$colorize_output\" = true ]\r\n  then\r\n    colour_pod=\"${pre_colour}[${pod}]${post_colour}\"\r\n  else\r\n    colour_pod=\"[${pod}]\"\r\n  fi\r\n}\r\n\r\nfunction show_logs() {\r\n  local sync=\"$1\"\r\n  grep -E -f $sync $NAMED_PIPE &amp;\r\n}\r\n\r\nfunction banner() {\r\n  echo \"\"\r\n  echo \"===================================================\"\r\n  echo \"+ Showing logs for:\"\r\n  echo \"+ $1\"\r\n  echo \"===================================================\"\r\n  echo \"\"\r\n}\r\n\r\nfunction start_log() {\r\n  show_logs $sync \r\n  shl_pid=$!\r\n  disown $shl_pid\r\n  PIDS+=$shl_pid\" \"  \r\n}\r\n\r\nfunction usage() {\r\n  echo \"~~~~~~~~~~~\"\r\n  echo \" U S A G E\"\r\n  echo \"~~~~~~~~~~~\"\r\n  echo \"Usage: kubectl demo [option]\"\r\n  echo \"  options:\"\r\n  echo \"    --no-colorize: no colorize [default: colorize]\"\r\n  echo \"    -h: Show this help\"\r\n  echo \"\"\r\n  echo \"When running you can use the numbers 1 to N to filter N-pod and only show it's output.\"\r\n  echo \"0 resets and shows all outputs again\"\r\n  echo \"\"\r\n}\r\n\r\nNAMED_PIPE=\"\/tmp\/my_named_pipe\"\r\nPODS=$(kubectl get pods --no-headers=true -o=custom-columns=NAME:.metadata.name)\r\nTOTAL_PODS=$(echo $PODS | sed -s 's\/ \/n\/g' | wc -l)\r\ncolorize_output=true\r\n\r\nif [[ $@ ]]; then\r\n  case \"$@\" in\r\n    \"--no-colorize\")\r\n      colorize_output=false\r\n      ;;\r\n    \"-h\")\r\n      usage\r\n      exit 1\r\n      ;;\r\n    *) echo \"Invalid option\"\r\n      exit 1\r\n      ;;\r\n  esac\r\nfi\r\n\r\n\r\n# create named pipe\r\nif [ ! -p $NAMED_PIPE ]\r\nthen\r\n    mkfifo $NAMED_PIPE\r\n    chmod a+rw $NAMED_PIPE\r\nfi\r\n\r\nPIDS=()\r\ndeclare -A pods_index\r\ncounter=1\r\nfor pod in $(echo $PODS)\r\ndo\r\n  colour_pod=\"\"\r\n  colorize $pod $counter\r\n  kubectl logs -f $pod | awk -v pod_name=$colour_pod '{print pod_name\" \"$0}' &gt; $NAMED_PIPE &amp;\r\n  PIDS+=$!\" \" # save all PIDs\r\n  pods_index[$counter]=$pod\r\n  counter=$((counter+1))\r\ndone\r\n\r\n# Trick: Shared memory segment for inter process comunication. \r\nsync=\/dev\/shm\/syntest-$$  # allocate a shared memory segment name for this pid\r\necho '' &gt; $sync           # init the shm\r\n\r\nstart_log\r\ninput=\"*\"\r\nre='^[0-9]+$' # we match only numbers\r\n\r\nwhile true\r\ndo\r\n  read -t 0.25 -N 1 input\r\n  if  [[ $input =~ $re ]]  &amp;&amp; [ \"$input\" -ge \"0\" ] &amp;&amp; [ \"$input\" -le \"$TOTAL_PODS\" ]\r\n  then\r\n    if [ \"$input\" -eq \"0\" ]\r\n    then\r\n      banner \"All Pods\"\r\n      echo $ &gt; $sync    # grep everything\r\n    else\r\n      banner ${pods_index[$input]}\r\n      echo ${pods_index[$input]} &gt; $sync  # grep only pod name\r\n    fi\r\n    kill -SIGTERM $shl_pid\r\n    PIDS=$(echo $PID | sed -e \"s\/$shl_pid\/\/g\" | tr -s \" \")  # remove unused pid\r\n    start_log\r\n  fi\r\ndone\r\n<\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p><strong>Segundo:\u00a0<\/strong>Le daremos permisos de ejecuci\u00f3n.<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">chmod +x kubectl-demo\r\n<\/pre>\n<\/div>\n<p><strong>Tercero:\u00a0<\/strong>Y \u00faltimo paso, necesitamos que este accesible en nuestro <strong>PATH.<\/strong><\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">ln -s $PWD\/kubectl-demo \/usr\/local\/bin\/kubectl-demo<\/pre>\n<\/div>\n<p>A partir de ahora, y sin nada m\u00e1s que hacer, podemos hacer uso de nuestro reci\u00e9n creado <strong>plugin<\/strong>.<\/p>\n<p>Podemos comprobar que\u00a0<strong>kubectl<\/strong> est\u00e1 listo para usarlo listando los <strong>plugins<\/strong> que encuentra:<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">$ kubectl plugin list\r\nThe following compatible plugins are available:\r\n\r\n\/home\/user\/kubectl-demo<\/pre>\n<\/div>\n<h2>\u00a0\u00a1Pong\u00e1moslo a prueba!<\/h2>\n<p>Mostramos las opciones posibles:<\/p>\n<div class=\"wp-block-codemirror-blocks code-block\">\n<pre class=\"CodeMirror\" data-setting=\"{\">$ kubectl demo -h\r\n~~~~~~~~~~~\r\n U S A G E\r\n~~~~~~~~~~~\r\nUsage: kubectl demo [option]\r\n  options:\r\n    --no-colorize: no colorize [default: colorize]\r\n    -h: Show this help\r\n\r\nWhen running you can use the numbers 1 to N to filter N-pod and only show it's output.\r\n0 resets and shows all outputs again<\/pre>\n<\/div>\n<p>A modo de ejemplo de c\u00f3mo podemos pasar par\u00e1metros a nuestros sub-comandos, hemos agregado la opci\u00f3n para permitir no pintar el output.<\/p>\n<h2>Outputs<\/h2>\n<p>Default:<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">[my-fake-logger-66dcffbccd-7q4tm] 214.216.236.37--[02\/Jan\/2021:10:17:17+0000] \"GET\/moderator\/Reduced.cssHTTP\/1.1\"....\r\n[my-fake-logger-66dcffbccd-6kx8b] 132.56.98.34--[02\/Jan\/2021:10:19:22+0000] \"GET\/standardization.svgHTTP\/1.1\"2001908 \r\n[my-fake-logger-66dcffbccd-cff4s] 159.240.103.70--[02\/Jan\/2021:10:24:45+0000] \"GET\/Virtual.htmHTTP\/1.1\"2002288\"-\"....\r\n<\/pre>\n<\/div>\n<p>Podemos elegir que pod mostrar con los n\u00fameros del 1 a 3 en este caso:<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\"># 1\r\n===================================================\r\n+ Showing logs for:\r\n+ my-fake-logger-66dcffbccd-6kx8b\r\n===================================================\r\n[my-fake-logger-66dcffbccd-6kx8b]  16.211.208.91 - - [02\/Jan\/2021:10:34:33 +0000]  \"GET \/bottom-line%20Advanced\/Upgradable\/intermediate.svg HTTP\/1.1\" ....\r\n<\/pre>\n<\/div>\n<p>Y podemos resetear esta vista con el n\u00famero 0 y volver a tener todos los logs:<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">===================================================\r\n+ Showing logs for:\r\n+ All Pods\r\n===================================================\r\n[my-fake-logger-66dcffbccd-7q4tm] 214.216.236.37--[02\/Jan\/2021:10:17:17+0000] \"GET\/moderator\/Reduced.cssHTTP\/1.1\"30143\"-\"....\r\n[my-fake-logger-66dcffbccd-6kx8b]  16.211.208.91 - - ....\r\n<\/pre>\n<\/div>\n<p>Como vemos el script es simple y te invito a que pruebes todas sus opciones, modifiques a tu gusto y extiendas su funcionalidad.<\/p>\n<h2>Conclusi\u00f3n:<\/h2>\n<p>Hemos visto que es sumamente sencillo crear un plugin para <strong>kubectl<\/strong>, basta con programar lo que nuestra imaginaci\u00f3n quiera y cumplir con el nombre y ubicaci\u00f3n del ejecutable.<\/p>\n<p>Por esta facilidad, no existe excusa para no hacer un plugin pr\u00e1cticamente por cada necesidad espec\u00edfica que necesitemos de <strong>kubectl<\/strong>.<br \/>\nTambi\u00e9n es necesario comentar que existe una gran cantidad de <a href=\"https:\/\/github.com\/ishantanu\/awesome-kubectl-plugins\">plugins provistos por la comunidad<\/a>.<br \/>\n\u00a1Vale la pena echar un vistazo!<\/p>\n<p>Espero que este art\u00edculo te haya servido de ayuda para aprender algo nuevo y seguir ampliando tus conocimientos.<\/p>\n<p>Te invito a que si necesitas informaci\u00f3n sobre el mundo <a href=\"https:\/\/geko.cloud\/es\/devops\/\"><strong>DevOps <\/strong><\/a>o<strong><a href=\"https:\/\/geko.cloud\/es\/que-es-kubernetes\/\"> Kubernetes<\/a>,<\/strong> <a href=\"https:\/\/geko.cloud\/es\/contacto\/\">nos contactes<\/a> y sigas revisando <a href=\"https:\/\/geko.cloud\/es\/blog\/\">nuestro blog <\/a>para encontrar otras publicaciones \u00fatiles. \u00a1Hasta la pr\u00f3xima!<\/p>\n<p><a href=\"https:\/\/geko.cloud\/es\/contacto\/\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3265\" src=\"https:\/\/geko2.factoryfy.com\/wp-content\/uploads\/geko-1-150x150.png\" alt=\"\" width=\"82\" height=\"82\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n Muchas veces para realizar nuestras tareas diarias nos vemos en la situaci\u00f3n de tener que crear herramientas propias para resolver problemas o situaciones a medida. En esta entrada voy a mostrar lo f\u00e1cil que es y c\u00f3mo podemos crear un plugin para kubectl. Un plugin es simplemente un programa ejecutable que permite extender la [&hellip;]<\/p>\n","protected":false},"author":8,"featured_media":2117,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[18],"tags":[37],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Kubectl Plugins en solo 3 pasos - Geko Cloud<\/title>\n<meta name=\"description\" content=\"Un plugin es simplemente un programa ejecutable que permite extender la funcionalidad de kubectl. Conoce qu\u00e9 es y c\u00f3mo crear un plugin kubectl\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/geko.cloud\/es\/kubectl-plugins\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kubectl Plugins en solo 3 pasos - Geko Cloud\" \/>\n<meta property=\"og:description\" content=\"Un plugin es simplemente un programa ejecutable que permite extender la funcionalidad de kubectl. Conoce qu\u00e9 es y c\u00f3mo crear un plugin kubectl\" \/>\n<meta property=\"og:url\" content=\"https:\/\/geko.cloud\/es\/kubectl-plugins\/\" \/>\n<meta property=\"og:site_name\" content=\"Geko Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2021-01-05T11:42:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-11-04T08:35:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/geko.cloud\/wp-content\/uploads\/plug_mesa-de-trabajo-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2667\" \/>\n\t<meta property=\"og:image:height\" content=\"1775\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Christian\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@geko_cloud\" \/>\n<meta name=\"twitter:site\" content=\"@geko_cloud\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/geko.cloud\/es\/kubectl-plugins\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/geko.cloud\/es\/kubectl-plugins\/\"},\"author\":{\"name\":\"Christian\",\"@id\":\"https:\/\/geko.cloud\/es\/#\/schema\/person\/7284169754650e302ab1278789d95d0e\"},\"headline\":\"Kubectl Plugins en solo 3 pasos\",\"datePublished\":\"2021-01-05T11:42:20+00:00\",\"dateModified\":\"2021-11-04T08:35:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/geko.cloud\/es\/kubectl-plugins\/\"},\"wordCount\":597,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/geko.cloud\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/geko.cloud\/es\/kubectl-plugins\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/geko.cloud\/wp-content\/uploads\/plug_mesa-de-trabajo-1.png\",\"keywords\":[\"Kubernetes\"],\"articleSection\":[\"Labs\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/geko.cloud\/es\/kubectl-plugins\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/geko.cloud\/es\/kubectl-plugins\/\",\"url\":\"https:\/\/geko.cloud\/es\/kubectl-plugins\/\",\"name\":\"Kubectl Plugins en solo 3 pasos - Geko Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/geko.cloud\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/geko.cloud\/es\/kubectl-plugins\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/geko.cloud\/es\/kubectl-plugins\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/geko.cloud\/wp-content\/uploads\/plug_mesa-de-trabajo-1.png\",\"datePublished\":\"2021-01-05T11:42:20+00:00\",\"dateModified\":\"2021-11-04T08:35:37+00:00\",\"description\":\"Un plugin es simplemente un programa ejecutable que permite extender la funcionalidad de kubectl. Conoce qu\u00e9 es y c\u00f3mo crear un plugin kubectl\",\"breadcrumb\":{\"@id\":\"https:\/\/geko.cloud\/es\/kubectl-plugins\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/geko.cloud\/es\/kubectl-plugins\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/geko.cloud\/es\/kubectl-plugins\/#primaryimage\",\"url\":\"https:\/\/geko.cloud\/wp-content\/uploads\/plug_mesa-de-trabajo-1.png\",\"contentUrl\":\"https:\/\/geko.cloud\/wp-content\/uploads\/plug_mesa-de-trabajo-1.png\",\"width\":2667,\"height\":1775,\"caption\":\"Plugin\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/geko.cloud\/es\/kubectl-plugins\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\/\/geko.cloud\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kubectl Plugins en solo 3 pasos\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/geko.cloud\/es\/#website\",\"url\":\"https:\/\/geko.cloud\/es\/\",\"name\":\"Geko Cloud\",\"description\":\"Servicios de consultor\u00eda cloud y devops\",\"publisher\":{\"@id\":\"https:\/\/geko.cloud\/es\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/geko.cloud\/es\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/geko.cloud\/es\/#organization\",\"name\":\"Geko Cloud\",\"url\":\"https:\/\/geko.cloud\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/geko.cloud\/es\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/geko.cloud\/wp-content\/uploads\/2021\/10\/geko_logo-positivo.png\",\"contentUrl\":\"https:\/\/geko.cloud\/wp-content\/uploads\/2021\/10\/geko_logo-positivo.png\",\"width\":1650,\"height\":809,\"caption\":\"Geko Cloud\"},\"image\":{\"@id\":\"https:\/\/geko.cloud\/es\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/geko_cloud\",\"https:\/\/www.instagram.com\/gekocloud\/\",\"https:\/\/www.linkedin.com\/company\/gekocloud\",\"https:\/\/www.youtube.com\/channel\/UC5EFLCqUM7fEaXSa_0nWowQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/geko.cloud\/es\/#\/schema\/person\/7284169754650e302ab1278789d95d0e\",\"name\":\"Christian\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/geko.cloud\/es\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/85abc7d877c6141512e82b54a333c262?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/85abc7d877c6141512e82b54a333c262?s=96&d=mm&r=g\",\"caption\":\"Christian\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Kubectl Plugins en solo 3 pasos - Geko Cloud","description":"Un plugin es simplemente un programa ejecutable que permite extender la funcionalidad de kubectl. Conoce qu\u00e9 es y c\u00f3mo crear un plugin kubectl","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/geko.cloud\/es\/kubectl-plugins\/","og_locale":"es_ES","og_type":"article","og_title":"Kubectl Plugins en solo 3 pasos - Geko Cloud","og_description":"Un plugin es simplemente un programa ejecutable que permite extender la funcionalidad de kubectl. Conoce qu\u00e9 es y c\u00f3mo crear un plugin kubectl","og_url":"https:\/\/geko.cloud\/es\/kubectl-plugins\/","og_site_name":"Geko Cloud","article_published_time":"2021-01-05T11:42:20+00:00","article_modified_time":"2021-11-04T08:35:37+00:00","og_image":[{"width":2667,"height":1775,"url":"https:\/\/geko.cloud\/wp-content\/uploads\/plug_mesa-de-trabajo-1.png","type":"image\/png"}],"author":"Christian","twitter_card":"summary_large_image","twitter_creator":"@geko_cloud","twitter_site":"@geko_cloud","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/geko.cloud\/es\/kubectl-plugins\/#article","isPartOf":{"@id":"https:\/\/geko.cloud\/es\/kubectl-plugins\/"},"author":{"name":"Christian","@id":"https:\/\/geko.cloud\/es\/#\/schema\/person\/7284169754650e302ab1278789d95d0e"},"headline":"Kubectl Plugins en solo 3 pasos","datePublished":"2021-01-05T11:42:20+00:00","dateModified":"2021-11-04T08:35:37+00:00","mainEntityOfPage":{"@id":"https:\/\/geko.cloud\/es\/kubectl-plugins\/"},"wordCount":597,"commentCount":0,"publisher":{"@id":"https:\/\/geko.cloud\/es\/#organization"},"image":{"@id":"https:\/\/geko.cloud\/es\/kubectl-plugins\/#primaryimage"},"thumbnailUrl":"https:\/\/geko.cloud\/wp-content\/uploads\/plug_mesa-de-trabajo-1.png","keywords":["Kubernetes"],"articleSection":["Labs"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/geko.cloud\/es\/kubectl-plugins\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/geko.cloud\/es\/kubectl-plugins\/","url":"https:\/\/geko.cloud\/es\/kubectl-plugins\/","name":"Kubectl Plugins en solo 3 pasos - Geko Cloud","isPartOf":{"@id":"https:\/\/geko.cloud\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/geko.cloud\/es\/kubectl-plugins\/#primaryimage"},"image":{"@id":"https:\/\/geko.cloud\/es\/kubectl-plugins\/#primaryimage"},"thumbnailUrl":"https:\/\/geko.cloud\/wp-content\/uploads\/plug_mesa-de-trabajo-1.png","datePublished":"2021-01-05T11:42:20+00:00","dateModified":"2021-11-04T08:35:37+00:00","description":"Un plugin es simplemente un programa ejecutable que permite extender la funcionalidad de kubectl. Conoce qu\u00e9 es y c\u00f3mo crear un plugin kubectl","breadcrumb":{"@id":"https:\/\/geko.cloud\/es\/kubectl-plugins\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/geko.cloud\/es\/kubectl-plugins\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/geko.cloud\/es\/kubectl-plugins\/#primaryimage","url":"https:\/\/geko.cloud\/wp-content\/uploads\/plug_mesa-de-trabajo-1.png","contentUrl":"https:\/\/geko.cloud\/wp-content\/uploads\/plug_mesa-de-trabajo-1.png","width":2667,"height":1775,"caption":"Plugin"},{"@type":"BreadcrumbList","@id":"https:\/\/geko.cloud\/es\/kubectl-plugins\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/geko.cloud\/es\/"},{"@type":"ListItem","position":2,"name":"Kubectl Plugins en solo 3 pasos"}]},{"@type":"WebSite","@id":"https:\/\/geko.cloud\/es\/#website","url":"https:\/\/geko.cloud\/es\/","name":"Geko Cloud","description":"Servicios de consultor\u00eda cloud y devops","publisher":{"@id":"https:\/\/geko.cloud\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/geko.cloud\/es\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/geko.cloud\/es\/#organization","name":"Geko Cloud","url":"https:\/\/geko.cloud\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/geko.cloud\/es\/#\/schema\/logo\/image\/","url":"https:\/\/geko.cloud\/wp-content\/uploads\/2021\/10\/geko_logo-positivo.png","contentUrl":"https:\/\/geko.cloud\/wp-content\/uploads\/2021\/10\/geko_logo-positivo.png","width":1650,"height":809,"caption":"Geko Cloud"},"image":{"@id":"https:\/\/geko.cloud\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/geko_cloud","https:\/\/www.instagram.com\/gekocloud\/","https:\/\/www.linkedin.com\/company\/gekocloud","https:\/\/www.youtube.com\/channel\/UC5EFLCqUM7fEaXSa_0nWowQ"]},{"@type":"Person","@id":"https:\/\/geko.cloud\/es\/#\/schema\/person\/7284169754650e302ab1278789d95d0e","name":"Christian","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/geko.cloud\/es\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/85abc7d877c6141512e82b54a333c262?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/85abc7d877c6141512e82b54a333c262?s=96&d=mm&r=g","caption":"Christian"}}]}},"_links":{"self":[{"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/posts\/2115"}],"collection":[{"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/comments?post=2115"}],"version-history":[{"count":4,"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/posts\/2115\/revisions"}],"predecessor-version":[{"id":6561,"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/posts\/2115\/revisions\/6561"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/media\/2117"}],"wp:attachment":[{"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/media?parent=2115"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/categories?post=2115"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/tags?post=2115"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}