GNU/Linux >> Tutoriales Linux >  >> Linux

Guía completa para principiantes sobre la implementación de clústeres de Kubernetes en CentOS (y otros Linux)

Espero que esté familiarizado con los términos básicos de Kubernetes como nodo, servicio, clúster, porque no voy a explicar esas cosas aquí.

Este es un tutorial paso a paso para mostrarle cómo implementar un clúster de Kubernetes listo para producción.

¿Listo para la producción? Sí, los ejemplos usan un dominio de muestra, por lo que si posee un dominio, puede configurarlo en una infraestructura pública. También puede usarlo para pruebas locales. Realmente depende de ti.

He usado CentOS Linux en los ejemplos, pero debería poder usar cualquier otra distribución de Linux. Excepto por los comandos de instalación, el resto de los pasos deberían ser aplicables a todos.

Voy a usar este grupo simple de un nodo maestro/de control y dos nodos trabajadores:

El tutorial se divide en dos partes principales.

La primera parte es básicamente un requisito previo y trata de preparar sus máquinas haciendo lo siguiente:

  • Configure nombres de host correctamente en todos los hosts
  • Desactive el intercambio en todos los nodos
  • Añadir reglas de cortafuegos
  • Configurar tablas de IP
  • Deshabilitar SELinux

La segunda parte es la implementación real del clúster de Kubernetes y consta de los siguientes pasos:

  • Configurar el repositorio de Kubernetes
  • Instalar kubelet, kubeadm, kubectl y docker
  • Habilite e inicie el servicio kubelet y docker
  • Habilitar finalizaciones de bash
  • Crear clúster con kubeadm
  • Configurar red de pods
  • Únete a los nodos de trabajo
  • Pruebe el clúster creando un módulo de prueba

Parte 1:preparación de sus sistemas para la implementación del clúster de Kubernetes

Necesita 3 servidores que se ejecuten en máquinas virtuales o bare metal o una plataforma en la nube como Linode, DigitalOcean o Azure.

Tengo 3 máquinas virtuales CentOS ejecutándose con los siguientes detalles:

  • Nodo principal de Kubernetes:172.42.42.230 kmaster-centos7.example.com/kmaster-centos7
  • Nodo de trabajo 1 de Kubernetes:172.42.42.231 kworker-centos71.example.com/kworker-centos71
  • Nodo de trabajo 2 de Kubernetes:172.42.42.232 kworker-centos72.example.com/kworker-centos72

Verifique las direcciones IP de sus máquinas y cámbielas según corresponda.

Paso 1. Configure correctamente los nombres de host en todos los sistemas

Puede agregar la IP y la información del subdominio correspondiente cambiando los registros DNS de su dominio.

En caso de que no tenga acceso al DNS, actualice el archivo /etc/hosts en los nodos maestro y trabajador con la siguiente información:

[[email protected] ~]# cat /etc/hosts
127.0.0.1       kmaster-centos7.example.com     kmaster-centos7
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.42.42.230 kmaster-centos7.example.com   kmaster-centos7
172.42.42.231 kworker-centos71.example.com  kworker-centos71
172.42.42.232 kworker-centos72.example.com  kworker-centos72
[[email protected] ~]#

Haga ping a los nodos de trabajo para verificar que los cambios en el archivo host funcionan bien.

Paso 2. Desactive el intercambio (por razones de rendimiento)

El programador de Kubernetes determina el mejor nodo disponible en el que implementar los pods recién creados. Si se permite el intercambio de memoria en un sistema host, esto puede generar problemas de rendimiento y estabilidad dentro de Kubernetes.

Por este motivo, Kubernetes requiere que desactive el intercambio en todos los nodos:

swapoff -a

Paso 3. Agregar reglas de firewall

Los nodos, contenedores y pods deben poder comunicarse a través del clúster para realizar sus funciones. Firewalld está habilitado en CentOS de forma predeterminada, por lo que sería conveniente abrir los puertos necesarios.

En el nodo principal, necesita estos puertos:

  • 6443:servidor API de Kubernetes:utilizado por todos
  • 2379–2380:API de cliente del servidor etcd:utilizada por kube-apiserver, etcd
  • 10250:API de Kubelet:utilizado por uno mismo, plano de control
  • 10251:kube-scheduler:utilizado por uno mismo
  • 10252:kube-controller-manager:usado por uno mismo

En los nodos trabajadores, se requieren estos puertos:

  • 10250:API de Kubelet:utilizado por uno mismo, plano de control
  • 30000–32767:Servicios de NodePort:utilizado por Todos

El comando firewall-cmd abre el puerto 6443 de esta manera:

firewall-cmd --permanent --add-port=6443/tcp

En los nodos maestro y trabajador, utilice el comando anterior para abrir los puertos necesarios que se han mencionado en esta sección.

Para el rango de puertos, puede reemplazar el número de puerto con el rango como firewall-cmd --permanent --add-port=2379-2380/tcp .

Una vez que haya agregado las nuevas reglas de firewall en cada máquina, vuelva a cargar el firewall:

firewall-cmd --reload

Paso 4. Configurar iptables

En los nodos maestro y trabajador, asegúrese de que br_netfilter el módulo del núcleo está cargado. Esto se puede hacer ejecutando lsmod | grep br_netfilter . Para cargarlo explícitamente llame a sudo modprobe br_netfilter .

Configure las net.bridge.bridge-nf-call-iptables a '1' en su archivo de configuración sysctl. Esto garantiza que las tablas de IP procesen correctamente los paquetes durante el filtrado y el reenvío de puertos.

[[email protected] ~]# cat <<EOF > /etc/sysctl.d/k8s.conf
> net.bridge.bridge-nf-call-ip6tables = 1
> net.bridge.bridge-nf-call-iptables = 1
> EOF

Ejecute este comando para que los cambios surtan efecto:

sysctl --system

Paso 5. Deshabilitar SELinux (para Red Hat y CentOS)

Los contenedores subyacentes serían necesarios para acceder al sistema de archivos del host. CentOS viene con SELinux (Linux con seguridad mejorada) habilitado en modo de aplicación. Esto podría bloquear el acceso al sistema de archivos del host.

Puede deshabilitar SELinux o configurarlo en modo permisivo, lo que deshabilita efectivamente sus funciones de seguridad.

[[email protected] ~]# setenforce 0
[[email protected] ~]# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
[[email protected] ~]#

Parte 2:Implementación del clúster de Kubernetes

Ahora que ha configurado los ajustes correctos en sus nodos maestro y trabajador, es hora de comenzar la implementación del clúster.

Paso 1. Configurar el repositorio de Kubernetes

Los paquetes de Kubernetes no están disponibles en los repositorios oficiales de CentOS 7. Este paso debe realizarse en el nodo principal y en cada nodo trabajador.

Ingrese lo siguiente y verifíquelo una vez agregado el contenido.

[[email protected] ~]# 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

Actualice y verifique que el repositorio de Kubernetes se agregue a la lista de repositorios:

[[email protected] ~]# yum update -y
[[email protected] ~]# yum repolist | grep -i kubernetes
!kubernetes                         Kubernetes                               570

Paso 2. Instalar kubelet, kubeadm, kubectl y Docker

kubelet, kubeadm, kubectl Se requieren tres paquetes básicos junto con el tiempo de ejecución del contenedor (que es docker aquí) para usar Kubernetes.

Instale estos paquetes en cada nodo:

yum install -y kubelet kubeadm kubectl docker

Paso 3. Habilite e inicie los servicios de kubelet y docker

Ahora que ha instalado los paquetes necesarios, habilite (para que se inicie automáticamente en cada arranque) kubelet y docker en cada nodo.

Habilite kubelet en cada nodo:

[[email protected] ~]# systemctl enable kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.

Habilitar ventana acoplable en cada nodo:

[[email protected] ~]# systemctl enable docker.service
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

También debe iniciar estos servicios para que puedan usarse de inmediato:


[[email protected] ~]# systemctl start kubelet
[[email protected] ~]# systemctl start docker.service

Paso 4. Habilite la finalización de bash (para una vida más fácil con Kubernetes)

Habilite las finalizaciones de bash en todos los nodos para que no tenga que escribir manualmente todos los comandos por completo. La pestaña haría eso por ti.

[[email protected] ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[[email protected] ~]# echo "source <(kubeadm completion bash)" >> ~/.bashrc
[[email protected] ~]# echo "source <(docker completion bash)" >> ~/.bashrc

Paso 5. Crear un clúster con kubeadm

Inicialice un clúster ejecutando el siguiente comando:

kubeadm init --apiserver-advertise-address=172.42.42.230 --pod-network-cidr=10.244.0.0/16

Nota: Siempre es bueno configurar --apserver-advertise-address específicamente al iniciar el clúster de Kubernetes usando kubeadm. La dirección IP en la que el servidor API anunciará que está escuchando. Si no se configura, se utilizará la interfaz de red predeterminada.

Lo mismo con --pod-network-cidr. Especifique el rango de direcciones IP para la red de módulos. Si se establece, el plano de control asignará automáticamente CIDR para cada nodo.

Para obtener más opciones, consulte este enlace.

Al final de la salida del comando kube-init, puede ver los pasos para ejecutar el clúster:

...
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/
  
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 172.42.42.230:6443 --token 22m8k4.kajx812tg74199x3 \
    --discovery-token-ca-cert-hash sha256:03baa45e2b2bb74afddc5241da8e84d16856f57b151e450bc9d52e6b35ad8d22
```

**Manage cluster as regular user:
**In the above kube-init command output you can clearly see that to start using your cluster, you need to run the following commands as a regular user:

```bash
[[email protected] ~]# mkdir -p $HOME/.kube
[[email protected] ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[[email protected] ~]# chown $(id -u):$(id -g) $HOME/.kube/config
[[email protected] ~]#

Debe ejecutar esos comandos uno por uno para iniciar el clúster de Kubernetes:

[[email protected] ~]# mkdir -p $HOME/.kube
[[email protected] ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[[email protected] ~]# chown $(id -u):$(id -g) $HOME/.kube/config

Paso 6. Configurar red de pod

La red de pods es la red superpuesta entre los nodos trabajadores. Con la red de pods, los contenedores en diferentes nodos se comunican entre sí.

Hay varias opciones de red de Kubernetes disponibles. Use el siguiente comando para instalar el complemento de red Flannel Pod:

[[email protected] ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
podsecuritypolicy.policy/psp.flannel.unprivileged created
Warning: rbac.authorization.k8s.io/v1beta1 ClusterRole is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRole
clusterrole.rbac.authorization.k8s.io/flannel created
Warning: rbac.authorization.k8s.io/v1beta1 ClusterRoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRoleBinding
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
[[email protected] ~]#

Verifique el estado del clúster y verifique que el nodo maestro (plano de control) esté listo.

[[email protected] ~]# kubectl get nodes
NAME                          STATUS   ROLES    AGE   VERSION
kmaster-centos7.example.com   Ready    master   2m    v1.19.2

Compruebe también todos los pods que se ejecutan en todos los espacios de nombres.

kubectl get pods --all-namespaces

Paso 7. Unir los nodos trabajadores al clúster

Consulte el resultado que obtuvo en el paso 5 y copie los comandos recomendados. Ejecútelo en cada nodo trabajador para conectarlo al clúster:

kubeadm join 172.42.42.230:6443 --token 22m8k4.kajx812tg74199x3 \
>     --discovery-token-ca-cert-hash sha256:03baa45e2b2bb74afddc5241da8e84d16856f57b151e450bc9d52e6b35ad8d22

Vuelva a verificar el estado del clúster para ver que todos los nodos de trabajo se han unido correctamente al clúster y están listos para servir cargas de trabajo.

[[email protected] ~]# kubectl get nodes -o wide
NAME                           STATUS   ROLES    AGE     VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
kmaster-centos7.example.com    Ready    master   9m17s   v1.19.2   172.42.42.230   <none>        CentOS Linux 7 (Core)   3.10.0-1127.19.1.el7.x86_64   docker://1.13.1
kworker-centos71.example.com   Ready    <none>   7m10s   v1.19.2   172.42.42.231   <none>        CentOS Linux 7 (Core)   3.10.0-1127.19.1.el7.x86_64   docker://1.13.1
kworker-centos72.example.com   Ready    <none>   7m8s    v1.19.2   172.42.42.232   <none>        CentOS Linux 7 (Core)   3.10.0-1127.19.1.el7.x86_64   docker://1.13.1

Verifique todos los pods que se ejecutan en todos los espacios de nombres:

kubectl get pods -o wide --all-namespaces

Paso 8. Probar el clúster creando un test pod

Ahora que tiene todo en su lugar, es hora de probar el clúster. Crear un pod:

[[email protected] ~]# kubectl run mypod1 --image=httpd --namespace=default --port=80 --labels app=fronend
pod/mypod1 created

Ahora, verifique el estado del pod:

[[email protected] ~]# kubectl get pods  -o wide
NAME     READY   STATUS    RESTARTS   AGE   IP           NODE                           NOMINATED NODE   READINESS GATES
mypod1   1/1     Running   0          29s   10.244.1.2   kworker-centos71.example.com   <none>           <none>
[[email protected] ~]#

¡Ahora tiene un clúster de Kubernetes completamente funcional en funcionamiento en CentOS!

Espero que les guste el tutorial. Si tiene preguntas o sugerencias, deje un comentario y estaré encantado de ayudarle.

Y conviértase en miembro del Manual de Linux para disfrutar de contenido exclusivo solo para miembros.


Linux
  1. Una guía para principiantes sobre los permisos de Linux

  2. Guía completa para usar paquetes Snap en Ubuntu y otras distribuciones de Linux

  3. ¿Qué es Kubernetes? Guía completa

  4. Una guía para principiantes de firewalld en Linux

  5. La guía completa para principiantes de LVM en Linux

Cómo instalar y usar Curl en distribuciones de Linux:una guía para principiantes

Guía para principiantes de Syslogs en Linux

Una guía completa para instalar Tomcat en Linux

Comandos de directorio de Linux:una guía completa

Cómo configurar un clúster de Linux con 2 nodos en RedHat y CentOS

Cómo instalar y usar FFmpeg en distribuciones de Linux | Guía para principiantes