企业级容器云 PaaS 平台离线部署完全指南
一、前言
在容器化技术普及的今天,Kubernetes 已成为云原生应用的事实标准。然而,对于内网环境、安全隔离场景或网络条件受限的企业而言,在线拉取镜像和依赖往往难以实现。本文将详细介绍如何在完全离线的环境下,使用自动化部署工具快速搭建一套企业级容器云 PaaS 平台。
本方案基于Kubernetes 1.25.2,集成Harbor(镜像仓库)、Istio(服务网格)、Prometheus + Grafana(监控告警)、KubeVirt(虚拟化管理)以及可视化 Web 控制台,适用于技能大赛、企业内网实训及生产环境私有化部署。
二、环境规划与准备
2.1 节点规划
本次部署采用最小高可用架构:1 个 Master 控制节点 + 1 个 Worker 计算节点。
| 节点角色 | 主机名 | IP 地址 | CPU | 内存 | 磁盘 | 系统 |
|---|---|---|---|---|---|---|
| Master | master | 192.168.20.100 | 2×4 核 | 8GB | 100GB | CentOS 7.9 |
| Worker | node | 192.168.20.110 | 2×4 核 | 8GB | 100GB | CentOS 7.9 |
说明:Master 节点同时承担控制平面和部分工作负载;Worker 节点专门运行业务容器。实际生产环境建议至少 3 个 Master 节点实现控制平面高可用。
🔗 阿里云新用户专属入口(享首购1折+代金券):https://www.aliyun.com/minisite/goods?userCode=iakscw7s
2.2 离线资源包清单
在开始部署前,需准备以下离线资源包(通常以 ISO 镜像或 tar.gz 形式提供):
| 资源包名称 | 说明 |
|---|---|
chinaskills_cloud_paas_v2.1.iso | 主安装镜像,包含 kubeeasy 工具及所有容器镜像 |
kubeeasy.tar.gz | Kubernetes 集群部署工具包 |
packages.tar.gz | 系统依赖 RPM 包集合(Docker、containerd、kubelet 等) |
三、基础环境配置
所有节点均需执行以下基础配置,确保系统环境满足容器云平台部署要求。
3.1 配置静态 IP 地址
确保两节点已配置静态 IP,并能互相通信。以 CentOS 7.9 为例,编辑网卡配置文件:
# 示例:Master 节点网卡配置vi/etc/sysconfig/network-scripts/ifcfg-eth0# 关键配置项BOOTPROTO=staticIPADDR=192.168.20.100NETMASK=255.255.255.0GATEWAY=192.168.20.1DNS1=192.168.20.1ONBOOT=yes配置完成后重启网络服务:
systemctl restart network3.2 设置主机名
分别在两节点上设置主机名,便于后续识别和管理:
# Master 节点hostnamectl set-hostname masterbash# Worker 节点hostnamectl set-hostnamenodebash3.3 关闭防火墙
容器云平台涉及大量端口通信,为避免防火墙规则干扰集群组件间的通信,建议关闭系统防火墙:
# 两节点均执行systemctl stop firewalld systemctl disable firewalld生产环境建议:如需保留防火墙,可针对性开放 Kubernetes 所需端口(6443、10250、2379-2380、10251、10252 等),而非直接关闭。
3.4 关闭 SELinux
SELinux 的强制策略可能限制容器进程的文件访问权限,导致 Pod 无法正常启动。将其设置为宽容模式或完全关闭:
# 临时关闭(立即生效)setenforce0# 永久关闭(重启后生效)sed-i's/SELINUX=enforcing/SELINUX=disabled/g'/etc/selinux/config3.5 配置主机名映射
在 Master 节点上编辑/etc/hosts文件,添加两节点的 IP 与主机名映射:
cat>>/etc/hosts<<EOF 192.168.20.100 master 192.168.20.110 node EOF通过scp将配置同步到 Worker 节点,确保两节点互相解析:
scp/etc/hosts root@192.168.20.110:/etc/hosts输入 node 节点的 root 密码完成传输。同步后在两节点上分别执行ping master和ping node验证连通性。
3.6 配置 SSH 免密登录(可选但推荐)
kubeeasy 工具通过 SSH 批量操作节点,配置免密登录可简化部署流程:
# 在 Master 节点执行ssh-keygen-trsa-P''-f~/.ssh/id_rsa ssh-copy-id root@192.168.20.100 ssh-copy-id root@192.168.20.1103.7 时间同步
确保两节点时间一致,避免因时间偏差导致证书验证失败:
# 安装并启用 NTPyuminstall-yntpdate ntpdate-untp.aliyun.com# 写入定时任务,每 10 分钟同步一次echo"*/10 * * * * /usr/sbin/ntpdate -u ntp.aliyun.com">>/var/spool/cron/root四、离线资源部署
4.1 上传镜像包到 Master 节点
使用 SFTP 工具将chinaskills_cloud_paas_v2.1.iso上传到 Master 节点的/root目录下。上传完成后验证文件完整性:
ls-lh/root/chinaskills_cloud_paas_v2.1.iso4.2 挂载 ISO 镜像
将 ISO 镜像挂载到/mnt目录,提取其中的部署资源到/opt目录:
# 创建挂载点并挂载(ISO 通常为只读)mount-oloop /root/chinaskills_cloud_paas_v2.1.iso /mnt/# 将资源复制到 /opt 目录,便于后续操作cp-r/mnt/* /opt/# 卸载 ISO 释放挂载点umount/mnt/# 查看资源结构ls/opt/预期输出应包含:
dependencies/:系统依赖包目录kubeeasy.tar.gz:集群部署工具kubeeasy-v2.0:可执行二进制文件
4.3 安装 kubeeasy 部署工具
将 kubeeasy 二进制文件移动到系统 PATH 路径,使其全局可调用:
mv/opt/kubeeasy-v2.0 /usr/bin/kubeeasychmod+x /usr/bin/kubeeasy验证安装:
kubeeasy--version4.4 分发并安装系统依赖包
进入依赖包目录,解压并安装所有 RPM 包:
cd/opt/dependencies/tar-zxvfpackages.tar.gzcdpackages yum-yinstall*.rpmWorker 节点同步执行:
在 Master 节点上将依赖包远程拷贝到 Worker 节点:
scp/opt/dependencies/packages.tar.gz root@192.168.20.110:/opt/然后在 Worker 节点上执行相同的解压安装操作:
cd/opt/tar-zxvfpackages.tar.gzcdpackages yum-yinstall*.rpm依赖包内容说明:通常包含 containerd、docker-ce、kubelet、kubectl、kubeadm、helm、cri-tools 等容器及 Kubernetes 基础组件。
五、部署 Kubernetes 集群
5.1 安装集群依赖环境
使用 kubeeasy 工具为所有节点安装并配置 Kubernetes 运行所需的系统环境(内核参数、模块加载、CNI 插件准备等):
kubeeasyinstalldepend\--host192.168.20.100,192.168.20.110\--userroot\--password000000\--offline-file /opt/dependencies/packages.tar.gz参数说明:
--host:指定所有节点 IP,逗号分隔--user:节点登录用户名--password:节点登录密码--offline-file:离线依赖包路径
执行成功后,日志将显示各节点依赖安装完成的提示。
5.2 部署 Kubernetes 集群
执行核心部署命令,安装 Kubernetes 1.25.2 集群并集成 PaaS 平台组件:
kubeeasyinstallkubernetes\--master192.168.20.100\--worker192.168.20.110\--userroot\--password000000\--version1.25.2\--offline-file /opt/kubeeasy.tar.gz参数说明:
--master:指定 Master 节点 IP--worker:指定 Worker 节点 IP(多个 Worker 用逗号分隔)--version:Kubernetes 版本号--offline-file:离线集群资源包
部署过程说明:
- 该过程约需10-20 分钟,具体时长取决于服务器性能
- 工具会自动完成:容器运行时安装、Kubernetes 控制平面初始化、CNI 网络插件部署、Worker 节点加入、CoreDNS 配置、平台组件(Harbor、Istio、Prometheus、KubeVirt 等)安装
- 期间若报错,请检查前几步的环境配置是否遗漏,或查看日志
/var/log/kubeinstall.log
六、集群状态验证
6.1 查看节点状态
在 Master 节点上执行:
kubectl get nodes预期输出:
NAME STATUS ROLES AGE VERSION k8s-master-node1 Ready control-plane 9m v1.25.2 k8s-worker-node1 Ready <none> 8m v1.25.2两节点均应显示Ready状态。若节点处于NotReady,请检查网络插件(Flannel/Calico)Pod 是否正常运行。
6.2 查看平台组件 Pod
查看所有命名空间下的 Pod 运行状态:
kubectl get pods-A预期应看到以下关键组件均为Running状态:
| 命名空间 | 组件 | 说明 |
|---|---|---|
harbor | harbor-core、harbor-database、harbor-nginx 等 | 企业级镜像仓库 |
istio-system | grafana、prometheus、jaeger、kiali | 服务网格与可观测性 |
kube-system | coredns、etcd、kube-apiserver、kube-controller-manager、kube-scheduler、kube-flannel、kube-proxy | Kubernetes 核心系统组件 |
kubevirt | virt-api、virt-controller、virt-handler、virt-operator | 虚拟机管理(KubeVirt) |
kubernetes-dashboard | kubernetes-dashboard、dashboard-metrics-scraper | 可视化监控面板 |
若发现 Pod 处于CrashLoopBackOff或Pending状态,可通过以下命令排查:
# 查看 Pod 详细事件kubectl describe pod<pod-name>-n<namespace># 查看容器日志kubectl logs<pod-name>-n<namespace>--tail100七、Web 平台访问与初始化
7.1 重启所有节点
部署完成后,必须重启所有节点(Master 和 Worker),以确保所有内核模块、系统服务及容器网络配置完全生效:
# 两节点分别执行reboot注意:若未重启直接访问 Web 控制台,可能出现"平台实例超时"的提示,要求重新启动平台。
7.2 访问 PaaS 控制台
节点重启完成后,通过浏览器访问容器云 PaaS 平台:
http://<任意节点IP>:30777例如:http://192.168.20.100:30777
首次访问将看到新平台安装页面,要求创建初始管理员账号:
- 用户名:默认
admin - 密码:需设置至少 12 位的强密码
- 确认密码:与上述密码一致
点击"创建用户"完成初始化,之后即可使用 admin 账号登录平台。
7.3 平台功能概览
登录后,企业级容器云 PaaS 平台通常提供以下核心能力:
| 功能模块 | 说明 |
|---|---|
| 集群管理 | 查看节点资源、命名空间、集群事件 |
| 应用部署 | 通过表单或 YAML 部署容器应用,支持 Deployment、StatefulSet、DaemonSet 等 |
| 服务网格 | 基于 Istio 的流量管理、灰度发布、熔断限流 |
| 镜像仓库 | 集成 Harbor,管理容器镜像的推送、拉取与版本控制 |
| 虚拟机管理 | 基于 KubeVirt 在 Kubernetes 中运行传统虚拟机,实现容器与 VM 统一调度 |
| 监控告警 | 基于 Prometheus + Grafana 的集群资源监控、自定义告警规则 |
| 日志中心 | 集中收集和分析容器 stdout 日志及文件日志 |
7.4 访问 Harbor 镜像仓库
Harbor 作为平台内置的镜像仓库,可通过以下方式访问:
# 查看 Harbor 服务端口kubectl get svc-nharbor通常 Harbor 的 Web 界面通过 NodePort 暴露,如30002端口。浏览器访问:
http://<节点IP>:<Harbor-NodePort>默认账号密码通常为admin / Harbor12345(具体以实际部署版本为准)。登录后可创建项目、管理镜像、配置复制规则等。
八、常见问题与排查
8.1 节点状态 NotReady
现象:kubectl get nodes显示某节点NotReady
排查步骤:
- 检查节点 kubelet 服务:
systemctl status kubelet - 查看节点详细状态:
kubectl describe node <node-name>,关注Conditions字段 - 检查网络插件 Pod:
kubectl get pods -n kube-system | grep flannel - 检查节点磁盘空间:
df -h,kubelet 在磁盘不足时会驱逐 Pod
8.2 Pod 一直处于 Pending
可能原因:
- 节点资源不足(CPU/内存)
- 没有合适的存储类(PVC 无法绑定)
- 节点存在污点(Taint),Pod 无法容忍
排查命令:
kubectl describe pod<pod-name>-n<namespace># 查看 Events 字段中的具体调度失败原因8.3 Web 控制台提示超时
现象:访问:30777显示"平台实例超时,需要重新启动平台"
解决方案:严格按照部署流程,重启所有节点后再访问。该提示是平台的安全机制,确保所有后台服务完全就绪。
8.4 离线部署时镜像拉取失败
即使使用离线包,部分场景可能仍尝试从公网拉取镜像。检查各节点是否配置了正确的镜像仓库地址(指向本地 Harbor 或离线包内置仓库),并确认 containerd/docker 的daemon.json中配置了 insecure-registries。
九、架构组件深度解析
9.1 Harbor:企业级镜像仓库
Harbor 提供安全的镜像存储、签名扫描(Trivy)、复制同步及 RBAC 权限管理。在离线环境中,它是整个平台的镜像分发中枢,所有 Kubernetes 节点从 Harbor 拉取业务镜像。
9.2 Istio:服务网格
Istio 为微服务应用提供流量管理、安全通信和可观测性能力,无需修改业务代码即可实现:
- 智能路由(金丝雀发布、A/B 测试)
- 负载均衡与故障恢复
- mTLS 自动加密
- 分布式追踪(Jaeger)
9.3 Prometheus + Grafana:监控体系
- Prometheus:负责采集集群节点、Pod、容器及自定义业务的指标数据
- Grafana:提供可视化仪表盘,预设 Kubernetes 集群监控模板,支持自定义告警阈值
9.4 KubeVirt:虚拟化能力
KubeVirt 允许在 Kubernetes 集群中运行和管理传统虚拟机,实现"容器 + 虚拟机"的统一云原生基础设施。适用于需要同时运行容器化应用和传统 VM 工作负载的混合场景。
十、总结
本文完整演示了在完全离线环境下,从基础环境配置到企业级容器云 PaaS 平台部署的全流程。通过 kubeeasy 自动化工具,大幅简化了 Kubernetes 及其生态组件的部署复杂度,使得在内网或隔离环境中快速构建云原生平台成为可能。
关键要点回顾:
- 基础环境务必规范:主机名、hosts、防火墙、SELinux、时间同步缺一不可
- 离线资源包需完整上传并正确挂载提取
- 依赖安装和集群部署两条命令顺序执行,耐心等待
- 部署完成后必须重启所有节点,再访问 Web 控制台
- 善用
kubectl命令排查集群和 Pod 状态
这套平台不仅适用于技能竞赛和教学实训,其架构设计(Harbor + Istio + 监控 + KubeVirt)也具备向生产环境演进的能力。后续可根据业务需求扩展 Worker 节点、配置持久化存储(Ceph/Rook)及完善多租户网络隔离策略。