离线安装 Kubernetes 和 KubeSphere
本节介绍如何在不能访问 Internet 的环境下使用离线安装包部署 Kubernetes 和 KubeSphere。
安装过程中将用到开源工具 KubeKey 的 v4.x 版本。有关 KubeKey 的更多信息,请访问 GitHub KubeKey 仓库。
| 注意 |
|---|
|
前置依赖: 安装过程依赖 tar 工具完成软件包的压缩和解压,请提前确认系统环境已预装该命令。若 config.yaml 中配置了 charts 参数,请确保打包节点已提前安装 Helm。
准备工作
参考如下最低配置要求,准备 Linux 主机。
| 角色 | 主机数量 | 最低要求(每个节点) | 网络要求 |
|---|---|---|---|
打包节点 |
1 |
CPU:1 核,内存:1 GB,硬盘:150 GB |
需能访问互联网 |
部署节点(运行 Web Installer 服务) |
1 |
CPU:1 核,内存:1 GB,硬盘:150 GB |
与 Kubernetes 节点网络互通 |
私有镜像仓库节点 |
1 |
CPU:8 核,内存:16 GB,硬盘:100 GB |
与 Kubernetes 节点网络互通 |
Kubernetes 节点 |
≥ 1 |
CPU:2 核,内存:4 GB,硬盘:40 GB |
节点间网络互通 |
| 注意 |
|---|
|
-
打包节点:您需要准备至少 1 台 Linux 服务器作为打包节点。该节点将从互联网下载所需软件包与镜像,需确保能够访问互联网。
-
部署节点(运行 Web Installer 服务):安装过程中需要在该节点上执行
kk命令以运行安装服务。该节点需与私有镜像仓库节点、Kubernetes 节点保持网络互通。 -
私有镜像仓库节点:如果您尚未部署任何私有镜像仓库,请准备至少 1 台 Linux 服务器作为私有镜像仓库节点。该节点需与 Kubernetes 各节点保持网络互通。
-
Kubernetes 节点:您需要准备至少 1 台 Linux 服务器作为集群节点(无需提前安装 Kubernetes)。
前提条件
| 说明 |
|---|
以下为 Kubernetes 节点需满足的前提条件。 |
-
您需要准备至少 1 台 Linux 服务器作为集群节点。在生产环境中,为确保集群具备高可用性,建议准备至少 5 台 Linux 服务器,其中 3 台作为控制平面节点,另外 2 台作为工作节点。如果您在多台 Linux 服务器上安装 KubeSphere,请确保所有服务器属于同一子网。
-
集群节点的操作系统和版本须为 Ubuntu 18.04、Ubuntu 20.04、Ubuntu 22.04、Ubuntu 24.04、Debian 10、Debian 11、CentOS 8、AlmaLinux 9.0 或 Kylin v10。多台服务器的操作系统可以不同。关于其它操作系统和版本支持,请咨询青云科技官方解决方案专家或交付服务专家。
-
在生产环境中,为确保集群具有足够的计算和存储资源,建议每台集群节点配置至少 8 个 CPU 核心、16 GB 内存和 200 GB 磁盘空间。除此之外,建议在每台集群节点的 /var/lib/docker(对于 Docker)或 /var/lib/containerd(对于 containerd) 目录额外挂载至少 200 GB 磁盘空间用于存储容器运行时数据。
-
在生产环境中,建议提前为 KubeSphere 集群配置高可用性以避免单个控制平面节点出现故障时集群服务中断。有关更多信息,请参阅配置高可用性。
说明 如果您规划了多个控制平面节点,请务必提前为集群配置高可用性。
-
默认情况下,KubeSphere 使用集群节点的本地磁盘空间作为持久化存储。在生产环境中,建议提前配置外部存储系统作为持久化存储。有关更多信息,请参阅配置外部持久化存储。
-
请确保所有集群节点上 /etc/resolv.conf 文件中配置的 DNS 服务器地址可用。否则,KubeSphere 集群可能会出现域名解析问题。
-
请确保在所有集群节点上都可以使用 sudo、tar、curl 和 openssl 命令。
-
请确保所有集群节点时间同步。
配置防火墙规则
KubeSphere 需要特定端口和协议用于服务之间的通信。如果您的基础设施环境已启用防火墙,您需要在防火墙设置中放行所需的端口和协议。如果您的基础设施环境未启用防火墙,您可以跳过此步骤。
下表列出需要在防火墙中放行的端口和协议。
| 服务 | 协议 | 行为 | 起始端口 | 结束端口 | 备注 |
|---|---|---|---|---|---|
ssh |
TCP |
allow |
22 |
N/A |
N/A |
etcd |
TCP |
allow |
2379 |
2380 |
N/A |
apiserver |
TCP |
allow |
6443 |
N/A |
N/A |
calico |
TCP |
allow |
9099 |
9100 |
N/A |
bgp |
TCP |
allow |
179 |
N/A |
N/A |
nodeport |
TCP |
allow |
30000 |
32767 |
N/A |
master |
TCP |
allow |
10250 |
10258 |
N/A |
worker |
TCP |
allow |
10250 |
N/A |
N/A |
dns |
TCP |
allow |
53 |
N/A |
N/A |
dns |
UDP |
allow |
53 |
N/A |
N/A |
local-registry |
TCP |
allow |
5000 |
N/A |
离线环境需要 |
local-apt |
TCP |
allow |
5080 |
N/A |
离线环境需要 |
rpcbind |
TCP |
allow |
111 |
N/A |
使用 NFS 作为持久化存储时需要 |
ipip |
IPENCAP / IPIP |
allow |
N/A |
N/A |
使用 Calico 时需要 |
构建离线安装包
创建配置文件
提示: 可通过 https://get-images.kubesphere.io 页面生成配置文件。
登录打包节点,在打包节点上创建 config.yaml 文件:
apiVersion: kubekey.kubesphere.io/v1
kind: Config
spec:
zone: "cn"
download:
arch:
- amd64
- arm64
images:
policy: warn
registry: hub.kubesphere.com.cn
kubernetes:
kube_version:
- v1.23.17
- v1.24.17
- v1.25.16
- v1.26.15
- v1.27.16
- v1.28.15
- v1.29.15
- v1.30.14
- v1.31.12
- v1.32.11
- v1.33.7
- v1.34.3
cni:
type:
- calico
- cilium
- flannel
- kubeovn
- hybridnet
multi_cni:
- multus
- spiderpool
cri:
container_manager:
- containerd
- docker
storage_class:
local:
enabled: true
nfs:
enabled: true
image_registry:
type:
- harbor
- docker-registry
iso:
- "almalinux-9.0-rpms"
- "kylin-v10SP3-rpms"
- "ubuntu-22.04-debs"
- "centos-8-rpms"
- "kylin-v10SP2-rpms"
- "ubuntu-24.04-debs"
- "debian-10-debs"
- "kylin-v10SP1-rpms"
- "debian-11-debs"
- "ubuntu-18.04-debs"
- "kylin-v10SP3-2403-rpms"
- "ubuntu-20.04-debs"
字段说明:
| 字段 | 说明 |
|---|---|
|
配置文件的 API 版本,固定值为 |
|
资源类型,固定值为 |
|
软件包下载的区域, |
|
指定需要下载的 CPU 架构,支持 |
|
镜像下载策略, |
|
镜像仓库地址 |
|
需要包含的 Kubernetes 版本列表 |
|
需要包含的 CNI 插件类型 |
|
需要包含的多 CNI 管理组件 |
|
容器运行时类型,支持 |
|
需要包含的存储类,支持 |
|
镜像仓库类型,支持 |
|
制作 ISO 依赖包的操作系统列表,用于安装系统依赖 |
获取 kk 与 Web Installer
如果访问 GitHub 或 Google APIs 受限,请设置如下环境变量:
export KKZONE=cn
执行以下命令下载 KubeKey 和 Web Installer:
curl -sfL https://get-kk.kubesphere.io | sh -
执行完成后,会在当前目录生成以下文件:
| 原文件 | 解压后文件 |
|---|---|
|
|
|
|
|
离线安装包的构建脚本 |
制作离线安装包
执行构建脚本:
./package.sh config.yaml
当输出以下信息时,表示制作成功:
Offline package artifact.tgz has been created successfully.
离线包为 artifact.tgz,包含以下内容:
artifact/
├── artifact/kubekey-artifact.tgz # 完整的离线资源包
└── artifact/tools/ # 不同架构的工具包
├── amd64/
│ ├── kubekey-v4.x.x-linux-amd64.tar.gz
│ ├── nerdctl-2.2.1-linux-amd64.tar.gz
│ └── oras_1.3.0_linux_amd64.tar.gz
└── arm64/
├── kubekey-v4.x.x-linux-arm64.tar.gz
├── nerdctl-2.2.1-linux-arm64.tar.gz
└── oras_1.3.0_linux_arm64.tar.gz
使用离线包安装集群
安装集群前,需要指定私有镜像仓库地址。有以下两种方式:
-
方式一:单独安装私有镜像仓库,请参考 镜像仓库安装。
-
方式二:在创建集群时同时安装镜像仓库,需要在
inventory.yaml和config.yaml中添加对应配置信息。详情请参考下文命令行安装步骤。
解压离线包
tar -zxvf artifact.tgz
方法 1:命令行安装
提示:
命令行安装支持以下两种镜像仓库安装方式:
-
先参考 镜像仓库安装 单独安装私有镜像仓库。
-
在创建集群过程中同步安装私有镜像仓库。此方式需要修改
inventory.yaml和config.yaml。
1. 进入离线包目录并解压工具
KubeKey 工具位于 tools/{arch}/ 目录下,请根据安装机器的架构解压对应工具。
查看机器架构:
uname -m
进入离线包目录:
cd artifact/
解压 KubeKey 到离线包目录:
tar -zxvf tools/{arch}/kubekey-v4.x.x-linux-{arch}.tar.gz -C .
2. 推送镜像到私有镜像仓库
执行以下命令将离线包中的镜像推送到已部署的私有镜像仓库:
./kk artifact images --push -c config.yaml -a kubekey-artifact.tgz
注意:
执行前请确保 config.yaml 中已正确配置私有镜像仓库地址。
3. 创建节点配置文件
执行以下命令创建节点配置文件 inventory.yaml:
./kk create inventory -o .
命令执行完毕后,将生成节点配置文件 inventory.yaml。inventory.yaml 主要用于设置集群中各节点的连接信息,示例如下:
apiVersion: kubekey.kubesphere.io/v1
kind: Inventory
metadata:
name: default
spec:
hosts:
# localhost:
# connector:
# password: 123456
# node1:
# connector:
# type: ssh
# host: node1
# port: 22
# user: root
# password: 123456
# internal_ipv4: 1.1.1.1
groups:
# 所有 Kubernetes 节点
k8s_cluster:
groups:
- kube_control_plane
- kube_worker
# 控制平面节点
kube_control_plane:
hosts:
- localhost
# 工作节点
kube_worker:
hosts:
- localhost
# etcd 节点(仅当 etcd_deployment_type 为 external 时)
etcd:
hosts:
- localhost
# image_registry:
# hosts:
# - localhost
# NFS 节点(用于镜像仓库存储和 Kubernetes NFS 存储)
# nfs:
# hosts:
# - localhost
spec.hosts 中的节点连接参数:
| 参数 | 描述 |
|---|---|
|
节点名称 |
|
节点连接信息 |
|
节点连接类型。支持 |
|
使用 SSH 连接节点时的地址 |
|
使用 SSH 连接节点时的端口。默认值: |
|
使用 SSH 连接节点时的用户名。默认值: |
|
连接节点时的密码。 |
|
SSH 连接节点时的私钥文件路径。密码和密钥任选其一 |
|
SSH 连接节点时的私钥文件内容。可使用密钥内容替代密钥文件路径 |
|
节点在集群中通信时使用的 IPv4 地址 |
|
节点在集群中通信时使用的 IPv6 地址 |
spec.groups 中的节点角色参数:
| 参数 | 描述 |
|---|---|
|
Kubernetes 集群节点分组。包含 |
|
Kubernetes 集群中的控制平面节点。在 |
|
Kubernetes 集群中的工作节点。在 |
|
Kubernetes 集群中的 etcd 节点。在 |
|
用于创建私有镜像仓库的节点。离线安装时通常需要配置 |
如果选择在创建集群时同时安装镜像仓库,需要在 inventory.yaml 中额外添加 image_registry 节点和分组。示例如下:
spec:
hosts:
harbor1:
connector:
type: ssh
host: 172.16.0.1
port: 22
user: root
password: 123456
internal_ipv4: 172.16.0.1
groups:
image_registry:
hosts:
- harbor1
4. 创建安装配置文件
执行以下命令创建安装配置文件。以下示例使用 v1.32.11,该版本已包含在前文 config.yaml 示例的离线资源列表中:
./kk create config --with-kubernetes v1.32.11 -o .
将 v1.32.11 替换为实际需要的 Kubernetes 版本。请确保替换后的版本已包含在构建离线包时使用的 spec.download.kubernetes.kube_version 列表中。
命令执行完毕后,将生成安装配置文件 config-v1.32.11.yaml。
如果选择在创建集群时同时安装镜像仓库,需要在 config-v1.32.11.yaml 中补充镜像仓库配置:
spec:
image_registry:
# 镜像仓库类型。支持 harbor、docker-registry;留空则不安装
type: "harbor"
auth:
# 私有镜像仓库地址
registry: "dockerhub.kubekey.local"
5. 配置集群参数
在 config-v1.32.11.yaml 中配置 Kubernetes 集群信息:
| 参数 | 描述 |
|---|---|
|
文件及镜像的下载区域。离线安装时无需联网,但此项在构建离线包时生效 |
|
Kubernetes 相关配置 |
|
etcd 相关配置 |
|
私有镜像仓库相关配置 |
|
容器运行时相关配置 |
|
网络插件相关配置 |
|
存储插件相关配置 |
|
域名解析相关配置 |
|
需要下载的额外镜像 |
注意:
完整的配置参数说明,请参考 配置参考。
6. 安装集群
./kk create cluster -a kubekey-artifact.tgz -i inventory.yaml -c config-v1.32.11.yaml
方法 2:Web Installer 安装
注意:
Web Installer 暂不支持安装私有镜像仓库。使用 Web Installer 安装集群前,请提前参考 镜像仓库安装,单独安装私有镜像仓库。
1. 进入离线包目录并解压工具
KubeKey 工具位于 tools/{arch}/ 目录下,请根据安装机器的架构解压对应工具。
查看机器架构:
uname -m
进入离线包目录:
cd artifact/
解压 KubeKey 到离线包目录:
tar -zxvf tools/{arch}/kubekey-v4.x.x-linux-{arch}.tar.gz -C .
2. 推送镜像到私有镜像仓库
在 config.yaml 中添加私有镜像仓库信息。示例如下:
apiVersion: kubekey.kubesphere.io/v1
kind: Config
spec:
image_registry:
auth:
registry: dockerhub.kubekey.local
username: admin
password: Harbor12345
skip_tls_verify: false
plain_http: false
各字段说明如下:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
|
String |
是 |
私有镜像仓库地址 |
|
String |
是 |
私有镜像仓库登录用户名 |
|
String |
是 |
私有镜像仓库登录密码 |
|
Boolean |
否 |
是否跳过 TLS 证书验证,默认为 |
|
Boolean |
否 |
是否使用 HTTP 明文传输,默认为 |
执行以下命令将离线包中的镜像推送到已部署的私有镜像仓库:
./kk artifact images --push -c config.yaml -a kubekey-artifact.tgz
注意:
执行前请确保 config.yaml 中已正确配置私有镜像仓库地址。
3. 启动 Web Installer
./kk web --port 8080 --schema-path web-installer/schema --ui-path web-installer/dist
如果显示如下信息,表示 Web Installer 启动成功:
Web server started successfully on port 8080
请勿关闭命令终端。在浏览器中访问 http://<启动节点 IP 地址>:8080,打开 KubeKey UI 页面。
4. 通过 Web Installer 部署 Kubernetes 和 KubeSphere
在浏览器中访问 http://<部署节点 IP 地址>:8080,点击 开始安装,进入部署流程。
4.1 添加集群节点
在 基本信息 页面,添加 Kubernetes 节点。支持通过手动添加、文件上传和节点扫描的方式添加节点。
注意: 如果只添加一个节点,节点角色必须为 Master & Worker。
手动添加
适用于添加单个节点。填写主机名、IP 地址、SSH 地址、SSH 认证等信息。
文件上传
适用于批量添加节点。根据模板填写节点信息后上传。
节点扫描
适用于自动发现节点。通过 IP CIDR 进行节点扫描,可根据扫描结果自由选择节点进行添加。
4.2 修改配置参数
配置部署 Kubernetes 和 KubeSphere 所需的参数。
Kubernetes 和 KubeSphere Core 标签页均支持 表单模式 和 YAML 模式。您可以在表单中填写配置信息(所有参数均需配置),也可以直接编辑 YAML 文件。如需了解更多配置信息,请参阅 配置示例。
Kubernetes 配置
| 分类 | 参数 | 描述 |
|---|---|---|
集群配置 |
集群名称 |
输入一个集群名称。 |
集群配置 |
Kubernetes 版本 |
此处的版本必须和离线安装包目录下 |
集群配置 |
集群访问地址 |
集群的统一访问入口地址,通常为负载均衡器的域名。 |
集群配置 |
端口 |
集群的访问端口。 |
集群配置 |
路由方式 |
支持 |
容器运行时 |
类型 |
容器运行时的类型,支持 |
网络设置 |
网络插件 |
支持多种插件,如 |
网络设置 |
每节点最大 Pod 数 |
每个节点可运行 Pod 的最大数量。默认为 |
网络设置 |
Service CIDR |
集群内部 Service 可用的 IP 地址范围。Service CIDR 支持 IPv4 和 IPv6,不能与同一个集群的其他网络(如 Pod CIDR 和 Node IP)重复。 |
网络设置 |
Pod CIDR |
集群内部 Pod 可用的 IP 地址范围。Pod CIDR 支持 IPv4 和 IPv6,不能与同一个集群的其他网络(如 Node IP)重复。 |
网络设置 |
IPv4/IPv6 掩码大小 |
IP 地址中用于标识网络部分的位数。 |
镜像仓库配置 |
仓库地址 |
填写私有镜像仓库的实际地址。 |
镜像仓库配置 |
用户名和密码 |
填写私有镜像仓库的登录账户和密码。 |
存储设置 |
启用 |
使用集群节点的本地存储系统。 |
存储设置 |
设置为默认存储 |
设置为默认存储类。 |
存储设置 |
存储路径 |
存储卷在宿主机上的存储路径。 |
KubeSphere Core 配置
| 参数 | 描述 |
|---|---|
全局镜像仓库 |
填写私有镜像仓库的实际地址。 |
扩展组件镜像仓库 |
填写私有镜像仓库的实际地址。 |
配置完成后,点击 下一步。
4.3 安装预览
在 安装预览 页面,确认版本等信息无误后,点击 下一步:执行安装 开始安装。也可以返回上一步修改配置参数。
4.4 安装
耐心等待安装完成。安装完成后,系统会自动进入安装校验步骤。
若安装过程中出现异常,点击 查看日志 查看日志详情,退出或初始化后重新安装。
说明: 若需要在 Web Installer 页面重新安装、修改配置参数或清除配置,点击左侧的 初始化 按钮,将重置 Kubernetes 节点上的所有任务并回到基本信息页面。初始化操作不可逆,请谨慎执行。
4.5 安装校验
-
在 安装校验 页面,点击 开始检测,系统将自动运行对应的检测脚本验证系统可用性。
-
若通过系统检测,点击 完成,可查看 KubeSphere 的访问地址、管理员用户名和默认密码。
-
在网页浏览器上输入访问地址,登录 KubeSphere Web 控制台,即可开始使用 KubeSphere。
说明: 取决于您的网络环境,您可能需要配置流量转发规则并在防火墙中放行 30880 端口。