{"id":2780,"date":"2018-04-23T21:45:21","date_gmt":"2018-04-24T01:45:21","guid":{"rendered":"http:\/\/arielantigua.com\/weblog\/?p=2780"},"modified":"2021-02-19T14:11:22","modified_gmt":"2021-02-19T18:11:22","slug":"kubernetes-montandonos-un-entorno-de-pruebas-homelab","status":"publish","type":"post","link":"https:\/\/arielantigua.com\/weblog\/2018\/04\/kubernetes-montandonos-un-entorno-de-pruebas-homelab\/","title":{"rendered":"Kubernetes \u2013 mont\u00e1ndonos un entorno de pruebas &#8211; homeLAB!"},"content":{"rendered":"<p>Hace ya unas semanas estuve en <strong>vBrownBagLATAM<\/strong> mostrando lo f\u00e1cil que es montarnos un LAB de <strong>Kubernetes<\/strong>, si buscamos en Internet podremos ver muchos posts de clusters usando Raspberry Pi. En mi caso intente usar LXD como base para las maquinas (contenedores) que tendr\u00e1n <strong>Kubernetes<\/strong>, tanto el master como los nodos. Resulta que el host con Ubuntu\/LXD usado para este proyecto no tiene bastante capacidad de CPU para correr varios contenedores y dentro de estos tener <strong>Kubernetes<\/strong>.<\/p>\n<p>As\u00ed que termine con un cluster de tres Raspberry Pi y otro sin terminar basado en LXD.<\/p>\n<p>En esta entrada se detalla como iniciar con tres Raspberry Pi + Hypriot + Kubernetes.<\/p>\n<p>Ingredientes!<\/p>\n<ul>\n<li>Raspberry Pi \u2013 funcionales! (en mi caso ser\u00e1n tres).<\/li>\n<li>Switch?<\/li>\n<li>Descargar Hypriot &#8211; <a href=\"https:\/\/blog.hypriot.com\/getting-started-with-docker-on-your-arm-device\/\">https:\/\/blog.hypriot.com\/getting-started-with-docker-on-your-arm-device\/<\/a><\/li>\n<\/ul>\n<p>Hypriot tiene una gu\u00eda en su propio portal donde describen la inicializaci\u00f3n y configuraci\u00f3n de un cluster de Kubernetes, es recomendable leer esa gu\u00eda.<\/p>\n<p><a href=\"https:\/\/blog.hypriot.com\/post\/setup-kubernetes-raspberry-pi-cluster\/\">https:\/\/blog.hypriot.com\/post\/setup-kubernetes-raspberry-pi-cluster\/<\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<ol>\n<li>Luego de introducir la imagen de <strong>Hypriot<\/strong> en el SD Card que usaremos en cada RPi, podremos hacer un:<\/li>\n<\/ol>\n<ul>\n<li>Por defecto el RPi solicitara IP median DHCP, es recomendable cambiarlo a est\u00e1tico. Ha diferencia de una imagen <strong>Raspbian<\/strong>, la direcci\u00f3n IP puede ser configurada en \/etc\/network.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>sudo apt update<br \/>\n<span style=\"font-style: inherit; font-weight: inherit;\">sudo <\/span>apt upgrade -y<\/p>\n<p>&nbsp;<\/p>\n<ol start=\"2\">\n<li>Lo interesante de <strong>Hypriot<\/strong> es que viene con <strong>Docker<\/strong> preinstalado, esto nos ahorra algunos minutos ya que no tenemos que hacer cambios como deshabilitar SWAP y editar la opci\u00f3n de cgroups. El siguiente paso es instalar <strong>Kubernetes<\/strong>:<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<pre>sudo su -\n\ncurl -s https:\/\/packages.cloud.google.com\/apt\/doc\/apt-key.gpg | apt-key add -\n\necho \"deb http:\/\/apt.kubernetes.io\/ kubernetes-xenial main\" &gt; \/etc\/apt\/sources.list.d\/kubernetes.list\n\napt update\n\napt install -y kubeadm kubelet<\/pre>\n<p>&nbsp;<\/p>\n<ol start=\"3\">\n<li>Ahora toca inicializar el <strong>master node<\/strong>:<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<pre>kubeadm init --pod-network-cidr 10.244.0.0\/16 --service-cidr 10.96.0.0\/12 --service-dns-domain \"k8s.do\" --apiserver-advertise-address 44.164.67.227 --ignore-preflight-errors=all<\/pre>\n<ul>\n<li>Recibiremos un mensaje de confirmaci\u00f3n relacionado a la creaci\u00f3n del cluster, un dato importante es el <strong>$TOKEN<\/strong> que m\u00e1s adelante usaremos para asociar los nodos.<\/li>\n<li>No es recomendable iniciar el cluster con \u2013ignore-preflight-errors=all, esta opci\u00f3n se usar\u00eda como \u00faltima alternativa si tenemos errores que no podemos evitar, tal como Swap en LXD.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ol start=\"4\">\n<li>Usando el Usuario <strong>pirate<\/strong> prepararemos el ambiente para usar kubectl sin especificar config o credenciales ya que estas ser\u00e1n cargadas desde el ambiente de usuario.<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<pre>mkdir -p $HOME\/.kube\n\n<span style=\"font-style: inherit; font-weight: inherit;\">sudo <\/span>cp -i \/etc\/kubernetes\/admin.conf $HOME\/.kube\/config\n\n<span style=\"font-style: inherit; font-weight: inherit;\">sudo <\/span>chown $(id -u<span style=\"font-style: inherit; font-weight: inherit;\">)<\/span>:$(id -g<span style=\"font-style: inherit; font-weight: inherit;\">)<\/span> $HOME\/.kube\/config\n\n<span style=\"font-style: inherit; font-weight: inherit;\">echo<\/span> \"export KUBECONFIG=<span style=\"font-style: inherit; font-weight: inherit;\">${<\/span><span style=\"font-style: inherit; font-weight: inherit;\">HOME<\/span><span style=\"font-style: inherit; font-weight: inherit;\">}<\/span><span style=\"font-style: inherit; font-weight: inherit;\">\/.kube\/config\"<\/span> &gt;&gt; ~\/.bashrc<span style=\"font-style: inherit; font-weight: inherit;\">source<\/span> ~\/.bashrc<\/pre>\n<p>&nbsp;<\/p>\n<ol start=\"5\">\n<li>Veo que muchos usan <strong>flannel<\/strong> como su <strong>CNI<\/strong>, en este cluster instalare <strong>wave<\/strong>, en el basado en LXD probare nuevamente con <strong>flannel<\/strong>. De esta manera tendr\u00eda ambos CNI para comparar funcionalidades, luego se podr\u00eda preparar una lista con las diferencias.<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<pre>$ kubectl apply -f \"https:\/\/cloud.weave.works\/k8s\/net?k8s-version=$(kubectl version | base64 | tr -d '\\n')\"<\/pre>\n<p>&nbsp;<\/p>\n<ol start=\"6\">\n<li>Para este momento ya contamos con un master, tenemos listo el CNI, podemos proceder a agregar nodos a nuestro cluster.<\/li>\n<\/ol>\n<ul>\n<li>Validamos que el CNI fue desplegado haciendo un <strong>kubectl get nodes<\/strong>, si nuestro nodo master tiene el estado de <strong>Ready<\/strong> esto quiere decir que estamos listos para el pr\u00f3ximo paso.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<pre>sudo kubeadm join --token<span style=\"font-style: inherit; font-weight: inherit;\">=<\/span><span style=\"font-style: inherit; font-weight: inherit;\">$TOKEN<\/span><\/pre>\n<p>&nbsp;<\/p>\n<ul>\n<li>$TOKEN es el valor que recibimos cuando iniciamos nuestro master.<\/li>\n<li>Recibiremos un mensaje indic\u00e1ndonos que todo aconteci\u00f3 correctamente y que revisemos nuestro cluster.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ol start=\"7\">\n<li>Verificamos que nuestro cluster cuenta con los nodos en los cuales ejecutamos <strong>kubeadm join<\/strong>.<\/li>\n<\/ol>\n<pre><strong>kubectl get nodes<\/strong><\/pre>\n<pre><strong>kubectl get pods \u2013all-namespaces<\/strong><\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<ol start=\"8\">\n<li>Validaremos que nuestro cluster puede ejecutar \u201cPods\u201d.<\/li>\n<\/ol>\n<ul>\n<li>En este ejemplo, utilizare la imagen oficial de nginx y ser\u00e1 configurada para escuchar en el puerto 80 de todos los nodos.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<pre>$ kubectl run nginx --image<span style=\"font-style: inherit; font-weight: inherit;\">=<\/span>nginx --replicas<span style=\"font-style: inherit; font-weight: inherit;\">=<\/span>3 --port<span style=\"font-style: inherit; font-weight: inherit;\">=<\/span>80\n\ndeployment \"nginx\" created<\/pre>\n<p>&nbsp;<\/p>\n<ul>\n<li>exponemos los Pods de nginx.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<pre>$ kubectl expose deployment nginx --port 80service \"nginx\" exposed<\/pre>\n<p>&nbsp;<\/p>\n<ul>\n<li>validamos que el puerto 80 est\u00e1 escuchando en los IP de nuestros nodos.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<pre>$ kubectl get endpoints\n\nNAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ENDPOINTS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AGE\n\nkubernetes&nbsp;&nbsp; 192.168.7.220:6443&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;37\n\nmnginx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10.244.4.2:80,10.244.4.3:80,10.244.3.2:80&nbsp;&nbsp; 23s<\/pre>\n<p>&nbsp;<\/p>\n<ol start=\"9\">\n<li>R\u00e1pidamente usando la herramienta <strong>curl<\/strong>, podemos validar que nginx est\u00e1 respondiendo en el puerto especificado.<\/li>\n<\/ol>\n<pre>$ curl 10.244.4.2 | head -n 5<\/pre>\n<p>&nbsp;<\/p>\n<ul>\n<li>deber\u00edamos recibir una respuesta como la siguiente:<\/li>\n<\/ul>\n<pre>&lt;DOCTYPE html&gt;\n\n&lt;html&gt;\n\n&lt;head&gt;\n\n&lt;title&gt;Welcome to nginx!&lt;\/title&gt;\n\n&lt;style&gt;<\/pre>\n<p>&nbsp;<\/p>\n<ul>\n<li>esto confirma que nuestro Pod est\u00e1 siendo ejecutado correctamente en el cluster de <strong>Kubernetes<\/strong>, aun faltar\u00edan muchos puntos por cubrir. Acceso desde fuera del cluster es importante ya que esta es la forma que nuestros usuarios\/clientes consumir\u00e1n servicios como nginx.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Hasta el momento solo hemos realizado configuraciones b\u00e1sicas en un entorno de <strong>Kubernetes<\/strong> y posiblemente algunos lleguen a la conclusi\u00f3n de que es mucho trabajo para simplemente tener un nginx o alguna otra aplicaci\u00f3n la cual se puede levantar con <strong>Docker<\/strong> on <strong>LXC<\/strong>. Lo interesante de <strong>Kubernetes<\/strong> es la poca diferencia en administrar un cluster con 3 nodos a uno con 40 nodos.<\/p>\n<p>En las pr\u00f3ximas entradas escribiere como instalar y utilizar <strong>Helm<\/strong>, as\u00ed tambi\u00e9n como instalar <strong>Istio<\/strong> para controlar el consumo de los servicios instalados en <strong>Kubernetes<\/strong>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hace ya unas semanas estuve en vBrownBagLATAM mostrando lo f\u00e1cil que es montarnos un LAB de Kubernetes, si buscamos en Internet podremos ver muchos posts de clusters usando Raspberry Pi. En mi caso intente usar LXD como base para las maquinas (contenedores) que tendr\u00e1n Kubernetes, tanto el master como los nodos. Resulta que el host [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[128,10,124],"tags":[130,129,139],"class_list":["post-2780","post","type-post","status-publish","format-standard","hentry","category-kubernetes","category-linux","category-ubuntu","tag-docker","tag-k8s","tag-kubernetes"],"_links":{"self":[{"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/posts\/2780","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/comments?post=2780"}],"version-history":[{"count":0,"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/posts\/2780\/revisions"}],"wp:attachment":[{"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/media?parent=2780"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/categories?post=2780"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/arielantigua.com\/weblog\/wp-json\/wp\/v2\/tags?post=2780"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}