Centos7.9 使用 Kubeadm 自动化部署 K8S 集群(一个脚本)

文章目录

  • 一、环境准备
    • 1、硬件准备(虚拟主机)
    • 2、操作系统版本
    • 3、硬件配置
    • 4、网络
  • 二、注意点
    • 1、主机命名格式
    • 2、网络插件 flannel 镜像拉取
      • 2.1、主机生成公私钥
      • 2.2、为啥有 Github 还用 Gitee
      • 2.3、将主机公钥添加到 Gitee
        • 2.3.1、复制主机上的公钥
        • 2.3.2、登录码云
        • 2.3.3、设置 --> 安全设置 --> SSH公钥
        • 2.3.4、添加公钥
      • 2.4、将主机公钥添加到 Github
        • 2.4.1、点击头像 --> settings
        • 2.4.2、左侧列表中找到 SSH and GPG keys 点击 New SSH key
    • 3、阿里云的镜像加速地址
      • 3.1、镜像加速器地址
      • 3.2、对应脚本的修改位置
    • 4、运行脚本时需要加入集群的主机都在线
      • 4.1、通过 SSH 配置免密登录
      • 4.2、在 master 节点上执行登录各节点执行加入集群命令
    • 5、输入正确的目标主机名
    • 6、脚本适用性
  • 三、脚本
  • 四、实例演示
    • 1、硬件准备
    • 2、**,启动!
    • 3、创建脚本文件(CV大法)
    • 4、运行脚本
    • 5、判断并关闭完firewalld、selinux、swap 后输入目标主机名
    • 6、master节点将预设的集群列表一个个追加到/etc/hosts文件中,所有节点执行判断逻辑
    • 7、所有节点设置 sysctl 参数,安装 ntpdate 并同步时间
    • 8、安装 wget git curl zsh...(pass)
    • 9、清除原有的 yum 仓库,下载新的仓库文件
    • 10、安装,配置 Docker 、添加 Kubernetes 仓库(pass)
    • 11、输入想要安装的 k8s 版本
    • 12、安装三件套kubelet、kubeadm、kubectl(pass)
    • 13、node节点:克隆镜像仓库
    • 14、加载 Docker 镜像
    • 15、master 节点 kubeadm 初始化好了以后保存 kubeadm join 命令为环境变量、创建 .kube 目录并复制 admin.conf 文件以及设置 KUBECONFIG 环境变量、kubectl 设置命令补全
    • 16、克隆镜像仓库,部署网络插件
    • 17、master 节点配置免密登录
    • 18、通过 SSH 登录 node 节点执行 join 操作
    • 19、每十秒检查集群状态,都为 Ready 即可退出脚本
    • 20、小坑:node节点是需要 admin.conf 文件并且设置 export KUBECONFIG=/etc/kubernetes/admin.conf 环境变量才可以使用kubectl命令操作集群的

一、环境准备

1、硬件准备(虚拟主机)

角色主机名ip地址
masterk8s-master192.168.112.10
nodek8s-node1192.168.112.20
nodek8s-node2192.168.112.30

2、操作系统版本

CentOS Linux release 7.9.2009 (Core)

兼容版本包含7.7~7.9

3、硬件配置

每个虚拟主机都需要至少分配2核CPU、3GB以上内存(2C3G)、硬盘20G(VMware Workstation)

4、网络

  • 需要可以访问外网(ping -c 2 www.baidu.com 测试连通性)
  • 集群中所有节点之间网络互通(可以提前设置,脚本里也有相关逻辑)

二、注意点

1、主机命名格式

hostnamectl set-hostname <node-name>

需要与脚本中预设的集群列表一一对应,ip地址建议使用静态ip(nmtui设置)

# 定义主机名与 IP 地址的映射关系
declare -A hosts=(["k8s-master"]="192.168.112.10"["k8s-node1"]="192.168.112.20"["k8s-node2"]="192.168.112.30"
)

2、网络插件 flannel 镜像拉取

主机需要有公钥私钥并添加公钥到 Gitee 的安装设置中的SSH公钥

2.1、主机生成公私钥

ssh-keygen

一路回车即可在 ~/.ssh/ 目录下发现 id_ras(私钥)以及id_rsa.pub(公钥)

image-20240921234533461

2.2、为啥有 Github 还用 Gitee

  • 一方面考虑到 Github 的网络连接不太稳定可能导致克隆仓库失败(git clone git@something.git)

  • 另一方面就是 Github 对仓库限制单个文件大小为 50MB(除非使用 Git LFS 管理文件),因为有一个镜像文件的大小超过了 50MB

  • 但其实两者都可以使用(测试过了)

# Github 仓库地址
git clone git@github.com:misakivv/flannel-needs.git# Gitee 仓库地址
git clone git@gitee.com:kurosaki01/flannel-needs.git

对应脚本修改

替换为你喜欢使用的

# 克隆 Gitee 仓库echo "克隆 Gitee 仓库..."git clone git@gitee.com:kurosaki01/flannel-needs.git# 检查克隆仓库是否成功
if [ $? -ne 0 ]; thenecho "克隆仓库失败,可能的原因包括:"echo "1. 目标主机没有公钥。"echo "2. 公钥没有正确设置到 Gitee 上。"echo "3. 克隆仓库时发生网络错误。"echo "请检查 SSH 配置和网络连接。"

2.3、将主机公钥添加到 Gitee

2.3.1、复制主机上的公钥
cat ~/.ssh/id_rsa.pub
2.3.2、登录码云
https://gitee.com/
2.3.3、设置 --> 安全设置 --> SSH公钥

image-20240921235701220

image-20240921235907042

2.3.4、添加公钥

标题无所谓

公钥粘贴刚才在主机上复制的内容

每次添加公钥都需要输入账号密码(与 Github 流程一致)

每个节点都需要添加哦,不然部署网络插件时报(ImagePullBackOff)

image-20240922000112559

2.4、将主机公钥添加到 Github

2.4.1、点击头像 --> settings
https://github.com/dashboard

image-20240922000653088

2.4.2、左侧列表中找到 SSH and GPG keys 点击 New SSH key

添加过程与 Gitee 一致,这里不再演示

image-20240922001025463

image-20240922000838773

3、阿里云的镜像加速地址

3.1、镜像加速器地址

这里请在脚本中替换为自己的

https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

image-20240922001317387

3.2、对应脚本的修改位置

# 配置 Docker
echo "配置 Docker..."
cat > /etc/docker/daemon.json <<EOF
{"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://jzjzrggd.mirror.aliyuncs.com","https://dockerproxy.com","https://docker.chenby.cn","https://dockerpull.com","https://dockerhub.jobcher.com","https://docker.mirrors.ustc.edu.cn","https://hub.uuuabc.top","https://mirror.baidubce.com","https://mirror.css.tencentyun.com","https://docker.m.daocloud.io","https://docker.nju.edu.cn","https://hub-mirror.c.163.com","https://dockerhub.azk8s.cn","https://registry.cn-hangzhou.aliyuncs.com"]
}
EOF
systemctl daemon-reload && systemctl restart docker.service
echo "Docker 配置完成。"

4、运行脚本时需要加入集群的主机都在线

因为脚本有两处均需要集群主机在线(开启状态)

4.1、通过 SSH 配置免密登录

# 循环遍历所有节点并复制公钥,排除 master 节点
for node in "${!hosts[@]}"; doif [[ ! $node == *"master"* ]]; thenip="${hosts[$node]}"echo "复制公钥到 $node ($ip)"ssh-copy-id -i ~/.ssh/id_rsa.pub root@$ipelseecho "跳过 master 节点 $node"fi
doneecho "所有非 master 节点的公钥复制完成。"

4.2、在 master 节点上执行登录各节点执行加入集群命令

# 从 hosts 映射中获取所有 worker 节点
for node in "${!hosts[@]}"; doif [[ ! $node == *"-master"* ]]; then# 在 worker 节点上直接执行 join 命令echo "在节点 $node 上执行 join 命令..."ssh root@${hosts[$node]} "$JOIN_COMMAND"fi
done

5、输入正确的目标主机名

主要是这块懒得加逻辑判断了

别三台主机运行脚本还能整出排列组合来:)

这里只要输入的主机名在预设的集群列表中脚本就继续运行了,想要优化的可以自行添加逻辑

# 循环提示用户输入主机名,直到输入正确的主机名
while true; doread -p "请输入目标主机名 (例如: k8s-master/ks8-node1): " hostname# 检查输入的主机名是否存在于映射关系中if [[ -n "${hosts[$hostname]}" ]]; thenbreakelseecho "错误:未知的主机名 '$hostname'。请重新输入。"fi
done

6、脚本适用性

  • 因为选的 docker 作为容器运行时,使用限定了 k8s 集群版本必须 < 1.24.x

  • 想要集群版本大于等于 1.24.x 的自己用换成 containerd吧

# 获取用户输入的 Kubernetes 版本
while true; doread -p "请输入 Kubernetes 版本号(如 1.23.16,建议不超过 1.24.x): " K8S_VERSION# 检查版本号是否符合要求if [[ $K8S_VERSION =~ ^1\.([0-9]{1,2})\..* ]] && ((BASH_REMATCH[1] < 24)); thenbreakelseecho "错误:版本号不符合要求。建议使用 1.23.x 或之前的版本。请重新输入。"fi
done

三、脚本

csnd 直接复制的话后面会跟一些无关紧要的文字,记得删除哦

vim k8s-install.sh
#!/bin/bash# 定义停止并禁用 firewalld 的函数
stop_and_disable_firewalld() {local max_attempts=$1local attempt=0while [ $attempt -lt $max_attempts ]; dosystemctl stop firewalldsystemctl disable firewalldif systemctl is-active --quiet firewalld; thenecho "Attempt $((attempt+1)): firewalld is still active, attempting to stop and disable again."attempt=$((attempt+1))elseecho "firewalld has been successfully disabled and stopped."return 0fidoneecho "firewalld could not be stopped and disabled after $max_attempts attempts."echo "This could be due to:"echo "1. A service or process is preventing firewalld from being stopped."echo "2. There might be a configuration issue with the firewalld service."echo "3. There could be a problem with the system's systemd manager."return 1
}# 主逻辑
check_firewalld_status() {if systemctl is-active --quiet firewalld; thenecho "firewalld is currently active, proceeding to stop and disable."if ! stop_and_disable_firewalld 3; thenecho "Failed to stop and disable firewalld."fielif systemctl is-enabled --quiet firewalld; thenecho "firewalld is not active but is enabled, proceeding to disable."systemctl disable firewalldecho "firewalld has been successfully disabled."elseecho "firewalld is not active and not enabled, no action needed."fi
}# 执行主逻辑
check_firewalld_status# 定义一个函数来检查 SELinux 状态
check_selinux_status() {if getenforce | grep -q "Disabled"; thenecho "SELinux is already disabled."return 0elseecho "SELinux is currently enforcing."return 1fi
}# 定义一个函数来更改 SELinux 配置
disable_selinux() {# 更改配置文件中的 SELinux 状态if sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config; thenecho "SELinux configuration updated in /etc/selinux/config."elseecho "Failed to update SELinux configuration in /etc/selinux/config."return 1fi# 应用更改if setenforce 0; thenecho "SELinux has been temporarily disabled."elseecho "Failed to disable SELinux temporarily."return 1fireturn 0
}# 主逻辑
if check_selinux_status; thenecho "No action required."
elseif disable_selinux; thenecho "SELinux has been disabled."elseecho "Failed to disable SELinux."fi
fi# 临时关闭 swap
echo "临时关闭 swap..."
swapoff -a# 永久关闭 swap (注释掉 /etc/fstab 中的 swap 行)
echo "永久关闭 swap..."
sed -ri 's/.*swap.*/#&/' /etc/fstab# 验证 swap 是否已经被注释掉
echo "验证 swap 是否已经被注释掉..."
cat /etc/fstab | grep swap# 定义主机名与 IP 地址的映射关系
declare -A hosts=(["k8s-master"]="192.168.112.10"["k8s-node1"]="192.168.112.20"["k8s-node2"]="192.168.112.30"
)# 循环提示用户输入主机名,直到输入正确的主机名
while true; doread -p "请输入目标主机名 (例如: k8s-master/ks8-node1): " hostname# 检查输入的主机名是否存在于映射关系中if [[ -n "${hosts[$hostname]}" ]]; thenbreakelseecho "错误:未知的主机名 '$hostname'。请重新输入。"fi
done# 遍历所有主机名与 IP 地址映射关系,并追加到 /etc/hosts 文件中
for node in "${!hosts[@]}"; doip_address=${hosts[$node]}host_line="${ip_address} ${node}"# 检查该行是否已经存在于 /etc/hosts 文件中if ! grep -q "$host_line" /etc/hosts; then
# 如果不存在,则追加到 /etc/hosts 文件中echo "$host_line" >> /etc/hostsecho "已将 '$node' 添加到 /etc/hosts 文件中。"fi
done# 验证用户输入的主机名与对应的 IP 地址是否存在于本地的 /etc/hosts 文件中
ip_address=${hosts[$hostname]}
host_line="${ip_address} ${hostname}"if grep -q "$host_line" /etc/hosts; thenecho "主机名 '$hostname' 与对应的 IP 地址 '$ip_address' 已经存在于本地的 /etc/hosts 文件中。"
elseecho "主机名 '$hostname' 与对应的 IP 地址 '$ip_address' 未能在本地的 /etc/hosts 文件中找到,请检查。"
fi# 设置 sysctl 参数
echo "设置 sysctl 参数..."
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
echo "sysctl 参数设置完成。"# 安装 ntpdate 并同步时间
echo "安装 ntpdate 并同步时间..."
yum install -y ntpdate
ntpdate time.windows.com
echo "时间同步完成。"# 安装 wget
echo "安装 wget git curl zsh..."
yum install -y wget.x86_64 git curl zsh
echo "wget 安装完成。"# 清除原有的 yum 仓库
echo "清除原有的 yum 仓库..."
rm -rf /etc/yum.repos.d/*
echo "原有仓库清除完成。"# 下载新的仓库文件
echo "下载新的仓库文件..."
wget -O /etc/yum.repos.d/centos7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
echo "新的仓库文件下载完成。"# 安装 Docker
echo "安装 Docker..."
yum install docker-ce -y
systemctl start docker && systemctl enable docker
echo "Docker 安装并启动完成。"# 配置 Docker
echo "配置 Docker..."
cat > /etc/docker/daemon.json <<EOF
{"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://jzjzrggd.mirror.aliyuncs.com","https://dockerproxy.com","https://docker.chenby.cn","https://dockerpull.com","https://dockerhub.jobcher.com","https://docker.mirrors.ustc.edu.cn","https://hub.uuuabc.top","https://mirror.baidubce.com","https://mirror.css.tencentyun.com","https://docker.m.daocloud.io","https://docker.nju.edu.cn","https://hub-mirror.c.163.com","https://dockerhub.azk8s.cn","https://registry.cn-hangzhou.aliyuncs.com"]
}
EOF
systemctl daemon-reload && systemctl restart docker.service
echo "Docker 配置完成。"# 添加 Kubernetes 仓库
echo "添加 Kubernetes 仓库..."
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
echo "Kubernetes 仓库添加完成。"# 获取用户输入的 Kubernetes 版本
while true; doread -p "请输入 Kubernetes 版本号(如 1.23.16,建议不超过 1.24.x): " K8S_VERSION# 检查版本号是否符合要求if [[ $K8S_VERSION =~ ^1\.([0-9]{1,2})\..* ]] && ((BASH_REMATCH[1] < 24)); thenbreakelseecho "错误:版本号不符合要求。建议使用 1.23.x 或之前的版本。请重新输入。"fi
done# 安装指定版本的 Kubernetes 组件
echo "安装指定版本的 Kubernetes 组件..."
yum install kubelet-$K8S_VERSION kubeadm-$K8S_VERSION kubectl-$K8S_VERSION -y# 启动并启用 kubelet 服务
echo "启动并启用 kubelet 服务..."
systemctl enable kubelet  && systemctl start kubelet# 检查 kubelet 是否成功启动
if systemctl is-active --quiet kubelet; thenecho "Kubernetes 组件安装并启动完成。"
elseecho "错误:kubelet 服务未能成功启动。请检查安装过程是否有误。"
fi# 判断是否为 master 节点
if [[ $hostname == *"-master"* ]]; thenecho "检测到当前节点为主节点 '$hostname',执行 kubeadm 初始化..."# 动态填充 kubeadm init 命令中的参数kubeadm init \--apiserver-advertise-address=$ip_address \--image-repository registry.aliyuncs.com/google_containers \--kubernetes-version v$K8S_VERSION \--control-plane-endpoint $hostname \--service-cidr=172.16.0.0/16 \--pod-network-cidr=10.244.0.0/16# 输出 kubeadm join 命令并保存到变量中JOIN_COMMAND=$(kubeadm token create --print-join-command)
# 输出提示信息echo "kubeadm 初始化完成,请记录以下 join 命令:"echo "$JOIN_COMMAND"# 创建 .kube 目录并复制 admin.conf 文件mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config# 设置 KUBECONFIG 环境变量export KUBECONFIG=/etc/kubernetes/admin.conf# 输出提示信息echo "为了开始使用您的集群,请执行以下命令:"echo "source <(kubectl completion bash)"# 克隆 Gitee 仓库echo "克隆 Gitee 仓库..."git clone git@gitee.com:kurosaki01/flannel-needs.git# 检查克隆仓库是否成功
if [ $? -ne 0 ]; thenecho "克隆仓库失败,可能的原因包括:"echo "1. 目标主机没有公钥。"echo "2. 公钥没有正确设置到 Gitee 上。"echo "3. 克隆仓库时发生网络错误。"echo "请检查 SSH 配置和网络连接。"
else# 进入克隆的仓库目录echo "进入 flannel-needs 目录..."cd flannel-needs || {echo "进入 flannel-needs 目录失败,可能的原因包括:"echo "1. 克隆仓库未成功创建目录。"echo "2. 当前目录不存在 flannel-needs 子目录。"echo "请检查克隆仓库是否成功。"}
fi# 加载 Docker 镜像echo "加载 Docker 镜像..."docker load -i lizhenliang-flannel-v0.11.0-amd64.tardocker load -i ranche-mirrored-flannelcni-flannel-cni-plugin.tar# 应用 Flannel 配置echo "应用 Flannel 配置..."kubectl apply -f flannel.yaml# 输出提示信息echo "Flannel 配置已应用,网络插件已准备好。"# 循环遍历所有节点并复制公钥,排除 master 节点
for node in "${!hosts[@]}"; doif [[ ! $node == *"master"* ]]; thenip="${hosts[$node]}"echo "复制公钥到 $node ($ip)"ssh-copy-id -i ~/.ssh/id_rsa.pub root@$ipelseecho "跳过 master 节点 $node"fi
doneecho "所有非 master 节点的公钥复制完成。"# 从 hosts 映射中获取所有 worker 节点
for node in "${!hosts[@]}"; doif [[ ! $node == *"-master"* ]]; then# 在 worker 节点上直接执行 join 命令echo "在节点 $node 上执行 join 命令..."ssh root@${hosts[$node]} "$JOIN_COMMAND"fi
done# 从预设的集群列表中获取预期的节点数量
EXPECTED_COUNT=${#hosts[@]}# 获取当前已加入集群的节点数量
CURRENT_COUNT=$(kubectl get nodes | grep -v NAME | wc -l)# 获取当前已加入集群的节点名称
CURRENT_NODES=$(kubectl get nodes | awk 'NR>1{print $1}')# 循环检查直到所有预期的节点都已加入集群并且状态为 Ready
while [ $CURRENT_COUNT -ne $EXPECTED_COUNT ]; doecho "当前已加入集群的节点数量 ($CURRENT_COUNT) 与预期数量 ($EXPECTED_COUNT) 不匹配,请等待..."sleep 10  # 等待10秒后再次检查CURRENT_COUNT=$(kubectl get nodes | grep -v NAME | wc -l)CURRENT_NODES=$(kubectl get nodes | awk 'NR>1{print $1}')
done# 检查所有节点的状态是否为 Ready=True
while true; doNODES_STATUS=$(kubectl get nodes -o jsonpath='{range .items[*]}{.status.conditions[-1:].type}{"="}{.status.conditions[-1:].status}{"\n"}{end}')# 使用数组存储每个节点的状态IFS=$'\n' read -d '' -r -a nodeStatusArray <<< "$NODES_STATUS"# 标记所有节点是否都 ReadyallReady=truefor status in "${nodeStatusArray[@]}"; doif [[ $status != "Ready=True" ]]; thenallReady=falsebreakfidoneif $allReady; thenecho "所有节点的状态均为 Ready,集群安装成功。"breakelseecho "集群中有节点状态不是 Ready,请等待..."sleep 10  # 等待10秒后再次检查fi
done# 输出当前集群节点状态
echo "检查集群节点状态..."
kubectl get nodeselseecho "检测到当前节点为 worker 节点 '$hostname',执行命令..."# "检测到当前节点为 worker 节点 '$hostname',执行命令..."# 克隆 Gitee 仓库echo "克隆 Gitee 仓库..."git clone git@gitee.com:kurosaki01/flannel-needs.git# 检查克隆仓库是否成功
if [ $? -ne 0 ]; thenecho "克隆仓库失败,可能的原因包括:"echo "1. 目标主机没有公钥。"echo "2. 公钥没有正确设置到 Gitee 上。"echo "3. 克隆仓库时发生网络错误。"echo "请检查 SSH 配置和网络连接。"else# 进入克隆的仓库目录echo "进入 flannel-needs 目录..."cd flannel-needs || {echo "进入 flannel-needs 目录失败,可能的原因包括:"echo "1. 克隆仓库未成功创建目录。"echo "2. 当前目录不存在 flannel-needs 子目录。"echo "请检查克隆仓库是否成功。"}
fi# 加载 Docker 镜像echo "加载 Docker 镜像..."docker load -i lizhenliang-flannel-v0.11.0-amd64.tardocker load -i ranche-mirrored-flannelcni-flannel-cni-plugin.tar# 输出提示信息echo "Docker 镜像已加载,worker 节点准备完毕。"# 提示用户在 master 节点上检查集群状态echo "请在 master 节点上执行 'kubectl get nodes' 来检查集群状态。"
fi

四、实例演示

1、硬件准备

image-20240922004359969image-20240922004425278image-20240922004452023

2、**,启动!

hostnamectl set-hostname <hostname>bashhostname
image-20240922004845284image-20240922004820629image-20240922004757656

3、创建脚本文件(CV大法)

vim k8s-install.sh

4、运行脚本

bash k8s-install.sh

5、判断并关闭完firewalld、selinux、swap 后输入目标主机名

输入 k8s-master
image-20240922005551225
输入 k8s-node1
image-20240922005608245
输入 k8s-node2
image-20240922005642113

6、master节点将预设的集群列表一个个追加到/etc/hosts文件中,所有节点执行判断逻辑

image-20240922010253406
image-20240922010401758
image-20240922010422813

7、所有节点设置 sysctl 参数,安装 ntpdate 并同步时间

image-20240922010546964
image-20240922010623422
image-20240922010654943

8、安装 wget git curl zsh…(pass)

不截图,太长了

9、清除原有的 yum 仓库,下载新的仓库文件

当然了,涉及到 rm 删除操作可以添加备份的逻辑

我就懒得搞(快照)

image-20240922011245695
image-20240922011327439
image-20240922011357208

10、安装,配置 Docker 、添加 Kubernetes 仓库(pass)

硬编码一般没什么问题

11、输入想要安装的 k8s 版本

此脚本只适用 k8s < 1.24.0 版本的

想要高版本自行修改脚本

image-20240922012214265
image-20240922012335232
image-20240922012304908

12、安装三件套kubelet、kubeadm、kubectl(pass)

13、node节点:克隆镜像仓库

输入 yes
image-20240922013615991
输入 yes
image-20240922013637960

14、加载 Docker 镜像

k8s-node1: 我滴使命完成啦
image-20240922015311806
k8s-node2: 我滴使命也完成啦
image-20240922015423351

15、master 节点 kubeadm 初始化好了以后保存 kubeadm join 命令为环境变量、创建 .kube 目录并复制 admin.conf 文件以及设置 KUBECONFIG 环境变量、kubectl 设置命令补全

image-20240922020036634

16、克隆镜像仓库,部署网络插件

image-20240922020133551

17、master 节点配置免密登录

需要输入 k8s-node1、k8s-node2 的登录密码

image-20240922020511525

18、通过 SSH 登录 node 节点执行 join 操作

k8s-master:done

image-20240922020315496

19、每十秒检查集群状态,都为 Ready 即可退出脚本

image-20240922020813978

20、小坑:node节点是需要 admin.conf 文件并且设置 export KUBECONFIG=/etc/kubernetes/admin.conf 环境变量才可以使用kubectl命令操作集群的

解决办法详见这篇:centos7.9部署k8s的几种方式

image-20240922021302739

想优化脚本的自己优化吧,我后续会把坑补上并且加上花里胡哨的 oh-my-zsh + p10k

毕竟这脚本写的还是比较拉的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/430124.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

< 微积分Calculus >

微积分 微分是把整体分拆为小部分来求它怎样改变 积分是把小部分连接在一起来求整体有多大&#xff0c;可以用来求面积、体积、中点和很多其他有用的东西。 lim极限 函数f(x) -> Q(x) y&#xff1a;x变量&#xff0c;f函数&#xff0c;Q(x)函数体&#xff08;多项式&am…

【Paper Reading】结合 NanoFlow 研究,优化大语言模型服务效率的探索

作者 王伟 PAI引擎团队 近年来&#xff0c;人工智能领域的快速发展推动了大型语言模型的广泛应用&#xff0c;随之而来的是对其服务效率的迫切需求。论文《NanoFlow&#xff1a;Towards Optimal Large Language Model Serving Throughput》提出了一种突破性的新型服务框架&…

CTF 技能树 LOG -GIT泄露 笔记

log 使用虚拟机kali操作 python2 安装 apt-get install python2 进入root用户&#xff0c;下载克隆git hack库 git clone https://github.com/BugScanTeam/GitHack sudo passwd root 修改root 命名密码为root 切换登录 su root 终端进入home/kali/GitHack/ python GitH…

2024年 AI大模型我该买一张什么卡?

有钱啥也不用说&#xff0c;买张最贵的就是了。对囊中羞涩的我还说&#xff0c;我该买张什么样的显卡呢&#xff1f; 我的旧显卡RTX1060 6G&#xff0c;满负荷消耗功率110多瓦&#xff0c;几乎达到设计最大TDP&#xff0c;周日时拿了朋友的RTX3060Ti 8G&#xff0c;发现是锁算…

【中国留学网-注册_登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

手机在网状态查询接口如何用C#进行调用?

一、什么是手机在网状态查询接口&#xff1f; 手机在网状态查询接口是利用实时数据来对手机号码在运营商网络中的状态进行查询的工具&#xff0c;包括正常使用状态、停机状态、不在网状态、预销户状态等。 二、手机在网状态查询适用哪些场景&#xff1f; 例如&#xff1a;商…

Android RecyclerView 实现 GridView ,并实现点击效果及方向位置的显示

效果图 一、引入 implementation com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30 二、使用步骤 1.Adapter public class UnAdapter extends BaseQuickAdapter<UnBean.ResultBean, BaseViewHolder> {private int selectedPosition RecyclerView.NO_POSITIO…

51单片机——LED灯篇

一、LED与单片机P2管脚相连 二、点亮一个LED灯 #include <STC89C5xRC.H> void main() { P2 0xFE; //1111 1110 } P2有8个管脚&#xff0c;对应8个二进制位。 LED灯右侧接电源是正极&#xff08;1&#xff09;&#xff0c;左侧给负极&#xff08;0&#xff09;即可…

C++学习指南(六)----list

欢迎来到繁星的CSDN。本期内容主要包括&#xff0c;list的介绍、使用以及与vector的优缺点。 一、什么是list 在先前的C语言学习中&#xff0c;我们接触到了顺序表和链表&#xff0c;而在C中&#xff0c;这正好对应了vector&#xff08;动态增长顺序表&#xff09;和l…

linux第三课(linux中安装nginx与redis及SpringBoot集成redis)

目录 一.nginx引入 二.关于nginx 1.什么是nginx 2.nginx的特点 3.在nginx中安装nginx 三.关于redis 1.背景引入 2.什么是redis 3.redis的特点 4.在linux下的docker中安装redis 四.redis中的数据结构 (1)String(字符串) (2)Hash (3)list(列表) (5)zset(sorted se…

Python模拟鼠标轨迹[Python]

一.鼠标轨迹模拟简介 传统的鼠标轨迹模拟依赖于简单的数学模型&#xff0c;如直线或曲线路径。然而&#xff0c;这种方法难以捕捉到人类操作的复杂性和多样性。AI大模型的出现&#xff0c;能够通过深度学习技术&#xff0c;学习并模拟更自然的鼠标移动行为。 二.鼠标轨迹算法实…

博睿谷IT认证-订阅试学习

在这个信息爆炸的时代&#xff0c;拥有一张IT认证证书&#xff0c;就像拿到了职场晋升的通行证。博睿谷&#xff0c;作为IT认证培训的佼佼者&#xff0c;帮你轻松拿下华为、Oracle等热门认证。下面&#xff0c;让我们一起看看博睿谷如何助你一臂之力。 学习时间&#xff0c;你说…

C++入门基础知识82(实例)——实例7【 判断一个数是奇数还是偶数】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C 实例 【判断一个数是奇数还是偶数】相…

java重点学习-总结

十五 总结 https://kdocs.cn/l/crbMWc8xEZda &#xff08;总结全部的精华&#xff09; 1.面试准备 企业筛选简历规则简历编写注意事项(亮点)项目怎么找&#xff0c;学习到什么程度面试过程(表达结构、什么样的心态去找工作) 2.redis 缓存相关(缓存击穿、穿透、雪崩、缓存过期淘…

传输层协议 —— TCP协议(上篇)

目录 1.认识TCP 2.TCP协议段格式 3.可靠性保证的机制 确认应答机制 超时重传机制 连接管理机制 三次握手 四次挥手 1.认识TCP 在网络通信模型中&#xff0c;传输层有两个经典的协议&#xff0c;分别是UDP协议和TCP协议。其中TCP协议全称为传输控制协议&#xff08;Tra…

远程升级频频失败?你可能忽略了模组差分包…

去年开发的一个项目产品&#xff0c;用的是合宙4G-Cat.1低功耗模块Air780E。 最近有客户反馈在乡村里频繁出现掉线的情况。通过换货、换SIM卡对比排查测试&#xff0c;发现只有去年5月22号采购的那批模块在客户环境附近会出现掉线的情况&#xff0c;而今年4月份采购的模块批次…

【Go】Go 环境下载与安装教程(Windows系统)

引言 Go&#xff0c;也被称为Golang&#xff0c;是一种静态类型&#xff0c;编译型的编程语言&#xff0c;由Google设计和开发。Go语言的设计目标是“解决软件开发中的一些问题”&#xff0c;特别是在大规模软件系统的构建和维护方面。 下载安装包 打开官网下载页面&#xff…

03 添加并发请求

03 添加并发请求 我们通过两种方式演示发起多个请求&#xff1a; 使用 async 和 await 方式使用 Promise.all() 方式 首先使用async 和 await 方式发送请求&#xff0c;使用 async 和 await 能够控制异步任务以同步的流程执行&#xff0c;代码如下&#xff0c;这时候就会产生…

Git 提交规范

一、Git 提交规范的基本格式 通常&#xff0c;Git 提交信息采用以下格式&#xff1a; <type>: <subject><body><footer>type&#xff08;提交类型&#xff09;&#xff1a;用于说明提交的性质&#xff0c;常见的类型有以下几种&#xff1a; feat&…

仓颉编程语言4,遇到BUG求助

本来准备整仓颉链接Mysql数据库。参考&#xff1a;GitCode - 全球开发者的开源社区,开源代码托管平台 这种方式是拿mysql官方的dll&#xff0c;编译一下&#xff0c;然后再封装成仓颉数据库驱动。这种方式不够逼格&#xff0c;所以准备解析mysql网络协议&#xff0c;从0开始写…