#!/bin/bash # Script para configurar el nodo master de Kubernetes en Oracle Linux 9.4 (ol9.4) # Salir inmediatamente si ocurre un error set -e # Funciones para mostrar mensajes echo_info() { echo -e "\e[32m[INFO]\e[0m $1" } echo_error() { echo -e "\e[31m[ERROR]\e[0m $1" >&2 } # Obtener el usuario que ejecuta el script if [ "$SUDO_USER" ]; then ORIGINAL_USER="$SUDO_USER" else ORIGINAL_USER=$(whoami) fi # Obtener el directorio home del usuario original USER_HOME=$(getent passwd "$ORIGINAL_USER" | cut -d: -f6) # Verificar si se está ejecutando post-reinicio if [ "$1" == "post-reboot" ]; then echo_info "=== Ejecutando pasos post-reinicio para configurar el clúster de Kubernetes ===" # Inicializar el clúster de Kubernetes echo_info "Inicializando el clúster de Kubernetes con kubeadm..." sudo kubeadm init --pod-network-cidr=10.244.0.0/16 # Verificar si kubeadm init se ejecutó correctamente if [ $? -ne 0 ]; then echo_error "kubeadm init falló. Revisa los logs para más detalles." exit 1 fi # Configurar kubectl para el usuario original echo_info "Configurando kubectl para el usuario $ORIGINAL_USER..." mkdir -p "$USER_HOME/.kube" sudo cp -i /etc/kubernetes/admin.conf "$USER_HOME/.kube/config" sudo chown "$ORIGINAL_USER":"$ORIGINAL_USER" "$USER_HOME/.kube/config" # Verificar la existencia de admin.conf if [ ! -f /etc/kubernetes/admin.conf ]; then echo_error "El archivo /etc/kubernetes/admin.conf no se encontró. Asegúrate de que kubeadm init se ejecutó correctamente." exit 1 fi # Instalar Flannel como red de pods ejecutando kubectl como el usuario original echo_info "Instalando Flannel como red de pods..." sudo -u "$ORIGINAL_USER" kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml # Esperar a que el DaemonSet de Flannel esté desplegado correctamente echo_info "Esperando a que el DaemonSet de Flannel esté desplegado correctamente..." sudo -u "$ORIGINAL_USER" kubectl rollout status daemonset/kube-flannel-ds -n kube-flannel --timeout=120s || { echo_error "Timeout esperando que el DaemonSet de Flannel esté desplegado." exit 1 } # Verificar el estado de los nodos echo_info "Verificando el estado de los nodos..." sudo -u "$ORIGINAL_USER" kubectl get nodes # Generar el comando de unión y guardarlo en un archivo echo_info "Generando el comando de unión para los nodos worker..." JOIN_COMMAND=$(sudo kubeadm token create --print-join-command) echo "$JOIN_COMMAND" | sudo tee /etc/kubernetes/join_command.sh sudo chmod +x /etc/kubernetes/join_command.sh echo_info "El comando de unión ha sido guardado en /etc/kubernetes/join_command.sh" # Imprimir el comando de unión al usuario echo_info "El comando de unión para los nodos worker es:" echo_info "$JOIN_COMMAND" # Pausa para permitir al usuario desplegar los nodos worker echo_info "Ahora puedes desplegar los nodos worker utilizando el comando de unión proporcionado." echo_info "Presiona Enter una vez que hayas desplegado los nodos worker para continuar con la instalación de Prometheus y Grafana..." read -rp ">> Presiona Enter para continuar: " < /dev/tty # Modificar secure_path en sudoers para incluir /usr/local/bin echo_info "Modificando secure_path en sudoers para incluir /usr/local/bin..." # Usar sed para reemplazar la línea existente de secure_path o agregarla si no existe if sudo grep -q "^Defaults\s\+secure_path" /etc/sudoers; then sudo sed -i 's@^Defaults\s\+secure_path\s*=.*@Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"@' /etc/sudoers else echo 'Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"' | sudo tee /etc/sudoers.d/secure_path fi echo_info "secure_path ha sido actualizado en sudoers." exit 0 fi # Función para manejar la deshabilitación de SELinux de forma condicional disable_selinux() { echo_info "Verificando el estado de SELinux..." if sestatus | grep "SELinux status:" | grep "enabled" > /dev/null 2>&1; then echo_info "SELinux está habilitado. Deshabilitándolo..." sudo setenforce 0 || echo_info "SELinux ya está en modo permisivo." sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config echo_info "SELinux deshabilitado." else echo_info "SELinux ya está deshabilitado." fi } # Verificar si se está ejecutando la primera parte del script echo_info "Ejecutando pasos iniciales para configurar el nodo master de Kubernetes..." # Actualizar el sistema echo_info "Actualizando el sistema..." sudo yum update -y || sudo dnf update -y # Instalar herramientas necesarias echo_info "Instalando herramientas necesarias..." sudo yum install -y wget vim git curl || sudo dnf install -y wget vim git curl # Descargar y configurar etcd ETCD_VERSION="v3.4.34" ETCD_ARCHIVE="etcd-${ETCD_VERSION}-linux-amd64.tar.gz" ETCD_URL="https://github.com/etcd-io/etcd/releases/download/${ETCD_VERSION}/${ETCD_ARCHIVE}" echo_info "Descargando etcd..." wget ${ETCD_URL} echo_info "Extrayendo etcd..." tar zxvf ${ETCD_ARCHIVE} echo_info "Moviendo binarios de etcd a /usr/bin..." cd etcd-${ETCD_VERSION}-linux-amd64 sudo mv etcd /usr/bin sudo mv etcdctl /usr/bin echo_info "Configurando directorio de etcd..." sudo mkdir -p /var/lib/etcd sudo groupadd --system etcd || echo_info "Grupo 'etcd' ya existe." sudo useradd -s /sbin/nologin --system -g etcd etcd || echo_info "Usuario 'etcd' ya existe." sudo chown -R etcd:etcd /var/lib/etcd/ cd .. # Desactivar swap echo_info "Desactivando swap..." sudo swapoff -a echo_info "Eliminando swap del archivo /etc/fstab..." sudo sed -i '/swap/d' /etc/fstab # Configurar módulos y sysctl para Kubernetes echo_info "Configurando módulos para Kubernetes..." cat <> Presiona Enter para continuar: " < /dev/tty # Reboot del sistema para aplicar todos los cambios echo_info "Reiniciando el sistema para aplicar todas las configuraciones..." sudo reboot