Instalación de kubernetes en Linux con Kubeadm

El presente instructivo tiene como finalidad, presentar los pasos básicos de instalación de Kubernetes en distribución GNU/Linux Debian 9.1

Disable swap kubelet
Requisitos:

  • Se debe contar con suficiente privilegios para la configuración de aplicativos
  • Todos los equipos a configurar deben tener acceso a la internet

Plataforma:

  • Equipos de arquitectura 64 bits
  • Sistema operativo ‘GNU/Linux’ Debian versión 9.1 (actualmente estable)

Aplicaciones:

  • docker-ce -> 17.03 ce
  • kubelet -> v1.9.6
  • kubeadm -> v1.9.6
  • kubectl -> v1.9.6
  • Calico -> 3.0

Para la configuración de la solución se utilizarán tres (03) maquinas virtuales en virtualbox con debian 9.1:

– Un (01) Equipo para instalación y configuración del Master:

  • Hostname: k8smaster
  • IP Interna: 192.168.0.103

– Dos (02) equipos para la instalación y configuración de nodos

  • Hostname: k8snodo1
  • IP Interna: 192.168.0.104
  • Hostname: k8snodo2
  • IP Interna: 192.168.0.105

Dominio: k8s

Nota: Para la fecha domingo 23/03/2018 1:01pm, la página oficial de kubernetes recomienda la instalacion de Docker CE versión 17.03 desde los repositorios de Ubuntu para Docker o Debian.

INSTALACION DE Docker-CE 17.03

Nota: Se requiere la instalación en todas las maquinas, en nuestro caso k8smaster, k8snodo1 y k8snodo2

1. Instalación de aplicaciones básicas para debian

root@k8smaster:/# aptitude install apt-transport-https ca-certificates curl software-properties-common

2. Descargar la llave repositorio Docker e instalarla

root@k8smaster:/# curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -

3. Incluir el repositorio de Docker, para la distribución utilizada “Debian”, versión en uso “Stretch”

root@k8smaster:/# add-apt-repository "deb https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") $(lsb_release -cs) stable"

4 Comprobar la entrada en el archivo de repositorios:

root@k8smaster:/# cat /etc/apt/sources.list | grep docker

Resultado:

deb https://download.docker.com/linux/debian stretch stable

5. Actualizar repositorios

root@k8smaster:/# aptitude update
Des: 1 http://deb.debian.org/debian stretch-updates InRelease [91,0 kB]
Ign http://ftp.es.debian.org/debian stretch InRelease                               
Des: 2 https://download.docker.com/linux/debian stretch InRelease [39,1 kB]
Des: 3 http://ftp.es.debian.org/debian stretch-backports InRelease [91,8 kB]
Des: 4 https://download.docker.com/linux/debian stretch/stable amd64 Packages [3.500 B]
Hit http://ftp.es.debian.org/debian stretch Release                    
Descargados 225 kB en 1s (126 kB/s)
                                                  
Estado actual: 1 (+1) new.

7. Instalar Docker Community Edition versión 17.03:

root@k8smaster:/# apt-get install -y docker-ce=$(apt-cache madison docker-ce | grep 17.03 | head -1 | awk '{print $3}')

8. Comprobar la instalación de Docker-ce 17.03:

root@k8smaster:~# docker version
Client:
 Version:      17.03.2-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   f5ec1e2
 Built:        Tue Jun 27 02:31:19 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.03.2-ce
 API version:  1.27 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   f5ec1e2
 Built:        Tue Jun 27 02:31:19 2017
 OS/Arch:      linux/amd64
 Experimental: false

Instalación kubeadm, kubelet y kubectl

Nota: Si quiere puede instalar los paquetes en todas las maquinas

1. Descargar la llave repositorio kubernetes e instalarla

root@k8smaster:/# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

2. Incluir repositorio de Kubernetes en el archivo de manejo de repositorio del sistema:

root@k8smaster:/# echo 'deb http://apt.kubernetes.io/ kubernetes-xenial main' >> /etc/apt/sources.list

3. Actualizar repositorio

root@k8smaster:~# apt-get update
Obj:1 http://deb.debian.org/debian stretch-updates InRelease
Ign:3 http://ftp.es.debian.org/debian stretch InRelease                          
Obj:4 https://download.docker.com/linux/debian stretch InRelease
Obj:5 http://ftp.es.debian.org/debian stretch-backports InRelease
Obj:6 http://ftp.es.debian.org/debian stretch Release                         
Des:2 https://packages.cloud.google.com/apt kubernetes-xenial InRelease [8.987 B]
Descargados 8.987 B en 1s (6.493 B/s)                       
Leyendo lista de paquetes... Hecho

4. Instalar paquetes:

root@k8smaster:~# apt-get install -y kubelet kubeadm kubectl

En donde:
– Kubelet: el componente más básico de Kubernetes. Se ejecuta en todas las máquinas de su clúster y hace cosas como iniciar las pods y los contenedores.
– Kubectl: el comando para controlar el clúster una vez que se está ejecutando. Sólo se utilizará en la maquina maestra (k8smaestro).
– Kubeadm: el comando para arrancar el clúster.

SOLO EN EL NODO MAESTRO (K8SMASTER)
Configurar controlador cgroup utilizado por kubelet. Sólo en el nodo Maestro (en nuestro caso ks8master)

1. Verificar el controlador de cgroup utilizado por el sistema operativo del nodo maestro

root@k8smaster:/# docker info | grep -i cgroup
WARNING: No swap limit support
Cgroup Driver: cgroupfs

2. Agregar la configuración de Kubelet para que coincida con controlador de cgroup de docker

root@k8smaster:/# vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

Agregar la siguiente linea:

Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=cgroupfs"

“Kubelet / Kubernetes desde la versión 1.8 no funciona “no soporta” el uso o habilitación de la memoria de intercambio o Swap los equipos”, por ello es necesario desactivar la memoria swap

3. Verificar el area de intercambio del equipo

root@k8smaster:~# swapon -s
Filename				Type		Size	Used	Priority
/dev/sda2                              	partition	1011708	268	-2

4. Desactivar la memoria swap

root@k8smaster:~# swapoff /dev/sda2

5. Desactivar la swap en la configuración de Kubelet

root@k8smaster:/# vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

Agregar la siguiente linea:

Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"

INICIAR O ARRANCAR EL MASTER

Nota: Sólo ejecutar en el equipo que sea considerado Master, en éste caso el “k8s1” – 192.168.100.52

1. Ejecutar kubeadm

root@k8smaster:/# kubeadm init --pod-network-cidr=192.168.0.0/16

donde:
–pod-network-cidr -> Valor del pools de IP, requerido por el complemento de red de pod para la asignación de rangos de red (CIDRS) a cada nodo. En nuestro caso “Calico” por defecto utiliza 192.168.0.0/16

root@k8smaster:~# kubeadm init --pod-network-cidr=192.168.0.0/16
[init] Using Kubernetes version: v1.9.6
[init] Using Authorization modes: [Node RBAC]
[preflight] Running pre-flight checks.
	[WARNING FileExisting-crictl]: crictl not found in system path
[certificates] Generated ca certificate and key.
[certificates] Generated apiserver certificate and key.
[certificates] apiserver serving cert is signed for DNS names [k8smaster kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.0.103]
[certificates] Generated apiserver-kubelet-client certificate and key.
[certificates] Generated sa key and public key.
[certificates] Generated front-proxy-ca certificate and key.
[certificates] Generated front-proxy-client certificate and key.
[certificates] Valid certificates and keys now exist in "/etc/kubernetes/pki"
[kubeconfig] Wrote KubeConfig file to disk: "admin.conf"
[kubeconfig] Wrote KubeConfig file to disk: "kubelet.conf"
[kubeconfig] Wrote KubeConfig file to disk: "controller-manager.conf"
[kubeconfig] Wrote KubeConfig file to disk: "scheduler.conf"
[controlplane] Wrote Static Pod manifest for component kube-apiserver to "/etc/kubernetes/manifests/kube-apiserver.yaml"
[controlplane] Wrote Static Pod manifest for component kube-controller-manager to "/etc/kubernetes/manifests/kube-controller-manager.yaml"
[controlplane] Wrote Static Pod manifest for component kube-scheduler to "/etc/kubernetes/manifests/kube-scheduler.yaml"
[etcd] Wrote Static Pod manifest for a local etcd instance to "/etc/kubernetes/manifests/etcd.yaml"
[init] Waiting for the kubelet to boot up the control plane as Static Pods from directory "/etc/kubernetes/manifests".
[init] This might take a minute or longer if the control plane images have to be pulled.
[apiclient] All control plane components are healthy after 171.002323 seconds
[uploadconfig] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[markmaster] Will mark node k8smaster as master by adding a label and a taint
[markmaster] Master k8smaster tainted and labelled with key/value: node-role.kubernetes.io/master=""
[bootstraptoken] Using token: d28dff.f1a86ee2bafdee32
[bootstraptoken] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstraptoken] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstraptoken] Configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstraptoken] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[addons] Applied essential addon: kube-dns
[addons] Applied essential addon: kube-proxy

Your Kubernetes master has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join --token d28dff.f1a86ee2bafdee32 192.168.0.103:6443 --discovery-token-ca-cert-hash sha256:c0c9ad326c615891090e4892d15c507bd6e8a4ae3ca17b167c2627927404b75d

Nota: Guardar el Token generado para ser utilizado en la unión de los nodos

EN CASO DE ALGÚN ERROR y DESEAR RESETEAR LA CONFIGURACIÓN, SE DEBE EJECUTAR EL SIGUIENTE COMANDO:

root@k8smaster:/home# kubeadm reset
[preflight] Running pre-flight checks
[reset] Stopping the kubelet service
[reset] Unmounting mounted directories in "/var/lib/kubelet"
[reset] Removing kubernetes-managed containers
[reset] No etcd manifest found in "/etc/kubernetes/manifests/etcd.yaml", assuming external etcd.
[reset] Deleting contents of stateful directories: [/var/lib/kubelet /etc/cni/net.d /var/lib/dockershim]
[reset] Deleting contents of config directories: [/etc/kubernetes/manifests /etc/kubernetes/pki]
[reset] Deleting files: [/etc/kubernetes/admin.conf /etc/kubernetes/kubelet.conf /etc/kubernetes/controller-manager.conf /etc/kubernetes/scheduler.conf]

2. Configurar kubectl:

root@k8smaster:/# mkdir -p $HOME/.kube
root@k8smaster:/# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
root@k8smaster:/# chown $(id -u):$(id -g) $HOME/.kube/config

3. Instalar Pod Network
Nota: Se debe instalar un complemento de red de pod para que los pods puedan comunicarse entre sí, cuando se encuentren en hosts diferentes. Varios proyectos proporcionan redes de pod Kubernetes utilizando CNI (contenedor de red Interface), algunos de los cuales también apoyan la política de red. En éste caso de instalará “Calico”

root@k8smaster:/# kubectl apply -f https://docs.projectcalico.org/v3.0/getting-started/kubernetes/installation/hosted/kubeadm/1.7/calico.yaml
configmap "calico-config" created
daemonset "calico-etcd" created
service "calico-etcd" created
daemonset "calico-node" created
deployment "calico-kube-controllers" created
clusterrolebinding "calico-cni-plugin" created
clusterrole "calico-cni-plugin" created
serviceaccount "calico-cni-plugin" created
clusterrolebinding "calico-kube-controllers" created
clusterrole "calico-kube-controllers" created
serviceaccount "calico-kube-controllers" created

4. Verificar que todos los Pods se encuentren ejecutando (depende del equipo toma algunos minutos):

root@k8smaster:/# watch kubectl get pods --all-namespaces
NAMESPACE     NAME                                       READY     STATUS    RESTARTS   AGE
kube-system   calico-etcd-jjd67                          1/1       Running   0          4m
kube-system   calico-kube-controllers-675684d4bb-lw884   1/1       Running   0          4m
kube-system   calico-node-mlb7d                          2/2       Running   0          4m
kube-system   etcd-k8smaster                             1/1       Running   0          8m
kube-system   kube-apiserver-k8smaster                   1/1       Running   0          8m
kube-system   kube-controller-manager-k8smaster          1/1       Running   0          8m
kube-system   kube-dns-6f4fd4bdf-8vnml                   3/3       Running   0          14m
kube-system   kube-proxy-vfnlz                           1/1       Running   0          14m
kube-system   kube-scheduler-k8smaster                   1/1       Running   0          8m

Nota: para salir del comando watch presionar CTRL+C o exit.

5. Permitir que el nodo master admita el despliegue de Pods:
Nota:Por defecto, el nodo master de un clúster de Kubernetes no ejecuta ningún tipo de carga de trabajo relacionada con los pods desplegados en el clúster, centrándose en las tareas de gestión de los pods y del propio clúster.

root@k8smaster:/# kubectl taint nodes --all node-role.kubernetes.io/master-
node "k8smaster" untainted

6. Verificar la existencia de un nodo(k8smaster) en el clúster

root@k8smaster:~# kubectl get nodes -o wide
NAME        STATUS    ROLES     AGE       VERSION   EXTERNAL-IP   OS-IMAGE                       KERNEL-VERSION         CONTAINER-RUNTIME
k8smaster   Ready     master    20m       v1.9.6            Debian GNU/Linux 9 (stretch)   4.14.0-0.bpo.3-amd64   docker://17.3.2

UNIR LOS NODOS
Los siguientes comandos deben ejecutarse desde el NODO que desea unir, en nuestro caso, k8snodo1 y k8snodo2

NODO #1

“Kubelet / Kubernetes desde la versión 1.8 no funciona “no soporta” el uso o habilitación de la memoria de intercambio o Swap los equipos”, por ello es necesario desactivar la memoria swap

1. Verificar el area de intercambio del equipo

root@k8snodo1:~# swapon -s
Filename				Type		Size	Used	Priority
/dev/sda2                              	partition	1011708	268	-2

2. Desactivar la memoria swap

root@k8snodo1:~# swapoff /dev/sda2

3. Desactivar la swap en la configuración de Kubelet

root@k8smaster:/# vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

Agregar la siguiente linea:

Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"

3. Unir nodo con el nodo master
k8snodo1 IP Interna 192.168.0.104
k8smaster IP Interna: 192.168.0.103

root@k8snodo1:/# kubeadm join --token d28dff.f1a86ee2bafdee32 192.168.0.103:6443 --discovery-token-ca-cert-hash sha256:c0c9ad326c615891090e4892d15c507bd6e8a4ae3ca17b167c2627927404b75d
[preflight] Running pre-flight checks.
	[WARNING FileExisting-crictl]: crictl not found in system path
[discovery] Trying to connect to API Server "192.168.0.103:6443"
[discovery] Created cluster-info discovery client, requesting info from "https://192.168.0.103:6443"
[discovery] Requesting info from "https://192.168.0.103:6443" again to validate TLS against the pinned public key
[discovery] Cluster info signature and contents are valid and TLS certificate validates against pinned roots, will use API Server "192.168.0.103:6443"
[discovery] Successfully established connection with API Server "192.168.0.103:6443"

This node has joined the cluster:
* Certificate signing request was sent to master and a response
  was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the master to see this node join the cluster.

VERIFICAR LA UNIÓN DEL NODO

1. Desde el nodo maestro (k8smaster), ejecutar:

root@k8smaster:~# kubectl get nodes
NAME        STATUS    ROLES     AGE       VERSION
k8smaster   Ready     master    29m       v1.9.6
k8snodo1    Ready         3m        v1.9.6

PROBANDO EL CLUSTER
1. Crear un espacio de trabajo:

root@k8smaster:~# kubectl create namespace prueba
namespace "prueba" created

2. Listar los espacios de trabajos del cluster:

root@k8smaster:~# kubectl get namespaces
NAME          STATUS    AGE
default       Active    2h
kube-public   Active    2h
kube-system   Active    2h
prueba        Active    5s

Enlaces:

Quickstart for Calico on Kubernetes
Instalación kubeadm
Installing Kubernetes on Linux with kubeadm

Anuncios

10 comentarios sobre “Instalación de kubernetes en Linux con Kubeadm

  1. Hola me podrías ayudar, hago todos tus pasos y te sigo al pie de la letra, pero a la hora de unir el nodo con el comando kubeadm join –token me da el siguiente error.

    root@nodo:/home/pc209# kubeadm join 192.168.1.109:6443 –token vrghf6.q03jcn3ozktjry3o –discovery-token-ca-cert-hash sha256:9e7d4fa6a3b9371f4d9b5ae53ee078a9d14cd2cc4de78a4e64d301e1889b1157
    [preflight] Running pre-flight checks.
    [WARNING Hostname]: hostname “nodo” could not be reached
    [WARNING Hostname]: hostname “nodo” lookup nodo on 8.8.8.8:53: no such host
    [WARNING FileExisting-crictl]: crictl not found in system path
    Suggestion: go get github.com/kubernetes-incubator/cri-tools/cmd/crictl
    [preflight] Some fatal errors occurred:
    [ERROR Swap]: running with swap on is not supported. Please disable swap
    [preflight] If you know what you are doing, you can make a check non-fatal with `–ignore-preflight-errors=…`

    Haber si puedes ayudarme muchas gracias espero respuestas.

    1. 1.- En los nodos al igual que en el master, hay que desactivar la memoria de intercambio o swap. Ya incluí el paso en el instructivo.

      2.- Desde el master, revisa si estas corriendo los “pods”
      # watch kubectl get pods –all-namespaces

      3.- Revisa la configuración del /etc/hosts del nodo
      127.0.0.1 localhost
      127.0.1.1 nodo

      4.- Revisar el nombre del equipo:
      # hostname -f

      1. Perfecto todo solucionado.

        Un tema por curiosidad cuando se reinicia el debían máster sabrías cual es el servicio o el comando para iniciarlo para poder levantar todo como estaba antes configurado.

        Es que reinicie y no me funciona.

        Muchas gracias por contestar.!

      2. hay un detalle con el proxy del dashboard, corriendo nuevamente el comando “# kubectl proxy –address 0.0.0.0 –accept-hosts=’^*$’&”, podras tener acceso de forma gráfica

  2. Hola me funciona todo perecto lo estoy haciendo en maquina virtual y me sale todo conectado incluso los nodos con el maste todos ready.

    Pero ahora hago un reboot al servidor master intento poner el mismo comando para ver los nodos disponible y no me deja me sale algo de conection port localhost como si se perdiera la configuración ya echa de antes.

    Espero respuestas.

  3. Excelente tutorial he logrado un máster y conectado muchos nodos , la pregunta es como desplegar una aplicación en el máster y q los nodos puedan aceder a ella existe algún tutorial para eso… Saludos y gracias por el aporte

  4. Buenas tardes mira tengo un problema en el paso para ejecutar kubeadm kubeadm init –pod-network-cidr=192.168.0.0/16 me sale el siguiente error

    unable to get URL “dl.k8s.io/release/stable-1.10.txt”: Get dl.k8s.io/release/stable-1.10.txt: dial tcp 23.236.58.218:443: getsockopt: connection timed out

    explicame por que me sale esto

    saludos

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s