#!/bin/bash menu() { echo "=========================" echo "= 菜单 =" echo "=========================" echo "= 1. 主机名解析 =" echo "= 2. 环境配置 =" echo "= 3. 安装docker =" echo "= 4. 安装kubernetes =" echo "= 5. 导入镜像 =" echo "= 6. master节点 =" echo "= 7. node节点 =" echo "= 8. 退出 =" echo "=========================" } menu_first() { echo "=========================" echo "= 主机解析 =" echo "=========================" echo "= 1. 查看主机名 =" echo "= 2. 设置主机名 =" echo "= 3. 查看解析文件 =" echo "= 4. 主机解析 =" echo "= 5. 删除特定行 =" echo "= 6. 退出 =" echo "=========================" } first_option() { while true; do menu_first read -p "请输入选项:" i case $i in 1) host=`hostname` echo "主机名为 $host" ;; 2) read -p "输入主机名:" host hostnamectl set-hostname $host if [ $? -eq 0 ]; then echo "设置主机名成功!" new_host=`hostname` echo "主机名为 $new_host" else echo "设置主机名失败!" fi ;; 3) cat /etc/hosts echo ;; 4) while true; do read -p "输入格式:IP 主机名(输入e退出):" host if [[ $host == "e" ]]; then echo "退出成功!" break fi arr=($host) if [[ ${#arr[@]} -ne 2 ]]; then echo "输入格式不符合,必须包含IP和主机名。" continue fi ip="${arr[0]}" hostname="${arr[1]}" ip_regex='^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])$' if [[ ! $ip =~ $ip_regex ]]; then echo "IP地址格式无效" continue fi hostname_regex='^[a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$' if [[ ! $hostname =~ $hostname_regex ]]; then echo "主机名格式无效(允许字母、数字、连字符,不以连字符开头/结尾,最长63字符)。" continue fi echo "$ip $hostname" >> /etc/hosts echo "添加成功:$ip $hostname" done ;; 5) read -p "输入要删除的主机解析:" host escaped_host=$(sed -e 's/[][\.^*$]/\\&/g' <<< "$host") if grep -q "$escaped_host" /etc/hosts; then sed -i "/$escaped_host/d" /etc/hosts echo "删除成功!" else echo "未找到匹配的主机解析!" fi ;; 6) break ;; *) echo "无效的选项,请重新输入!" ;; esac done } menu_second() { echo "=========================" echo "= 环境配置 =" echo "=========================" echo "= 1. 查看firewalld状态 =" echo "= 2. 启动firewalld =" echo "= 3. 关闭firewalld =" echo "= 4. 开机启动firewalld =" echo "= 5. 开机关闭firewalld =" echo "= 6. 查看selinux状态 =" echo "= 7. 开启selinux =" echo "= 8. 关闭selinux =" echo "= 9. 开机启动selinux =" echo "= 10. 开机关闭selinux =" echo "= 11. 禁用swap分区 =" echo "= 12. 开机禁用swap分区 =" echo "= 13. 加载内核 =" echo "= 14. 退出 =" echo "=========================" } second_option() { while true; do menu_second read -p "请选择选项:" i case $i in 1) status=$(systemctl is-active firewalld) enabled=$(systemctl is-enabled firewalld) if [ "$status" == "active" ]; then echo "firewalld 当前状态:已启动!" else echo "firewalld 当前状态:未启动!" fi if [ "$enabled" == "enabled" ]; then echo "firewalld 是否开机启动:是" else echo "firewalld 是否开机启动:否" fi ;; 2) systemctl start firewalld if [ $? -eq 0 ]; then echo "启动成功!" else echo "启动失败!" fi ;; 3) systemctl stop firewalld if [ $? -eq 0 ]; then echo "关闭成功!" else echo "关闭失败!" fi ;; 4) systemctl enable firewalld if [ $? -eq 0 ]; then echo "永久启动成功!" else echo "永久启动失败!" fi ;; 5) systemctl disable firewalld if [ $? -eq 0 ]; then echo "永久关闭成功!" else echo "永久关闭失败!" fi ;; 6) state=`getenforce` if [[ $state == "Enforcing" ]]; then echo "selinux的状态为已启动!" else echo "selinux的状态为已关闭!" fi ;; 7) setenforce 1 if [ $? -eq 0 ]; then echo "selinux启动成功!" else echo "selinux启动失败!需要重启才能启动" fi ;; 8) setenforce 0 if [ $? -eq 0]; then echo "selinux关闭成功!" else echo "selinux关闭失败!" fi ;; 9) sed -i '/^SELINUX=/c SELINUX=enforcing/' /etc/selinux/config if [ $? -eq 0]; then echo "永久启动selinux成功!" else echo "永久启动selinux失败!" fi ;; 10) sed -i '/^SELINUX=/c SELINUX=disabled/' /etc/selinux/config if [ $? -eq 0 ]; then echo "永久关闭selinux成功!" else echo "永久关闭selinux失败!" fi ;; 11) swapoff -a if [ $? -eq 0 ]; then echo "禁用swap分区成功!" else echo "禁用swap分区失败!" fi ;; 12) sed -i 's/.*swap.*/#&/' /etc/fstab if [ $? -eq 0 ]; then echo "永久禁用swap分区成功!" else echo "永久禁用swap分区失败!" fi ;; 13) modprobe br_netfilter echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf echo "vm.swappiness=0" >> /etc/sysctl.conf echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p ;; 14) echo "退出成功!" break ;; *) echo "无效的选择,请重新输入!" ;; esac done } menu_third() { echo "=========================" echo "= docker管理 =" echo "=========================" echo "= 1. 安装docker =" echo "= 2. 配置容器加速 =" echo "= 3. 启动docker =" echo "= 4. 关闭docker =" echo "= 5. 开机启动docker =" echo "= 6. 开机关闭docker =" echo "= 7. 重启docker =" echo "= 8. 清空 =" echo "= 9. 退出 =" echo "=========================" } third_option(){ while true; do menu_third read -p "请选择选项:" i case $i in 1) yum install -y yum-utils >/dev/null yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo >/dev/null yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y >/dev/null ;; 2) echo '{ "max-concurrent-downloads": 10, "max-concurrent-uploads": 5, "default-shm-size": "1G", "debug": true, "experimental": false, "registry-mirrors": [ "https://x9r52uz5.mirror.aliyuncs.com", "https://dockerhub.icu", "https://docker.chenby.cn", "https://docker.1panel.live", "https://docker.awsl9527.cn", "https://docker.anyhub.us.kg", "https://dhub.kubesre.xyz" ] }' > /etc/docker/daemon.json systemctl daemon-reload ;; 3) systemctl start docker if [ $? -eq 0 ]; then echo "启动docker成功!" else echo "启动docker失败!" fi ;; 4) systemctl stop docker if [ $? -eq 0 ]; then echo "关闭docker成功!" else echo "关闭docker失败!" fi ;; 5) systemctl enable docker &> /dev/null if [ $? -eq 0 ]; then echo "开机启动docker成功!" else echo "开机启动docker失败!" fi ;; 6) systemctl disable docker &> /dev/null if [ $? -eq 0 ]; then echo "开机关闭docker成功!" else echo "开机关闭docker失败!" fi ;; 7) systemctl restart docker if [ $? -eq 0 ]; then echo "docker重启成功!" else echo "docker重启失败" fi ;; 8) clear ;; 9) echo "退出成功!" break ;; *) echo "无效的选择,请重新输入!" ;; esac done } menu_fourth() { echo "=========================" echo "= kubernetes 安装 =" echo "=========================" echo "= 1. 配置yum仓库 =" echo "= 2. 安装 =" echo "= 3. 配置cgroups =" echo "= 4. 开机启动 =" echo "= 5. 清空 =" echo "= 6. 退出 =" echo "=========================" } fourth_option() { while true; do menu_fourth read -p "请选择选项:" i case $i in 1) echo "[kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg" > /etc/yum.repos.d/kubernetes.repo ;; 2) yum -y install kubeadm-1.23.5 kubelet-1.23.5 kubectl-1.23.5 ipvsadm >/dev/null ;; 3) echo 'KUBELET_EXTRA_ARGS="--cgroup-driver=cgroupfs --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1"' > /etc/sysconfig/kubelet ;; 4) systemctl enable kubelet &> /dev/null if [ $? -eq 0 ]; then echo "开机启动成功!" else echo "开机启动失败!" fi ;; 5) clear ;; 6) echo "推出成功!" break ;; *) echo "无效的选择,请重新输入!" ;; esac done } menu_fifth() { echo "=========================" echo "= 镜像导入 =" echo "=========================" echo "= 1. 导入镜像文件 =" echo "= 2. 加载镜像 =" echo "= 3. 查看镜像 =" echo "= 4. 清空 =" echo "= 5. 退出 =" echo "=========================" } fifth_option() { while true; do menu_fifth read -p "请选择选项:" i case $i in 1) yum -y install lrzsz mkdir /mnt/docker-image && cd /mnt/docker-image pwd rz ;; 2) tar_dir="/mnt/docker-image" tar_files=("$tar_dir"/*.tar) if [ ${#tar_files[@]} -eq 0 ]; then echo "在 $tar_dir 中未找到任何.tar文件" exit 0 fi ERRORS=0 for file in "${tar_files[@]}"; do docker load < $file >/dev/null if [ $? -eq 0 ]; then echo "加载 $file 镜像成功!" else echo "加载 $file 镜像失败!" ((ERRORS++)) fi done if [ $ERRORS -ne 0 ]; then echo "警告:有 $ERRORS 个文件加载失败" >&2 else echo "所有镜像已成功加载" fi ;; 3) docker images ;; 4) clear ;; 5) echo "推出成功!" break ;; *) echo "无效的选择,请重新输入!" ;; esac done } menu_sixth() { echo "=========================" echo "= master节点管理 =" echo "=========================" echo "= 1. 初始化 =" echo "= 2. 查看集群状态 =" echo "= 3. 清空 =" echo "= 4. 退出 =" echo "=========================" } sixth_option() { while true; do menu_sixth read -p "请选择选项:" i case $i in 1) while true; do read -p "输入master的ip地址:" ip ip_regex='^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])$' if [[ ! $ip =~ $ip_regex ]]; then echo "IP地址格式无效" continue fi mkdir /mnt/master kubeadm init --kubernetes-version=1.23.5 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=$ip > /mnt/master/init_info 2>> /mnt/master/error_info if [ $? -eq 0 ]; then echo "初始化成功!" mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config export KUBECONFIG=/etc/kubernetes/admin.conf kubectl apply -f /mnt/docker-image/kube-flannel-2402.yml > /mnt/master/flannel_info else echo "初始化失败!" fi break done ;; 2) kubectl get nodes ;; 3) clear ;; 4) echo "退出成功!" break ;; *) echo "无效的选择,请重新输入!" ;; esac done } menu_seventh() { echo "=========================" echo "= node节点管理 =" echo "=========================" echo "= 1. 获取初始化信息文件 =" echo "= 2. 加入集群 =" echo "= 3. 清空 =" echo "= 4. 退出 " echo "=========================" } seventh_option() { while true; do menu_seventh read -p "请选择选项:" i case $i in 1) rpm -q expect &> /dev/null if [ $? -ne 0 ]; then yum -y install expect tcl tclx tcl-devel &> /dev/null fi while true; do read -p "输入master的ip地址:" ip ip_regex='^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])$' if [[ ! $ip =~ $ip_regex ]]; then echo "IP地址格式无效" continue else break fi done stty -echo read -p "输入密码:" password stty echo echo /usr/bin/expect <<-EOF >/dev/null 2>&1 set timeout 10 log_user 0 spawn scp $ip:/mnt/master/init_info /mnt/ expect { "yes/no" { send "yes\n"; exp_continue } "password:" {send "$password\n"} } expect eof EOF if [ $? -eq 0 ]; then echo "输出成功!" else echo "输出失败!" fi ;; 2) file="/mnt/init_info" ip=`awk '/kubeadm join/ {print $3}' $file` token=$(grep -oP -- '--token \K\S+' "$file") cert_hash=$(grep -oP -- '--discovery-token-ca-cert-hash \K\S+' "$file") kubeadm join $ip --token $token --discovery-token-ca-cert-hash $cert_hash >/dev/null if [ $? -eq 0 ]; then echo "加入集群成功!" else echo "加入集群失败!" fi ;; 3) clear ;; 4) echo "退出成功!" break ;; *) echo "无效的选择,请重新输入!" ;; esac done } while true; do menu read -p "请选择选项:" i case $i in 1) first_option ;; 2) second_option ;; 3) third_option ;; 4) fourth_option ;; 5) fifth_option ;; 6) sixth_option ;; 7) seventh_option ;; 8) echo "退出成功!" exit ;; *) echo "无效的选择,请重新输入!" ;; esac done