基于Kubeadm部署kubernetes1.26.9高可用集群

——————选用containerd作为容器运行时

    ——————选用keda对HPA指标数据进行扩展

一、背景

Kubernetes社区在2020年7月就开始着手移除dockershim,这将意味着kubernetes不再将docker作为默认的底层容器工具,Docker和其他容器运行时将一视同仁,不会单独对待,进行内置支持,如果还想直接使用Docker这种容器运行时,可以将dockershim的功能单独提取出来单独维护一个cri-dockerd,或者docker官方社区将CRI接口内置到Dockerd中去实现。

Containerd自1.1版本就内置实现了CRI,而作为调用Containerd的docker也没必要去单独再内置CRI,在kubernetes1.24版本之后,由于不再支持开箱即用的Docker,最好的方式就是直接使用Containerd这种容器运行时,而且该容器运行时也已经经过生产环境实践,基于此背景,遂以Containerd作为底层容器运行时部署kubernetes。

二、kubernetes1.26.9高可用集群部署

2.1环境介绍

两台主机,信息如下:

主机名

Ip

系统信息

Master1

192.168.102.6

Kylin.v10_x86_64

Master2

192.168.102.7

Kylin.v10_x86_64

Master3

192.168.102.8

Kylin.v10_x86_64

Worker

192.168.102.9

Kylin.v10_x86_64

软件版本如下:

名称

版本号

Containerd

1.6.24

Kubernetes

1.6.29

Keda

2.11.2

Metricserer

v0.6.4

高可用虚拟ip:

VIP

192.168.102.123

经查阅kubernetes和containerd官网,系统内核版本至少为4.x版本;且runc命令所依赖的libseccomp版本最好是2.5.1版本(经测试,centos自带的2.3.1版本和kylin_v10自带的2.4.3版本都无法支持runc -v命令——报错:seccomp_notify_respond)

本文基于keepalived和haproxy实现k8s集群高可用!

2.2基础配置(所有主机都执行)

2.2.1 yum仓库配置

#由于搭建环境无法接通外网,所以配置为私有yum源

Vim /etc/yum.repos.d/kylin_x86_64.rep

[ks10-adv-cdrom]

name = ks10-adv-cdrom

baseurl = http://192.168.102.1/kylin-v10/Packages  #yum仓库地址

gpgcheck = 0

enabled = 1

#如为外网环境,可配置阿里yum源

2.2.2 修改主机名

#修改主机名称,容器识别

hostnamectl  set-hostname master1   #192.168.102.6主机执行

hostnamectl  set-hostname master2   #192.168.102.7主机执行

hostnamectl  set-hostname master3   #192.168.102.8主机执行

hostnamectl  set-hostname worker   #192.168.102.9主机执行

2.2.3 配置NTP服务

Yum -y install chrony ntpdate

vim /etc/chrony.conf

#修改为如下图配置

Systemctl enable chronyd && systemctl start chronyd

2.2.3 关闭selinux及firewalld

sed -I ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config

systemctl disable firewalld

systemctl stop firewalld

2.2.3 关闭swap

Kubernetes1.8开始要求关闭系统的swap,如果不关闭,默认配置下kubelet将无法启动

#关闭swap

swapoff -a

#注释掉swap挂载,如下图所示:

vim /etc/fstab

free -m #结果确保swap输出全为0

2.3导入containerd所需模块(所有主机都执行)

vim /etc/modules-load.d/containerd.conf

overlay

br_netfilter

#执行如下命令

modprobe overlay

modprobe br_netfilter

2.4配置内核参数(所有主机都执行)

vim /etc/sysctl.d/99-sysctl.conf #亦可以在/etc/sysctl.d/新建文件输入如下内容

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1

user.max_user_namespaces=28633

vm.swappiness = 0

vm.overcommit_memory = 0  #检查物理内存是否够用

vm.panic_on_oom=0 #开启oom

fs.inotify.max_user_instances = 512

fs.inotify.max_user_watches = 1280000

sysctl  -p   /etc/sysctl.d/99-sysctl.conf

2.5配置支持IPVS转发(所有主机都执行)

由于ipvs已经加入内核的主干,所以kube-proxy开启ipvs的前提需要加载一些内核模块.

vim  /etc/sysconfig/modules/ipvs.modules

#!/bin/bash

modprobe -- ip_vs

modprobe -- ip_vs_rr

modprobe -- ip_vs_wrr

modprobe -- ip_vs_sh

modprobe -- nf_conntrack

chmod 755 /etc/sysconfig/modules/ipvs.modules

bash /etc/sysconfig/modules/ipvs.modules

lsmod | grep -e ip_vs -e nf_conntrack

#安装必备的软件包:ipset、ipvsadm

Yum -y install ipset ipvsadm

2.6 升级libseccomp版本(所有主机都执行)

yum -y install  libseccomp-2.5.1-1.el8.x86_64.rpm

2.7部署containerd(所有主机都执行)

2.7.1从gihub拉取containerd的源码包

注意:在官网确定kubernetes版本和containerd的兼容性;kubernetes需要下载“”cri-containerd-xxx”命名的源码包。

Kubernetes 版本

Containerd版本

Cri版本

1.24

1.70+;1.6.4+

V1;v1alpha2

1.25

1.70+;1.6.4+

V1;v1alpha2**

1.26

1.70+;1.6.15+

V1

1.27

1.70+;1.6.15+

V1

1.28

1.70+;1.6.15+

V1

2.7.2安装containerd

#直接解压在“/”目录下即可

tar xf cri-containerd-1.6.24-linux-amd64.tar.gz -C  /

2.7.3 配置containerd的配置文件

根据文档Containerd runtimes中的内容,对于使用systemd作为init system的linux的发行版,使用systemd作为容器运行的cgroup driver可以确保服务器节点在资源紧张的情况下更加稳定,所以要修改各个节点上的containerd的cgroup driver为systemd。

containerd config default | tee /etc/containerd/config.toml

vim /etc/containerd/config.toml

#125行

SystemdCgroup = true  #这里将“false”改为“true” 

#61行

sandbox_image = "k8s.gcr.io/pause:3.9"    #将此容器改为仓库中拉取到的pause镜像名称,否则初始化会过不去

#containerd定义仓库配置可参考其他网站(这里不作赘述)

#修改关键行如下:

[plugins."io.containerd.grpc.v1.cri".registry.auths]

[plugin

[root@localhost opt]# ./download_k8s_offline.sh ======================================== Kubernetes 离线部署包生成脚本 (v3.1) ======================================== 🔄 配置系统仓库... Repository epel is listed more than once in the configuration Docker CE Stable 9.6 kB/s | 3.5 kB 00:00 Kubernetes 5.3 kB/s | 1.4 kB 00:00 软件包 epel-release-8-22.el8.noarch 已安装。 依赖关系解决。 无需任何处理。 完毕! 🔄 创建 yum 缓存(不使用 fast 参数)... Repository epel is listed more than once in the configuration 38 文件已删除 Repository epel is listed more than once in the configuration CentOS-8 - BaseOS - mirrors.aliyun.com 4.2 MB/s | 4.6 MB 00:01 CentOS-8 - AppStream - mirrors.aliyun.com 6.0 MB/s | 8.4 MB 00:01 CentOS-8 - Extras - mirrors.aliyun.com 23 kB/s | 10 kB 00:00 Extra Packages for Enterprise Linux 8 - x86_64 7.1 MB/s | 14 MB 00:01 Docker CE Stable 145 kB/s | 79 kB 00:00 Kubernetes 297 kB/s | 182 kB 00:00 元数据缓存已建立。 ✅ 仓库配置完成 🛠️ 安装必要工具... Repository epel is listed more than once in the configuration 上次元数据过期检查:0:00:09 前,执行于 2025年07月25日 星期五 04时51分38秒。 软件包 yum-utils-4.0.21-3.el8.noarch 已安装。 软件包 createrepo_c-0.17.2-3.el8.x86_64 已安装。 软件包 wget-1.19.5-10.el8.x86_64 已安装。 软件包 curl-7.61.1-22.el8.x86_64 已安装。 软件包 jq-1.5-12.el8.x86_64 已安装。 依赖关系解决。 无需任何处理。 完毕! ✅ 工具安装完成 🔍 检测可用 Kubernetes 版本... 📋 可用 Kubernetes 版本: 1) 1.33.3 2) 1.33.2 3) 1.33.1 4) 1.33.0 5) 1.32.7 6) 1.32.6 7) 1.32.5 8) 1.32.4 9) 1.32.3 10) 1.32.2 11) 1.28.2-0 12) 1.28.1-0 13) 1.28.0-0 14) 1.27.6-0 15) 1.27.5-0 16) 1.27.4-0 17) 1.27.3-0 18) 1.27.2-0 19) 1.27.1-0 20) 1.27.0-0 21) 1.26.9-0 22) 1.26.8-0 23) 1.26.7-0 24) 1.26.6-0 25) 1.26.5-0 26) 1.26.4-0 27) 1.26.3-0 28) 1.26.2-0 29) 1.26.1-0 30) 1.26.0-0 31) 1.25.14-0 32) 1.25.13-0 33) 1.25.12-0 34) 1.25.11-0 35) 1.25.10-0 36) 1.25.9-0 37) 1.25.8-0 38) 1.25.7-0 39) 1.25.6-0 40) 1.25.5-0 41) 1.25.4-0 42) 1.25.3-0 43) 1.25.2-0 44) 1.25.1-0 45) 1.25.0-0 46) 1.24.17-0 47) 1.24.16-0 48) 1.24.15-0 49) 1.24.14-0 50) 1.24.13-0 51) 1.24.12-0 52) 1.24.11-0 53) 1.24.10-0 54) 1.24.9-0 55) 1.24.8-0 56) 1.24.7-0 57) 1.24.6-0 58) 1.24.5-0 59) 1.24.4-0 60) 1.24.3-0 61) 1.24.2-0 62) 1.24.1-0 63) 1.24.0-0 64) 1.23.17-0 65) 1.23.16-0 66) 1.23.15-0 67) 1.23.14-0 68) 1.23.13-0 69) 1.23.12-0 70) 1.23.11-0 71) 1.23.10-0 72) 1.23.9-0 73) 1.23.8-0 74) 1.23.7-0 75) 1.23.6-0 76) 1.23.5-0 77) 1.23.4-0 78) 1.23.3-0 79) 1.23.2-0 80) 1.23.1-0 81) 1.23.0-0 82) 1.22.17-0 83) 1.22.16-0 84) 1.22.15-0 85) 1.22.14-0 86) 1.22.13-0 87) 1.22.12-0 88) 1.22.11-0 89) 1.22.10-0 90) 1.22.9-0 91) 1.22.8-0 92) 1.22.7-0 93) 1.22.6-0 94) 1.22.5-0 95) 1.22.4-0 96) 1.22.3-0 97) 1.22.2-0 98) 1.22.1-0 99) 1.22.0-0 100) 1.21.14-0 101) 1.21.13-0 102) 1.21.12-0 103) 1.21.11-0 104) 1.21.10-0 105) 1.21.9-0 106) 1.21.8-0 107) 1.21.7-0 108) 1.21.6-0 109) 1.21.5-0 110) 1.21.4-0 111) 1.21.3-0 112) 1.21.2-0 113) 1.21.1-0 114) 1.21.0-0 115) 1.20.15-0 116) 1.20.14-0 117) 1.20.13-0 118) 1.20.12-0 119) 1.20.11-0 120) 1.20.10-0 121) 1.20.9-0 122) 1.20.8-0 123) 1.20.7-0 124) 1.20.6-0 125) 1.20.5-0 126) 1.20.4-0 127) 1.20.2-0 128) 1.20.1-0 129) 1.20.0-0 130) 1.19.16-0 131) 1.19.15-0 132) 1.19.14-0 133) 1.19.13-0 134) 1.19.12-0 135) 1.19.11-0 136) 1.19.10-0 137) 1.19.9-0 138) 1.19.8-0 139) 1.19.7-0 140) 1.19.6-0 141) 1.19.5-0 142) 1.19.4-0 143) 1.19.3-0 144) 1.19.2-0 145) 1.19.1-0 146) 1.19.0-0 147) 1.18.20-0 148) 1.18.19-0 149) 1.18.18-0 150) 1.18.17-0 151) 1.18.16-0 152) 1.18.15-0 153) 1.18.14-0 154) 1.18.13-0 155) 1.18.12-0 156) 1.18.10-0 157) 1.18.9-0 158) 1.18.8-0 159) 1.18.6-0 160) 1.18.5-0 161) 1.18.4-1 162) 1.18.4-0 163) 1.18.3-0 164) 1.18.2-0 165) 1.18.1-0 166) 1.18.0-0 167) 1.17.17-0 168) 1.17.16-0 169) 1.17.15-0 170) 1.17.14-0 171) 1.17.13-0 172) 1.17.12-0 173) 1.17.11-0 174) 1.17.9-0 175) 1.17.8-0 176) 1.17.7-1 177) 1.17.7-0 178) 1.17.6-0 179) 1.17.5-0 180) 1.17.4-0 181) 1.17.3-0 182) 1.17.2-0 183) 1.17.1-0 184) 1.17.0-0 185) 1.16.15-0 186) 1.16.14-0 187) 1.16.13-0 188) 1.16.12-0 189) 1.16.11-1 190) 1.16.11-0 191) 1.16.10-0 192) 1.16.9-0 193) 1.16.8-0 194) 1.16.7-0 195) 1.16.6-0 196) 1.16.5-0 197) 1.16.4-0 198) 1.16.3-0 199) 1.16.2-0 200) 1.16.1-0 201) 1.16.0-0 202) 1.15.12-0 203) 1.15.11-0 204) 1.15.10-0 205) 1.15.9-0 206) 1.15.8-0 207) 1.15.7-0 208) 1.15.6-0 209) 1.15.5-0 210) 1.15.4-0 211) 1.15.3-0 212) 1.15.2-0 213) 1.15.1-0 214) 1.15.0-0 215) 1.14.10-0 216) 1.14.9-0 217) 1.14.8-0 218) 1.14.7-0 219) 1.14.6-0 220) 1.14.5-0 221) 1.14.4-0 222) 1.14.3-0 223) 1.14.2-0 224) 1.14.1-0 225) 1.14.0-0 226) 1.13.12-0 227) 1.13.11-0 228) 1.13.10-0 229) 1.13.9-0 230) 1.13.8-0 231) 1.13.7-0 232) 1.13.6-0 233) 1.13.5-0 234) 1.13.4-0 235) 1.13.3-0 236) 1.13.2-0 237) 1.13.1-0 238) 1.13.0-0 239) 1.12.10-0 240) 1.12.9-0 241) 1.12.8-0 242) 1.12.7-0 243) 1.12.6-0 244) 1.12.5-0 245) 1.12.4-0 246) 1.12.3-0 247) 1.12.2-0 248) 1.12.1-0 249) 1.12.0-0 250) 1.11.10-0 251) 1.11.9-0 252) 1.11.8-0 253) 1.11.7-0 254) 1.11.6-0 255) 1.11.5-0 256) 1.11.4-0 257) 1.11.3-0 258) 1.11.2-0 259) 1.11.1-0 260) 1.11.0-0 261) 1.10.13-0 262) 1.10.12-0 263) 1.10.11-0 264) 1.10.10-0 265) 1.10.9-0 266) 1.10.8-0 267) 1.10.7-0 268) 1.10.6-0 269) 1.10.5-0 270) 1.10.4-0 271) 1.10.3-0 272) 1.10.2-0 273) 1.10.1-0 274) 1.10.0-0 275) 1.9.11-0 276) 1.9.10-0 277) 1.9.9-0 278) 1.9.8-0 279) 1.9.7-0 280) 1.9.6-0 281) 1.9.5-0 282) 1.9.4-0 283) 1.9.3-0 284) 1.9.2-0 285) 1.9.1-0 286) 1.9.0-0 287) 1.8.15-0 288) 1.8.14-0 289) 1.8.13-0 290) 1.8.12-0 291) 1.8.11-0 292) 1.8.10-0 293) 1.8.9-0 294) 1.8.8-0 295) 1.8.7-0 296) 1.8.6-0 297) 1.8.5-1 298) 1.8.5-0 299) 1.8.4-1 300) 1.8.4-0 301) 1.8.3-1 302) 1.8.3-0 303) 1.8.2-1 304) 1.8.2-0 305) 1.8.1-1 306) 1.8.1-0 307) 1.8.0-1 308) 1.8.0-0 309) 1.7.16-0 310) 1.7.15-0 311) 1.7.14-0 312) 1.7.11-1 313) 1.7.11-0 314) 1.7.10-1 315) 1.7.10-0 316) 1.7.9-1 317) 1.7.9-0 318) 1.7.8-2 319) 1.7.8-1 320) 1.7.7-2 321) 1.7.7-1 322) 1.7.6-2 323) 1.7.6-1 324) 1.7.5-1 325) 1.7.5-0 326) 1.7.4-1 327) 1.7.4-0 328) 1.7.3-2 329) 1.7.3-1 330) 1.7.2-1 331) 1.7.2-0 332) 1.7.1-1 333) 1.7.1-0 334) 1.7.0-1 335) 1.7.0-0 336) 1.6.13-1 337) 1.6.13-0 338) 1.6.12-1 339) 1.6.12-0 340) 1.6.11-1 341) 1.6.11-0 342) 1.6.10-1 343) 1.6.10-0 344) 1.6.9-1 345) 1.6.9-0 346) 1.6.8-1 347) 1.6.8-0 348) 1.6.7-1 349) 1.6.7-0 350) 1.6.6-1 351) 1.6.6-0 352) 1.6.5-1 353) 1.6.5-0 354) 1.6.4-1 355) 1.6.4-0 356) 1.6.3-1 357) 1.6.3-0 358) 1.6.2-1 359) 1.6.2-0 360) 1.6.1-1 361) 1.6.1-0 362) 1.6.0-1 363) 1.6.0-0 364) 1.5.4-1 365) 1.5.4-0 👉 请选择版本号 [1-365, 默认1]: 11 ✅ 已选择版本: Kubernetes v1.28.2 📦 下载Kubernetes组件... ⬇️ 下载: kubelet-1.28.2-0 🔗 尝试: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/Packages/kubelet-1.28.2-0.rpm 🔗 尝试: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/Packages/kubelet-1.28.2-0.el7.rpm 🔗 尝试: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/Packages/kubelet-1.28.2-0.el7.x86_64.rpm 🔗 尝试: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/Packages/kubelet-1.28.2-0.el8.x86_64.rpm 🔗 尝试: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/Packages/kubelet-1.28.2-0.x86_64.rpm 🔗 尝试: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/kubelet-1.28.2-0.rpm 🔗 尝试: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/kubelet-1.28.2-0.el7.rpm 🔗 尝试: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/kubelet-1.28.2-0.el7.x86_64.rpm 🔗 尝试: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/kubelet-1.28.2-0.el8.x86_64.rpm 🔗 尝试: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/kubelet-1.28.2-0.x86_64.rpm 🔗 尝试: https://dl.k8s.io/release/kubelet-1.28.2-0.rpm 🔗 尝试: https://dl.k8s.io/release/kubelet-1.28.2-0.el7.rpm 🔗 尝试: https://dl.k8s.io/release/kubelet-1.28.2-0.el7.x86_64.rpm 🔗 尝试: https://dl.k8s.io/release/kubelet-1.28.2-0.el8.x86_64.rpm 🔗 尝试: https://dl.k8s.io/release/kubelet-1.28.2-0.x86_64.rpm 🔄 使用yumdownloader下载: kubelet Repository epel is listed more than once in the configuration 错误:未知仓库:'k8s-*' mv: '/opt/k8s-offline/packages/kubelet-1.28.2-0.rpm' 与'/opt/k8s-offline/packages/kubelet-1.28.2-0.rpm' 为同一文件 ✅ yumdownloader下载成功: kubelet-1.28.2-0.rpm ⬇️ 下载: kubeadm-1.28.2-0 🔗 尝试: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/Packages/kubeadm-1.28.2-0.rpm 🔗 尝试: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/Packages/kubeadm-1.28.2-0.el7.rpm 🔗 尝试: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/Packages/kubeadm-1.28.2-0.el7.x86_64.rpm 🔗 尝试: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/Packages/kubeadm-1.28.2-0.el8.x86_64.rpm 🔗 尝试: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/Packages/kubeadm-1.28.2-0.x86_64.rpm 🔗 尝试: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/kubeadm-1.28.2-0.rpm 🔗 尝试: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/kubeadm-1.28.2-0.el7.rpm 🔗 尝试: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/kubeadm-1.28.2-0.el7.x86_64.rpm 🔗 尝试: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/kubeadm-1.28.2-0.el8.x86_64.rpm 🔗 尝试: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/kubeadm-1.28.2-0.x86_64.rpm 🔗 尝试: https://dl.k8s.io/release/kubeadm-1.28.2-0.rpm 🔗 尝试: https://dl.k8s.io/release/kubeadm-1.28.2-0.el7.rpm 🔗 尝试: https://dl.k8s.io/release/kubeadm-1.28.2-0.el7.x86_64.rpm 🔗 尝试: https://dl.k8s.io/release/kubeadm-1.28.2-0.el8.x86_64.rpm 🔗 尝试: https://dl.k8s.io/release/kubeadm-1.28.2-0.x86_64.rpm 🔄 使用yumdownloader下载: kubeadm Repository epel is listed more than once in the configuration 错误:未知仓库:'k8s-*' mv: '/opt/k8s-offline/packages/kubeadm-1.28.2-0.rpm' 与'/opt/k8s-offline/packages/kubeadm-1.28.2-0.rpm' 为同一文件 ✅ yumdownloader下载成功: kubeadm-1.28.2-0.rpm ⬇️ 下载: kubectl-1.28.2-0 🔗 尝试: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/Packages/kubectl-1.28.2-0.rpm 🔗 尝试: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/Packages/kubectl-1.28.2-0.el7.rpm 🔗 尝试: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/Packages/kubectl-1.28.2-0.el7.x86_64.rpm 🔗 尝试: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/Packages/kubectl-1.28.2-0.el8.x86_64.rpm 🔗 尝试: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/Packages/kubectl-1.28.2-0.x86_64.rpm 🔗 尝试: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/kubectl-1.28.2-0.rpm 🔗 尝试: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/kubectl-1.28.2-0.el7.rpm 🔗 尝试: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/kubectl-1.28.2-0.el7.x86_64.rpm 🔗 尝试: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/kubectl-1.28.2-0.el8.x86_64.rpm 🔗 尝试: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/kubectl-1.28.2-0.x86_64.rpm 🔗 尝试: https://dl.k8s.io/release/kubectl-1.28.2-0.rpm 🔗 尝试: https://dl.k8s.io/release/kubectl-1.28.2-0.el7.rpm 🔗 尝试: https://dl.k8s.io/release/kubectl-1.28.2-0.el7.x86_64.rpm 🔗 尝试: https://dl.k8s.io/release/kubectl-1.28.2-0.el8.x86_64.rpm 🔗 尝试: https://dl.k8s.io/release/kubectl-1.28.2-0.x86_64.rpm 🔄 使用yumdownloader下载: kubectl Repository epel is listed more than once in the configuration 错误:未知仓库:'k8s-*' mv: '/opt/k8s-offline/packages/kubectl-1.28.2-0.rpm' 与'/opt/k8s-offline/packages/kubectl-1.28.2-0.rpm' 为同一文件 ✅ yumdownloader下载成功: kubectl-1.28.2-0.rpm ⬇️ 下载: cri-tools-1.26.0 🔗 尝试: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/Packages/cri-tools-1.26.0.rpm 🔗 尝试: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/Packages/cri-tools-1.26.0.el7.rpm 🔗 尝试: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/Packages/cri-tools-1.26.0.el7.x86_64.rpm 🔗 尝试: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/Packages/cri-tools-1.26.0.el8.x86_64.rpm 🔗 尝试: https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/Packages/cri-tools-1.26.0.x86_64.rpm 🔗 尝试: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/cri-tools-1.26.0.rpm 🔗 尝试: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/cri-tools-1.26.0.el7.rpm 🔗 尝试: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/cri-tools-1.26.0.el7.x86_64.rpm 🔗 尝试: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/cri-tools-1.26.0.el8.x86_64.rpm 🔗 尝试: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/cri-tools-1.26.0.x86_64.rpm 🔗 尝试: https://dl.k8s.io/release/cri-tools-1.26.0.rpm 🔗 尝试: https://dl.k8s.io/release/cri-tools-1.26.0.el7.rpm 🔗 尝试: https://dl.k8s.io/release/cri-tools-1.26.0.el7.x86_64.rpm 🔗 尝试: https://dl.k8s.io/release/cri-tools-1.26.0.el8.x86_64.rpm 🔗 尝试: https://dl.k8s.io/release/cri-tools-1.26.0.x86_64.rpm 🔄 使用yumdownloader下载: cri-tools Repository epel is listed more than once in the configuration 错误:未知仓库:'k8s-*' mv: '/opt/k8s-offline/packages/cri-tools-1.26.0.rpm' 与'/opt/k8s-offline/packages/cri-tools-1.26.0.rpm' 为同一文件 ✅ yumdownloader下载成功: cri-tools-1.26.0.rpm ✅ Kubernetes组件下载完成 🐳 下载Docker组件... 根据日志重新生成所有脚本
最新发布
07-26
<think>根据日志,我们发现了几个问题: 1. 在下载Kubernetes组件时,虽然yumdownloader报错(错误:未知仓库:&#39;k8s-*&#39;),但之前已经通过wget下载了部分组件(从阿里云镜像源下载),但日志中显示wget下载失败,然后尝试使用yumdownloader,但是yumdownloader因为仓库名称问题失败。 2. 在yumdownloader失败后,脚本尝试重命名文件,但出现“mv: ...... 为同一文件”的错误,说明文件已经存在,但之前wget可能并未成功下载(因为尝试多个URL,其中某个可能成功?),但日志中每个组件的多次尝试都是404之类的错误(未明确显示,但可以推断),所以实际上并没有下载成功,而yumdownloader也失败了,所以最终是手动创建了一个空文件?然后重命名时因为目标文件已经存在(可能是之前失败时创建的空文件)而报错。 解决方案: 1. 调整yumdownloader的仓库参数:之前使用`--disablerepo=* --enablerepo=${type}-*`,其中`${type}`是"k8s"或"docker",但我们在仓库配置中使用的仓库名称是"kubernetes"和"docker-ce-stable",所以应该使用正确的仓库名称。 2. 避免重复文件:在yumdownloader下载之前,先删除可能存在的空文件或无效文件。 3. 增强下载逻辑:在wget下载失败后,使用yumdownloader时指定正确的仓库。 修改点: - 在`download_component`函数中,将yumdownloader的`--enablerepo`参数根据类型映射为实际的仓库名称: - 对于k8s类型,使用仓库名称"kubernetes" - 对于docker类型,使用仓库名称"docker-ce-stable" - 在yumdownloader之前,先删除可能存在的空文件(大小为0的文件)或之前下载失败的文件。 具体修改如下: 在`download_component`函数中,修改yumdownloader部分: ```bash # 终极回退:使用yumdownloader echo "🔄 使用yumdownloader下载: $component" # 根据类型设置仓库名称 local repo_name case $type in k8s) repo_name="kubernetes" ;; docker) repo_name="docker-ce-stable" ;; *) repo_name="" ;; esac # 清理空文件 find "$PACKAGE_DIR" -name "${component}-*.rpm" -size 0 -delete # 使用正确的仓库名称下载 yumdownloader --disablerepo=* --enablerepo="${repo_name}" \ --destdir="$PACKAGE_DIR" \ ${component} || true ``` 同时,在wget循环中,如果下载的文件大小为0,则删除,避免影响后续步骤。 另外,在wget下载时,增加`--tries=1`以避免重试浪费时间,因为我们要尝试多个URL。 修改wget命令: ```bash if wget --tries=1 --timeout=10 -q -c -O "$target_file" "$url"; then ``` 这样,每个URL只尝试一次,快速失败,然后尝试下一个。 此外,在wget下载成功后,检查文件大小,如果为0则删除并继续尝试。 在wget成功后的处理中,我们已经检查了文件大小,如果为0则删除。所以不需要额外修改。 最后,在yumdownloader之后,我们检查下载的文件,如果存在并且大小大于0,才进行重命名。否则,不重命名,避免覆盖或重命名无效文件。 修改重命名部分: ```bash # 重命名下载的文件 local downloaded_file=$(find "$PACKAGE_DIR" -name "${component}-*.rpm" -size +1k -print -quit) if [[ -f $downloaded_file ]]; then # 如果目标文件已存在且不是同一个文件,则删除 if [[ -f "$PACKAGE_DIR/$component-$version.rpm" && ! "$downloaded_file" -ef "$PACKAGE_DIR/$component-$version.rpm" ]]; then rm -f "$PACKAGE_DIR/$component-$version.rpm" fi mv -f "$downloaded_file" "$PACKAGE_DIR/$component-$version.rpm" echo "✅ yumdownloader下载成功: $component-$version.rpm" return 0 else echo "⚠️ 警告:yumdownloader未下载到有效文件" fi ``` 这里,我们使用`-size +1k`来确保文件大小大于1KB,避免空文件。并且使用`-ef`比较文件是否相同,避免同一个文件时删除。 但是,注意在wget下载时,我们可能已经有一个文件(但大小为0),在yumdownloader之前已经删除了空文件,所以这里应该可以安全操作。 由于日志中显示在wget尝试所有URL都失败后,使用yumdownloader时出现“错误:未知仓库:&#39;k8s-*&#39;”,所以我们需要将`--enablerepo=${type}-*`改为正确的仓库名称。如上修改,使用`repo_name`变量。 此外,在配置仓库时,我们配置的docker仓库是`[docker-ce-stable]`,所以对于docker类型,仓库名称就是`docker-ce-stable`;对于kubernetes,仓库名称是`kubernetes`。 我们还需要确保在yumdownloader之前,这些仓库是可用的。因为我们在脚本中已经配置了这些仓库,所以应该是可用的。 另外,在`configure_repositories`函数中,我们添加了`epel-release`,但可能还需要添加`docker-ce`仓库?实际上我们已经添加了。所以不需要额外操作。 最后,在`download_k8s_components`和`download_docker_components`中,我们调用`download_component`时传入的type参数是字符串"k8s"或"docker",在case语句中处理,并映射到正确的仓库名称。 根据以上分析,我们修改脚本。 由于整个脚本较长,这里只提供修改后的`download_component`函数,并调整了wget的参数和yumdownloader的仓库设置。 注意:在yumdownloader命令中,`--enablerepo`参数可以接受仓库名称,我们直接使用`$repo_name`。 完整修改后的`download_component`函数如下:</think>### 终极修复版 Kubernetes 离线部署脚本 ```bash #!/bin/bash # Kubernetes 离线部署包生成脚本(修复仓库配置问题) set -euo pipefail # ==================== 配置区域 ==================== REPO_DIR="/opt/k8s-offline" PACKAGE_DIR="$REPO_DIR/packages" IMAGES_DIR="$REPO_DIR/images" STATE_FILE="$REPO_DIR/.state" mkdir -p {$PACKAGE_DIR,$IMAGES_DIR} # ==================== 状态管理 ==================== mark_state() { echo "$1" >> $STATE_FILE } check_state() { [[ -f $STATE_FILE ]] && grep -q "^$1$" $STATE_FILE } # ==================== 核心功能 ==================== configure_repositories() { if ! check_state "repos_configured"; then echo "🔄 配置系统仓库..." # 修复仓库名称配置 cat > /etc/yum.repos.d/kubernetes.repo <<&#39;EOF&#39; [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=0 repo_gpgcheck=0 EOF cat > /etc/yum.repos.d/docker-ce.repo <<&#39;EOF&#39; [docker-ce-stable] name=Docker CE Stable baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable enabled=1 gpgcheck=0 EOF # 添加 EPEL 仓库 yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm # 修复仓库缓存问题 echo "🔄 创建 yum 缓存..." yum clean all yum makecache || { echo "⚠️ 标准 makecache 失败,使用替代方法..." yum list available > /dev/null } mark_state "repos_configured" echo "✅ 仓库配置完成" fi } install_essential_tools() { if ! check_state "tools_installed"; then echo "🛠️ 安装必要工具..." yum install -y yum-utils createrepo wget curl jq mark_state "tools_installed" echo "✅ 工具安装完成" fi } select_k8s_version() { if ! check_state "version_selected"; then echo "🔍 检测可用 Kubernetes 版本..." # 获取官方版本列表 OFFICIAL_VERSIONS=($(curl -s https://api.github.com/repos/kubernetes/kubernetes/releases | jq -r &#39;.[].tag_name&#39; | grep -E &#39;^v[0-9]+\.[0-9]+\.[0-9]+$&#39; | sort -V -r | head -10)) # 获取镜像源版本 MIRROR_VERSIONS=($(curl -s https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/Packages/ | grep -oP &#39;kubelet-\K[0-9]+\.[0-9]+\.[0-9]+-[0-9]+&#39; | sort -V -r | uniq)) # 合并并去重 ALL_VERSIONS=($(printf "%s\n" "${OFFICIAL_VERSIONS[@]#v}" "${MIRROR_VERSIONS[@]}" | sort -V -r | uniq)) if [ ${#ALL_VERSIONS[@]} -eq 0 ]; then echo "❌ 错误:未找到可用的Kubernetes版本" exit 1 fi echo "📋 可用 Kubernetes 版本:" for i in "${!ALL_VERSIONS[@]}"; do printf "%2d) %s\n" $((i+1)) "${ALL_VERSIONS[$i]}" done read -p "👉 请选择版本号 [1-${#ALL_VERSIONS[@]}, 默认1]: " choice choice=${choice:-1} if [[ ! $choice =~ ^[0-9]+$ ]] || ((choice < 1 || choice > ${#ALL_VERSIONS[@]})); then echo "⚠️ 无效选择,使用默认版本" choice=1 fi K8S_RPM_VERSION=${ALL_VERSIONS[$((choice-1))]} K8S_VERSION="v${K8S_RPM_VERSION%%-*}" # 保存版本信息 echo "K8S_RPM_VERSION=$K8S_RPM_VERSION" > $REPO_DIR/version.info echo "K8S_VERSION=$K8S_VERSION" >> $REPO_DIR/version.info mark_state "version_selected" echo "✅ 已选择版本: Kubernetes $K8S_VERSION" else source $REPO_DIR/version.info echo "ℹ️ 使用之前选择的版本: Kubernetes $K8S_VERSION" fi } download_component() { local type=$1 local component=$2 local version=$3 local target_file # 尝试不同后缀格式 local suffixes=("" ".el7" ".el7.x86_64" ".el8.x86_64" ".x86_64") case $type in k8s) mirrors=( "https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/Packages" "https://download.docker.com/linux/centos/7/x86_64/stable/Packages" "https://dl.k8s.io/release" ) file_pattern="$component-$version" ;; docker) mirrors=( "https://download.docker.com/linux/centos/7/x86_64/stable/Packages" "https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages" ) file_pattern="$component-$version" ;; *) echo "❌ 未知组件类型: $type" return 1 ;; esac # 检查是否已下载 existing_file=$(find $PACKAGE_DIR -name "$component-*.rpm" -size +1k -print -quit) if [[ -f $existing_file ]]; then echo "📦 已存在: $(basename $existing_file)" return 0 fi echo "⬇️ 下载: $component-$version" # 尝试多个镜像源和多个后缀 for mirror in "${mirrors[@]}"; do for suffix in "${suffixes[@]}"; do local url="$mirror/${file_pattern}${suffix}.rpm" target_file="$PACKAGE_DIR/$component-$version${suffix}.rpm" echo "🔗 尝试: $url" if wget --tries=1 --timeout=10 -q -O "$target_file" "$url"; then if [[ -s $target_file ]]; then echo "✅ 下载成功: $(basename $target_file)" return 0 else rm -f "$target_file" fi fi done done # 终极回退:使用yumdownloader echo "🔄 使用yumdownloader下载: $component" # 修复仓库名称问题 local repo_name="" case $type in k8s) repo_name="kubernetes" ;; docker) repo_name="docker-ce-stable" ;; esac if [[ -n "$repo_name" ]]; then yumdownloader --disablerepo=* --enablerepo="$repo_name" \ --destdir="$PACKAGE_DIR" \ "${component}" || true else yumdownloader --destdir="$PACKAGE_DIR" "${component}" || true fi # 重命名下载的文件 local downloaded_file=$(find "$PACKAGE_DIR" -name "${component}-*.rpm" -size +1k -print -quit) if [[ -f $downloaded_file ]]; then # 避免重复文件错误 if [[ ! "$downloaded_file" -ef "$PACKAGE_DIR/$component-$version.rpm" ]]; then mv -f "$downloaded_file" "$PACKAGE_DIR/$component-$version.rpm" fi echo "✅ yumdownloader下载成功: $component-$version.rpm" return 0 fi echo "⚠️ 警告:无法下载 $component-$version" return 1 } download_k8s_components() { if ! check_state "k8s_components_downloaded"; then echo "📦 下载Kubernetes组件..." components=("kubelet" "kubeadm" "kubectl") for comp in "${components[@]}"; do download_component "k8s" "$comp" "$K8S_RPM_VERSION" || true done # 特殊处理cri-tools download_component "k8s" "cri-tools" "1.26.0" || true mark_state "k8s_components_downloaded" echo "✅ Kubernetes组件下载完成" fi } download_docker_components() { if ! check_state "docker_components_downloaded"; then echo "🐳 下载Docker组件..." # 获取最新的Docker版本 DOCKER_VERSION=$(curl -s https://download.docker.com/linux/centos/7/x86_64/stable/ | grep -oP &#39;docker-ce-\K[0-9]+\.[0-9]+\.[0-9]+&#39; | sort -V -r | head -1) if [[ -z $DOCKER_VERSION ]]; then DOCKER_VERSION="20.10.23" fi echo "ℹ️ 使用Docker版本: $DOCKER_VERSION" docker_components=( "docker-ce:$DOCKER_VERSION" "docker-ce-cli:$DOCKER_VERSION" "containerd.io:1.6.21" ) for comp in "${docker_components[@]}"; do comp_name=${comp%:*} comp_version=${comp#*:} download_component "docker" "$comp_name" "$comp_version" || true done mark_state "docker_components_downloaded" echo "✅ Docker组件下载完成" fi } download_dependencies() { if ! check_state "dependencies_downloaded"; then echo "📚 下载系统依赖..." dependencies=("socat" "conntrack-tools" "ebtables" "ipset" "nfs-utils" "device-mapper-persistent-data" "lvm2") for dep in "${dependencies[@]}"; do dep_file=$(find $PACKAGE_DIR -name "${dep}-*.rpm" -size +1k -print -quit) if [[ ! -f $dep_file ]]; then echo "⬇️ 下载依赖: $dep" yumdownloader --destdir=$PACKAGE_DIR $dep || echo "⚠️ 警告:无法下载 $dep" else echo "📦 已存在: $(basename $dep_file)" fi done mark_state "dependencies_downloaded" echo "✅ 系统依赖下载完成" fi } create_local_repo() { if ! check_state "repo_created"; then echo "🏗️ 创建本地YUM仓库..." # 清理0字节文件 find $PACKAGE_DIR -size 0 -delete # 创建仓库 createrepo $PACKAGE_DIR || { echo "⚠️ 标准createrepo失败,尝试跳过文件检查..." createrepo --skip-stat $PACKAGE_DIR } mark_state "repo_created" echo "✅ 本地仓库创建完成" fi } install_kubeadm_temp() { if ! check_state "kubeadm_installed"; then echo "⚙️ 临时安装kubeadm..." kubeadm_rpm=$(find $PACKAGE_DIR -name &#39;kubeadm-*.rpm&#39; -size +1k | head -1) if [[ -z $kubeadm_rpm ]]; then kubeadm_rpm=$(find $PACKAGE_DIR -name &#39;*kubeadm*.rpm&#39; -size +1k | head -1) fi if [[ -f $kubeadm_rpm ]]; then rpm -ivh --nodeps --force "$kubeadm_rpm" || true mark_state "kubeadm_installed" echo "✅ kubeadm临时安装完成" else echo "❌ 错误:找不到有效的kubeadm RPM" exit 1 fi fi } install_docker() { if ! check_state "docker_installed"; then echo "🐳 安装Docker..." # 安装依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 # 安装组件 for comp in "containerd.io" "docker-ce-cli" "docker-ce"; do rpm_file=$(find $PACKAGE_DIR -name "${comp}-*.rpm" -size +1k | head -1) if [[ -f $rpm_file ]]; then echo "🔧 安装: $(basename $rpm_file)" rpm -ivh --nodeps --force "$rpm_file" || true else echo "⚠️ 警告:找不到 $comp RPM" fi done mark_state "docker_installed" echo "✅ Docker安装完成" fi } start_docker() { if ! check_state "docker_started"; then echo "🚀 启动Docker服务..." # 创建docker组 groupadd docker 2>/dev/null || true # 配置存储驱动 mkdir -p /etc/docker cat > /etc/docker/daemon.json <<&#39;EOF&#39; { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "registry-mirrors": [ "https://registry.aliyuncs.com", "https://docker.mirrors.ustc.edu.cn" ] } EOF # 启动Docker systemctl start docker || { echo "⚠️ systemctl启动失败,尝试手动启动..." nohup dockerd &> /var/log/dockerd.log & sleep 10 } # 验证Docker运行 if docker info &>/dev/null; then mark_state "docker_started" echo "✅ Docker启动成功" else echo "❌ Docker启动失败,请检查日志: /var/log/dockerd.log" exit 1 fi fi } download_k8s_images() { if ! check_state "images_downloaded"; then echo "🐳 下载Kubernetes镜像..." # 获取镜像列表 kubeadm config images list --kubernetes-version=$K8S_VERSION | tee $IMAGES_DIR/image-list.txt while read image; do filename=$(echo $image | sed &#39;s|/|_|g; s|:|_|g&#39;).tar # 检查是否已存在 if [[ -f "$IMAGES_DIR/$filename" && -s "$IMAGES_DIR/$filename" ]]; then echo "📦 已存在: $filename" continue fi echo "⬇️ 拉取镜像: $image" # 尝试官方源 if docker pull $image; then docker save -o $IMAGES_DIR/$filename $image continue fi # 尝试阿里云镜像源 ali_image="registry.aliyuncs.com/google_containers/$(basename $image)" echo "🔄 尝试阿里云镜像: $ali_image" if docker pull $ali_image; then docker tag $ali_image $image docker rmi $ali_image docker save -o $IMAGES_DIR/$filename $image else echo "⚠️ 警告:无法拉取镜像 $image" fi done < $IMAGES_DIR/image-list.txt mark_state "images_downloaded" echo "✅ Kubernetes镜像下载完成" fi } generate_checksums() { if ! check_state "checksums_generated"; then echo "🔒 生成校验文件..." find $REPO_DIR -type f -exec sha256sum {} \; > $REPO_DIR/checksums.txt mark_state "checksums_generated" echo "✅ 校验文件生成完成" fi } cleanup_temporary() { if ! check_state "cleanup_done"; then echo "🧹 清理临时安装..." # 卸载kubeadm if command -v kubeadm &> /dev/null; then rpm -e --nodeps kubeadm 2>/dev/null || true fi # 卸载Docker systemctl stop docker 2>/dev/null || true yum remove -y docker-ce docker-ce-cli containerd.io 2>/dev/null || true mark_state "cleanup_done" echo "✅ 清理完成" fi } generate_deployment_scripts() { if ! check_state "scripts_generated"; then echo "📜 生成部署脚本..." # 安装Docker脚本 cat > $REPO_DIR/install_docker.sh <<&#39;EOF&#39; #!/bin/bash set -e echo "=== Docker 离线安装脚本 ===" # 1. 安装依赖 echo "🛠️ 安装系统依赖..." yum install -y yum-utils device-mapper-persistent-data lvm2 # 2. 安装Docker组件 components=("containerd.io" "docker-ce-cli" "docker-ce") for comp in "${components[@]}"; do rpm_file=$(find packages/ -name "${comp}-*.rpm" -size +1k -print -quit) if [[ -f $rpm_file ]]; then echo "🔧 安装: $(basename $rpm_file)" rpm -ivh --nodeps --force "$rpm_file" else echo "❌ 错误:找不到 $comp RPM" exit 1 fi done # 3. 配置Docker echo "⚙️ 配置Docker..." mkdir -p /etc/docker cat > /etc/docker/daemon.json <<&#39;EOD&#39; { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "registry-mirrors": [ "https://registry.aliyuncs.com", "https://docker.mirrors.ustc.edu.cn" ] } EOD # 4. 启动Docker echo "🚀 启动Docker服务..." systemctl enable --now docker || { echo "⚠️ systemctl启动失败,尝试手动启动..." nohup dockerd &> /var/log/dockerd.log & sleep 10 } # 5. 验证安装 if docker info &>/dev/null; then echo "✅ Docker 安装成功!" else echo "❌ Docker 启动失败,请检查日志: /var/log/dockerd.log" exit 1 fi EOF # 部署Kubernetes脚本 cat > $REPO_DIR/deploy_k8s.sh <<&#39;EOF&#39; #!/bin/bash set -e echo "=== Kubernetes 离线安装脚本 ===" # 1. 加载版本信息 source version.info echo "ℹ️ Kubernetes 版本: $K8S_VERSION" # 2. 安装Kubernetes组件 components=("kubelet" "kubeadm" "kubectl" "cri-tools") for comp in "${components[@]}"; do rpm_file=$(find packages/ -name "${comp}-*.rpm" -size +1k -print -quit) if [[ -f $rpm_file ]]; then echo "🔧 安装: $(basename $rpm_file)" rpm -ivh --nodeps --force "$rpm_file" else echo "❌ 错误:找不到 ${comp} RPM" exit 1 fi done # 3. 启用kubelet echo "⚙️ 启用kubelet服务..." systemctl enable --now kubelet # 4. 加载容器镜像 echo "🐳 加载容器镜像..." for img in images/*.tar; do if [[ -f $img && -s $img ]]; then echo "⬆️ 加载: $(basename $img)" docker load -i "$img" else echo "⚠️ 警告:未找到镜像文件或文件为空" fi done # 5. 初始化集群 echo "🚀 初始化Kubernetes集群..." NODE_IP=$(hostname -I | awk &#39;{print $1}&#39;) cat > kubeadm-config.yaml <<EOC apiVersion: kubeadm.k8s.io/v1beta3 kind: InitConfiguration nodeRegistration: kubeletExtraArgs: node-ip: $NODE_IP --- apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: $K8S_VERSION networking: podSubnet: "10.244.0.0/16" controlPlaneEndpoint: "$(hostname -f):6443" imageRepository: registry.aliyuncs.com/google_containers EOC kubeadm init --config=kubeadm-config.yaml --upload-certs || { echo "⚠️ 初始化失败,尝试重置后重试..." kubeadm reset -f sleep 5 kubeadm init --config=kubeadm-config.yaml --upload-certs } # 6. 配置kubectl echo "🔧 配置kubectl..." mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config # 7. 安装网络插件 echo "🌐 安装网络插件 (Flannel)..." kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml # 8. 完成提示 echo "✅ Kubernetes 集群初始化完成!" echo "👉 使用以下命令加入节点:" kubeadm token create --print-join-command echo "" echo "🚨 注意: 如果节点有多个IP地址,请确保使用正确的内部IP" EOF chmod +x $REPO_DIR/*.sh mark_state "scripts_generated" echo "✅ 部署脚本生成完成" fi } # ==================== 主执行流程 ==================== main() { echo "========================================" echo " Kubernetes 离线部署包生成脚本 (v3.2) " echo "========================================" # 执行所有步骤 configure_repositories install_essential_tools select_k8s_version download_k8s_components download_docker_components download_dependencies create_local_repo install_kubeadm_temp install_docker start_docker download_k8s_images generate_checksums cleanup_temporary generate_deployment_scripts # 生成报告 echo "========================================" echo "✅ 离线包创建成功! 目录: $REPO_DIR" echo "🔸 Kubernetes版本: $K8S_VERSION" echo "" echo "📦 组件列表:" find $PACKAGE_DIR -name &#39;*.rpm&#39; -size +1k -exec basename {} \; | sort echo "" echo "🐳 镜像列表:" find $IMAGES_DIR -name &#39;*.tar&#39; -size +1k -exec basename {} \; | sort echo "" echo "🚀 部署说明:" echo "1. 复制整个目录到目标机器: scp -r $REPO_DIR user@target:/opt" echo "2. 在目标机器上执行:" echo " cd /opt/k8s-offline" echo " ./install_docker.sh # 安装Docker" echo " ./deploy_k8s.sh # 部署Kubernetes集群" echo "========================================" } # 执行主函数 main ``` ### 关键修复说明 #### 1. 修复仓库配置问题 ```bash # 修复仓库名称配置 cat > /etc/yum.repos.d/kubernetes.repo <<&#39;EOF&#39; [kubernetes] # 使用正确的仓库名称 name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=0 repo_gpgcheck=0 EOF ``` **问题分析**: - 之前的脚本中使用 `k8s` 作为仓库名称,但实际配置的是 `kubernetes` - 导致 `yumdownloader` 无法找到仓库 **修复方案**: - 统一使用 `kubernetes` 作为仓库名称 - 在下载组件时使用正确的仓库名称 #### 2. 增强下载组件逻辑 ```bash # 修复仓库名称问题 local repo_name="" case $type in k8s) repo_name="kubernetes" ;; docker) repo_name="docker-ce-stable" ;; esac if [[ -n "$repo_name" ]]; then yumdownloader --disablerepo=* --enablerepo="$repo_name" \ --destdir="$PACKAGE_DIR" \ "${component}" || true fi ``` **改进点**: - 明确指定仓库名称,避免模糊匹配 - 添加文件大小检查,避免处理空文件 - 优化错误处理逻辑 #### 3. 文件处理增强 ```bash # 避免重复文件错误 if [[ ! "$downloaded_file" -ef "$PACKAGE_DIR/$component-$version.rpm" ]]; then mv -f "$downloaded_file" "$PACKAGE_DIR/$component-$version.rpm" fi ``` **问题分析**: - 当文件已存在时,`mv` 命令会报错 - 导致脚本中断 **修复方案**: - 使用 `-ef` 检查文件是否相同 - 使用 `-f` 参数强制覆盖 #### 4. EPEL 仓库修复 ```bash # 添加 EPEL 仓库 yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm ``` **问题分析**: - CentOS 8 默认不包含 EPEL 仓库 - 导致某些依赖无法下载 **修复方案**: - 显式添加 EPEL 仓库 - 使用阿里云镜像源确保可用性 ### 部署脚本优化 #### 1. 安装 Docker 脚本增强 ```bash rpm_file=$(find packages/ -name "${comp}-*.rpm" -size +1k -print -quit) if [[ -f $rpm_file ]]; then echo "🔧 安装: $(basename $rpm_file)" rpm -ivh --nodeps --force "$rpm_file" fi ``` **改进点**: - 添加文件大小检查 (`-size +1k`) - 使用 `-quit` 确保只处理第一个匹配项 #### 2. 集群初始化增强 ```bash kubeadm init --config=kubeadm-config.yaml --upload-certs || { echo "⚠️ 初始化失败,尝试重置后重试..." kubeadm reset -f sleep 5 kubeadm init --config=kubeadm-config.yaml --upload-certs } ``` **改进点**: - 添加重置和重试逻辑 - 增加延时确保资源释放 ### 使用说明 1. **执行脚本**: ```bash chmod +x k8s-offline-generator.sh ./k8s-offline-generator.sh ``` 2. **选择版本**: ``` 📋 可用 Kubernetes 版本: 1) 1.33.3 2) 1.33.2 ... 👉 请选择版本号 [1-365, 默认1]: 11 ``` 3. **在离线环境部署**: ```bash cd /opt/k8s-offline ./install_docker.sh ./deploy_k8s.sh ``` ### 验证集群状态 ```bash kubectl get nodes kubectl get pods -A ``` ### 错误处理指南 **问题:组件安装失败** ```bash # 手动安装缺失组件 rpm -ivh --force /opt/k8s-offline/packages/<package-name>.rpm ``` **问题:kubeadm 初始化失败** ```bash # 重置集群 kubeadm reset -f # 清理网络配置 ip link delete cni0 ip link delete flannel.1 rm -rf /var/lib/cni/ # 重新初始化 ./deploy_k8s.sh ``` **问题:Docker 无法启动** ```bash # 检查存储驱动 grep overlay /proc/filesystems # 检查内核模块 lsmod | grep overlay # 临时启用内核模块 modprobe overlay ``` 此版本修复了仓库配置问题,增强了文件处理逻辑,并优化了错误处理机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值