@@ -8,17 +8,10 @@ CONFIG_DIR="config"
# Цвета для вывода
GREEN = '\033[0;32m'
YELLOW = '\033[1;33m'
RED = '\033[0;31m'
NC = '\033[0m' # No Color
# Helper function for checking uniqueness in an array
contains_element ( ) {
local e match = " $1 "
shift
for e; do [ [ " $e " = = " $match " ] ] && return 0; done
return 1
}
# Function for asking yes/no questions
# функции ask_yes_no, check_command, detect_os и т.д.
ask_yes_no( ) {
local prompt = " $1 "
local default = " $2 "
@@ -43,6 +36,161 @@ ask_yes_no() {
done
}
# Функция для определения О С
detect_os( ) {
if [ [ " $OSTYPE " = = "linux-gnu" * ] ] ; then
if [ [ -f /etc/os-release ] ] ; then
. /etc/os-release
echo " $ID "
elif [ [ -f /etc/redhat-release ] ] ; then
echo "rhel"
elif [ [ -f /etc/debian_version ] ] ; then
echo "debian"
else
echo "linux"
fi
elif [ [ " $OSTYPE " = = "darwin" * ] ] ; then
echo "macos"
else
echo "unknown"
fi
}
# Функция для проверки установки утилиты
check_command( ) {
local cmd = " $1 "
local name = " $2 "
if command -v " $cmd " & > /dev/null; then
echo -e " ${ GREEN } ✓ $name установлен ${ NC } "
return 0
else
echo -e " ${ RED } ✗ $name не установлен ${ NC } "
return 1
fi
}
# Функция для проверки установки brew (для macOS)
check_brew( ) {
if ! command -v brew & > /dev/null; then
echo -e " ${ RED } ✗ brew не установлен ${ NC } "
echo -e " ${ YELLOW } Установите Homebrew командой:/bin/bash -c \" $( curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh) \" ${ NC } "
exit 1
fi
}
# Функция для установки talosctl
install_talosctl( ) {
local os = $( detect_os)
echo -e " \n ${ YELLOW } Установка talosctl... ${ NC } "
case " $os " in
"ubuntu" | "debian" )
echo "Для Ubuntu/Debian:"
echo "curl -Lo /usr/local/bin/talosctl https://github.com/siderolabs/talos/releases/latest/download/talosctl-linux-amd64"
echo "chmod +x /usr/local/bin/talosctl"
; ;
"rhel" | "centos" | "fedora" | "rocky" | "alma" )
echo "Для RHEL/CentOS/Fedora:"
echo "curl -Lo /usr/local/bin/talosctl https://github.com/siderolabs/talos/releases/latest/download/talosctl-linux-amd64"
echo "chmod +x /usr/local/bin/talosctl"
; ;
"macos" )
check_brew
echo "Для macOS:"
echo "brew install talosctl"
echo "Или вручную:"
echo "curl -Lo /usr/local/bin/talosctl https://github.com/siderolabs/talos/releases/latest/download/talosctl-darwin-amd64"
echo "chmod +x /usr/local/bin/talosctl"
; ;
*)
echo "Скачайте talosctl с https://github.com/siderolabs/talos/releases"
; ;
esac
}
# Функция для установки kubectl
install_kubectl( ) {
local os = $( detect_os)
echo -e " \n ${ YELLOW } Установка kubectl... ${ NC } "
case " $os " in
"ubuntu" | "debian" )
echo "Для Ubuntu/Debian:"
echo "sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl"
echo "sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg"
echo "echo \"deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main\" | sudo tee /etc/apt/sources.list.d/kubernetes.list"
echo "sudo apt-get update && sudo apt-get install -y kubectl"
; ;
"rhel" | "centos" | "fedora" | "rocky" | "alma" )
echo "Для RHEL/CentOS/Fedora:"
echo "cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo"
echo "[kubernetes]"
echo "name=Kubernetes"
echo "baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64"
echo "enabled=1"
echo "gpgcheck=1"
echo "repo_gpgcheck=1"
echo "gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg"
echo "EOF"
echo "sudo yum install -y kubectl"
; ;
"macos" )
check_brew
echo "Для macOS:"
echo "brew install kubectl"
; ;
*)
echo "Скачайте kubectl с https://kubernetes.io/docs/tasks/tools/install-kubectl/"
; ;
esac
}
# Проверка необходимых утилит
echo -e " ${ GREEN } --- Проверка необходимых утилит --- ${ NC } "
TALOSCTL_INSTALLED = false
KUBECTL_INSTALLED = false
if check_command "talosctl" "talosctl" ; then
TALOSCTL_INSTALLED = true
else
if [ [ $( ask_yes_no "Установить talosctl автоматически? (y/n) [y]: " "y" ) = = "y" ] ] ; then
install_talosctl
else
echo -e " ${ YELLOW } Установка talosctl отменена пользователем. Скрипт завершён. ${ NC } "
exit 1
fi
fi
if check_command "kubectl" "kubectl" ; then
KUBECTL_INSTALLED = true
else
if [ [ $( ask_yes_no "Установить kubectl автоматически? (y/n) [y]: " "y" ) = = "y" ] ] ; then
install_kubectl
else
echo -e " ${ YELLOW } Установка kubectl отменена пользователем. Скрипт завершён. ${ NC } "
exit 1
fi
fi
# Если что-то не установлено, предлагаем установить
if [ [ " $TALOSCTL_INSTALLED " = = "false" || " $KUBECTL_INSTALLED " = = "false" ] ] ; then
echo -e " \n ${ YELLOW } Для продолжения необходимо установить недостающие утилиты. ${ NC } "
echo -e " ${ YELLOW } Выполните команды установки выше, затем запустите скрипт снова. ${ NC } "
exit 1
fi
echo -e " \n ${ GREEN } В с е необходимые утилиты установлены!${ NC } \n "
# Helper function for checking uniqueness in an array
contains_element ( ) {
local e match = " $1 "
shift
for e; do [ [ " $e " = = " $match " ] ] && return 0; done
return 1
}
echo -e " ${ GREEN } --- Интерактивный конфигуратор Talos K8s --- ${ NC } "
# --- Вопросы пользователю ---
@@ -283,6 +431,7 @@ if [[ "$USE_DRBD" == "y" ]] && (( WORKER_COUNT == 0 )); then
- name: drbd
parameters:
- usermode_helper=disabled
- name: drbd_transport_tcp
- name: dm-thin-pool
EOF
if [ [ " $USE_ZFS " = = "y" ] ] ; then
@@ -431,6 +580,7 @@ done
# Генерация патчей для worker-нод
if ( ( WORKER_COUNT > 0 ) ) ; then
echo -e " \n ${ GREEN } --- Настройка Worker нод --- ${ NC } "
WORKER_IPS = ( )
for i in $( seq 1 $WORKER_COUNT ) ; do
while true; do
read -p " Введите IP адрес для worker $i (например, 192.168.23.10 ${ i } ): " WORKER_IP
@@ -443,6 +593,7 @@ if (( WORKER_COUNT > 0 )); then
echo -e " ${ YELLOW } Этот IP адрес уже используется. Введите уникальный адрес. ${ NC } "
else
USED_IPS += ( " $WORKER_IP " )
WORKER_IPS += ( " $WORKER_IP " )
break
fi
done
@@ -472,7 +623,34 @@ EOF
- name: drbd
parameters:
- usermode_helper=disabled
- name: drbd_transport_tcp
- name: dm-thin-pool
EOF
if [ [ " $USE_ZFS " = = "y" ] ] ; then
cat >> " $FILENAME " << EOF
- name: zfs
EOF
fi
if [ [ " $USE_SPL " = = "y" ] ] ; then
cat >> " $FILENAME " << EOF
- name: spl
EOF
fi
if [ [ " $USE_VFIO_PCI " = = "y" ] ] ; then
cat >> " $FILENAME " << EOF
- name: vfio_pci
EOF
fi
if [ [ " $USE_VFIO_IOMMU_TYPE1 " = = "y" ] ] ; then
cat >> " $FILENAME " << EOF
- name: vfio_iommu_type1
EOF
fi
if [ [ " $USE_OPENVSWITCH " = = "y" ] ] ; then
cat >> " $FILENAME " << EOF
- name: openvswitch
EOF
fi
fi
echo " Создан файл: $FILENAME "
done
@@ -509,8 +687,9 @@ done
# Применение патчей к worker-нодам
if ( ( WORKER_COUNT > 0 ) ) ; then
for i in $( seq 1 $WORKER_COUNT ) ; do
talosctl machineconfig patch worker.yaml --patch @worker$i .patch --output worker$i .yaml
echo " Создан файл: $CONFIG_DIR / worker $ i .yaml"
WORKER_IP = ${ WORKER_IPS [ $(( i-1)) ] }
talosctl machineconfig patch worker.yaml --patch @worker${ i } .patch --output worker${ i } .yaml
echo " Создан файл: $CONFIG_DIR /worker ${ i } .yaml "
done
fi
@@ -554,5 +733,51 @@ else
echo -e " ${ YELLOW } Файл talosconfig не найден ${ NC } "
fi
# --- Применение конфигов и bootstrap ---
echo -e " \n ${ GREEN } --- Применение конфигов и bootstrap --- ${ NC } "
cd ..
FIRST_CP_IP = ${ CP_IPS [0] }
FIRST_CP_IP_CLEAN = $( echo " $FIRST_CP_IP " | cut -d'/' -f1)
read -p " Применить конфиг на первом control-plane ( $FIRST_CP_IP_CLEAN )? [Enter для продолжения] "
talosctl apply-config --insecure -n $FIRST_CP_IP_CLEAN --file config/cp1.yaml
echo -e " ${ GREEN } Применен конфиг на первом control-plane ( $FIRST_CP_IP_CLEAN ) ${ NC } "
echo -e " ${ YELLOW } -------------------------------------------------- ${ NC } "
echo -e " ${ RED } Обязательно дождитесь ребута и предложения в логе о bootstrap ${ NC } "
echo -e " ${ YELLOW } -------------------------------------------------- ${ NC } "
read -p " Выполнить bootstrap на первом control-plane ( $FIRST_CP_IP_CLEAN )? [Enter для продолжения] "
talosctl bootstrap --nodes $FIRST_CP_IP_CLEAN --endpoints $FIRST_CP_IP_CLEAN --talosconfig= config/talosconfig
echo -e " ${ RED } Выполнен bootstrap на первом control-plane ( $FIRST_CP_IP_CLEAN ) ${ NC } "
echo "Обазятельно дождитесь полного завершения bootstrap"
echo "Остальные ноды можно применять без ожидания"
echo -e " ${ YELLOW } -------------------------------------------------- ${ NC } "
if ( ( CP_COUNT > 1 ) ) ; then
for i in $( seq 2 $CP_COUNT ) ; do
CP_IP_CLEAN = $( echo " ${ CP_IPS [ $(( i-1)) ] } " | cut -d'/' -f1)
read -p " Применить конфиг на control-plane $i ( $CP_IP_CLEAN )? [Enter для продолжения] "
talosctl apply-config --insecure -n $CP_IP_CLEAN --file config/cp${ i } .yaml
done
fi
if ( ( WORKER_COUNT > 0 ) ) ; then
for i in $( seq 1 $WORKER_COUNT ) ; do
WORKER_IP = ${ WORKER_IPS [ $(( i-1)) ] }
read -p " Применить конфиг на worker- $i ( $WORKER_IP )? [Enter для продолжения] "
talosctl apply-config --insecure -n $WORKER_IP --file config/worker${ i } .yaml
done
fi
# Выгрузка kubeconfig
KUBECONFIG_ENDPOINT = ""
if [ [ " $USE_VIP " = = "y" && -n " $VIP_IP " ] ] ; then
KUBECONFIG_ENDPOINT = $VIP_IP
else
KUBECONFIG_ENDPOINT = $FIRST_CP_IP_CLEAN
fi
talosctl kubeconfig ~/.kube/${ CLUSTER_NAME } .yaml --nodes $KUBECONFIG_ENDPOINT --endpoints $KUBECONFIG_ENDPOINT --talosconfig config/talosconfig
echo "Работа скрипта завершена"