diff --git a/kubernetes.sh b/kubernetes.sh new file mode 100644 index 0000000..4f42f1f --- /dev/null +++ b/kubernetes.sh @@ -0,0 +1,663 @@ +#!/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