meta data de esta página
  •  

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
virtualizacion:kubernetes:instalacion [292021/06/ 08:32] – [Referencias] lcvirtualizacion:kubernetes:instalacion [182023/01/ 13:37] (actual) – editor externo 127.0.0.1
Línea 1: Línea 1:
 +{{tag>docker kubernetes centos instalar}}
 +===== Instalación de Kubernetes en Centos 7 =====
 +La Wikipedida define [[https://es.wikipedia.org/wiki/Kubernetes|Kubernetes]] como (referido en inglés comúnmente como “K8s”) ** un sistema de código libre para la automatización del despliegue, ajuste de escala y manejo de aplicaciones en contenedores** . 
  
 +A esta clase de software se la conoce como orquestadores, existen varios y cada uno tienen sus propias [[https://www.ackstorm.com/orquestadores-mesos-kubernetes-swarm/|características]]
 +
 +Vamos a crear un cluster con almenos tres nodos , 1 manager y 2 workers (utilizar siempre un número impar de nodos) con unos requisitos mínimos de 2vCPUs y 2 GB de memoria por cada nodo.
 +
 +Además necesitaremos conectividad de red entre todos los nodos
 +
 +==== Pasos previos ====
 +Vamos a realizar los siguientes pasos tanto en el manager como en el resto de nodos
 +Lo primero será deshabilitar la swap 
 +  * temporalmente (hasta que reiniciemos )con el comando **swapoff -a **
 +  * Definitivamente editando el fichero /etc/fstab y comentando la línea de la partición del swap
 +  * Permitimos a iptable ver el trafico en modo bridge   . Para ello tenemos que cargar el módulo  <sxh>modprobe br_netfilter</sxh> y activarlo al arrancar con <sxh>echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables</sxh> o bien creamos un fichero de configuración para que se cargue en /etc/sysctl.d incluido el manager
 +<sxh>cat <<EOF >  /etc/sysctl.d/k8s.conf
 +net.bridge.bridge-nf-call-ip6tables = 1
 +net.bridge.bridge-nf-call-iptables = 1
 +EOF</sxh>
 +
 +y aplicamos los cambios con <sxh>sysctl --system</sxh>
 +  * deshabilitamos [[linux:centos:selinux|SElinux]] <sxh>sudo setenforce 0
 +sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config</sxh>
 +==== Instalamos Docker ====
 +  * instalamos los requisitos para instalar docker <sxh>yum install -y yum-utils device-mapper-persistent-data lvm2</sxh>
 +  * añadimos el repositorio e instalamos docker <sxh>yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo</sxh>
 +<sxh>sudo yum update -y && sudo yum install -y  containerd.io-1.2.13  docker-ce-19.03.11  docker-ce-cli-19.03.11</sxh>
 +<note>A día de este tutorial estas son las versiones de docker-ce soportadas por kubernetes </note>
 +  * Creamos el directorio /etc/docker <sxh>sudo mkdir /etc/docker</sxh>
 +  * Declaramos el demonio para docker <sxh>cat <<EOF | sudo tee /etc/docker/daemon.json
 +{
 +  "exec-opts": ["native.cgroupdriver=systemd"],
 +  "log-driver": "json-file",
 +  "log-opts": {
 +    "max-size": "100m"
 +  },
 +  "storage-driver": "overlay2",
 +  "storage-opts": [
 +    "overlay2.override_kernel_check=true"
 +  ]
 +}
 +EOF</sxh>
 +  * creamos el directorio del servicio <sxh>sudo mkdir -p /etc/systemd/system/docker.service.d</sxh>
 +  * Recargamos <sxh>systemctl daemon-reload && sudo systemctl restart docker</sxh> 
 +  * Lo ponemos para que arranque al inicio <sxh>systemctl enable docker && systemctl start docker</sxh>
 +<note>debemos comprobar con el comando **docker info | grep -i cgroup** que el docker está bajo systemd</note>
 +==== Instalación de Kubernetes ====
 +=== Pasos a realizar en todos los nodos (incluido el manager) ===
 +<sxh>cat <<EOF > /etc/yum.repos.d/kubernetes.repo
 +[kubernetes]
 +name=Kubernetes
 +baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
 +enabled=1
 +gpgcheck=1
 +repo_gpgcheck=1
 +gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
 +EOF
 +</sxh>
 +
 +Instalamos los paquetes
 +<sxh>yum update
 +yum install -y kubelet kubeadm kubectl</sxh>
 +<note warning>Ojo al ser el um update y que no instale versiones más nuevas de Docker </note>
 +  * Lo ponemos para que arranque al inicio 
 +<sxh>systemctl enable kubelet && systemctl start kubelet</sxh>
 +
 +Comprobamos que kubernetes y docker están en el mismo grupo de control ( cgroup)
 +
 +Para verificar el cgroup de docker <sxh>docker info | grep -i cgroup</sxh>
 +
 +Para añadir kubernetes al mismo cgroup <sxh>sed -i 's/cgroup-driver=systemd/cgroup-driver=cgroupfs/g' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf</sxh>
 +<note>según la versión de kubernetes y/o SO el fichero de  configuración se ha cambiado a /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
 +<sxh>sed -i 's/cgroup-driver=systemd/cgroup-driver=cgroupfs/g' /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf</sxh></note>
 +
 +
 +
 +Reiniciamos los servicios <sxh>systemctl daemon-reload
 +systemctl restart kubelet</sxh>
 +
 +=== Pasos a realizar sólo en el Manager ===
 +Como el Firewalld está habilitado en CentOS de manera predeterminada, tenemos que abrir  los siguientes puertos para permitir la comunicación con los nodos
 +<sxh>
 +firewall-cmd --permanent --add-port=6443/tcp
 +firewall-cmd --permanent --add-port=2379-2380/tcp
 +firewall-cmd --permanent --add-port=10250/tcp
 +firewall-cmd --permanent --add-port=10251/tcp
 +firewall-cmd --permanent --add-port=10252/tcp
 +firewall-cmd --permanent --add-port=10255/tcp
 +firewall-cmd –-reload
 +</sxh>
 +
 +Iniciamos el cluster <sxh>kubeadm init  --pod-network-cidr=10.244.0.0/16  --apiserver-advertise-address=<ip_del_nodo_manager> </sxh> 
 +<note>hay varias [[https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/|opciones]] que podemos usar para definir el interfaz que da servicio o la red para los pods. </note>
 +
 +<note > flannel por defecto usa el CIDR 10.244.0.0/16 . Calico por defecto usa el CIDR 192.168.0.0/16 el pod-network-cidr va acorde a esto. Aunque se puede cambiar para usar otros valores</note>
 +
 +Cuando este comando termina nos aparecerá un comando con el token y el hash para unir los nodos. Este comando deberemos de guardarlos para añadir los nodos.
 +
 +Antes de usar Kubernetes deberemos de ejecutar los siguientes comandos para terminar la configuración. 
 +
 +  * Si kubernetes lo vamos a lanzar como root sólo debemos ejecutar el siguiente comando <sxh>export KUBECONFIG=/etc/kubernetes/admin.conf</sxh>
 +  * Si lo vamos a lanzar como otro usuario deberemos de crear un directorio para la configuración, copiar los archivos necesarios y darle permisos sobre dichos archivos<sxh>
 +mkdir -p $HOME/.kube
 +sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
 +sudo chown $(id -u):$(id -g) $HOME/.kube/config
 +</sxh>
 +
 +Ahora debemos de definir el modelo de red que queremos usar en kubernetes , hay varias aproximaciones cada una con distitas características (https://kubernetes.io/docs/concepts/cluster-administration/networking/)
 +
 +Si por ejemplo vamos a usar [[https://github.com/coreos/flannel#flannel|flannel]] ejecutariamos en el manager <sxh>kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml</sxh>
 +
 +Si usamos [[https://www.weave.works/oss/net/|weave]] el comando sería <sxh> kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"</sxh>
 +
 +Si queremos comprobar si se ha instalado correctamente podemos ejecutar <sxh>kubectl  get pods --all-namespaces</sxh> nos deberías aparecer un pods llamada weave-net-wvlbx con el estado **running**
 +
 +=== Paso final en los nodos ===
 +Abrimos los puertos para la comunicación con el resto de nodos
 +<sxh>firewall-cmd --permanent --add-port=10251/tcp
 +firewall-cmd --permanent --add-port=10255/tcp
 +firewall-cmd –-reload
 +</sxh>
 +
 +Como último punto tenemos que añadir los nodos al manager. Para ello usaremos el comando que habiamos guardado cuando iniciamos el cluster  y lo ejecutamos en los nodos que vamos a unir al cluster 
 +<sxh>kubeadm join ipmanager:6443 --token MITOKEN --discovery-token-ca-cert-hash MIDISCOVERY_TOKEN</sxh>
 +<note>MITOKEN y MIDISCOVERY_TOKEN son los que nos dio el manager al iniciarlo</note>
 +
 +==== Funcionamiento ====
 +Para ver que todo está funcionando y los nodos están registrados ejecutamos en el manager <sxh>kubectl get nodes</sxh>
 +
 +==== Problemas ====
 +===  Cambiar el cgroup driver de Docker a systemd ===
 +Editar el fichero /usr/lib/systemd/system/docker.service y cambiar la línea 
 +<sxh>
 +ExecStart=/usr/bin/dockerd \
 +          --exec-opt native.cgroupdriver=systemd
 +</sxh>
 +=== kube-flannel-ds in CrashLoopBackoff ===
 +https://github.com/flannel-io/flannel/blob/master/Documentation/troubleshooting.md
 +
 +Si tenemos este problema con el driver kube-flannel es debido a que al ejecutar kubeadm init no especificamos la opción **--pod-network-cidr=<red para pods>.** Para comprobar  si está definida ejecutamos para cada nodo 
 +<sxh>kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}'</sxh>
 +
 +Para definir el PodCIDR en un nodo 
 +<sxh>kubectl patch node <NODE_NAME> -p '{"spec":{"podCIDR":"<SUBNET>"}}' </sxh>
 +
 +Por ejemplo <sxh>kubectl patch node slave1 -p '{"spec":{"podCIDR":"10.244.0.0/16"}}'"</sxh>
 +==== Referencias ====
 +  * https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
 +  * https://www.techrepublic.com/article/how-to-deploy-nginx-on-a-kubernetes-cluster/
 +  * https://www.techrepublic.com/article/how-to-install-a-kubernetes-cluster-on-centos-7/
 +  * https://computingforgeeks.com/install-kubernetes-cluster-on-centos-with-kubeadm/
 +  * https://www.doblefactor.com/devops/como-instalar-un-cluster-de-kubernetes-en-centos-7/
 +  * https://phoenixnap.com/kb/how-to-install-kubernetes-on-centos
 +  * https://medium.com/liveness-y-readiness-probe/instalaci%C3%B3n-de-kubernetes-onpremise-638609f2bb1e
 +  * https://blog.mauriciovillagran.uy/2019/Kubernetes-Lab/
 +  * https://rescalante.com/blog/view/f08ff837-5fcf-4b3c-81ac-0592014c6631