<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Christian Altamirano Ayala on Medium]]></title>
        <description><![CDATA[Stories by Christian Altamirano Ayala on Medium]]></description>
        <link>https://medium.com/@christian.altamirano.ayala?source=rss-4a536fbb75bd------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*R8rVrE4NnLoXHJWkkUtnbg.jpeg</url>
            <title>Stories by Christian Altamirano Ayala on Medium</title>
            <link>https://medium.com/@christian.altamirano.ayala?source=rss-4a536fbb75bd------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 03:21:10 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@christian.altamirano.ayala/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Troubleshoting in RKE: Nodos en estado NotReady]]></title>
            <link>https://medium.com/liveness-y-readiness-probe/troubleshoting-in-rke-nodos-en-estado-notready-5e942b4f6107?source=rss-4a536fbb75bd------2</link>
            <guid isPermaLink="false">https://medium.com/p/5e942b4f6107</guid>
            <category><![CDATA[rancher]]></category>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[rke]]></category>
            <dc:creator><![CDATA[Christian Altamirano Ayala]]></dc:creator>
            <pubDate>Thu, 14 May 2020 03:24:42 GMT</pubDate>
            <atom:updated>2020-05-14T03:27:54.879Z</atom:updated>
            <content:encoded><![CDATA[<h3>Troubleshoting in RKE: Cuando los nodos estan en estado NotReady</h3><p>Hace poco me paso un caso interesante con los cluster <strong>RKE on premise</strong> de la empresa, resulta que inesperadamente me llegaban las notificaciones de Grafana por uso intensivo de CPU y RAM, ingresando a ver el estado del cluster me doy con la sorpresa que 3 de los 4 worker nodos estaban caídos (NotReady).</p><p>La razón de que los 3 nodos estaban no disponibles fue que en algún momento se “eliminaron” los kubelets y kube-proxys de dichos nodos. Desesperado vi la forma de solucionar este problema pero desafortunadamente no encontré ninguna respuesta, así que me puse a averiguar sobre la funcionalidad del <strong>binario RKE (</strong>que se usa para instalar el cluster<strong>).</strong></p><p>Resulta que RKE tiene la opción de actualizar un cluster (agregar o quitar worker nodes sin la necesidad de hacer algún cambio en los nodos masters) para ello se le tiene que pasar la opción <strong>— update-only</strong> en el comando para instalar el cluster:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/7471202b4dfdc22fc2b20195f26e78c3/href">https://medium.com/media/7471202b4dfdc22fc2b20195f26e78c3/href</a></iframe><p>Para ello primero saque los nodos dañados del descriptor <strong>cluster.yml</strong> y ejecuté el comando anterior, esto a fin de que los nodos se desligaran del cluster. Luego agregue los nodos en el descriptor cluster.yml y volví a ejecutar el mismo comando.</p><p>El resultado de esa acción fue que dichos nodos fueron considerados como nodos nuevos por lo que el instalador volvió a instalar las imágenes correspondientes (Kubelet, proxy, etc.) Volviendo así el cluster a su normalidad.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5e942b4f6107" width="1" height="1" alt=""><hr><p><a href="https://medium.com/liveness-y-readiness-probe/troubleshoting-in-rke-nodos-en-estado-notready-5e942b4f6107">Troubleshoting in RKE: Nodos en estado NotReady</a> was originally published in <a href="https://medium.com/liveness-y-readiness-probe">Kubernetes</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Rancher Kubernetes Engine (RKE)]]></title>
            <link>https://medium.com/liveness-y-readiness-probe/rancher-kubernetes-engine-rke-2c9a3eb63ba3?source=rss-4a536fbb75bd------2</link>
            <guid isPermaLink="false">https://medium.com/p/2c9a3eb63ba3</guid>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[rke]]></category>
            <dc:creator><![CDATA[Christian Altamirano Ayala]]></dc:creator>
            <pubDate>Mon, 03 Feb 2020 17:17:04 GMT</pubDate>
            <atom:updated>2020-02-04T22:43:06.113Z</atom:updated>
            <content:encoded><![CDATA[<p>Si lo que deseas es instalar un cluster kubernetes de manera rápida, sencilla y que este cuente con una certificación de la CNCF entonces RKE es una muy buena opción.</p><p>En este post veremos como instalar un cluster de 1 master y 1 worker (obviamente por los recursos limitados de mí pc), para ello necesario algunos requisitos:</p><ul><li>Conexión SSH desde el host que instalará el cluster a los nodos master y worker, esta conexión debe permitir que el host puede conectarse sin la necesidad de ingresar algún password.</li><li>Tener instalado docker en cada nodo, aquí se debe tener cuidado en la versión que se debe instalar. Aquí te dejo un enlace de scripts hechos por el team de Rancher de los<a href="https://rancher.com/docs/rke/latest/en/os/#installing-docker"> instaladores de Docker </a>.</li><li>Reglas de entrada y salida del firewall.</li></ul><p>Una vez que tengamos los requerimientos anteriores, el siguiente paso es descargar el ejecutable de RKE desde <a href="https://github.com/rancher/rke/releases">Github</a> y configurarlo en modo ejecución:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/f2826e410eede1de54d07102cc0409dd/href">https://medium.com/media/f2826e410eede1de54d07102cc0409dd/href</a></iframe><p>Luego creamos un archivo descriptor del cluster que deseemos configurar, este archivo es un yaml:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/4987f30fc2edbe6924a157f07b0c0812/href">https://medium.com/media/4987f30fc2edbe6924a157f07b0c0812/href</a></iframe><p>En esta configuración especificamos que queremos 1 Worker y 1 Master y que además agregue un nginx como controlador del Ingress</p><p>Terminado de realizar la configuración de nuestro cluster solo es necesario ejecutar el siguiente comando:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/b95fd9377e2aab98a54cd0c0941690df/href">https://medium.com/media/b95fd9377e2aab98a54cd0c0941690df/href</a></iframe><p>Si tienes Vagrant instalado puedes descargar y ejecutar los archivos desde mí <a href="https://github.com/christian1607/rke">github</a>.</p><p>Solo bastara con hacer un <strong>vagrant up</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2c9a3eb63ba3" width="1" height="1" alt=""><hr><p><a href="https://medium.com/liveness-y-readiness-probe/rancher-kubernetes-engine-rke-2c9a3eb63ba3">Rancher Kubernetes Engine (RKE)</a> was originally published in <a href="https://medium.com/liveness-y-readiness-probe">Kubernetes</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Kubernetes - NFS Server]]></title>
            <link>https://medium.com/liveness-y-readiness-probe/kubernetes-nfs-server-3fb2c2c00c29?source=rss-4a536fbb75bd------2</link>
            <guid isPermaLink="false">https://medium.com/p/3fb2c2c00c29</guid>
            <category><![CDATA[storage]]></category>
            <category><![CDATA[kubernetes]]></category>
            <dc:creator><![CDATA[Christian Altamirano Ayala]]></dc:creator>
            <pubDate>Sun, 20 Oct 2019 23:05:08 GMT</pubDate>
            <atom:updated>2019-10-21T23:53:37.944Z</atom:updated>
            <content:encoded><![CDATA[<p>Hay algunas ocasiones en el que deseemos desarrollar aplicaciones que queramos guardar la data recolectada, ya sea una base de datos, archivos, etc. Para los desarrolladores que desplegaron estas aplicaciones en algún proveedor de k8s en la nube (AKS, GKE, EKS, etc.) se nos es más fácil usar volúmenes por que dichos proveedores ya implementaron la solución para esa necesidad, por si aún no te diste cuenta cuando creas algún volumen en cualquier proveedor, por defecto toma el “provider” de dicho proveedor (AWSElasticBlockStore, GCEPersistentDisk, AzureDisk). Esta característica no la encontramos cuando instalamos k8s en nuestros propios servidores, razón por la cual escribo este post para poder instalar y configurar un NFS Server para guardar la data que deseemos.</p><p>Requisitos:</p><ol><li>Tener un cluster k8s instalado (<a href="https://medium.com/liveness-y-readiness-probe/instalaci%C3%B3n-de-kubernetes-onpremise-638609f2bb1e?source=friends_link&amp;sk=dd4d030fd29f9f2ea43ccebdc0adec8f">Aquí</a> tengo una publicación de como instalarlo onPremise).</li><li>Una maquina que será usado como servidor NFS.</li></ol><h3>Configuración del Servidor NFS:</h3><p>Instalamos las herramientas necesarias para NFS y luego habilitamos los servicios</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/1224578b4c75942bb893d2b51be9db8b/href">https://medium.com/media/1224578b4c75942bb893d2b51be9db8b/href</a></iframe><p>Ahora creamos un directorio el cual queremos compartir en nuestro caso será <em>/home/vagrant/nfs_data</em> y además dar ciertos permisos</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/ed4a3b9062cba2a2419393bb3aee0de1/href">https://medium.com/media/ed4a3b9062cba2a2419393bb3aee0de1/href</a></iframe><p>Luego debemos de realizar la configuración en el archivo exports</p><p><strong>vi /etc/exports</strong></p><p>Es en este archivo donde describimos que clientes van a tener acceso a la carpeta compartida, en mi caso tengo 2 workers con ip 192.168.2.X por lo tanto la configuración será:</p><p><em>/home/vagrant/nfs_data 192.168.2.90(rw,sync,no_root_squash,no_subtree_check)</em></p><p>/home/vagrant/nfs_data 192.168.2.91(rw,sync,no_root_squash,no_subtree_check)</p><p>Una vez hecho la configuración ejecutamos el siguiente comando:</p><p><strong>exports -a</strong></p><h3>Configuración Clientes NFS</h3><p>En el lado del cliente que son los worker de k8s solo debemos instalar las herramientas necesarias:</p><p><strong>yum -y install nfs-utils</strong></p><p>Ahora es momento de probar dicha configuración en kubernetes para lo cual creamos un PersistentVolumen en el cual especificaremos la ip y ruta de nuestro servidor NFS</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/eeb4659e922b568a1929e13a116afd23/href">https://medium.com/media/eeb4659e922b568a1929e13a116afd23/href</a></iframe><p>Si todo salio bien entonces ya podríamos crear nuestro PVC y por lo tanto asignarlos a algún POD</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/c5d1cb8bb2f9aa6d94c303df32ece344/href">https://medium.com/media/c5d1cb8bb2f9aa6d94c303df32ece344/href</a></iframe><p>Ahora usaremos el PVC en un Nginx;</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/96ccb81b0fabc2ba33cebe58a83b7a46/href">https://medium.com/media/96ccb81b0fabc2ba33cebe58a83b7a46/href</a></iframe><p>Ahora ya podemos crear subir archivos a nuestra carpeta compartida y este se mapeara en la ruta /usr/share/nginx/html de cada contenedor que se ejecute.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3fb2c2c00c29" width="1" height="1" alt=""><hr><p><a href="https://medium.com/liveness-y-readiness-probe/kubernetes-nfs-server-3fb2c2c00c29">Kubernetes - NFS Server</a> was originally published in <a href="https://medium.com/liveness-y-readiness-probe">Kubernetes</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Kubernetes 1.16.0]]></title>
            <link>https://medium.com/liveness-y-readiness-probe/la-versi%C3%B3n-1-16-8018eff0e419?source=rss-4a536fbb75bd------2</link>
            <guid isPermaLink="false">https://medium.com/p/8018eff0e419</guid>
            <category><![CDATA[kubernetes]]></category>
            <dc:creator><![CDATA[Christian Altamirano Ayala]]></dc:creator>
            <pubDate>Wed, 16 Oct 2019 04:48:39 GMT</pubDate>
            <atom:updated>2019-10-16T15:04:44.161Z</atom:updated>
            <content:encoded><![CDATA[<p>La versión 1.16 de kubernetes fue liberado en el mes de septiembre de este año, dicha versión trajo como cambios importantes la deprecación de algunos de los api tales como apps/v1beta1 y apps/v1beta2.</p><p>De lo mencionado en el párrafo anterior debemos notar que los objetos que tienen esa versión de api son:daemonsets, deployments y replicasets. Por lo que crear estos objetos de la forma en que se solía hacer (apiVersion: apps/v1beta1) nos saldrá el siguiente error:</p><p><strong><em>no matches for kind “Deployment” in version “extensions/v1beta1”</em></strong></p><p>Para solucionar este inconveniente solo basta con modificar el apiVersion a <strong>apps/v1.</strong></p><p>En caso de que tengamos nuestros objetos kubernetes en archivos yaml con la versión anterior también podemos convertirlos a la versión 1.16.0 con el siguiente comando</p><p><strong><em>kubectl convert -f k8s-object.yml &gt; new_object.yml</em></strong></p><p>Estos nos creara el descriptor del objeto para la nueva versión.</p><p>Para mayor información:</p><p><a href="https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.16.md#deprecations-and-removals">https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.16.md#deprecations-and-removals</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8018eff0e419" width="1" height="1" alt=""><hr><p><a href="https://medium.com/liveness-y-readiness-probe/la-versi%C3%B3n-1-16-8018eff0e419">Kubernetes 1.16.0</a> was originally published in <a href="https://medium.com/liveness-y-readiness-probe">Kubernetes</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Instalación de Kubernetes OnPremise]]></title>
            <link>https://medium.com/liveness-y-readiness-probe/instalaci%C3%B3n-de-kubernetes-onpremise-638609f2bb1e?source=rss-4a536fbb75bd------2</link>
            <guid isPermaLink="false">https://medium.com/p/638609f2bb1e</guid>
            <category><![CDATA[k8s]]></category>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[cluster]]></category>
            <dc:creator><![CDATA[Christian Altamirano Ayala]]></dc:creator>
            <pubDate>Sun, 08 Sep 2019 03:16:50 GMT</pubDate>
            <atom:updated>2019-09-08T03:16:50.137Z</atom:updated>
            <content:encoded><![CDATA[<p>Hace mucho tiempo quería instalar y configurar un cluster de kubernetes onpremise, así que después de un buen tiempo decidí que era la hora y por fin pude instalarlo, así que aquí comparto los pasos que hice.</p><p><strong>Requerimientos</strong>:</p><ol><li>Maquinas o VM con IP estáticas.</li><li>Mínimo 2GB de RAM y 2 CPU por cada maquina.</li><li>El usuario root o usuario con los mismos privilegios.</li></ol><h3><strong>Instalación inicial</strong></h3><p>En esta etapa se harán las instalaciones y configuraciones para todas las maquinas, sean estas workers o master.</p><pre>sudo vi /etc/hosts</pre><p>Configuramos las IP de cada nodo.</p><pre>192.168.1.105 master<br>192.168.1.106 worker1</pre><p>Configuramos el hostname</p><pre>sudo hostnamectl set-hostname master (para el master)</pre><pre>sudo hostnamectl set-hostname worker1 (para el worker)</pre><p>Deshabilitamos el SELIINUX</p><pre>sudo setenforce 0</pre><p>luego modificamos el archivo /etc/sysconfig/selinux a disabled</p><pre>sudo sed -i --follow-symlinks &#39;s/SELINUX=enforcing/SELINUX=disabled/g&#39; /etc/sysconfig/selinux</pre><p>Hasta este paso es bueno reiniciar la maquina para que tome en cuenta el cambio que se hizo en el paso anterior.</p><p>Luego necesitamos habilitar el modulo <strong>br_netfilter </strong>del kernel</p><pre>sudo modprobe br_netfilter<br>sudo echo &#39;1&#39; &gt; /proc/sys/net/bridge/bridge-nf-call-iptables</pre><p>luego des habilitamos la configuración del swap, esto por que kubernetes no permite la instalación si esta opción esta habilitada.</p><pre>sudo swapoff -a</pre><p>Instalamos Docker:</p><p>En este caso es recomendable instalar la version 18.04 de docker, ya que kubernetes siguiere esa version (yo instale la ultima version 19.03 y la instalación me salio normal, eso si con un WARNING de la version de docker).</p><pre>sudo yum install -y yum-utils device-mapper-persistent-data lvm2</pre><pre>sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo</pre><pre>sudo yum install -y docker-ce</pre><pre>sudo systemctl enable docker.service<br>sudo systemctl start docker.service</pre><p><strong>Instalación de Kubernetes</strong>:</p><p>Después de instalar debemos de instalar kubernetes.</p><p>Creamos el repositorio:</p><pre>sudo vi /etc/yum.repos.d/kubernetes.repo</pre><p>Agregamos el siguiente contenido en el repositorio que creamos en el paso anterior:</p><pre>[kubernetes]<br>name=Kubernetes<br>baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64<br>enabled=1<br>gpgcheck=1<br>repo_gpgcheck=1<br>gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg<br>        <a href="https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg">https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg</a></pre><p>Instalamos Kubernetes con el siguiente comando:</p><pre>sudo yum install -y kubelet kubeadm kubectl</pre><p>Finalmente, habilitamos el servicio de Kubelet</p><pre>sudo systemctl enable kubelet.service</pre><h3>Configuración en el Nodo Maestro</h3><p>Esta parte es para la configuración del nodo maestro:</p><pre>sudo kubeadm init  --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=&lt;IP_MASTER&gt;</pre><p>Después de ejecutar el comando anterior nos debería de mandar un mensaje como el siguiente:</p><pre>Your Kubernetes master has initialized successfully!<br><br>To start using your cluster, you need to run the following as a regular user:<br><br>mkdir -p $HOME/.kube<br>sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config<br>sudo chown $(id -u):$(id -g) $HOME/.kube/config<br><br>You should now deploy a pod network to the cluster.<br>Run &quot;kubectl apply -f [podnetwork].yaml&quot; with one of the options listed at:<br>https://kubernetes.io/docs/concepts/cluster-administration/addons/<br><br>You can now join any number of machines by running the following on each node<br>as root:<br><br>kubeadm join 192.168.1.105:6443 --token fwldpz.bgejrgr1cqviuoeo --discovery-token-ca-cert-hash sha256:b11fbe1063550e822c54033729d45ca28e1fdb05deed3fbd103f27cf2926b2e7</pre><p>En la ultima parte del mensaje podemos ver un comando, copia ese comando en un lugar seguro ya que usaremos este comando para conectar los nodos workers con el master.</p><p>Luego ejecutamos los siguientes comando para la configuración del kubectl</p><pre>mkdir -p $HOME/.kube<br>sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config<br>sudo chown $(id -u):$(id -g) $HOME/.kube/config</pre><p>Una vez terminado, podríamos ejecutar el comando para obtener los nodos disponibles</p><pre>kubectl get nodes</pre><p>Deberías de ver una salida como la siguiente</p><pre>NAME          STATUS     ROLES    AGE   VERSION<br>master         NotReady   master   14m   v1.13.2</pre><p>En la salida del mensaje anterior nos muestra que el nodo master se encuentra en el estado <strong>NotReady</strong>, esto es por que nos falta instalar un <strong>CNI </strong>(Container Networking Interface)</p><p>En este caso instalaremos <strong>Calico </strong>como nuestro gestor de red, para ello primero debemos instalar un etcd para calico:</p><pre>kubectl apply -f \<br>https://docs.projectcalico.org/v3.4/getting-started/kubernetes/installation/hosted/etcd.yaml</pre><p>Luego instalar Calico:</p><pre>kubectl apply -f \<br>https://docs.projectcalico.org/v3.4/getting-started/kubernetes/installation/hosted/calico.yaml</pre><p>Deberías de ver el siguiente mensaje</p><pre>configmap/calico-config created<br>secret/calico-etcd-secrets created<br>daemonset.extensions/calico-node created<br>serviceaccount/calico-node created<br>deployment.extensions/calico-kube-controllers created<br>serviceaccount/calico-kube-controllers created<br>clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created<br>clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created<br>clusterrole.rbac.authorization.k8s.io/calico-node created<br>clusterrolebinding.rbac.authorization.k8s.io/calico-node created</pre><p>Esperemos un momento hasta que se desplieguen los pods de calico, para lo cual ejecutamos el siguiente comando y esperamos hasta que todos los pods tengan un estado <strong>RUNNING</strong></p><pre>kubectl get pods --all-namespaces</pre><p>Una vez que todos los pods tengan el estado <strong>RUNNING </strong>ejecutamos el siguiente comando:</p><pre>kubectl get nodes</pre><p>Deberíamos de ver algo así:</p><pre>NAME          STATUS     ROLES    AGE     VERSION<br>master         Ready    master   6m44s   v1.13.2</pre><h3>Configuración en los nodos Workers</h3><p>En el lado de los workers solo debemos de ejecutar el siguiente comando pero eso si cambiando los valores del token y el hash del certificado (Aquí debemos copiar el comando que nos mostró al momento de instalar en el nodo maestro):</p><pre>kubeadm join 192.168.1.105:6443 --token fwldpz.bgejrgr1cqviuoeo --discovery-token-ca-cert-hash sha256:b11fbe1063550e822c54033729d45ca28e1fdb05deed3fbd103f27cf2926b2e7</pre><p>Cuando la ejecución sea exitosa se mostrara el siguiente resultado:</p><pre>[discovery] Trying to connect to API Server &quot;192.168.1.105:6443&quot;<br>[discovery] Created cluster-info discovery client, requesting info from &quot;https://192.168.1.105:6443&quot;<br>[discovery] Requesting info from &quot;https://192.168.1.105:6443&quot; again to validate TLS against the pinned public key<br>[discovery] Cluster info signature and contents are valid and TLS certificate validates against pinned roots, will use API Server &quot;192.168.1.105:6443&quot;<br>[discovery] Successfully established connection with API Server &quot;192.168.1.105:6443&quot;<br>[join] Reading configuration from the cluster...<br>[join] FYI: You can look at this config file with &#39;kubectl -n kube-system get cm kubeadm-config -oyaml&#39;<br>[kubelet] Downloading configuration for the kubelet from the &quot;kubelet-config-1.13&quot; ConfigMap in the kube-system namespace<br>[kubelet-start] Writing kubelet configuration to file &quot;/var/lib/kubelet/config.yaml&quot;<br>[kubelet-start] Writing kubelet environment file with flags to file &quot;/var/lib/kubelet/kubeadm-flags.env&quot;<br>[kubelet-start] Activating the kubelet service<br>[tlsbootstrap] Waiting for the kubelet to perform the TLS Bootstrap...<br>[patchnode] Uploading the CRI Socket information &quot;/var/run/dockershim.sock&quot; to the Node API object &quot;worker-node&quot; as an annotation</pre><pre>This node has joined the cluster:<br>* Certificate signing request was sent to apiserver and a response was received.<br>* The Kubelet was informed of the new secure connection details.</pre><pre>Run &#39;kubectl get nodes&#39; on the master to see this node join the cluster.</pre><p>Ahora volvamos al nodo maestro y ejecutemos el siguiente comando:</p><pre>kubectl get nodes</pre><p>Salida:</p><pre>NAME          STATUS   ROLES    AGE     VERSION<br>master         Ready    master   21m     v1.13.2<br>worker1        Ready    &lt;none&gt;   5m29s   v1.13.2</pre><h3>Probando el cluster</h3><p>Probamos ejecutando un NGINX:</p><pre>kubectl create deployment nginx --image=nginx</pre><p>Salida:</p><pre>deployment.apps/nginx created</pre><p>Creamos un service para poder ver desde nuestro navegador red:</p><pre>kubectl create service nodeport nginx --tcp=80:80</pre><p>Now, list out all the services by running the following command:</p><pre>kubectl get svc</pre><p>Deberíamos ver el puerto en el que se expone nuestro nginx:</p><pre>NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE<br>nginx       NodePort    10.102.166.47   &lt;none&gt;        80:30784/TCP   31s<br>kubernetes   ClusterIP   10.96.0.1       &lt;none&gt;        443/TCP        25m</pre><p>Finalmente, solo habré la siguiente url <a href="http://192.168.1.106:30784/">http://192.168.1.106:30784</a> (IP del nodo worker). Deberías de ver la siguiente imagen:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/880/0*4E1WdXV00DDHnL-4.png" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=638609f2bb1e" width="1" height="1" alt=""><hr><p><a href="https://medium.com/liveness-y-readiness-probe/instalaci%C3%B3n-de-kubernetes-onpremise-638609f2bb1e">Instalación de Kubernetes OnPremise</a> was originally published in <a href="https://medium.com/liveness-y-readiness-probe">Kubernetes</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[¿Qué es el “SERIAL_VERSION_UID” de Spring Security?]]></title>
            <link>https://medium.com/spring-in-action/qu%C3%A9-es-el-serial-version-uid-de-spring-security-bfabf66fe5c1?source=rss-4a536fbb75bd------2</link>
            <guid isPermaLink="false">https://medium.com/p/bfabf66fe5c1</guid>
            <category><![CDATA[spring]]></category>
            <category><![CDATA[oauth2]]></category>
            <category><![CDATA[spring-security]]></category>
            <dc:creator><![CDATA[Christian Altamirano Ayala]]></dc:creator>
            <pubDate>Mon, 22 Jul 2019 23:50:51 GMT</pubDate>
            <atom:updated>2019-07-22T23:50:51.938Z</atom:updated>
            <content:encoded><![CDATA[<p>Al usar spring security para la autenticación de nuestras aplicaciones tenemos que implementar la interfaz <strong>UserDetailService </strong>el cual tiene un método <strong>loadUserByUsername, </strong>es este método debe retornar un objeto de clase <strong>User </strong>que luego spring usa para ciertas validaciones (usuario bloqueado, contraseña vencida, etc.). Implícitamente la clase <strong>User </strong>implementa la interfaz <strong>UserDetail</strong>, esta interfaz tiene los siguientes métodos:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/785/1*yvPsUf9I0dlmWKG3eg7D1Q.png" /><figcaption>Métodos de la interfaz UserDetail</figcaption></figure><p>Hasta este punto todo funciona normal ya que no se “modifica” nada, el problema pasa cuando en vez de retornar una instancia de la clase <strong>User </strong>nosotros creamos una clase que implemente dicha interfaz. Personalmente creí que con el simple hecho de implementar esa interfaz la cosa iba a funcionar de maravillas. Terrible error!!!.</p><p>Esta configuración trajo sus consecuencias, por ejemplo: no podía obtener un nuevo <strong>access_token </strong>usando el <strong>refresh_token </strong>que proporciona spring security oauth2.</p><p><strong>La causa</strong>:</p><p>El problema de esta configuración fue que no me percate de algo muy importante (Me costó 2 días en descubrirlo), al momento de persistir la data spring espera que los objetos a guardar este debidamente serializados. Uno podría simplemente implementar la interfaz <strong>Serializable </strong>(tal como lo hice yo), pero <strong>NO, </strong>spring usa su propio valor de serialización que generalmente corresponde con la versión en el que este se encuentre.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/725/1*-Q9ZSYubKHwR7ptp9LL03w.png" /><figcaption>Clase User: Propia de Spring</figcaption></figure><p>Así que si alguna vez desean personalizar la clase de retorno en vez del que spring maneja por defecto, solo deben de implementar la interfaz UserDetails y Serializable y poner con valor en el campo serialVersionUID de la siguiente manera:</p><p><em>public class MyCustomUser implements UserDetails, Serializable{</em></p><p><em>private static final long serialVersionUID = SpringSecurityCoreVersion.SERIAL_VERSION_UID;</em></p><p>…</p><p><em>}</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bfabf66fe5c1" width="1" height="1" alt=""><hr><p><a href="https://medium.com/spring-in-action/qu%C3%A9-es-el-serial-version-uid-de-spring-security-bfabf66fe5c1">¿Qué es el “SERIAL_VERSION_UID” de Spring Security?</a> was originally published in <a href="https://medium.com/spring-in-action">Spring in Action</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Spring JDBC- SP con parametro Array]]></title>
            <link>https://medium.com/spring-in-action/spring-jdbc-sp-con-parametro-array-233c0dbefb5a?source=rss-4a536fbb75bd------2</link>
            <guid isPermaLink="false">https://medium.com/p/233c0dbefb5a</guid>
            <category><![CDATA[spring]]></category>
            <category><![CDATA[oracle]]></category>
            <category><![CDATA[spring-jdbc]]></category>
            <dc:creator><![CDATA[Christian Altamirano Ayala]]></dc:creator>
            <pubDate>Mon, 08 Jul 2019 00:44:05 GMT</pubDate>
            <atom:updated>2019-07-08T00:44:05.736Z</atom:updated>
            <content:encoded><![CDATA[<p>En el trabajo actual se me asigno un caso en el cual se tenia que llamar a un procedimiento el cual tenia como parámetros unos arreglos de VARCHAR (Oracle como BD), a principio pensé que era una tarea sencilla debido a que creí que al pasar un arreglo y poner el tipo de dato ARRAY en el constructor del SqlParameter iba a solucionar el problema, pero no</p><pre>new SqlParameter(&quot;PV_COD_SCG&quot;, Types.<em>ARRAY</em>, CHAR_ARRAY)</pre><p>Fue ahi que me puse a investigar un poquito el tema y vi que se tenia que hacer algunas configuraciones las cuales detallo:</p><p>Al momento de declarar los parámetros a recibir, en caso de que sea un ARRAY se tiene que especificar el nombre de ese Array a nivel de la base de datos en mi caso esos array los llame <strong><em>CH</em>AR_ARRAY </strong>y <strong>NUM_ARRAY</strong></p><pre>SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(concurrenciaDataSource)<br>        .withSchemaName(ConstanteUtil.<em>ESQUEMA_ONTPAC</em>)<br>        .withCatalogName(ConstanteUtil.<em>PAQUETE_SOLBEN_AC</em>)<br>        .withProcedureName(PROCEDURE)<br>        .withoutProcedureColumnMetaDataAccess()<br>        .declareParameters(<br>          new SqlParameter(&quot;PV_NOMB_VALID&quot;, Types.<em>ARRAY,CH</em>AR_ARRAY),<br>          new SqlParameter(&quot;PN_TOT_PRESUP&quot;, Types.<em>ARRAY</em>,NUM_ARRAY));</pre><p>Luego se tiene que hacer la carga de la data a enviar, para ese caso se tiene utilizar la interfaz <strong>SqlTypeValue </strong>el cual debemos de implementar su metodo de la siguiente manera:</p><pre>SqlTypeValue pvCodScg = new AbstractSqlTypeValue() {<br>    protected Object createTypeValue(Connection conn, int sqlType, String typeName) throws SQLException {<br>        ArrayDescriptor arrayDescriptor = new ArrayDescriptor(typeName, conn);<br>        return new ARRAY(arrayDescriptor, conn, strings);<br>    }<br>};</pre><p>una vez implementado dicha interfaz debemos de asignar ese valor:</p><pre>MapSqlParameterSource in = new MapSqlParameterSource();<br>in.addValue(&quot;PV_COD_SCG&quot;,pvCodScg);</pre><p>y finalmente ejecutamos:</p><pre>out = simpleJdbcCall.execute(in);</pre><p>Ahora en el caso que nuestro SP tambien nos retorne un ARRAY debemos manejar la salida de la siguiente manera:</p><pre>(ARRAY)(out.get(&quot;PV_COD_CG_SOLBEN&quot;))</pre><p>donde ARRAY proviene de la librería<strong> oracle.sql.ARRAY</strong>;</p><p>El código completo lo puede ver en el siguiente <a href="https://gist.github.com/christian1607/1a944ac4e5003c54a52715b21c32dcdb">gist </a>.</p><p>Para mayor información:</p><p><a href="https://docs.spring.io/spring-data/jdbc/old-docs/2.0.0.BUILD-SNAPSHOT/reference/html/orcl.datatypes.html">https://docs.spring.io/spring-data/jdbc/old-docs/2.0.0.BUILD-SNAPSHOT/reference/html/orcl.datatypes.html</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=233c0dbefb5a" width="1" height="1" alt=""><hr><p><a href="https://medium.com/spring-in-action/spring-jdbc-sp-con-parametro-array-233c0dbefb5a">Spring JDBC- SP con parametro Array</a> was originally published in <a href="https://medium.com/spring-in-action">Spring in Action</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Volumenes]]></title>
            <link>https://medium.com/liveness-y-readiness-probe/volumenes-df428ca5a81a?source=rss-4a536fbb75bd------2</link>
            <guid isPermaLink="false">https://medium.com/p/df428ca5a81a</guid>
            <category><![CDATA[pods]]></category>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[containers]]></category>
            <category><![CDATA[volume]]></category>
            <dc:creator><![CDATA[Christian Altamirano Ayala]]></dc:creator>
            <pubDate>Fri, 28 Jun 2019 05:00:22 GMT</pubDate>
            <atom:updated>2019-06-28T05:00:22.377Z</atom:updated>
            <content:encoded><![CDATA[<p>Cuando trabajamos con Kubernetes, los pods que gestionamos una vez que eliminamos o reiniciamos la data almacenada en el filesystem se pierde, esto debido a que los pods por defecto son de tipo “stateless”.</p><p>Ante esa problemática en kubernetes existen los volumenes, estos volumenes pueden ser de diferentes tipos:</p><ul><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#awselasticblockstore">awsElasticBlockStore</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#azuredisk">azureDisk</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#azurefile">azureFile</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#cephfs">cephfs</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#cinder">cinder</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#configmap">configMap</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#csi">csi</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#downwardapi">downwardAPI</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#emptydir">emptyDir</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#fc">fc (fibre channel)</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#flexVolume">flexVolume</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#flocker">flocker</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#gcepersistentdisk">gcePersistentDisk</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#gitrepo">gitRepo (deprecated)</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#glusterfs">glusterfs</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#hostpath">hostPath</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#iscsi">iscsi</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#local">local</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#nfs">nfs</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#persistentvolumeclaim">persistentVolumeClaim</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#projected">projected</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#portworxvolume">portworxVolume</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#quobyte">quobyte</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#rbd">rbd</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#scaleio">scaleIO</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#secret">secret</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#storageos">storageos</a></li><li><a href="https://kubernetes.io/docs/concepts/storage/volumes/#vspherevolume">vsphereVolume</a></li></ul><p>De estos tipos de volumenes es importante notar que soportan volumenes de los 3 principales proveedores cloud publicos <a href="https://kubernetes.io/docs/concepts/storage/volumes/#gcepersistentdisk">gcePersistentDisk</a> (GCP), <a href="https://kubernetes.io/docs/concepts/storage/volumes/#awselasticblockstore">awsElasticBlockStore</a> (AWS ) y <a href="https://kubernetes.io/docs/concepts/storage/volumes/#azuredisk">azureDisk</a> (AZURE).</p><p>Del listado mencionado veremos los siguientes tipo de volumenes: <a href="https://kubernetes.io/docs/concepts/storage/volumes/#hostpath"><strong>hostPath</strong></a> y <a href="https://kubernetes.io/docs/concepts/storage/volumes/#persistentvolumeclaim"><strong>persistentVolumeClaim</strong></a></p><p><strong>hostPath</strong>: Este tipo de volumen permite crear el volumen en el directorio del nodo en el que se ejecuta el pod.</p><pre><strong>apiVersion: v1<br>kind: Pod<br>metadata:<br>  name: test-pd<br>spec:<br>  containers:<br>  - image: k8s.gcr.io/test-webserver<br>    name: test-container<br>    volumeMounts:<br>    - mountPath: /test-pd<br>      name: test-volume<br>  volumes:<br>  - name: test-volume<br>    hostPath:<br>      </strong><strong><em># directory location on host</em></strong><strong><br>      path: /data<br>      </strong><strong><em># this field is optional</em></strong><strong><br>      type: Directory</strong></pre><p><strong>PersistentVolume (PV)</strong>: Es espacio de almacenamiento que se provisiona, en ella se describe la capacidad de almacenamiento y el modo de acceso (<strong>ReadWriteOnce,ReadWriteMany y ReadOnlyMany</strong>)</p><pre><strong>apiVersion: v1<br>kind: PersistentVolume<br>metadata:<br>  name: pv0003<br>spec:<br>  capacity:<br>    storage: 5Gi<br>  volumeMode: Filesystem<br>  accessModes:<br>    - ReadWriteOnce<br>  persistentVolumeReclaimPolicy: Recycle<br>  storageClassName: slow<br>  mountOptions:<br>    - hard<br>    - nfsvers=4.1<br>  nfs:<br>    path: /tmp<br>    server: 172.17.0.2</strong></pre><p><strong>persistentVolumeClaim(PVC)</strong>: Es un tipo de peticion para almacenamiento realizada por el usuario hacia los persistentVolume(PV) existentes y configurada por defecto para optimizar el almacenamiento, esto quiere decir si tenemos 2 persistent volumes con 100Mb y 500Mb, y creamos un persistent volumeClaim de 80Mb la peticion tomara al primer persitent volume.</p><pre><strong>apiVersion: v1<br>kind: PersistentVolumeClaim<br>metadata:<br>  name: myclaim<br>spec:<br>  accessModes:<br>    - ReadWriteOnce<br>  volumeMode: Filesystem<br>  resources:<br>    requests:<br>      storage: 8Gi<br>  storageClassName: slow<br>  selector:<br>    matchLabels:<br>      release: &quot;stable&quot;<br>    matchExpressions:<br>      - {key: environment, operator: In, values: [dev]}</strong></pre><p>Una vez configurado el persistentVolume y el persistentVolumeClaim, procedemos a usar esos volumenes en nuestro pod de la siguiente manera:</p><pre><strong>apiVersion: v1<br>kind: Pod<br>metadata:<br>  name: mypod<br>spec:<br>  containers:<br>    - name: myfrontend<br>      image: nginx<br>      volumeMounts:<br>      - mountPath: &quot;/var/www/html&quot;<br>        name: mypd<br>  volumes:<br>    - name: mypd<br>      persistentVolumeClaim:<br>        claimName: myclaim</strong></pre><p>Referencias:</p><p><a href="https://kubernetes.io/docs/concepts/storage/persistent-volumes/">https://kubernetes.io/docs/concepts/storage/persistent-volumes/</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=df428ca5a81a" width="1" height="1" alt=""><hr><p><a href="https://medium.com/liveness-y-readiness-probe/volumenes-df428ca5a81a">Volumenes</a> was originally published in <a href="https://medium.com/liveness-y-readiness-probe">Kubernetes</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Accediendo mysql (host) desde un contenedor]]></title>
            <link>https://medium.com/docker-everywhere/accediendo-mysql-host-desde-un-contenedor-2ba4d104afc?source=rss-4a536fbb75bd------2</link>
            <guid isPermaLink="false">https://medium.com/p/2ba4d104afc</guid>
            <category><![CDATA[networking]]></category>
            <category><![CDATA[docker]]></category>
            <category><![CDATA[mysql]]></category>
            <dc:creator><![CDATA[Christian Altamirano Ayala]]></dc:creator>
            <pubDate>Fri, 07 Jun 2019 05:51:34 GMT</pubDate>
            <atom:updated>2019-06-07T05:51:34.853Z</atom:updated>
            <content:encoded><![CDATA[<p>Hace poco tuve un problema de conexión a mi base de datos mysql local desde un container también en el local. Al principio pense que se trataba que faltaba alguna configuración de red en docker pero resulta que la configuracion por defecto de red de los contenedores docker es en modo “bridge” (esto permite que dentro de cada contenedor se pueda acceder a internet).</p><p>Para sacarme de dudas use una imagen busybox y realize un ping a la IP de mi maquina host y resulta que efectivamente habia conexion.</p><p>Por lo que averiguando pude notar que la configuración por defecto de mysql permite solo conexiones locales (127.0.0.1), ya que los contenedores son asignados en otro rango de red (el mio esta en el rango de 172.17.0.0)esta conexion no se podia realizar</p><p>La solución fue habilitar la conexión externa en mysql cambiando la propiedad <strong>bind-address</strong> (archivo /etc/mysql/mysql.conf.d)</p><p><em>bind-address = 0.0.0.0</em></p><p>Además de eso fue necesario crear un usuario de mysql con los permisos necesarios y que pueda conectarse desde cualquier dominio o red</p><p><em>CREATE USER ‘newuser’@’%’ IDENTIFIED BY ‘user_password’;</em></p><p>Una vez hecha esa configuracion el contenedor pudo establecer conexion con la base de datos mysql del host.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2ba4d104afc" width="1" height="1" alt=""><hr><p><a href="https://medium.com/docker-everywhere/accediendo-mysql-host-desde-un-contenedor-2ba4d104afc">Accediendo mysql (host) desde un contenedor</a> was originally published in <a href="https://medium.com/docker-everywhere">Docker Everywhere</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Liveness y Readiness]]></title>
            <link>https://medium.com/liveness-y-readiness-probe/liveness-y-readiness-3123c16a38a0?source=rss-4a536fbb75bd------2</link>
            <guid isPermaLink="false">https://medium.com/p/3123c16a38a0</guid>
            <dc:creator><![CDATA[Christian Altamirano Ayala]]></dc:creator>
            <pubDate>Tue, 30 Apr 2019 05:00:11 GMT</pubDate>
            <atom:updated>2019-04-30T05:00:11.500Z</atom:updated>
            <content:encoded><![CDATA[<p>Algunas aplicaciones que desarrollamos por lo general no tienen un tiempo de startup de 0 segundos (osea al instante), por experiencia propia usando aplicaciones springboot estos demoran un aproximado de 10 a 30 segundos.</p><p>En ese sentido el poder tener una cierta regla que permita que el pod este disponible bajo ciertas pruebas nos permitira ofrecer aplicaciones menos tolerantes a fallos de cara a los cliente.</p><p>De la misma manera es importante conocer el estado de nuestra aplicacion dentro del Pod, ya que en caso de que nuestra aplicacion se haya colgado deberiamos reiniciarla.</p><p>Como solución a esas necesidades existen las pruebas de Liveness y readiness que nos permiten justamente validar el estado de nuestra aplicacion, en caso de no cumplir con los requisitos que pongamos, el pod sera reiniciado.</p><p>Estas validaciones pueden ser a nivel de <strong>http</strong>, <strong>tcp</strong> ,etc. tambien es posible especificar el <strong>delay</strong> y los <strong>periodos</strong> para hacer las pruebas.</p><p>A continuacion un ejemplo de su uso:</p><blockquote><em>apiVersion: v1<br>kind: Pod<br>metadata:<br> name: kubia-liveness<br>spec:<br> containers:<br> -image: luksa/kubia-unhealthy<br> name: kubia<br></em><strong><em> livenessProbe:<br> httpGet:<br> path: /<br> port: 8080<br> initialDelaySeconds: 15<br> periodSeconds: 10</em></strong></blockquote><blockquote>readinessProbe:</blockquote><blockquote>httpGet:</blockquote><blockquote>path: /readiness</blockquote><blockquote>port: 8888</blockquote><blockquote>initialDelaySeconds: 300</blockquote><blockquote>periodSeconds: 3</blockquote><p>Mas información:</p><p><a href="https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/">https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3123c16a38a0" width="1" height="1" alt=""><hr><p><a href="https://medium.com/liveness-y-readiness-probe/liveness-y-readiness-3123c16a38a0">Liveness y Readiness</a> was originally published in <a href="https://medium.com/liveness-y-readiness-probe">Kubernetes</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>