<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jose Luis</title>
    <description>The latest articles on DEV Community by Jose Luis (@joseluisp).</description>
    <link>https://dev.to/joseluisp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F510881%2Fdf17c0a3-0f2f-41a5-8b89-aaba8c3b5515.jpg</url>
      <title>DEV Community: Jose Luis</title>
      <link>https://dev.to/joseluisp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joseluisp"/>
    <language>en</language>
    <item>
      <title>Kubernetes Security Checklist 2021</title>
      <dc:creator>Jose Luis</dc:creator>
      <pubDate>Mon, 18 Oct 2021 10:57:21 +0000</pubDate>
      <link>https://dev.to/joseluisp/kubernetes-security-checklist-2021-9j2</link>
      <guid>https://dev.to/joseluisp/kubernetes-security-checklist-2021-9j2</guid>
      <description>&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@eugene_golovesov?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Eugene Golovesov&lt;/a&gt; on &lt;a href="https://unsplash.com/t/experimental?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;October 18 2021&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authentication&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It is recommended to use an IdP server as a provider for user authentication to the Kubernetes API (for example, using &lt;a href="https://kubernetes.io/docs/reference/access-authn-authz/authentication/#openid-connect-tokens"&gt;OIDC&lt;/a&gt;) Cluster administrators are advised not to use service account tokens for authentication.&lt;/li&gt;
&lt;li&gt;It is recommended to use a centralized certificate management service to manage certificates within the cluster (for user and service purposes)&lt;/li&gt;
&lt;li&gt;User accounts should be personalized. The names of the service accounts should reflect the purpose access rights of the accounts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Authorization&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For each cluster, a role-based access model should be developed.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kubernetes.io/docs/reference/access-authn-authz/rbac/"&gt;Role-Based Access Control (RBAC)&lt;/a&gt; should be configured for the Kubernetes cluster. Rights need to be assigned within the project namespace based on least privilege and separation of duties (&lt;a href="https://github.com/alcideio/rbac-tool"&gt;RBAC-tool&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;All services should have a unique service account with configured RBAC rights.&lt;/li&gt;
&lt;li&gt;Developers should not have access to a production environment without the approval of the security team.&lt;/li&gt;
&lt;li&gt;It is forbidden to use &lt;a href="https://kubernetes.io/docs/reference/access-authn-authz/authentication/#user-impersonation"&gt;user impersonation&lt;/a&gt; (the ability to perform actions under other accounts)&lt;/li&gt;
&lt;li&gt;It is forbidden to use anonymous authentication, except for &lt;code&gt;/healthz&lt;/code&gt;, &lt;code&gt;/readyz&lt;/code&gt;, &lt;code&gt;/livez&lt;/code&gt;. Exceptions should be agreed upon with the security team.&lt;/li&gt;
&lt;li&gt;Cluster administrators and maintainers should interact with the cluster API and infrastructure services through privileged access management systems  ( &lt;a href="https://goteleport.com/docs/kubernetes-access/introduction/"&gt;Teleport&lt;/a&gt;, &lt;a href="https://www.hashicorp.com/blog/gating-access-to-kubernetes-with-hashicorp-boundary"&gt;Boundary&lt;/a&gt; ) &lt;/li&gt;
&lt;li&gt;All information systems should be divided into separate namespaces. It is recommended to avoid the situation when the same maintainer team is responsible for different namespaces&lt;/li&gt;
&lt;li&gt;RBAC Rights should be audited regularly (&lt;a href="https://github.com/cyberark/KubiScan"&gt;KubiScan&lt;/a&gt;, &lt;a href="https://github.com/appvia/krane"&gt;Krane&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Secure work with secrets&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Secrets should be stored in third-party storage (&lt;a href="https://www.vaultproject.io/docs/platform/k8s"&gt;HashiCorp Vault&lt;/a&gt;, &lt;a href="https://www.conjur.org/blog/securing-secrets-in-kubernetes/"&gt;Conjur&lt;/a&gt;), or in etcd in encrypted form.&lt;/li&gt;
&lt;li&gt;Secrets should be added to the container using the volumeMount mechanism or the secretKeyRef mechanism. For hiding secrets in source codes, for example, the &lt;a href="https://github.com/bitnami-labs/sealed-secrets"&gt;sealed-secret&lt;/a&gt; tool can be used.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cluster Configuration Security&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use TLS encryption between all cluster components.&lt;/li&gt;
&lt;li&gt;Use Policy engine (&lt;a href="https://www.openpolicyagent.org/docs/v0.12.2/kubernetes-admission-control/"&gt;OPA&lt;/a&gt;, &lt;a href="https://kyverno.io/"&gt;Kyverno&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;The cluster configuration is recommended to comply with &lt;a href="https://www.cisecurity.org/benchmark/kubernetes/"&gt;CIS Benchmark&lt;/a&gt; except for &lt;a href="https://kubernetes.io/blog/2021/04/06/podsecuritypolicy-deprecation-past-present-and-future/"&gt;PSP requirements&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;It is recommended to use only the latest versions of cluster components (&lt;a href="https://www.container-security.site/general_information/container_cve_list.html"&gt;CVE list&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;For services with increased security requirements, it is recommended to use a low-level run-time with a high degree of isolation (&lt;a href="https://gvisor.dev/docs/user_guide/quick_start/kubernetes/"&gt;gVisior&lt;/a&gt;, &lt;a href="https://github.com/kata-containers/documentation/blob/master/how-to/run-kata-with-k8s.md"&gt;Kata-runtime&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Cluster Configuration should be audited regularly (&lt;a href="https://github.com/aquasecurity/kube-bench"&gt;Kube-bench&lt;/a&gt;, &lt;a href="https://github.com/aquasecurity/kube-hunter"&gt;Kube-hunter&lt;/a&gt;, &lt;a href="https://www.kubestriker.io/"&gt;Kubestriker&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Audit and Logging&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Log all cases of changing access rights in the cluster.&lt;/li&gt;
&lt;li&gt;Log all operations with secrets (including unauthorized access to secrets)&lt;/li&gt;
&lt;li&gt;Log all actions related to the deployment of applications and changes in their configuration.&lt;/li&gt;
&lt;li&gt;Log all cases of changing parameters, system settings, or configuration of the entire cluster (including OS level)&lt;/li&gt;
&lt;li&gt;All registered security events (at the cluster level and  application level both) should be sent to the centralized audit logging system (SIEM)&lt;/li&gt;
&lt;li&gt;The audit logging system should be located outside the Kubernetes cluster.&lt;/li&gt;
&lt;li&gt;Build observability and visibility processes in order to understand what is happening in infrastructure and services (&lt;a href="https://luntry.com/"&gt;Luntry&lt;/a&gt;, &lt;a href="https://github.com/weaveworks/scope"&gt;WaveScope&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Use third-party security monitoring tool on all cluster nodes (&lt;a href="https://falco.org/"&gt;Falco&lt;/a&gt;, &lt;a href="https://sysdig.com/"&gt;Sysdig&lt;/a&gt;, &lt;a href="https://www.aquasec.com/"&gt;Aqua Enterpise&lt;/a&gt;, &lt;a href="https://neuvector.com/"&gt;NeuVector&lt;/a&gt;, &lt;a href="https://www.paloaltonetworks.com/prisma/cloud"&gt;Prisma Cloud Compute&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Secure OS configuration&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Host administrators and maintainers should interact with cluster nodes through privileged access management systems (or bastion hosts)&lt;/li&gt;
&lt;li&gt;It is recommended to configure the OS and software following the baseline and standards (&lt;a href="https://www.cisecurity.org/cis-benchmarks/"&gt;CIS&lt;/a&gt;, &lt;a href="https://ncp.nist.gov/repository"&gt;NIST&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;It is recommended to regularly scan packages and configuration for vulnerabilities(&lt;a href="https://static.open-scap.org/"&gt;OpenSCAP profiles&lt;/a&gt;, &lt;a href="https://cisofy.com/lynis/"&gt;Lynis&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;It is recommended to regularly update the OS kernel version (&lt;a href="https://github.com/evdenis/cvehound"&gt;CVEhound&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Network Security&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All namespaces should have NetworkPolicy. Interactions between namespaces should be limited to NetworkPolicy following least privileges principles (&lt;a href="https://github.com/kinvolk/inspektor-gadget"&gt;Inspektor Gadget&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;It is recommended to use authentication and authorization between all application microservices (&lt;a href="https://platform9.com/blog/kubernetes-service-mesh-how-to-set-up-istio/"&gt;Istio&lt;/a&gt;, &lt;a href="https://platform9.com/blog/how-to-set-up-linkerd-as-a-service-mesh-for-platform9-managed-kubernetes/"&gt;Linkerd&lt;/a&gt;, &lt;a href="https://www.consul.io/docs/architecture"&gt;Consul&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;The interfaces of the cluster components and infrastructure tools should not be published on the Internet.&lt;/li&gt;
&lt;li&gt;Infrastructure services, control plane, and data storage should be located in a separate VLAN on isolated nodes.&lt;/li&gt;
&lt;li&gt;External user traffic passing into the cluster should be inspected using WAF.&lt;/li&gt;
&lt;li&gt;It is recommended to separate the cluster nodes interacting with the Internet (DMZ) from the cluster nodes interacting with internal services. Delimitation can be within one cluster, or within two different clusters (DMZ and VLAN)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Secure configuration of workloads&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do not run pods under the &lt;a href="https://kubernetes.io/docs/tasks/configure-pod-container/security-context/"&gt;root account&lt;/a&gt; UID 0&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod"&gt;Set&lt;/a&gt; &lt;code&gt;runAsUser&lt;/code&gt; parameter for all applications&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kubernetes.io/docs/tasks/configure-pod-container/security-context/"&gt;Set&lt;/a&gt; &lt;code&gt;allowPrivilegeEscalation - false&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;Do not run the &lt;a href="https://kubernetes.io/docs/tasks/configure-pod-container/security-context/"&gt;privileged pod&lt;/a&gt; (&lt;code&gt;privileged: true&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;It is recommended to &lt;a href="https://kubernetes.io/docs/tasks/configure-pod-container/security-context/"&gt;set&lt;/a&gt; &lt;code&gt;readonlyRootFilesystem - true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kubernetes.io/docs/concepts/policy/pod-security-policy/#host-namespaces"&gt;Do not&lt;/a&gt; use &lt;code&gt;hostPID&lt;/code&gt; and &lt;code&gt;hostIPC&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kubernetes.io/docs/concepts/policy/pod-security-policy/#host-namespaces"&gt;Do not&lt;/a&gt; use &lt;code&gt;hostNetwork&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://kubernetes.io/docs/tasks/administer-cluster/sysctl-cluster/"&gt;Do not&lt;/a&gt; use unsafe system calls (sysctl):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;kernel.shm *&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kernel.msg *&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kernel.sem&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fs.mqueue. *&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://kubernetes.io/docs/concepts/policy/pod-security-policy/#volumes-and-file-systems"&gt;Do not&lt;/a&gt; use &lt;code&gt;hostPath&lt;/code&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/"&gt;Use&lt;/a&gt; CPU / RAM limits. The values should be the minimum for the containerized application to work&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;&lt;a href="https://kubernetes.io/docs/tasks/configure-pod-container/security-context/"&gt;Capabilities&lt;/a&gt; should be set according to the principle of least privileges (drop 'ALL', after which all the necessary capacities for the application to work are enumerated, while it is prohibited to use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CAP_FSETID&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CAP_SETUID&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CAP_SETGID&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CAP_SYS_CHROOT&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CAP_SYS_PTRACE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CAP_CHOWN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CAP_NET_RAW&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CAP_NET_ADMIN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CAP_SYS_ADMIN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CAP_NET_BIND_SERVICE&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do not use the default namespace (&lt;code&gt;default&lt;/code&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The application should have a seccomp, apparmor or selinux profile according to the principles of least privileges (&lt;a href="https://github.com/containers/udica"&gt;Udica&lt;/a&gt;, &lt;a href="https://github.com/containers/oci-seccomp-bpf-hook"&gt;Oci-seccomp-bpf-hook&lt;/a&gt;, &lt;a href="https://github.com/xfernando/go2seccomp"&gt;Go2seccomp&lt;/a&gt;, &lt;a href="https://github.com/kubernetes-sigs/security-profiles-operator"&gt;Security Profiles Operator&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Workload configuration should be audited regularly (&lt;a href="https://checkmarx.com/product/opensource/kics-open-source-infrastructure-as-code-project/"&gt;Kics&lt;/a&gt;,  &lt;a href="https://github.com/Shopify/kubeaudit"&gt;Kubeaudit&lt;/a&gt;, &lt;a href="https://github.com/armosec/kubescape"&gt;Kubescape&lt;/a&gt;, &lt;a href="https://github.com/open-policy-agent/conftest"&gt;Conftest&lt;/a&gt;,  &lt;a href="https://github.com/controlplaneio/kubesec"&gt;Kubesec&lt;/a&gt;, &lt;a href="https://github.com/bridgecrewio/checkov"&gt;Checkov&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Secure image development&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do not use &lt;code&gt;RUN&lt;/code&gt; construct with &lt;code&gt;sudo&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;COPY&lt;/code&gt; is required instead of &lt;code&gt;ADD&lt;/code&gt; instruction.&lt;/li&gt;
&lt;li&gt;Do not use automatic package update via &lt;code&gt;apt-get upgrade&lt;/code&gt;, &lt;code&gt;yum update&lt;/code&gt;, &lt;code&gt;apt-get dist-upgrade&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;It is necessary to explicitly indicate the versions of the installed packages. The SBOM building tools (&lt;a href="https://github.com/anchore/syft"&gt;Syft&lt;/a&gt;) can be used to determine the list of packages.&lt;/li&gt;
&lt;li&gt;Do not store sensitive information (passwords, tokens, certificates) in the Dockerfile.&lt;/li&gt;
&lt;li&gt;The composition of the packages in the container image should be minimal enough to work.&lt;/li&gt;
&lt;li&gt;The port range forwarded into the container should be minimal enough to work. &lt;/li&gt;
&lt;li&gt;It is not recommended to install

&lt;code&gt;wget&lt;/code&gt;

,

&lt;code&gt;curl&lt;/code&gt;

,

&lt;code&gt;netcat&lt;/code&gt;

inside the production application image and container.
- It is recommended to use

&lt;code&gt;dockerignore&lt;/code&gt;

to prevent putting sensitive information inside the image.&lt;/li&gt;
&lt;li&gt;It is recommended to use a minimum number of layers using a &lt;a href="https://docs.docker.com/develop/develop-images/multistage-build/"&gt;multi-stage build&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;It is recommended to use &lt;code&gt;WORKDIR&lt;/code&gt; as an absolute path. It is not recommended to use &lt;code&gt;cd&lt;/code&gt; instead of &lt;code&gt;WORKDIR&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;It is recommended to beware of recursive copying using &lt;code&gt;COPY . ..&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;It is recommended not to use the &lt;code&gt;latest&lt;/code&gt; tag&lt;/li&gt;
&lt;li&gt;When downloading packages from the Internet during the build process, it is recommended to check the integrity of these packages.&lt;/li&gt;
&lt;li&gt;Do not run remote control tools in a container&lt;/li&gt;
&lt;li&gt;Based on the results of scanning Docker images, an image signature should be generated, which will be verified before deployment (&lt;a href="https://medium.com/sse-blog/verify-container-image-signatures-in-kubernetes-using-notary-or-cosign-or-both-c25d9e79ec45"&gt;Notary, Cosign&lt;/a&gt;) &lt;/li&gt;
&lt;li&gt;Dockerfile should be checked during development by automated scanners (&lt;a href="https://checkmarx.com/product/opensource/kics-open-source-infrastructure-as-code-project/"&gt;Kics&lt;/a&gt;, &lt;a href="https://github.com/hadolint/hadolint"&gt;Hadolint&lt;/a&gt;, &lt;a href="https://github.com/open-policy-agent/conftest"&gt;Conftest&lt;/a&gt;) &lt;/li&gt;
&lt;li&gt;All images should be checked in the application lifecycle by automated scanners (&lt;a href="https://github.com/aquasecurity/trivy"&gt;Trivy&lt;/a&gt;, &lt;a href="https://github.com/quay/clair"&gt;Clair&lt;/a&gt;, &lt;a href="https://github.com/anchore/grype"&gt;Grype&lt;/a&gt;)
&lt;/li&gt;
&lt;li&gt;Build secure CI and CD as same as suply chain process (&lt;a href="https://github.com/slsa-framework/slsa"&gt;SLSA&lt;/a&gt;) &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>kubernetes</category>
      <category>security</category>
    </item>
    <item>
      <title>¿Que es prometheus? (parte 2)</title>
      <dc:creator>Jose Luis</dc:creator>
      <pubDate>Sun, 23 May 2021 21:50:40 +0000</pubDate>
      <link>https://dev.to/joseluisp/que-es-prometheus-parte-2-99f</link>
      <guid>https://dev.to/joseluisp/que-es-prometheus-parte-2-99f</guid>
      <description>&lt;h1&gt;
  
  
  Informacion e instalacion Prometheus Parte 2
&lt;/h1&gt;

&lt;p&gt;Imagen de &lt;a href="https://pixabay.com/es/users/blickpixel-52945/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=499792"&gt;Michael Schwarzenberger&lt;/a&gt; en &lt;a href="https://pixabay.com/es/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=499792"&gt;Pixabay&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Pasado de Prometheus
&lt;/h1&gt;

&lt;p&gt;Google para correr sus diversos productos construyo BORG, es un cluster manager que ejecuta cientos de miles de trabajos. Kubernetes se inspira en  BORG, ademas construyeron la herramienta "BORG Mon" enfocoda a monitorizar el sistema BORG. El creador de Prometheus se inspiro en "BORG Mon". Borg mon esta desarrollado por un desarrollador ex de google, que se habia unido a soundcloud y lo empezaron a desarrollar internamente en Soundcloud. En 2015 hicieron su primer lanzamiento publico.&lt;/p&gt;

&lt;p&gt;Soundcloud fue un "early adopter" de los patrones de arquitectura de microservicios. Para monitorizar un cloud dinamico basado en microservicios, fue construido Prometheus para responder a esas necesidades. Generalmente se suele utilizar Prometheus para monitorizar entornos basados en microservicios.&lt;/p&gt;

&lt;p&gt;Prometheus esta enfocado en priorizar lo que esta pasanado ahora mismo, en lugar de lo que ha pasado hace semanas, meses o hacer una monitorizacion mas amplia en el tiempo. La monitorizacion de Prometheus se basa en datos generados recientemente. Facebook descubrio que el 85% de las querys par la monitorizacion se basaban en datos de menos de 26 horas. La mayor parte de los datos que queremos ver seran recientes, esto se refleja en el lenguaje de querys que esta pensado en tener una retencion de datos muy corta o estan pensado sobre datos con una retencion muy corta.&lt;/p&gt;

&lt;h1&gt;
  
  
  Arquitectura
&lt;/h1&gt;

&lt;p&gt;Como ya hemos dicho antes, Prometheus trabaja haciendo pull de datos timeseries expuestos en aplicaciones. Tu aplicacion necesitas que la aplicacion exponga esos datos y prometheus los va a buscar. Esos datos estan expuestos via librerias de clientes o via proxies llamados &lt;code&gt;exporters&lt;/code&gt; accesibles atraves de http. Por tanto tu aplicacion tiene que estar exponiendo esos datos.&lt;/p&gt;

&lt;p&gt;Existen librerias de cliente para muchos lenguajes, frameworks y aplicaciones open source como apache, mysql... Prometheus tambien tiene un pushgateway para que reciba prometheus pequeños volumenes de datos, por ejemplo, datos que se han generado o que se envian desde sitios que no pueden ser contactados, como servidores que estan detras de un firewall o servidores que NO van a poder enviar datos.&lt;/p&gt;

&lt;p&gt;Cada servicio estaria ejecutandose un exporter que va a ser contactado por prometheus para recoger los datos. Si tiene que enviar una alerta, lo hace atraves de un manager de alertas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--elLJlfLK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/sosan/kubernetes/master/assets/diagrama_prometheus_arquitectura.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--elLJlfLK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/sosan/kubernetes/master/assets/diagrama_prometheus_arquitectura.svg" alt="Imagen"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Coleccion de metricas
&lt;/h1&gt;

&lt;p&gt;Prometheus llama al origin de las metricas desde el cual las obtiene. Este puente se corresponde con un proceso HOST, por tanto, vas a ir a un punto con una url concreta: &lt;code&gt;ip_del_servidor/nombre_del_host/nombre_de_la_metrica&lt;/code&gt; en otro punto puede estar la metrica de la memoria, cpu, etc... Osea que tiene que ir a rascar/obtener metrica a metrica.&lt;/p&gt;

&lt;p&gt;Prometheus, en algunos casos, necesitara autentificacion para conectarse, se pueden crear grupos de targets, a los que se llama &lt;code&gt;jobs&lt;/code&gt;, un &lt;code&gt;job&lt;/code&gt; es un grupo de targets. Puedes tener un grupo de servidores que todos tienen la misma metrica expuesta y atacarias esos servidores para obtener esas metricas.&lt;/p&gt;

&lt;p&gt;El resultado es que se obtienen los datos y se almacenan esos datos en el servidor prometheus, tambien puede ser enviados a un servidor externo o otra base de datos compatible con timeseries.&lt;/p&gt;

&lt;h1&gt;
  
  
  Sistema de discovery
&lt;/h1&gt;

&lt;p&gt;El discubrimento de recursos que pueden ser monitorizadas se pueden gestionar de diferentes formas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ficheros estaticos: una lista de recursos estatica proveida directamente a Prometheus&lt;/li&gt;
&lt;li&gt;Ficheros dinamicos: descubrimiento basado en ficheros, por ejemplo, un fichero generado por ansible, puppet. Asi prometheus sabria que hay algo en la lista&lt;/li&gt;
&lt;li&gt;Descubrimiento automatico, para hacer querys de datos que estan guardados en consul, instancias de amazon, google, etc... o a traves de record dns donde se genera esa lista de recursos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El servidor tambien puede hacer una query para agregar los datos y puede crear reglas que van a guardar esas queries de agregacion. Esto te permite crear nuevos datos timeseries de otros datos timeseries que ya existen. Por ejemplo, si calculos el rate y los ratios de un sistema de produccion donde sumas diferentes datos, la siguiente query sera almacenar esos datos que se van a sumar a los ya existentes.&lt;/p&gt;

&lt;p&gt;Tambien puede definir reglas para alertas en base a criterios como el uso de cpu, memoria, etc.. eso lo hace atraves de un servidor separado al que llamamos alert manager. El alert manager puede gestionar, dirigir alertas a una variedad de destinos como por ejemplo, mandar un email cuando hay un problema.&lt;/p&gt;

&lt;h1&gt;
  
  
  Queries
&lt;/h1&gt;

&lt;p&gt;El servidor Prometheus viene con un lenguaje propio de queries que se llama PROMQL. Viene con un browser de expriones y con un interfaz grafico que podemos usar para explorar los datos almacenados en el servidor. Cada servidor de Prometheus esta diseñado para ser lo mas autonomo posible, y puede almacenar desde cientos a millones de metricas en formato timeseries.&lt;/p&gt;

&lt;p&gt;El formato de almancenamiento de datos esta diseñado para mantener lo mas bajo posible el uso de disco y proveer una obtencion de datos rapida durante la query y agregacion de datos.&lt;/p&gt;

&lt;h1&gt;
  
  
  Redundancia y alta disponibilidad
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--otUCqq0q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/sosan/kubernetes/master/assets/diagrama_prometheus_arquitectura_redundancia.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--otUCqq0q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/sosan/kubernetes/master/assets/diagrama_prometheus_arquitectura_redundancia.svg" alt="Imagen"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La redundancia se centra en la resilencia de las alertas mas que en la durabilidad de los datos, se recomienda desplegar servidores prometheus para propuestos especificos y equipos mas que un servidor unico monolitico.&lt;/p&gt;

&lt;p&gt;Si quieres desplegar redudancia y alta disponibilidad, necesitas que dos servidores identicos obtengan los datos y que las alertas generadas sean gestionados por un manager de alertas con alta disponibilidades configurado para desduplicar alertas (para que no se envien dos veces). &lt;/p&gt;

&lt;p&gt;Nota: genera un trafico interno bastante alto&lt;/p&gt;

&lt;h1&gt;
  
  
  Visualizacion de datos
&lt;/h1&gt;

&lt;p&gt;La visualizacion se provee via expresiones construidas integradas con el dashboard GRAFANA, tambien soporta otros dashboards.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prometheus Expresion Browser&lt;/li&gt;
&lt;li&gt;Prometheus Console templates&lt;/li&gt;
&lt;li&gt;Grafana&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  El modelo de datos de prometheus
&lt;/h1&gt;

&lt;p&gt;Prometheus colecciona datos timeseries, para gestionar estos datos, tiene un tipo de datos multidimensional. Los datos timeseries combinan nombres timeseries y valores clave/valor, llamados labels o etiquetas. Estas etiquetas proveen dimensiones. Es parecido a cloudWatch.&lt;/p&gt;

&lt;p&gt;Cada timeseries es identificado por la combinacion de: el nombre y las etiquetas asignadas. El nombre seria &lt;code&gt;cpu:nombre-instancia&lt;/code&gt; es igual a las dimensions de cloudwatch. El nombre define lo que estamos guardando. El nombre puede contener letras ascii, numeros, guiones bajos y dos puntos.&lt;/p&gt;

&lt;p&gt;Las etiquetas permiten a Prometehus un modelo de datos dimensional, añaden contexto a un dato especifico, por ejemplo, el &lt;code&gt;totalwebvisits&lt;/code&gt;. Tiene etiquetas que podrian identificar el nombre de la visita, la ip del origin.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;total_website_visits
{
    site="App_cualquiera", # app
    location="ES",          # de donde viene la visita
    instance="servidor_web", # la instancia que corre la app
    job="web"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Retencion de datos
&lt;/h1&gt;

&lt;p&gt;Prometheus esta diseñado para monitorizacion cortas. Guarda 15 dias de datos, si quieres retener mas lo recomandado es enviar los datos a sistemas/plataformas de terceros.&lt;/p&gt;

&lt;h1&gt;
  
  
  Seguridad
&lt;/h1&gt;

&lt;p&gt;Prometheus puede ser configurado y desplegado de muchas maneras. Hace asumciones sobre la seguridad:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Los usuarios no confiables(cualquiera) pueden acceder al servidor Prometheus y a los datos, pero solo los usuarios confiables(administrador, operadores, etc...) pueden modificar la configuracion. Pero no significa que desde casa podamos ver el promotheus de amazon, porque esta protegido por una red interna, etc..&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Ecosistema de Prometheus
&lt;/h1&gt;

&lt;p&gt;El ecosistema es una coleccion de integraciones de herramientas open source.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Servidor Prometheus, es el corazon del ecosistema.&lt;/li&gt;
&lt;li&gt;Manager de alertas para Prometheus.&lt;/li&gt;
&lt;li&gt;Coleccion de &lt;code&gt;exporters&lt;/code&gt; (servicios instalados en las maquinas para que prometheus pueda pedir las metricas) para servidores web(apache, etc...), bases de datos (mysql, etc...)&lt;/li&gt;
&lt;li&gt;Librerias de clientes para instrumentalizar aplicaciones. &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>spanish</category>
      <category>monitoring</category>
      <category>prometheus</category>
    </item>
    <item>
      <title>Que es Prometheus?(promicius) Parte 1</title>
      <dc:creator>Jose Luis</dc:creator>
      <pubDate>Sun, 21 Feb 2021 21:18:02 +0000</pubDate>
      <link>https://dev.to/joseluisp/que-es-prometheus-promicius-parte-1-2bai</link>
      <guid>https://dev.to/joseluisp/que-es-prometheus-promicius-parte-1-2bai</guid>
      <description>&lt;p&gt;&lt;strong&gt;Photo by &lt;a href="https://unsplash.com/@lukechesser"&gt;Luke Chesser&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/JKUTrJ4vK00?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditShareLink"&gt;Unsplash&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Prometeus es un sistema de monitorizacion en tiempo real muy modular. Soundcloud cedio el proyecto a la CNCF.&lt;/p&gt;

&lt;p&gt;Se puede desplegar a traves terraform, cloudformation, helm, etc...&lt;/p&gt;

&lt;p&gt;Utiliza metricas con timeseries y se usa para monitorizar el entorno. Segun a ido creciendo prometheus, se ha integrando muy bien en kubernetes. Utilizando prometeus para monitorizar el cluster kubernetes, podemos sacar metricas del uso del cluster kubernetes (capacidad, que esta haciendo cada pod, servicios, etc...)&lt;/p&gt;

&lt;p&gt;Sustituye a una parte muy especifica de datadog / newrelic: monitorizar los recursos. Datadog / newrelic tienen muchos mas servicios.&lt;/p&gt;

&lt;h1&gt;
  
  
  Que es monitorizacion?
&lt;/h1&gt;

&lt;p&gt;La monitorizacion son las herramientas y procesos para medir y gestionar temas tecnologicos.&lt;/p&gt;

&lt;h1&gt;
  
  
  Que ofrece Prometheus?
&lt;/h1&gt;

&lt;p&gt;Tus mediciones se van a transformar en metricas que una persona pueda evaluar. Esto provee feedback al negocio, etc...&lt;/p&gt;

&lt;p&gt;Muchos pueden tener nagios como referente, pero con nagios vas a buscar el estado de un recurso/servicio, esta arriba / abajo, estado booleano, aunque nagios ofrece plugins para mejorarlo.&lt;/p&gt;

&lt;p&gt;Prometeus permite recoger metricas (porcentaje de uso cpu, porcentaje uso memoria, bytes en un interface de red, etc...) en base a esas metricas pueda lanzar alertas. Prometheus esta mas pensado en sistemas mas dinamicos ya que agrupa las metricas sin necesidad de detalles concretos, por ejemplo: conocer la ip.&lt;/p&gt;

&lt;p&gt;Prometheus esta mas indicado para ver la raiz del error en entornos mas complicados como kubernetes, donde la falla de un proceso puede estar asociado a otro proceso que es el realmente falla.&lt;/p&gt;

&lt;h1&gt;
  
  
  Monitorizacion push vs pull
&lt;/h1&gt;

&lt;p&gt;La diferencia basica entre estos dos sistemas es que el sistema push va a buscar el dato y el sistema de monitorizacion pull reciben el dato.&lt;/p&gt;

&lt;p&gt;Los sistemas basados en pull garantizan que ciertas mediciones van a estar enviando el dato aunque no se puedan enviar entre si, menos uso de los recursos. Por contra, por ejemplo, el sistema pull no puede comprobar si tu instancia sigue viva, porque no llega a ella.&lt;/p&gt;

&lt;p&gt;Los sistemas basados en push las aplicaciones emiten eventos que son recibidos por el sistema de monitorizacion.&lt;/p&gt;

&lt;p&gt;Los dos acercamientos tienen aspectos positivos y negativos. El debate sigue abierto.&lt;/p&gt;

&lt;p&gt;Prometheus es un sistema basado en pull pero tambien soporta recibir eventos(push) gracias a un pushgateway que envia los eventos a prometheus. Prometheus es un poco hibrido en este aspecto.&lt;/p&gt;

&lt;h1&gt;
  
  
  Datos que usaremos
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Metricas que tienen un timeseries.&lt;/li&gt;
&lt;li&gt;Logs (es costoso estar parseando los logs en busca de patrones). Se suelen utilizar otros sistemas mas especializados en este ambito.&lt;/li&gt;
&lt;li&gt;Chequeo del estado, aunqe tambien puede considerarse una metrica.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Las metricas seran el elemento principal que vamos a usar para generar alarmas, el log vamos a convertir en una metrica, es decir, sacamos un patron de errores del log y ese patron lo convertimos como metrica. El log nos va apoyar para generar las alarmas.&lt;/p&gt;

&lt;p&gt;Como hemos comentado antes, muchos frameworks de monitorizacion utilizan un estado boleano para lanzar alertas y se quedan cortos al usarse en entornos tan complejos como kubernetes.&lt;/p&gt;

&lt;p&gt;Prometheus cambia la idea anterior de chequear el estado del servicio por chequear las metricas.&lt;/p&gt;

&lt;p&gt;La metrica nos ayuda a adelantarnos al error, podemos adelantarnos a los errores. Ejemplo de situacion, la carga de cpu empieza a subir, igual 5 minutos antes de que la web caiga, podemos reaccionar.&lt;/p&gt;

&lt;p&gt;A que se llama timeseries? se le llama timeseries a un dato con un indice timestamp junto con un dato de cualquier tipo. Por ejemplo, numero de visitas en una pagina web, alertar al minado de criptomonedas en nuestra infraestructura, etc...&lt;/p&gt;

&lt;h1&gt;
  
  
  Granularidad
&lt;/h1&gt;

&lt;p&gt;Cuando almacenas un dato tienes que definir la granularidad, es decir, cada cuando vas a almacenar el dato, si es cada segundo, cada 60 segundos, etc...&lt;/p&gt;

&lt;p&gt;Elegir la granularidad correcto es critico porque con ello nos conlleva a adelantarnos a un error critico.&lt;/p&gt;

&lt;h1&gt;
  
  
  Tipos de metricas
&lt;/h1&gt;

&lt;p&gt;Hay una variedad de diferentes tipos de metricas que vamos a etener:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Gauge (calibre): son valores que pueden subir o bajar. Esencialmente una foto fija de una medida en concreto. La clasica metrica de cpu, disco, uso de memoria, numero concurrente de visitas en un momento dado,  etc...&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Contador: son numeros que se incrementen durante un tiempo, pero que nunca bajan, esencialmente son incrementales. Algunas veces los counters se pueden resetar a 0 e incrementarse de nuevo. Ejemplos: uptime del sistema, numero de bytes recibidos en un interfaz de red, numero de logins, etc... Los counter tienen utilidad porque te permiten calcular el ratio de cambio. El ratio de crecimiento en N minutos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Histograma: es metrica que muestrea observaciones. Agrupa datos juntos, y representa los datos en un grupo. El resultado es varias metricas agrupadas. Visualizacion comun es una grafica de barras.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Transformaciones matematicas: ocasasionalmente el valor de una sola metrica no nos sirve para nada, en su lugar necesitamos una visualizacion con transformaciones matematicas, por ejemplo, funciones estadisticas, las mas comunes son contar / suma / media / percentils / desviacion estandard / ratio de cambio.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Agregacion de metricas: podemos agregar metricas para multiples recursos. Por ejemplo: uso de disco desde diferentes servidores. No agregas datos simplemente pones los datos uno encima de otro. El valor agregado lo visualiza grafana mejor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Media: metodo de facto de las metricas. La media de un rango concreto.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por ejemplo: un plan de capacidad a largo plazo, necesitaremos transformaciones matematicas, funciones mas avanzadas de estadistica.&lt;/p&gt;

&lt;h1&gt;
  
  
  Metodologia de monitorizacion
&lt;/h1&gt;

&lt;p&gt;Hacemos un uso de una combinacion de diferentes metodologias de monitorizacion encima de nuestras metricas. Vamos a combinar elementos de dos metodos diferentes. El uso del metodo USE (Utilizacion, Saturacion, Errores) y el metodo "Google's Four Golden Signal" que se centra en la monitorizacion a nivel de aplicacion. Estas son las dos metodos que combinan para diseñar sistemas de monitorizacion.&lt;/p&gt;

&lt;p&gt;Cuando estan combinadas uno se centra en la perfomance del servidor y el otro en el performance a nivel de aplicacion. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;El metodo USE, desarrollado por netflix, propone la creacion de un checklist para el analisis de los servidores que permite identificacion rapido de problemas. Con este identificas problemas comunes de perfomance con los datos que has recolectado. Muy util para monitorizar recursos(cpu, disco, etc...) que sufren problemas de performance sobre grandes cargas(saturacion).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Utilizacion es el tiempo medio que el recurso esta ocupado realizando procesos expresado como porcentaje sobre tiempo.&lt;/li&gt;
&lt;li&gt;Saturacion es el numero de trabajos que no ha podido procesar y por tanto se han quedado en cola, se expresa en el tamaño de la cola y contador de errores.&lt;/li&gt;
&lt;li&gt;Errores.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo: tenemos un serio problema de perfomance, nuestro checklist contiene vario elementos y los tenemos que recorrer en busca de anomalias. Mirariamos el uso/saturacion/errores de la cpu, uso/saturacion/errores de la memoria, etc...&lt;/p&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;El metodo "Google's Four Golden Signal" viene del "google sre book" &lt;a href="https://sre.google/sre-book/monitoring-distributed-systems/"&gt;link libro&lt;/a&gt; Latencia / Trafico / Errores / Saturacion.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Latencia: es el tiempo que le toma servir una peticion. Hay que distinguir entre latencia cuando algo ha salido bien y latencia cuando ha salido mal, por ejemplo, una peticion fallida puede tener una latencia muy baja, porque simplemente retorna el error muy rapido.&lt;/li&gt;
&lt;li&gt;Trafico: es la demanada que tiene tu sistema en un momento dado. Por ejemplo, peticiones HTTP por segundo.&lt;/li&gt;
&lt;li&gt;Errores: es el numero de errores en un tiempo dado.&lt;/li&gt;
&lt;li&gt;Saturacion: es como de ocupado esta tu aplicacion o los recursos que estan haciendo que la aplicacion vaya mal, por ejemplo, memoria o entrada/salida.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>spanish</category>
      <category>monitoring</category>
      <category>prometheus</category>
    </item>
    <item>
      <title>K3S y K3D = buena combinacion para el desarrollo en local y tests locales</title>
      <dc:creator>Jose Luis</dc:creator>
      <pubDate>Sun, 07 Feb 2021 18:00:00 +0000</pubDate>
      <link>https://dev.to/joseluisp/k3s-y-k3d-buena-combinacion-para-el-desarrollo-en-local-y-tests-locales-a48</link>
      <guid>https://dev.to/joseluisp/k3s-y-k3d-buena-combinacion-para-el-desarrollo-en-local-y-tests-locales-a48</guid>
      <description>&lt;p&gt;&lt;strong&gt;Photo by &lt;a href="https://unsplash.com/@wildmax"&gt;Massimo Botturi&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/zFYUsLk_50Y?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditShareLink"&gt;Unsplash&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Trabajar con Kubernetes(K8S) en &lt;code&gt;maquina local&lt;/code&gt; cuando eres desarrollador o un operador de sistemas no es facil. ¿Como crear un cluster de kubernetes local facilmente? Hay muchas soluciones para utilizar kubernetes en el sistema local, &lt;code&gt;microk8s&lt;/code&gt;, &lt;code&gt;minikube&lt;/code&gt;, &lt;code&gt;k3s&lt;/code&gt;. La que veremos aqui es k3s.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;¿Y por que un cluster local?
Un cluster en local es una buena forma de empezar en kubernetes, ademas, puedes experimentar y realizar todos los errores que quieras.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  En que es diferente k3s a las demas soluciones
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;k3s no tiene dependencias externas.&lt;/li&gt;
&lt;li&gt;k3s es un binario de 40MB.&lt;/li&gt;
&lt;li&gt;k3s usa muchisimos menos recursos&lt;/li&gt;
&lt;li&gt;k3s utiliza un intermediario llamado kine que traduce las llamadas de la api a etcd o a una base de datos sql.&lt;/li&gt;
&lt;li&gt;k3s esta construido en base a funcionalidad y la modularidad. Incluye un controlador de helm(puede usar los charts de helm sin tener que usar el cliente de helm), manifiestos para un despliegue automatico, politicas de red.&lt;/li&gt;
&lt;li&gt;k3s al arrancar solo levanta 3 servicios. Pero en caso de necesitar mas servicios se pueden levantar.&lt;/li&gt;
&lt;li&gt;k3s esta optimizado para ARM. Funciona igual de bien que en raspberry pi o en una aws x4large.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Arquitectura interna de k3s
&lt;/h2&gt;

&lt;p&gt;Aqui tenemos un diagrama de la estructura interna del k3s&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4pg7X5hu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/sosan/kubernetes/master/assets/diagrama_arquitectura_rancher.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4pg7X5hu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/sosan/kubernetes/master/assets/diagrama_arquitectura_rancher.webp" alt="Imagen interna de la arquitectura"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Requisitos
&lt;/h2&gt;

&lt;p&gt;Antes de empezar la instalacion de k3d, necesitamos tener instalados:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/engine/install/ubuntu/"&gt;Informacion externa sobre la instalacion de Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/tasks/tools/install-kubectl/"&gt;Informacion externa sobre la instalacion de Kubectl&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Instalacion de kubectl
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Bajar kubectl
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-LO&lt;/span&gt; &lt;span class="s2"&gt;"https://dl.k8s.io/release/&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; https://dl.k8s.io/release/stable.txt&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/bin/linux/amd64/kubectl"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Cambiamos permisos de kubectl y copiamos a /usr/local/bin
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo install&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; root &lt;span class="nt"&gt;-g&lt;/span&gt; root &lt;span class="nt"&gt;-m&lt;/span&gt; 0755 kubectl /usr/local/bin/kubectl &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm &lt;/span&gt;kubectl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ¿Que es k3s? Al turron!!
&lt;/h2&gt;

&lt;p&gt;k3s es una distribucion de Kubernetes muy eficiente y ligera. k3s encaja particularmente bien en un entorno de desarrollo local. Podemos probar la aplicacion con los manifiestos de kubernetes en condiciones reales. Ademas de ligero y eficiente, es bastante modular y debido a esta modularidad podemos intercambiar/cambiar piezas que vienen por defecto. (Desarrollado mas adelante en profundidad)&lt;/p&gt;

&lt;p&gt;k3s incluye:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Flannel: una red superpuesta L2 muy simple que satisface los requisitos de Kubernetes. Este es un complemento CNI (interfaz de red de contenedores), como Calico, Romana, Weave-net&lt;br&gt;
Flannel no es compatible con las políticas de red de Kubernetes, pero se puede reemplazar por Calico.&lt;/p&gt;

&lt;p&gt;CoreDNS: un servidor DNS flexible y extensible que puede servir como el DNS del clúster de Kubernetes.&lt;/p&gt;

&lt;p&gt;Traefik: es un proxy inverso HTTP y un balanceador de carga. Se puede cambiar por traefik2 o nginx.&lt;/p&gt;

&lt;p&gt;Balanceador de carga Klipper: balanceador de carga de servicios que utiliza puertos de host disponibles.&lt;/p&gt;

&lt;p&gt;SQLite3: el almacenamiento utilizado de forma predeterminada. Tambien se puede sustituir por MySQL, Postgres, etcd3.&lt;/p&gt;

&lt;p&gt;Containerd: es un ejecutador de contenedores en tiempo de ejecución como Docker pero sin la parte de construcción de imagen.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  ¿Que es k3d?
&lt;/h2&gt;

&lt;p&gt;k3d es una utilidad diseñada por Rancher para ejecutar fácilmente k3s en Docker, proporciona un cliente para crear, ejecutar y eliminar clusters de Kubernetes de 1 nodo a n nodos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nuevas incorporaciones del K3D version 3
&lt;/h3&gt;

&lt;p&gt;Rancher ha hecho un gran trabajo y ha reescrito por completo k3d en la version 3. Han implementado nuevos conceptos y estructuras para convertir a k3d con caracteristicas muy interesantes y practicas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ahora ya no existe la terminologia &lt;code&gt;maestro&lt;/code&gt; / &lt;code&gt;esclavo&lt;/code&gt;, ahora existen &lt;code&gt;servidor&lt;/code&gt; y &lt;code&gt;agente&lt;/code&gt; (&lt;code&gt;server&lt;/code&gt; / &lt;code&gt;agent&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Cada cluster que se cree, generara al menos 2 contenedores: 1 equilibrador de carga y 1 nodo &lt;code&gt;servidor&lt;/code&gt;. El equilibrador de carga es el punto de acceso a la api de k3s, por lo que para clusters en varios servidores, solo necesitas exponer un unico puerto para la api. Tambien se encarga de enviar las solucitudes al nodo &lt;code&gt;servidor&lt;/code&gt; correcto (se puede desactivar con &lt;code&gt;--no-lb&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Siguiendo la tendencia de otros clientes nativos de la nube (awscli, gcloud, azurecli, etc...) se ha adoptado la sintaxis &lt;code&gt;noun verb&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Soporte para clusters en multiples servidores (&lt;code&gt;dqlite&lt;/code&gt;) con configuracion de recargas en caliente cuando se agrega un nuevo nodo &lt;code&gt;servidor&lt;/code&gt; al cluster.&lt;/li&gt;
&lt;li&gt;Manejos de nodos independientemente de los clusters: k3d create/start/stop/delete node NOMBRE_DEL_NODO&lt;/li&gt;
&lt;li&gt;Soporte basico para plugins.&lt;/li&gt;
&lt;li&gt;Autocompletado. (Desarrollado mas adelante)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Instalacion K3D
&lt;/h3&gt;

&lt;p&gt;La instalación es muy fácil y está disponible a través de muchos instaladores: wget, curl, brew, ...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;wget:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="nt"&gt;-O&lt;/span&gt; - https://raw.githubusercontent.com/rancher/k3d/master/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;curl:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://raw.githubusercontent.com/rancher/k3d/main/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Homebrew:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;k3d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Choco windows&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;choco &lt;span class="nb"&gt;install &lt;/span&gt;k3d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;una vez instalado, puedes configurar el autocomplete con el shell (bash, zsh, fish, powershell). El Comando completo con sus opcionales:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;k3d completion &lt;span class="o"&gt;[&lt;/span&gt;bash | zsh | fish | &lt;span class="o"&gt;(&lt;/span&gt;psh | powershell&lt;span class="o"&gt;)]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ejemplo en bash, simplemente sustituir bash por el que necesitemos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;k3d completion bash &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Creacion del cluster
&lt;/h3&gt;

&lt;p&gt;Creamos un cluster muy simple llamado &lt;code&gt;hello-world&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;k3d cluster create hello-world
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En unos segundos saldria el output, lo que realiza el k3d es generando los contenedores:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;INFO[0000] Prep: Network
INFO[0000] Created network &lt;span class="s1"&gt;'k3d-hello-world'&lt;/span&gt;
INFO[0001] Created volume &lt;span class="s1"&gt;'k3d-hello-world-images'&lt;/span&gt;
INFO[0002] Creating node &lt;span class="s1"&gt;'k3d-hello-world-server-0'&lt;/span&gt;
INFO[0002] Creating LoadBalancer &lt;span class="s1"&gt;'k3d-hello-world-serverlb'&lt;/span&gt;
INFO[0003] Starting cluster &lt;span class="s1"&gt;'hello-world'&lt;/span&gt;
INFO[0003] Starting Node &lt;span class="s1"&gt;'k3d-hello-world-server-0'&lt;/span&gt;
INFO[0034] Starting Node &lt;span class="s1"&gt;'k3d-hello-world-serverlb'&lt;/span&gt;
INFO[0076] &lt;span class="o"&gt;(&lt;/span&gt;Optional&lt;span class="o"&gt;)&lt;/span&gt; Trying to get IP of the docker host and inject it into the cluster as &lt;span class="s1"&gt;'host.k3d.internal'&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;easy access
INFO[0146] Successfully added host record to /etc/hosts &lt;span class="k"&gt;in &lt;/span&gt;2/2 nodes and to the CoreDNS ConfigMap
INFO[0146] Cluster &lt;span class="s1"&gt;'hello-world'&lt;/span&gt; created successfully!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este cluster &lt;code&gt;hello-world&lt;/code&gt; solo tiene un solo nodo, este unico nodo haria la funcion de servidor y agente. No tiene alta disponibilidad. A parte de crear el cluster desde consola tambien se puede crear desde un archivo. Veremos mas adelante.&lt;/p&gt;

&lt;p&gt;Creamos otro cluster con 1 balanceador y con 1 nodo (con el rol de servidor y agente) con el nombre &lt;code&gt;dev&lt;/code&gt; con los puertos abiertos 8080 y 8443 en el host y 80 y 443 puertos locales de la imagen (esto se complica!!!). Tampoco tiene alta disponibilidad:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;k3d cluster create dev &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--port&lt;/span&gt; 8080:80@loadbalancer &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--port&lt;/span&gt; 8443:443@loadbalancer &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--api-port&lt;/span&gt; 6551
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;ATENCION: Estos dos clusters ocuparan en memoria cerca de 1.5GiB&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ahora podemos listar los clusters que tenemos&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;k3d cluster list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;y obtendremos algo asi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME          SERVERS   AGENTS   LOADBALANCER
dev           1/1       0/0      true
hello-world   1/1       0/0      true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Para que podamos entender mejor la estructura que crea k3d, aqui tenemos un diagrama general:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BPDQFbuR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/sosan/kubernetes/master/assets/diagrama_cluster_k3d.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BPDQFbuR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/sosan/kubernetes/master/assets/diagrama_cluster_k3d.webp" alt="Diagrama cluster k3d"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Creamos otro cluster con 1 nodo servidor con 3 agentes. Con &lt;code&gt;--servers&lt;/code&gt; y &lt;code&gt;--agents&lt;/code&gt; podemos espicificar el numero que queremos de cada tipo. Este cluster tampoco tiene alta disponibilidad. Nos puede vernir muy bien para probar cosas en fase de desarrollo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;k3d cluster create dev-servidoryagentes &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--port&lt;/span&gt; 8081:81@loadbalancer &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--port&lt;/span&gt; 8444:443@loadbalancer &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--api-port&lt;/span&gt; 6443 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--servers&lt;/span&gt; 1 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--agents&lt;/span&gt; 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;NOTA: Si comprobamos la memoria usada por los 2 clusters creados hasta ahora, facilmente sobrepasemos los 2GiB. Este ultimo cluster es solo de prueba y podemos borrarlo con &lt;code&gt;k3d cluster delete dev-servidoryagentes&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Explicacion mapeo de puertos
&lt;/h3&gt;

&lt;p&gt;Ahora vamos a explicar un poco como el balanceador de carga se encarga de repartir el trafico hacia otros contenedores. Con el comando &lt;code&gt;docker ps&lt;/code&gt; obtenemos que existen 4 contenedores: 2 k3d-proxy(2 balanceadores de carga ... &lt;code&gt;xxxx-serverlb&lt;/code&gt;) y 2 k3s(2 servidores &lt;code&gt;xxxx-server-0&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;...] IMAGE                      COMMAND                &lt;span class="o"&gt;[&lt;/span&gt;...]   PORTS                                                                 NAMES
&lt;span class="o"&gt;[&lt;/span&gt;...] rancher/k3d-proxy:v4.0.0   &lt;span class="s2"&gt;"/bin/sh -c nginx-pr…"&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;...]   0.0.0.0:8080-&amp;gt;80/tcp, 0.0.0.0:8443-&amp;gt;443/tcp, 0.0.0.0:6551-&amp;gt;6443/tcp   k3d-dev-serverlb
&lt;span class="o"&gt;[&lt;/span&gt;...] rancher/k3s:v1.20.0-k3s2   &lt;span class="s2"&gt;"/bin/k3s server --t…"&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;...]                                                                         k3d-dev-server-0
&lt;span class="o"&gt;[&lt;/span&gt;...] rancher/k3d-proxy:v4.0.0   &lt;span class="s2"&gt;"/bin/sh -c nginx-pr…"&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;...]   80/tcp, 0.0.0.0:45735-&amp;gt;6443/tcp                                       k3d-hello-world-serverlb
&lt;span class="o"&gt;[&lt;/span&gt;...] rancher/k3s:v1.20.0-k3s2   &lt;span class="s2"&gt;"/bin/k3s server --t…"&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;...]                                                                         k3d-hello-world-server-0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aunque el &lt;code&gt;docker ps&lt;/code&gt; facilita mas informacion, omitiremos informacion y nos centraremos en la parte que nos importa. En &lt;strong&gt;PORTS&lt;/strong&gt; obtenemos los puertos abiertos localmente y localmente en el contenedor.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;0.0.0.0:8080-&amp;gt;80/tcp, 0.0.0.0:8443-&amp;gt;443/tcp, 0.0.0.0:6551-&amp;gt;6443/tcp&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Abre 2 puertos en el host 8080 y 8443 y 2 puertos en local del contenedor 80 y 443.&lt;/p&gt;

&lt;p&gt;Ahora centremos en el comando de creacion del cluster que hemos utilizado anteriormente:&lt;br&gt;
&lt;strong&gt;NOTA: No es necesario ejecutar el comando de abajo.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;k3d cluster create dev &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--port&lt;/span&gt; 8080:80@loadbalancer &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--port&lt;/span&gt; 8443:443@loadbalancer &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--api-port&lt;/span&gt; 6551
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explicacion del mapeo de puertos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;--port 8080:80@loadbalancer&lt;/strong&gt; añade un mapa al puerto del host 8080 que vaya al puerto local 80 del balanceador de carga, ademas añade para las peticiones un mapa con el puerto 80 a todos los nodos &lt;code&gt;agente&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;--api-port 6551&lt;/strong&gt; : Por defecto, los puertos de la api NO son publicos. API-PORT se usa para forzar el api-servidor de k3s a escuchar en el puerto 6551. De esta forma, el balanceador de carga accedera a la api de kubernetes, incluso para clusters en multi-servidores. Solo es necesario publicar/exponer un solo api puerto. El balanceador de carga se encargara de redireccionar las peticiones al nodo &lt;code&gt;servidor&lt;/code&gt; apropiado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;NOTA: --port "32000-32767:32000-32767@loadbalancer"&lt;/strong&gt; : De esta forma, utilizando rangos (&lt;code&gt;32000-32767&lt;/code&gt;) expones un rango de puertos para los nodos. Se utiliza esta forma (rangos de puertos) cuando quieras evitar el &lt;code&gt;Ingress Controller&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;PRO TIP: Durante el proceso de creacion de un cluster es posible que, debido a falta de recursos el cluster este intentando constantemente matandose y reinciandose. Para evitar este comportamiento, es posible añadirle un timeout a la creacion del cluster.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Que ocurre cuando tienes multiples clusters?
&lt;/h3&gt;

&lt;p&gt;Si tenemos planificado tener varios clusters, ¿como podemos separar la configuacion de los multiples clusters? kubernetes tiene una forma de separar la configuracion atrasves de archivos de configuracion. Los usuarios, contextos se suelen definir en uno o varios archivos de configuracion, de esta forma puedes cambiar rapidamente entre configuraciones de clusters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTA:Normalmente se le suele llamar kubeconfig pero no es fisicamente el nombre de un archivo.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Un contexto es un elemento del archivo kubeconfig que se usa para agruapar parametros sobre un nombre. Cada contexto tiene tres parametros: cluster, namespace y usuario. Por defecto, kubectl usa los parametros del contexto actual para comunicarse dentro del cluster.&lt;/p&gt;

&lt;p&gt;Para ver cual es contexto actual, tenemos este comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl config current-context
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para obtener mas informacion de la configuracion:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl config view
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;el output es el siguiente, como veis enseña los &lt;code&gt;contexts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://0.0.0.0:6551
  name: k3d-dev
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://0.0.0.0:34716
  name: k3d-hello-world
contexts:  &lt;span class="c"&gt;#####--------AQUI-------------------&lt;/span&gt;
- context:
    cluster: k3d-dev
    user: admin@k3d-dev
  name: k3d-dev
- context:
    cluster: k3d-hello-world
    user: admin@k3d-hello-world
  name: k3d-hello-world
current-context: k3d-dev
kind: Config
preferences: &lt;span class="o"&gt;{}&lt;/span&gt;
&lt;span class="nb"&gt;users&lt;/span&gt;:
- name: admin@k3d-dev
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
- name: admin@k3d-hello-world
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;------PEQUEÑO INCISO------&lt;/p&gt;

&lt;p&gt;Hacemos un pequeño inciso y pegamos una pequeña pincelada al manejo de kubectl. Kubectl puede configurar los clusters atraves de archivos, podemos empezar usando la estructura de aqui abajo y modificar la estructura con comandos kubectl. Este archivo describe dos clusters, dos usurios y tres contextos.&lt;/p&gt;

&lt;p&gt;NO es necesario ejecutar los siguientes comandos, solo es a modo de pequeña explicacion.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; configuracion-clusters
apiVersion: v1
kind: Config
preferences: {}

clusters:
- cluster:
  name: development
- cluster:
  name: production

users:
- name: developer
- name: test-user

contexts:
- context:
  name: dev-frontend
- context:
  name: dev-storage
- context:
  name: pd-production
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Con estos comandos añadimos detalles a los clusters, certificados, direcciones, etc...:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl config &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--kubeconfig&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;configuracion-clusters set-cluster development &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--server&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://1.2.3.4 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--certificate-authority&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;fake-ca-file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl config &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--kubeconfig&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;configuracion-clusters set-cluster production &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--server&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://5.6.7.8 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--insecure-skip-tls-verify&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Con estos comandos añadimos detalles a los usuarios:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl config &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--kubeconfig&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;configuracion-clusters set-credentials developer &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--client-certificate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;certificado_fake_archivo &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--client-key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;key_fake_archivo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl config &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--kubeconfig&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;configuracion-clusters set-credentials test-user &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--username&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;usuario_test &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;password_test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Con este comando enlazamos los clusters con el contexto. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;En este caso enlaza el contexto &lt;code&gt;dev-frontend&lt;/code&gt; y el cluster &lt;code&gt;development&lt;/code&gt;, el namespace &lt;code&gt;frontend&lt;/code&gt; y el usuario &lt;code&gt;developer&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl config &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--kubeconfig&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;configuracion-clusters set-context dev-frontend &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--cluster&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;development &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--namespace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;frontend  &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;developer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;En este caso enlaza el contexto &lt;code&gt;dev-storage&lt;/code&gt; y el cluster &lt;code&gt;development&lt;/code&gt;, el namespace &lt;code&gt;storage&lt;/code&gt; y el usuario &lt;code&gt;developer&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl config &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--kubeconfig&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;configuracion-clusters set-context dev-storage &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--cluster&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;development &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--namespace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;storage &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;developer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;En este caso enlaza el cluster &lt;code&gt;production&lt;/code&gt; con el contexto &lt;code&gt;pd-production&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl config &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--kubeconfig&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;configuracion-clusters set-context pd-production &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--cluster&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--namespace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;test-user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;para ver los cambios efectuados en el archivo:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl config &lt;span class="nt"&gt;--kubeconfig&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;configuracion-clusters view
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;la salida es la siguiente, fijarse como ha ido cambiando los parametros :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: v1
clusters:
- cluster:
    certificate-authority: fake-ca-file
    server: https://1.2.3.4
  name: development
- cluster:
    insecure-skip-tls-verify: true
    server: https://5.6.7.8
  name: production
contexts:
- context:
    cluster: development
    namespace: frontend
    user: developer
  name: dev-frontend
- context:
    cluster: development
    namespace: storage
    user: developer
  name: dev-storage
- context:
    cluster: production
    namespace: production
    user: test-user
  name: pd-production
current-context: ""
kind: Config
preferences: {}
users:
- name: developer
  user:
    client-certificate: certificado_fake_archivo
    client-key: key_fake_archivo
- name: test-user
  user:
    password: password_test
    username: usuario_test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Ahora supongamos que queremos trabajar con el cluster &lt;code&gt;PRODUCTION&lt;/code&gt; pero estamos en el cluster &lt;code&gt;DEVELOPMENT&lt;/code&gt;. Tenemos que usar el kubectl y decirle que use el archivo de configuracion &lt;code&gt;configuracion-clusters&lt;/code&gt; y se pase al pd-production:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl config &lt;span class="nt"&gt;--kubeconfig&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;configuracion-clusters use-context pd-production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Con este ejemplo pasamos al contexto &lt;code&gt;dev-storage&lt;/code&gt; y como tiene enlazado el contexto al cluster &lt;code&gt;DEVELOPMENT&lt;/code&gt; usa el cluster correcto.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl config &lt;span class="nt"&gt;--kubeconfig&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;configuracion-clusters use-context dev-storage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;PRO TIP: Existe las herramientas &lt;a href="https://github.com/ahmetb/kubectx"&gt;Kubectx y Kubens&lt;/a&gt; que nos permiten cambiar de clusters y namespaces mucho mas facil.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;
Despues de este pequño inciso, seguimos con k3d. &lt;/p&gt;

&lt;p&gt;Por defecto, al crear un cluster en k3d el kubeconfig se actualizara automaticamente. Por ejemplo, si estamos usando el kubeconfig de un cluster y tenemos que crear un nuevo cluster, al terminar de crear el nuevo cluster nos cambiara automaticamente al nuevo cluster. &lt;/p&gt;

&lt;p&gt;Lo podemos comprobar lanzado el comando &lt;code&gt;get-contexts&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl config get-contexts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nos enseñara algo asi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;CURRENT   NAME               CLUSTER            AUTHINFO                 NAMESPACE
&lt;span class="k"&gt;*&lt;/span&gt;         k3d-dev            k3d-dev            admin@k3d-dev
          k3d-hello-world    k3d-hello-world    admin@k3d-hello-world
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para cambiar al cluster &lt;code&gt;k3d-hello-world&lt;/code&gt; tendriamos que realizar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl config use-context k3d-hello-world
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saldra mensaje: &lt;code&gt;Switched to context "k3d-hello-world".&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Por defecto, el formato del contexto es &lt;code&gt;k3d-NOMBRE_DEL_CLUSTER&lt;/code&gt;. Si quisieramos cambiar de cluster y ademas especificar el archivo de configuracion &lt;code&gt;kubectl config --kubeconfig=NOMBRE_DEL_ARCHIVO use-context NOMBRE_DEL_CONTEXTO&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Por el momento cambiamos de contexto a &lt;code&gt;k3d-dev&lt;/code&gt; con la instruccion:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl config use-context k3d-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  PROFUNDIZANDO. Desactivar el cambio automatico, cambio manual
&lt;/h2&gt;

&lt;p&gt;Si se quiere deshabilitar este comportamiento de creacion/actualizacion automatica que viene por defecto, se puede usar el comando &lt;code&gt;--kubeconfig-update-default = false&lt;/code&gt;. Quedaria algo asi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;k3d cluster create sin-auto &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--port&lt;/span&gt; 8085:80@loadbalancer &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--port&lt;/span&gt; 8445:443@loadbalancer &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--api-port&lt;/span&gt; 6552 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--kubeconfig-update-default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se creara el cluster pero no saltaremos al contexto del nuevo cluster, esto ocurre gracias a la instruccion &lt;code&gt;kubeconfig-update-default = false&lt;/code&gt;. Por tanto, nos tocara actualizar el kubeconfig manualmente. Pues vamos alla!! Al atake!!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para comprobar y consultar el contexto actual:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl config current-context
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;tendremos un output &lt;code&gt;k3d-dev&lt;/code&gt;, ya anteriormente hemos cambiado al cluster &lt;code&gt;k3d-dev&lt;/code&gt;. Nos lo confirmara el comando &lt;code&gt;kubectl config get-contexts&lt;/code&gt; que nos lanzara una respuesta parecida a:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CURRENT   NAME              CLUSTER           AUTHINFO                NAMESPACE
*         k3d-dev           k3d-dev           admin@k3d-dev           
          k3d-hello-world   k3d-hello-world   admin@k3d-hello-world   
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ATENCION: con el ultimo cluster creado &lt;code&gt;sin-auto&lt;/code&gt; llegaremos a los 4GiB de memoria consumidos.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Y ahora realizamos un:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl config view
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pero tenemos el cluster creado ya que con&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;k3d cluster list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;aparece el siguente listado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME          SERVERS   AGENTS   LOADBALANCER
dev           1/1       0/0      true
hello-world   1/1       0/0      true
sin-auto      1/1       0/0      true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tanto mostrando el &lt;code&gt;get-contexts&lt;/code&gt; y el &lt;code&gt;config view&lt;/code&gt; no nos enseña el cluster &lt;code&gt;sin-auto&lt;/code&gt;. Podriamos pensar que simplemente con este comando se solucionaran los problemas. Pero la realidad es que nos salta un error &lt;code&gt;error: no context exists with the name: "sin-auto"&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl config use-context sin-auto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para actualizar el kubeconfig con el nuevo contexto y cambiar al nuevo contexto, necesitamos relaizar estos comandos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;k3d kubeconfig write sin-auto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;el output sera parecido a: &lt;code&gt;/root/.k3d/kubeconfig-sin-auto.yaml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;k3d kubeconfig merge sin-auto &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--kubeconfig-merge-default&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--kubeconfig-switch-context&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Volvemos a consultar el contexto actual:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl config current-context
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Comandos para manipular el kubeconfig desde k3d
&lt;/h3&gt;

&lt;p&gt;k3d proporciona algunos comandos para manipular fácilmente kubeconfig:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Obtener el kubeconfig del cluster dev.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;k3d kubeconfig get dev&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Crear el archivo kubeconfig, por defecto se guardan en &lt;code&gt;~/.k3d/&lt;/code&gt; y siguen el esquema de nombre &lt;code&gt;kubeconfig-NOMBRE_DEL_CLUSTER.yaml&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;k3d kubeconfig write dev&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;obtener kubeconfig del cluster y fusionarlos en un archivo en &lt;code&gt;$HOME/.k3d/&lt;/code&gt; a otro archivo de configuracion yaml&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;k3d kubeconfig merge dev hello-world&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  SUBCOMANDOS del kubectl config
&lt;/h3&gt;

&lt;p&gt;Los comandos para añadir detalles al kubeconfig del cluster:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl config SUBCOMMANDOS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;current-context Muesta el contexto actual
delete-cluster  Borra el cluster especificado del kubeconfig
delete-context  Borra el contexto especificado del kubeconfig
delete-user     Borra el usuario especificado del kubeconfig
get-clusters    Mustra los clusters especificados en el kubeconfig
get-contexts    Muestra los contextos
get-users       Muestra los usuarios dentro del kubeconfig
rename-context  Renombra un contexto del kubeconfig
set             Especifica un valor en el kubeconfig
set-cluster     Añade un cluster en el kubeconfig
set-context     Añade un contexto en el kubeconfig
set-credentials Añade un usuario en el kubeconfig
unset           Desliga un valor individual del kubeconfig
use-context     Fija el contexto actual dentro del kubeconfig
view            Muestra los ajustes del kubeconfig o un archivo kubeconfig especificado
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Algunos Comandos k3d
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Paramos el cluster&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;k3d cluster stop dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Arrancamos el cluster y restauramos el estado anterior de la parada&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;k3d cluster start dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Borramos el cluster&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;k3d cluster delete dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Listamos los cluster&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;k3d cluster list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://k3d.io/usage/commands/"&gt;Arbol de comandos k3d&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Ejemplos de despliegue(workloads):
&lt;/h3&gt;

&lt;p&gt;Antes de hacer un despligue comprobamos que estemos el cluster correcto &lt;code&gt;dev&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl config get-contexts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En caso de no te estemos en el cluster &lt;code&gt;dev&lt;/code&gt; cambiamos de cluster con &lt;code&gt;kubectl config use-context k3d-dev&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Luego realizamos ciertos despligues:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl create deployment nginx &lt;span class="nt"&gt;--image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con el comando&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get pod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;obtendremos si el contenedor esta arriba &lt;code&gt;Running&lt;/code&gt; o todavia se esta levantado &lt;code&gt;Pending&lt;/code&gt;. Mientras esperamos podemos lanzar el siguiente comando para crear el servicio con el contenedor nginx:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl create service clusterip nginx &lt;span class="nt"&gt;--tcp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;80:80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si accedemos a la ip del contenedor con la 8080, nos dara un error 404. El error nos da porque todavia falta configurar los servicios internos para el contenedor nginx. Para ello necesitamos un archivo de configuracion yaml y aplicarle los cambios.&lt;/p&gt;

&lt;p&gt;Primero creamos el archivo, luego ejecutamos el comando para aplicar el archivo de configuracion &lt;code&gt;nginx-config.yaml&lt;/code&gt;. Mas tarde veremos el &lt;code&gt;cat&lt;/code&gt; redirigido al comando &lt;code&gt;kubectl apply&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; nginx-config.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: nginx
  annotations:
    ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: nginx
          servicePort: 80
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hemos creado el archivo y aplicamos el archivo de config.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; nginx-config.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;el resultado sera un mensaje: &lt;code&gt;ingress.networking.k8s.io/nginx created&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Para ver como nos ha quedado podemos realizar la consulta &lt;code&gt;kubectl get pod&lt;/code&gt; y nos quedaria algo asi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;NAME                     READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-l97lk   1/1     Running   0          16m
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esperamos a que el &lt;code&gt;status&lt;/code&gt; nos indique &lt;code&gt;Running&lt;/code&gt; y a partir de ahi podemos realizar un testing a la url &lt;code&gt;localhost:8080&lt;/code&gt; o &lt;code&gt;ip_linux:8080&lt;/code&gt; de la maquina que corre el linux deberia salir un texto &lt;code&gt;Welcome to nginx!&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ejemplo de creacion de 3 nodos servidor y 3 nodos agentes:
&lt;/h3&gt;

&lt;p&gt;Ahora vamos a crear un cluster mas parecido a un entorno un poco mas real. Creamos un cluster &lt;code&gt;dev-mas-real&lt;/code&gt; con 1 balanceador de carga, 3 servidores con 3 agentes. &lt;strong&gt;En el ejemplo usamos la base de datos interna (por defecto sqlite, pero en este caso usa etcd) de k3s para guardar el estado de los nodos servidor, pero para no complicar mas el ejemplo, se podria utilizar una base de datos externa(Mysql, posgres, etcd) para guardar el estado de los nodos servidor. La base de datos interna de k3s entre los nodos servidor se base en quorum entre los nodos servidor .&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTA: los nodos servidores TAMBIEN estan corriendo cargas de trabajo(workloads)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTA2: es posible que no arranque por problemas de memoria. Este cluster ocupa 3GiB en memoria con 3 nodos servidor y 3 nodos agente.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;k3d cluster create dev-mas-real &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--port&lt;/span&gt; 8090:80@loadbalancer &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--port&lt;/span&gt; 8143:443@loadbalancer &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--servers&lt;/span&gt; 3 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--agents&lt;/span&gt; 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El comando puede tardar varios segundos en completarse. Cuando termine con el comando de abajo listaremos los nodos que estan corriendo.:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get nodes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME                        STATUS   ROLES                       AGE     VERSION
k3d-dev-mas-real-agent-0    Ready    &amp;lt;none&amp;gt;                      3m45s   v1.20.0+k3s2
k3d-dev-mas-real-agent-1    Ready    &amp;lt;none&amp;gt;                      3m43s   v1.20.0+k3s2
k3d-dev-mas-real-agent-2    Ready    &amp;lt;none&amp;gt;                      3m43s   v1.20.0+k3s2
k3d-dev-mas-real-server-0   Ready    control-plane,etcd,master   4m11s   v1.20.0+k3s2
k3d-dev-mas-real-server-1   Ready    control-plane,etcd,master   3m57s   v1.20.0+k3s2
k3d-dev-mas-real-server-2   Ready    control-plane,etcd,master   3m47s   v1.20.0+k3s2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si necesitamos conocer las ips externas o internas usaremos este comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get nodes -o wide
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;RECORDATARIO: si hubieramos creado otro cluster despues de &lt;code&gt;dev-mas-real&lt;/code&gt;, al realizar el comando &lt;code&gt;kubectl get nodes&lt;/code&gt; saldrian los nodos del cluster creado depues de &lt;code&gt;dev-mas-real&lt;/code&gt;, osea, que esta creado despues cluster &lt;code&gt;nuevo&lt;/code&gt; haciendo &lt;code&gt;get nodes&lt;/code&gt; saldrian los nodos del cluster &lt;code&gt;nuevo&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;RECORDATORIO2: para cambiar al cluster &lt;code&gt;dev-mas-real&lt;/code&gt; tendriamos que realizar &lt;code&gt;kubectl config use-context k3d-dev-mas-real&lt;/code&gt;. Por defecto, el formato del contexto es &lt;code&gt;k3d-NOMBRE_DEL_CLUSTER&lt;/code&gt;. Si quisieramos cambiar de cluster y ademas especificar el archivo de configuracion &lt;code&gt;kubectl config --kubeconfig=NOMBRE_DEL_ARCHIVO use-context NOMBRE_DEL_CONTEXTO&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ahora que tenemos los nodos lanzaremos un despligue de una imagen nginx.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl create deployment nginx --image=nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl create service clusterip nginx --tcp=80:80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: nginx
  annotations:
    ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: nginx
          servicePort: 80
EOF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Despues de unos segundos saldra un mensaje: &lt;code&gt;ingress.networking.k8s.io/nginx created&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get pod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;el resultado es el de abajo y nos fijamos que solo hay uno.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME                     READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-9qdgq   1/1     Running   0          21s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora que ya tenemos el despliegue escalaremos a 3 replicas del contenedor nginx, el cluster se encargara de repatirlo entre los nodos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl scale deployment nginx --replicas 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Despues de varios segundos, podremos realizar el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get pod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;y veremos como se ha auto escalado a 3&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME                     READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-6542j   1/1     Running   0          8s
nginx-6799fc88d8-9qdgq   1/1     Running   0          48s
nginx-6799fc88d8-9tr69   1/1     Running   0          8s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;NOTA: con este despliegue llegaremos a 3.7GiB facilmente. Si es necesario borramos el cluster dev con &lt;code&gt;k3d cluster delete dev&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Explicacion visual de como quedaria el cluster con 3 nodos servidor y 3 nodos agentes:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DnPRLDEr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/sosan/kubernetes/master/assets/diagrama_cluster_devmasreal_k3d.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DnPRLDEr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/sosan/kubernetes/master/assets/diagrama_cluster_devmasreal_k3d.webp" alt="Diagrama cluster mas real k3d"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Despues de que el cluster se ha creado, es posible añadirle nodos. Por ejemplo añadimos un nuevo nodo llamado &lt;code&gt;nuevo-nodo&lt;/code&gt; con un rol de &lt;code&gt;agente&lt;/code&gt; con:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;k3d node create nuevo-nodo &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--cluster&lt;/span&gt; dev-mas-real &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--role&lt;/span&gt; agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;el resultado despues de listar con &lt;code&gt;k3d node list&lt;/code&gt; es el siguiente:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME                        ROLE           CLUSTER        STATUS
k3d-dev-mas-real-agent-0    agent          dev-mas-real   running
k3d-dev-mas-real-agent-1    agent          dev-mas-real   running
k3d-dev-mas-real-agent-2    agent          dev-mas-real   running
k3d-dev-mas-real-server-0   server         dev-mas-real   running
k3d-dev-mas-real-server-1   server         dev-mas-real   running
k3d-dev-mas-real-server-2   server         dev-mas-real   running
k3d-dev-mas-real-serverlb   loadbalancer   dev-mas-real   running
k3d-nuevo-nodo-0            agent          dev-mas-real   running
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;el resultado despues de listar con &lt;code&gt;kubectl get nodes&lt;/code&gt; es el siguiente:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME                        STATUS   ROLES                       AGE     VERSION
k3d-dev-mas-real-agent-0    Ready    &amp;lt;none&amp;gt;                      9m50s   v1.20.0+k3s2
k3d-dev-mas-real-agent-1    Ready    &amp;lt;none&amp;gt;                      9m48s   v1.20.0+k3s2
k3d-dev-mas-real-agent-2    Ready    &amp;lt;none&amp;gt;                      9m48s   v1.20.0+k3s2
k3d-dev-mas-real-server-0   Ready    control-plane,etcd,master   10m     v1.20.0+k3s2
k3d-dev-mas-real-server-1   Ready    control-plane,etcd,master   10m     v1.20.0+k3s2
k3d-dev-mas-real-server-2   Ready    control-plane,etcd,master   9m52s   v1.20.0+k3s2
k3d-nuevo-nodo-0            Ready    &amp;lt;none&amp;gt;                      96s     v1.20.0+k3s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El nuevo nodo aparece como &lt;code&gt;k3d-nuevo-nodo-0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ahora fijemos un segundo en &lt;code&gt;VERSION&lt;/code&gt;. Si queremos tener mayor control de la version de la imagen de k3s debido a incompatibilidades, podemos crear el cluster k3s a una determinada version con:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Version v1.17.13-k3s2
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;k3d cluster create test-viejo &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--port&lt;/span&gt; 8080:80@loadbalancer &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--port&lt;/span&gt; 8443:443@loadbalancer &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--image&lt;/span&gt; rancher/k3s:v1.17.13-k3s2 &lt;span class="c"&gt;# version 1.17...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Version v1.19.3-k3s3
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;k3d cluster create test-nuevo &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--port&lt;/span&gt; 8080:80@loadbalancer &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--port&lt;/span&gt; 8443:443@loadbalancer &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--image&lt;/span&gt; rancher/k3s:v1.19.3-k3s3 &lt;span class="c"&gt;# version 1.19...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://hub.docker.com/r/rancher/k3s/tags?page=1&amp;amp;ordering=last_updated"&gt;Listado de las imagenes de k3s en docker hub.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Creacion de un cluster atraves de un arhcivo yaml
&lt;/h2&gt;

&lt;p&gt;Lo hemos hablado anteriormente que se puede crear un cluster a partir de un archio yaml.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOF &amp;gt; k3d-configuracion_cluster_nuevo.yaml
apiVersion: k3d.io/v1alpha1
kind: Simple
name: cluster-desdearchivo
servers: 1
agents: 1
exposeAPI:
  hostIP: "0.0.0.0"
  port: "6443" # puerto kubernetes api 6443:6443
image: rancher/k3s:v1.19.4-k3s1
volumes:
  - volume: /tmp:/tmp/fakepath # volumen en el localhost:contenedor
    nodeFilters:
      - all
ports:
  - port: 9080:80 # puerto http localhost:contenedor 8080:80
    nodeFilters:
      - loadbalancer
  - port: 0.0.0.0:8443:443 # https con 8443:443
    nodeFilters:
      - loadbalancer
env:
  - envVar: secreto=token
    nodeFilters:
      - all
labels:
  - label: mejorcluster=etiquetaforzada
    nodeFilters:
      - server[0] # 
      - loadbalancer

options:
  k3d:
    wait: true
    timeout: "60s" # Cuando no se pueda arrancar, no entre en bucle arriba/abajo
    disableLoadbalancer: false
    disableImageVolume: false
  k3s:
    extraServerArgs:
      - --tls-san=127.0.0.1
    extraAgentArgs: []
  kubeconfig:
    updateDefaultKubeconfig: true # actualiza automatica el kubeconfig
    switchCurrentContext: true # cambia al nuevo contexto
EOF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;k3d cluster create --config k3d-configuracion_cluster_nuevo.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>kubernetes</category>
      <category>k3s</category>
      <category>k3d</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
