kubernetes/脚本/kubernetes.sh
2025-04-22 10:00:14 +08:00

664 lines
14 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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