GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo configurar el clúster de Kubernetes (k8s) en HA con Kubeadm

Cuando configuramos Kubernetes (k8s) clúster local para el entorno de producción, se recomienda implementarlo en alta disponibilidad. Aquí, alta disponibilidad significa instalar el maestro o plano de control de Kubernetes en HA. En este artículo, demostraré cómo configurar el clúster de Kubernetes (k8s) en HA (alta disponibilidad) con la utilidad kubeadm.

Para la demostración, he usado cinco sistemas CentOS 7 con los siguientes detalles:

  • k8s-master-1 – CentOS 7 mínimo – 192.168.1.40 – 2 GB de RAM, 2 vCPU, disco de 40 GB
  • k8s-master-2 – CentOS 7 mínimo – 192.168.1.41 – 2 GB de RAM, 2 vCPU, disco de 40 GB
  • k8s-master-3 – CentOS 7 mínimo – 192.168.1.42 – 2 GB de RAM, 2 vCPU, disco de 40 GB
  • k8s-worker-1 – CentOS 7 mínimo – 192.168.1.43 – 2 GB de RAM, 2 vCPU, disco de 40 GB
  • k8s-worker-2 – CentOS 7 mínimo – 192.168.1.44 – 2 GB de RAM, 2 vCPU, disco de 40 GB

Nota:el clúster de etcd también se puede formar fuera de los nodos maestros, pero para eso necesitamos hardware adicional, por lo que estoy instalando etcd dentro de mis nodos maestros.

Requisitos mínimos para configurar un clúster Highly K8s

  • Instalar Kubeadm , kubelet y kubectl en todos los nodos maestros y trabajadores
  • Conectividad de red entre nodos maestros y trabajadores
  • Conectividad a Internet en todos los nodos
  • Credenciales raíz o usuario con privilegios sudo en todos los nodos

Pasemos a los pasos de instalación y configuración

Paso 1) Establezca el nombre de host y agregue entradas en el archivo /etc/hosts

Ejecute el comando hostnamectl para establecer el nombre de host en cada nodo, se muestra un ejemplo para el nodo k8s-master-1,

$ hostnamectl set-hostname "k8s-master-1"$ exec bash

Del mismo modo, ejecute el comando anterior en los nodos restantes y establezca su respectivo nombre de host. Una vez que el nombre de host esté configurado en todos los nodos maestros y trabajadores, agregue las siguientes entradas en /etc/hosts archivo en todos los nodos.

192.168.1.40   k8s-master-1192.168.1.41   k8s-master-2192.168.1.42   k8s-master-3192.168.1.43   k8s-worker-1192.168.1.44   k8s-worker-2192.168.1.48 vip 

Usé una entrada adicional "192.168.1.45   vip-k8s-master" en el archivo de host porque usaré esta IP y nombre de host mientras configuro el haproxy y el keepalive en todos los nodos maestros. Esta IP se usará como kube-apiserver balanceador de carga ip. Todas las solicitudes de kube-apiserver llegarán a esta IP y luego la solicitud se distribuirá entre los kube-apiservers reales del backend.

Paso 2) Instalar y configurar Keepalive y HAProxy en todos los nodos del plano de control/maestro

Instale keepalived y haproxy en cada nodo maestro usando el siguiente comando yum,

$ sudo yum install haproxy keepalived -y

Configure Keepalived en k8s-master-1 primero, cree el script check_apiserver.sh con el siguiente contenido,

[[email protected] ~]$ sudo vi /etc/keepalived/check_apiserver.sh#!/bin/shAPISERVER_VIP=192.168.1.45APISERVER_DEST_PORT=6443errorExit() {    echo "*** $*" 1>&2    salida 1 }curl --silent --max-time 2 --insecure https://localhost:${APISERVER_DEST_PORT}/ -o /dev/null || errorExit "Error GET https://localhost:${APISERVER_DEST_PORT}/"if ip addr | grep -q ${APISERVER_VIP}; entonces    curl --silent --max-time 2 --insecure https://${APISERVER_VIP}:${APISERVER_DEST_PORT}/ -o /dev/null || errorSalir "Error OBTENER https://${APISERVER_VIP}:${APISERVER_DEST_PORT}/"fi

guardar y salir del archivo.

Establecer los permisos ejecutables

$ sudo chmod +x /etc/keepalived/check_apiserver.sh

Tome la copia de seguridad del archivo keepalived.conf y luego trunque el archivo.

[[correo electrónico protegido] ~]$ sudo cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf-org[[correo electrónico protegido] ~]$ sudo sh -c '> /etc/keepalived/ keepalived.conf'

Ahora pegue el siguiente contenido en el archivo /etc/keepalived/keepalived.conf

[[email protected] ~]$ sudo vi /etc/keepalived/keepalived.conf! /etc/keepalived/keepalived.conf! Archivo de configuración para KeepAlivedGlobal_defs {Router_id lvs_devel} vrrp_script check_apiserver {script "/etc/keepalive protegido]##D321! }    virtual_ipaddress {        192.168.1.45/24    }    track_script {        check_apserver    }}

Guarde y cierre el archivo.

Nota: Solo es necesario cambiar dos parámetros de este archivo para los nodos master-2 y 3. Estado se convertirá en ESCLAVO para el master 2 y 3, la prioridad será 254 y 253 respectivamente.

Configure HAProxy en el nodo k8s-master-1, edite su archivo de configuración y agregue los siguientes contenidos:

[[email protected] ~]$ sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg-org

Elimine todas las líneas después de la sección predeterminada y agregue las siguientes líneas

[[correo electrónico protegido] ~]$ sudo vi /etc/haproxy/haproxy.cfg#---------------------------- -----------------------------------------# interfaz de apserver que transmite a los maestros# -------------------------------------------------- -------------------frontend apserver    bind *:8443    modo tcp    opción tcplog    default_backend apiserver#------------------ -------------------------------------------------- -# equilibrio por turnos para apiserver#---------------------------------------------------------- ---------------------------backend apserver    opción httpchk GET /healthz    http-check esperar estado 200    modo tcp    opción ssl-hello-chk    balance     roundrobin servidor k8s-master-1 192.168.1.40:6443 comprobar        servidor k8s-master-2 192.168.1.41:6443 comprobar        servidor k8s-master-3 192.168.1.42:6443 comprobar

Guardar y salir del archivo

Ahora copie estos tres archivos (check_apiserver.sh, keepalived.conf y haproxy.cfg) de k8s-master-1 a k8s-master-2 y 3

Ejecute el siguiente bucle for para scp estos archivos para dominar 2 y 3

[[email protected] ~]$ para f en k8s-master-2 k8s-master-3; hacer scp /etc/keepalived/check_apiserver.sh /etc/keepalived/keepalived.conf [email protected]$f:/etc/keepalived; scp /etc/haproxy/haproxy.cfg [email protected]$f:/etc/haproxy; hecho

Nota: No olvide cambiar dos parámetros en el archivo keepalived.conf que discutimos anteriormente para k8s-master-2 y 3

En caso de que el firewall se esté ejecutando en los nodos maestros, agregue las siguientes reglas de firewall en los tres nodos maestros

$ sudo firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent$ sudo firewall-cmd --permanent --add-port=8443/tcp$ sudo firewall- cmd --recargar

Ahora, finalmente, inicie y habilite el servicio keepalived y haproxy en los tres nodos maestros usando los siguientes comandos:

$ sudo systemctl habilitar keepalived --ahora$ sudo systemctl habilitar haproxy --ahora

Una vez que estos servicios se inicien con éxito, verifique si VIP (IP virtual) está habilitado en el nodo k8s-master-1 porque hemos marcado k8s-master-1 como nodo MASTER en el archivo de configuración keepalived.

Perfecto, la salida anterior confirma que VIP se ha habilitado en k8s-master-1.

Paso 3) Deshabilite el intercambio, configure SELinux como permisivo y reglas de firewall para los nodos maestro y trabajador

Deshabilite el espacio de intercambio en todos los nodos, incluidos los nodos trabajadores. Ejecute los siguientes comandos

$ sudo swapoff -a $ sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

Establezca SELinux como Permisivo en todos los nodos maestros y trabajadores, ejecute los siguientes comandos,

$ sudo setenforce 0$ sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permisivo/' /etc/selinux/config

Reglas de cortafuegos para nodos maestros:

En caso de que el firewall se esté ejecutando en los nodos maestros, permita los siguientes puertos en el firewall,

Ejecute el siguiente comando firewall-cmd en todos los nodos maestros,

$ sudo firewall-cmd --permanent --add-port=6443/tcp$ sudo firewall-cmd --permanent --add-port=2379-2380/tcp$ sudo firewall-cmd --permanent --add -port=10250/tcp$ sudo firewall-cmd --permanente --add-port=10251/tcp$ sudo firewall-cmd --permanent --add-port=10252/tcp$ sudo firewall-cmd --permanente -- add-port=179/tcp$ sudo firewall-cmd --permanent --add-port=4789/udp$ sudo firewall-cmd --reload$ sudo modprobe br_netfilter$ sudo sh -c "echo '1'> /proc/ sys/net/bridge/bridge-nf-call-iptables"$ sudo sh -c "echo '1'> /proc/sys/net/ipv4/ip_forward"

Reglas de cortafuegos para nodos de trabajo:

En caso de que el cortafuegos se esté ejecutando en los nodos trabajadores, permita los siguientes puertos en el cortafuegos en todos los nodos trabajadores

Ejecute los siguientes comandos en todos los nodos trabajadores,

 $ sudo firewall-cmd --Permanent --add-puerto =10250/tcp $ sudo firewall-cmd --Permanent --add-port =30000-32767/tcp $ sudo firewall-cmd --permanent --add -port=179/tcp$ sudo firewall-cmd --permanent --add-port=4789/udp$ sudo firewall-cmd --reload$ sudo modprobe br_netfilter$ sudo sh -c "echo '1'> /proc/sys /net/bridge/bridge-nf-call-iptables"$ sudo sh -c "echo '1'> /proc/sys/net/ipv4/ip_forward"

Paso 4) Instalar la ventana acoplable Container Run Time (CRI) en los nodos maestro y trabajador

Instale Docker (Container Run Time) en todos los nodos maestros y trabajadores, ejecute el siguiente comando,

$ sudo yum install -y yum-utils$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo$ sudo yum install docker-ce -y

Ejecute el siguiente comando systemctl para iniciar y habilitar el servicio docker (ejecute este comando también en todos los nodos maestros y trabajadores)

$ sudo systemctl habilitar docker --ahora

Ahora, instalemos kubeadm, kubelet y kubectl en el siguiente paso

Paso 5) Instalar Kubeadm, kubelet y kubectl

Instale kubeadm, kubelet y kubectl en todos los nodos maestros, así como en los nodos trabajadores. Antes de instalar estos paquetes primero, debemos configurar el repositorio de Kubernetes, ejecutar el siguiente comando en cada nodo maestro y trabajador,

gato < 

Ahora ejecute debajo del comando yum para instalar estos paquetes,

$ sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

Ejecute el siguiente comando systemctl para habilitar el servicio kubelet en todos los nodos (nodos maestros y trabajadores)

$ sudo systemctl habilitar kubelet --ahora

Paso 6) Inicialice el clúster de Kubernetes desde el primer nodo maestro

Ahora muévase al primer nodo maestro/plano de control y emita el siguiente comando,

[[email protected] ~]$ sudo kubeadm init --control-plane-endpoint "vip-k8s-master:8443" --upload-certs

En el comando anterior, –control-plane-endpoint establezca el nombre de dns y el puerto para el equilibrador de carga (kube-apiserver), en mi caso, el nombre de dns es "vip-k8s-master" y el puerto es "8443", aparte de esto '–upload-certs La opción ' compartirá los certificados entre los nodos maestros automáticamente,

La salida del comando kubeadm sería similar a la siguiente:

Genial, el resultado anterior confirma que el clúster de Kubernetes se ha inicializado correctamente. En la salida también obtuvimos los comandos para que otros nodos maestros y trabajadores se unan al clúster.

Nota: Se recomienda copiar este resultado en un archivo de texto para referencia futura.

Ejecute los siguientes comandos para permitir que el usuario local use el comando kubectl para interactuar con el clúster,

[[correo electrónico protegido] ~]$ mkdir -p $HOME/.kube[[correo electrónico protegido] ~]$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config[[correo electrónico protegido ] ~]$ sudo chown $(id -u):$(id -g) $HOME/.kube/config[[email protected] ~]$

Ahora, implementemos la red de pods (CNI – Interfaz de red de contenedores), en mi caso voy a implementar el complemento calico como red de pods, ejecute el siguiente comando kubectl

[[email protected] ~]$ kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml

Una vez que la red de módulos se haya implementado correctamente, agregue los dos nodos principales restantes al clúster. Simplemente copie el comando para que el nodo maestro se una al clúster desde la salida y péguelo en k8s-master-2 y k8s-master-3, el ejemplo se muestra a continuación

[[email protected] ~]$ sudo kubeadm join vip-k8s-master:8443 --token tun848.2hlz8uo37jgy5zqt  --discovery-token-ca-cert-hash sha256:d035f143d4bea38d54a3d827729954ab4b1d9620631ee3fc5ab8 --control-planetecertifica03f4ab5b8 -- clave a0b31bb346e8d819558f8204d940782e497892ec9d3d74f08d1c0376dc3d3ef4

La salida sería:

También ejecute el mismo comando en k8s-master-3,

[[email protected] ~]$ sudo kubeadm join vip-k8s-master:8443 --token tun848.2hlz8uo37jgy5zqt  --discovery-token-ca-cert-hash sha256:d035f143d4bea38d54a3d827729954ab4b1d9620631ee3fc5ab8 --control-planetecertifica03f4ab5b8 -- clave a0b31bb346e8d819558f8204d940782e497892ec9d3d74f08d1c0376dc3d3ef4

La salida sería:

El resultado anterior confirma que k8s-master-3 también se unió al clúster con éxito. Verifiquemos el estado de los nodos desde el comando kubectl, vaya al nodo master-1 y ejecute el siguiente comando,

[[email protected] ~]$ kubectl get nodesNAME           ESTADO   ROLES    EDAD     VERSIONk8s-master-1   Ready    master   31m     v1.18.6k8s-master-2   Ready    master   10m     v1.18.6k8s-master-3    Masters    Ready 3 [[correo electrónico protegido] ~]$

Perfecto, nuestros tres nodos maestros o del plano de control están listos y se unen al clúster.

Paso 7) Unir los nodos de trabajo al clúster de Kubernetes

Para unir nodos de trabajo al clúster, copie el comando para el nodo de trabajo de la salida y péguelo en ambos nodos de trabajo, el ejemplo se muestra a continuación:

 [[correo electrónico protegido] ~] $ sudo kubeadm Únete vip-k8s-master:8443--token tun848.2hlz8Uo37jgy5zqt --discovery-token-ca-cert-hashhhash sha256:d035f143d4bea38d54a3d827729954ab4b1d9631631e3c8b8b8b8b8b8b8b8bt9620620620 kubeadm unirse a vip-k8s-master:8443 --token tun848.2hlz8uo37jgy5zqt --discovery-token-ca-cert-hash sha256:d035f143d4bea38d54a3d827729954ab4b1d9620631ee330b8f3fbc70324abc5

La salida sería algo así como a continuación:

Ahora diríjase al nodo k8s-master-1 y ejecute debajo del comando kubectl para obtener los nodos trabajadores de estado,

[[email protected] ~]$ kubectl get nodesNAME           STATUS   ROLES    AGE     VERSIONk8s-master-1   Ready    master   43m     v1.18.6k8s-master-2   Ready    master   21m     v1.18.6k8s-master-3m.    Ready  1 5 k8s-worker-1   Listo       6m11s   v1.18.6k8s-worker-2   Listo       5m22s   v1.18.6[[email protected] ~]$

El resultado anterior confirma que ambos trabajadores también se han unido al clúster y están listos.

Ejecute el siguiente comando para verificar los pods de infraestructura de estado que se implementan en el espacio de nombres del sistema kube.

[[email protected] ~]$ kubectl get pods -n kube-system

Paso 8) Pruebe el clúster de Kubernetes de alta disponibilidad

Intentemos conectarnos al clúster desde una máquina remota (sistema CentOS) usando el nombre y el puerto del dns del equilibrador de carga. En la máquina remota primero, debemos instalar el paquete kubectl. Ejecute el siguiente comando para configurar los repositorios de kubernetes.

gato < 

Ahora agregue la siguiente entrada en el archivo /etc/host,

192.168.1.45   vip-k8s-maestro

Cree el directorio kube y copie el archivo /etc/kubernetes/admin.conf del nodo k8s-master-1 a $HOME/.kube/config,

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

Ahora ejecute el comando "kubectl get nodes",

[[email protected] ~]$ kubectl get nodesNAME           ESTADO   ROLES    EDAD    VERSIONk8s-master-1   Ready    master   3h5m   v1.18.6k8s-master-2   Ready    master   163m   v1.18.6k8s-master-3   Ready  v1.1m master k8s-worker-1   Ready       148m   v1.18.6k8s-worker-2   Ready       147m   v1.18.6[[email protected] ~]$

Creemos una implementación con el nombre nginx-lab con imagen 'nginx ' y luego exponga esta implementación como servicio de tipo "NodePort

[[email protected] ~]$ kubectl create deployment nginx-lab --image=nginxdeployment.apps/nginx-lab created[[email protected] ~]$[[email protected] ~]$ kubectl get deployments.apps Nginx-Labname Ready Upsing Actualización disponible AGENGINX-LAB 1/1 1 1 59S [[Correo electrónico protegido] ~] $ Kubectl Get Podsname Ready Status se reinicia AGENGINX-LAB-5DF4577D49-RZV9Q 1/1 Running 0 68Stest-844B6566C-PXPKH 1/1     Corriendo   3          154m[[email protected] ~]$

Intentemos escalar las réplicas de 1 a 4, ejecute el siguiente comando,

[[email protected] ~]$ kubectl scale deployment nginx-lab --replicas=4deployment.apps/nginx-lab scaled[[email protected] ~]$[[email protected] ~]$ kubectl get deployments.apps nginx-labNAME        LISTO   ACTUALIZADO    DISPONIBLE   AGenginx-lab   4/4     4            4           3m10s[[email protected] ~]$

Ahora exponga la implementación como servicio, ejecute

[[correo electrónico protegido] ~]$ kubectl exposición de implementación nginx-lab --name=nginx-lab --type=NodePort --port=80 --target-port=80servicio/nginx-lab expuesto[[correo electrónico protegido ] ~]$

Obtenga los detalles del puerto e intente acceder al servidor web nginx usando curl,

[[email protected] ~]$ kubectl get svc nginx-labNAME        TYPE       CLUSTER-IP     EXTERNAL-IP   PUERTO(S)        AGEnginx-lab   NodePort   10.102.32.29           80:317 66/TCP protegido ]$

Para acceder al servidor web nginx, podemos usar cualquier IP y puerto de nodo maestro o trabajador como "31766"

[[correo electrónico protegido] ~]$ curl http://192.168.1.44:31766

La salida sería algo así como a continuación:

Perfecto, eso confirma que hemos implementado con éxito un clúster de Kubernetes de alta disponibilidad con kubeadm en servidores CentOS 7. No dude en compartir sus valiosos comentarios y opiniones.

Leer también :Cómo configurar el controlador de entrada NGINX en Kubernetes


Linux
  1. Cómo configurar un clúster de Kubernetes con Rancher

  2. Cómo instalar el clúster de Kubernetes (k8s) en RHEL 8

  3. Cómo instalar Kubernetes (k8s) con Minikube en CentOS 8

  4. Configurar el clúster de Kubernetes con Rancher

  5. Configure Kubernetes Cluster en Ubuntu 20.04 usando kubeadm

Cómo configurar Percona Cluster con HAproxy Loadbalancer en CentOS 7

Cómo configurar MariaDB Galera Cluster con HAproxy en CentOS 7

Cómo configurar un cortafuegos con UFW en Linux

Cómo implementar el clúster de Kubernetes en AWS con Amazon EKS

Creación de un clúster de Kubernetes de plano de control único con kubeadm

Cómo implementar CouchDB como un clúster con Docker