Instalar Kubernetes en Centos 7
Empezamos el año 2019 con una temática que me va gustando cada día más…El otro día creamos un GlusterFS sobre máquinas virtuales Centos 7, y ya que lo tengo creado y funcionando, por qué no reutilizarlo para otros “menesteres” como generar una instalación de Kubernetes.
Como primer paso, utilizaremos los nombres de los servidores en la instalación, con lo que tienen que estar reflejados en el fichero hosts. El nodo glusterfs01 será el master:
1 2 3 4 |
[root@glusterfs01 glusterfs]# cat /etc/hosts 192.168.2.20 glusterfs01 192.168.2.21 glusterfs02 192.168.2.22 glusterfs03 |
Ahora entramos en los requisitos que necesita la instalación, a parte de la conectividad de red entre los nodos, deberemos deshabilitar tanto Selinux como la Swap del sistema de los 3 nodos.
Deshabilitar Selinux y Swap en Centos 7
Dejamos Selinux en disabled:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[root@glusterfs01 glusterfs]# cat /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of three two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted |
Deshabilitamos la Swap:
1 |
[root@glusterfs01 glusterfs]# swapoff -a |
Adicionalmente modificamos para que el cambio sea efectivo aún reiniciando el sistema operativo. Necesitamos comentar la línea de la swap de /etc/fstab:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# # /etc/fstab # Created by anaconda on Sat Dec 29 11:08:05 2018 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/centos-root / xfs defaults 0 0 UUID=11551e7f-4aff-4dfc-b0c6-2af2e960baa0 /boot xfs defaults 0 0 #/dev/mapper/centos-swap swap swap defaults 0 0 /dev/vg_gluster/brick1 /bricks/brick1 xfs defaults 0 0 /dev/vg_gluster/brick2 /bricks/brick2 xfs defaults 0 0 glusterfs01:/gluster-volume /mnt/glusterfs glusterfs defaults,backupvolfile-server=glusterfs02 0 0 |
Habilitar módulo br_netfilter en Centos 7
También necesitaremos habilitar el módulo br_netfilter. Normalmente un módulo de sistema se carga cuando se necesita, pero en este caso necesitamos hacerlo manualmente:
1 |
[root@glusterfs03 ~]# modprobe br_netfilter |
1 |
[root@glusterfs01 glusterfs]# echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables |
Paquetes necesarios Kubernetes en Centos 7
Deberemos preparar el sistema operativo para la implantación:
1 |
yum install -y yum-utils device-mapper-persistent-data lvm2 |
Instalación Docker-CE en Centos 7
Ahora agregamos el repositorio de Docker-CE:
1 2 3 4 5 |
[root@glusterfs01 ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo Complementos cargados:fastestmirror adding repo from: https://download.docker.com/linux/centos/docker-ce.repo grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo repo saved to /etc/yum.repos.d/docker-ce.repo |
Lanzamos el instalador para Docker-CE:
1 |
yum install -y docker-ce |
Instalando Kubernetes en Centos 7
Una vez hecho todo esto ya podemos empezar con la instalación. Creamos el fichero para la descarga desde el repo de kubernetes:
1 2 3 4 5 6 7 8 9 |
[root@glusterfs01 ~]# vi /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 |
Instalamos Kubernetes:
1 |
yum install -y kubelet kubeadm kubectl |
Ahora tenemos que conseguir que tanto Kubernetes como Docker-CE estén en el mismo grupo de control o cgroup. ¿Por qué hacemos esto? Los grupos de control permiten definir jerarquías en las que se agrupan los procesos de manera que un administrador puede definir con gran detalle la manera en la que se asignan los recursos (CPU, memoria y I/O).
Arrancamos docker:
1 2 |
[root@glusterfs02 ~]# systemctl start docker | systemctl enable docker Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service. |
Comprobamos el cgroup donde se encuentra:
1 2 3 |
[root@glusterfs01 ~]# docker info | grep -i cgroup WARNING: bridge-nf-call-ip6tables is disabled Cgroup Driver: cgroupfs |
Añadimos Kubernetes al cgroup:
1 |
[root@glusterfs01 ~]# sed -i 's/cgroup-driver=systemd/cgroup-driver=cgroupfs/g' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf |
Reiniciamos el servicio de kubelet:
1 |
[root@glusterfs01 ~]# systemctl daemon-reload | systemctl restart kubelet | systemctl enable kubelet |
Ahora vamos a inicializar nuestro clúster de Kubernetes. Nos colocamos en el kubernetes-master y lanzamos el siguiente comando (modificar las IPs). Tardará un poco en terminarse:
1 2 3 4 5 6 7 8 9 |
[root@glusterfs01 ~]# kubeadm init --apiserver-advertise-address=192.168.2.20 --pod-network-cidr=10.0.0.0/24 [init] Using Kubernetes version: v1.13.1 [preflight] Running pre-flight checks [WARNING SystemVerification]: this Docker version is not on the list of validated versions: 18.09.0. Latest validated version: 18.06 [preflight] Pulling images required for setting up a Kubernetes cluster [preflight] This might take a minute or two, depending on the speed of your internet connection [preflight] You can also perform this action in beforehand using 'kubeadm config images pull' .... |
Lo importante, a parte de no tener errores, es la línea final:
1 |
kubeadm join 192.168.2.20:6443 --token fnstmu.70dt02mv05le2ypd --discovery-token-ca-cert-hash sha256:c869363643a8ac59783024f60203a104821087b79922672ecce13ef7b048d982 |
Con esto, iremos a los otros nodos:
1 |
kubeadm join 192.168.2.20:6443 --token fnstmu.70dt02mv05le2ypd --discovery-token-ca-cert-hash sha256:c869363643a8ac59783024f60203a104821087b79922672ecce13ef7b048d982 |
Creamos un nuevo directorio y le damos permisos desde el master:
1 2 3 |
[root@glusterfs01 ~]# mkdir -p $HOME/.kube [root@glusterfs01 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@glusterfs01 ~]# chown $(id -u):$(id -g) $HOME/.kube/config |
Ahora implementamos la red en el clúster desde el master:
1 2 3 4 5 6 7 8 9 10 |
[root@glusterfs01 ~]# kubectl apply -f https://github.com/coreos/flannel/raw/master/Documentation/kube-flannel.yml clusterrole.rbac.authorization.k8s.io/flannel created clusterrolebinding.rbac.authorization.k8s.io/flannel created serviceaccount/flannel created configmap/kube-flannel-cfg created daemonset.extensions/kube-flannel-ds-amd64 created daemonset.extensions/kube-flannel-ds-arm64 created daemonset.extensions/kube-flannel-ds-arm created daemonset.extensions/kube-flannel-ds-ppc64le created daemonset.extensions/kube-flannel-ds-s390x created |
Revisamos que ya tenemos los nodos y sus roles desde el master:
1 2 3 4 5 |
[root@glusterfs01 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION glusterfs01 Ready master 19m v1.13.1 glusterfs02 Ready 14m v1.13.1 glusterfs03 Ready 14m v1.13.1 |
Con esto ya tendríamos nuestro clúster Kubernetes en Centos 7
1 2 3 |
[root@glusterfs01 ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 443/TCP 15h |
Adicionalmente, agregamos estas reglas al Firewall:
Creación kubernete container NGINX
Para terminar podemos crear un container de NGINX, por ejemplo:
1 2 3 4 5 |
[root@glusterfs01 ~]# kubectl create deployment nginx --image=nginx deployment.apps/nginx created [root@glusterfs01 ~]# kubectl create service nodeport nginx --tcp=80:80 service/nginx created |
Comprobamos:
1 2 3 4 |
[root@glusterfs01 ~]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 443/TCP 15h nginx NodePort 10.108.31.194 80:32073/TCP 3s |
Comprobamos la consistencia:
1 2 3 |
[root@glusterfs01 ~]# kubectl get pods -o=wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-5c7588df-4sg9p 0/1 ContainerCreating 0 27m glusterfs03 |
Borramos el pod:
1 2 |
[root@glusterfs01 ~]# kubectl delete pod -l app=nginx pod "nginx-5c7588df-4sg9p" deleted |
Y vemos como Kubernetes-Engine lo regenera. Si queremos que cambie de nodo podemos borrarlo hasta que lo haga.
1 2 3 |
[root@glusterfs01 ~]# kubectl get pods -o=wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-5c7588df-qd5cp 0/1 ContainerCreating 0 13s glusterfs03 |
¿Te ha gustado la entrada SÍGUENOS EN TWITTER?
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?