Desarrollo del clúster de Kubernetes a CentOS (y otros Linux)

¿Cómo va eso? soy Fran. Os traigo un nuevo post sobre el sistema operativo mas molón. Encantado linuxeros.

Espero que conozca los términos básicos de Kubernetes como nodo, servicio, clúster porque no contaré estas cosas aquí.

Este es un tutorial paso a paso para mostraros cómo desplegar un clúster de Kubernetes preparado para la producción.

La producción está preparada? Sí, los ejemplos utilizan un dominio de muestra, por lo que si tiene un dominio, se puede configurar la infraestructura pública. También puede utilizarlo para hacer pruebas locales. Realmente depende de vosotros.

he utilizado CentOS Linux los ejemplos, pero debería poder utilizar cualquier otra distribución de Linux. Excepto las órdenes de instalación, el resto de pasos deberían ser aplicables a todos.

Voy a utilizar este simple clúster de un nodo maestro / control y dos nodos de trabajo:

Despliegue del clúster de Kubernetes

El tutorial se divide en dos partes principales.

La primera parte es básicamente un requisito previo y trata de preparar las máquinas haciendo las siguientes acciones:

  • Configure correctamente los nombres de host a todos los anfitriones
  • Desactive el intercambio a todos los nodos
  • Agregue reglas del cortafuegos
  • Configure IPtables
  • desactive SELinux

La segunda parte es el desarrollo real del clúster de Kubernetes y consta de los siguientes pasos:

  • Configure el depósito de Kubernetes
  • Instalación kubelet, kubeadm, kubectl y docker
  • Active e inicie el servicio Kubelet y Docker
  • Activa las finalizaciones bash
  • Cree un clúster con kubeadm
  • Configuración de la red Pod
  • Únase a Workers Nodos
  • Pruebe el clúster creando un pod de prueba

Parte 1: Preparación de los sistemas para el desarrollo del clúster de Kubernetes

Necesita 3 servidores que 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 en funcionamiento con los siguientes detalles:

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

Compruebe las direcciones IP de las máquinas y cámbielas en consecuencia.

Paso 1. Configure correctamente los nombres de anfitrión en todos los sistemas

Puede añadir la IP y la información de subdominio correspondiente cambiando los registros DNS de su dominio.

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

[root@kmaster-centos7 ~]# 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
[root@kmaster-centos7 ~]#

Haga un ping a los nodos del trabajador para verificar que los cambios del archivo anfitrión funcionen bien.

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

El planificador de Kubernetes determina el mejor nodo disponible para desplegar pods de nueva creación. Si se permite el intercambio de memoria en un sistema anfitrión, esto puede provocar problemas de rendimiento y estabilidad a Kubernetes.

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

swapoff -a

Paso 3. Añada reglas del cortafuegos

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

Al nodo maestro, necesita estos puertos:

  • 6443: servidor API Kubernetes: utilizado por todos
  • 2379-2380: API del cliente del servidor ETCD: utilizado para kube-apiserver, ETCD
  • 10250: API Kubelet: utilizado para Self, plan de control
  • 10251: kube-scheduler: utilizado para self
  • 10252: kube-controller-manager: utilizado para self

A los nodos de trabajo, estos puertos son obligatorios:

  • 10250: API Kubelet: utilizado para Self, plan de control
  • 30000-32767: Servicios NodePort: todos los utilizan

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

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

A los nodos maestro y de trabajo, utilice la orden anterior para abrir los puertos necesarios que se han mencionado en esta sección.

Para el intervalo de puertos, puede sustituir el número de puerto del intervalo como firewall-cmd --permanent --add-port=2379-2380/tcp.

Una vez que haya añadido las nuevas reglas del cortafuegos a cada equipo, vuelva a cargar el cortafuegos:

firewall-cmd --reload

Paso 4. Configure iptables

A los nodos maestro y trabajador, asegúrese de que el archivo br_netfilter se carga el módulo del núcleo. Esto se puede hacer ejecutando lsmod | grep br_netfilter. Para cargarlo explique explícitamente sudo modprobe br_netfilter.

Establece el archivo net.bridge.bridge-nf-call-iptables a «1» en el archivo de configuración de sysctl. Esto garantiza que los paquetes sean procesados ​​correctamente para las tablas IP durante el filtrado y el reenvío de puertos.

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

Ejecutar esta orden para que los cambios entren en vigor:

sysctl --system

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

Los contenedores subyacentes serían necesarios para acceder al sistema de ficheros anfitrión. CentOS viene con SELinux (Linux mejorado en seguridad) habilitado en modo de aplicación. Esto puede bloquear el acceso al sistema de ficheros anfitrión.

Puede desactivar SELinux o configurarlo en modo permisivo, que desactiva efectivamente sus funciones de seguridad.

[root@kmaster-centos7 ~]# setenforce 0
[root@kmaster-centos7 ~]# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
[root@kmaster-centos7 ~]#

Parte 2: desarrollo del clúster de Kubernetes

Ahora que ha configurado la configuración correcta a los nodos maestro y trabajador, es hora de iniciar el despliegue del clúster.

Paso 1. Configure el depósito de Kubernetes

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

Introduzca el siguiente y verifíquelo una vez añadido el contenido.

[root@kmaster-centos7 ~]# 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

Actualizar y verifique que el depósito de Kubernetes añada a la lista de depósitos:

[root@kmaster-centos7 ~]# yum update -y
[root@kmaster-centos7 ~]# yum repolist | grep -i kubernetes
!kubernetes                         Kubernetes                               570

Paso 2. Instalación kubelet, kubeadm, kubectl y Docker

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

Instale estos paquetes en cada nodo:

yum install -y kubelet kubeadm kubectl docker

Paso 3. Active e inicie los servicios de Kubelet y Docker

Ahora que ha instalado los paquetes necesarios, active (de modo que se inicie automáticamente cada arranque) kubelet y acoplador cada nodo.

Active kubelet cada nodo:

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

Active la conexión a cada nodo:

[root@kmaster-centos7 ~]# 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 debes iniciar estos servicios para que se puedan utilizar de inmediato:


[root@kmaster-centos7 ~]# systemctl start kubelet
[root@kmaster-centos7 ~]# systemctl start docker.service

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

Active las completación bash a todos los nodos, de manera que no es necesario que escriba manualmente todas las órdenes. La pestaña lo haría por vosotros.

[root@kmaster-centos7 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@kmaster-centos7 ~]# echo "source <(kubeadm completion bash)" >> ~/.bashrc
[root@kmaster-centos7 ~]# echo "source <(docker completion bash)" >> ~/.bashrc

Paso 5. Cree un clúster con kubeadm

Inicialice un clúster ejecutando el siguiente orden:

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

Nota: Siempre es bueno montar –apiserver-Advertise-address específicamente mientras se inicia el clúster Kubernetes mediante kubeadm. La dirección IP que anunciará el servidor API que escucha. Si no se define, se utilizará la interfaz de red por defecto.

Lo mismo con –Podría-network-CIDR. Especifique el intervalo de direcciones IP para la red de pod. Si se establece, el plan de control asignará automáticamente CIDR para cada nodo.

Para obtener más opciones, consulte este enlace.

Al final de la salida de la orden 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
[root@kmaster-centos7 ~]# mkdir -p $HOME/.kube
[root@kmaster-centos7 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@kmaster-centos7 ~]# chown $(id -u):$(id -g) $HOME/.kube/config
[root@kmaster-centos7 ~]#

Debe ejecutar estas órdenes una por una para iniciar el clúster de Kubernetes:

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

Paso 6. Configure la red del pod

La red de pod es la red de superposición entre los nodos de trabajo. Con la red de pods, los contenedores de diferentes nodos se comunican entre ellos.

Hay varios disponibles Opciones de red de Kubernetes. Utilice el mandato siguiente para instalar el complemento de red de flannel pod:

[root@kmaster-centos7 ~]# 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
[root@kmaster-centos7 ~]#

Compruebe el estado del clúster y compruebe que el nodo maestro (plano de control) esté a punto.

[root@kmaster-centos7 ~]# 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. Únete a nodos de trabajo para agrupar

Consulte la salida que ha obtenido en el paso 5 y copie las órdenes recomendadas. Ejecute a cada nodo de 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 comprobar el estado del clúster para ver si todos los nodos de trabajo se han unido correctamente al clúster y están preparados para atender cargas de trabajo.

[root@kmaster-centos7 ~]# 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

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

kubectl get pods -o wide --all-namespaces

Paso 8. Pruebe el clúster creando un pod de prueba

Ahora que ya lo tiene todo a punto, es hora de probar el clúster. Cree un pod:

[root@kmaster-centos7 ~]# kubectl run mypod1 --image=httpd --namespace=default --port=80 --labels app=fronend
pod/mypod1 created

Ahora, verifique el estado del pod:

[root@kmaster-centos7 ~]# 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>
[root@kmaster-centos7 ~]#

Ahora tiene un clúster Kubernetes completamente funcional que funciona y funciona a CentOS.

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

Y se conviertan miembro de Linux Handbook para disfrutar de contenido exclusivo exclusivo para miembros.

El Blog lo escribimos para ayudar y servir de ayuda a la comunidad Linux. Esperamos que os guste.

Leave a Reply