企业级容器云 PaaS 平台离线部署完全指南

一、前言

在容器化技术普及的今天,Kubernetes 已成为云原生应用的事实标准。然而,对于内网环境、安全隔离场景或网络条件受限的企业而言,在线拉取镜像和依赖往往难以实现。本文将详细介绍如何在完全离线的环境下,使用自动化部署工具快速搭建一套企业级容器云 PaaS 平台。

本方案基于Kubernetes 1.25.2,集成Harbor(镜像仓库)、Istio(服务网格)、Prometheus + Grafana(监控告警)、KubeVirt(虚拟化管理)以及可视化 Web 控制台,适用于技能大赛、企业内网实训及生产环境私有化部署。


二、环境规划与准备

2.1 节点规划

本次部署采用最小高可用架构:1 个 Master 控制节点 + 1 个 Worker 计算节点。

节点角色主机名IP 地址CPU内存磁盘系统
Mastermaster192.168.20.1002×4 核8GB100GBCentOS 7.9
Workernode192.168.20.1102×4 核8GB100GBCentOS 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.gzKubernetes 集群部署工具包
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 network

3.2 设置主机名

分别在两节点上设置主机名,便于后续识别和管理:

# Master 节点hostnamectl set-hostname masterbash# Worker 节点hostnamectl set-hostnamenodebash

3.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/config

3.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 masterping 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.110

3.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.iso

4.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--version

4.4 分发并安装系统依赖包

进入依赖包目录,解压并安装所有 RPM 包:

cd/opt/dependencies/tar-zxvfpackages.tar.gzcdpackages yum-yinstall*.rpm

Worker 节点同步执行

在 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状态:

命名空间组件说明
harborharbor-core、harbor-database、harbor-nginx 等企业级镜像仓库
istio-systemgrafana、prometheus、jaeger、kiali服务网格与可观测性
kube-systemcoredns、etcd、kube-apiserver、kube-controller-manager、kube-scheduler、kube-flannel、kube-proxyKubernetes 核心系统组件
kubevirtvirt-api、virt-controller、virt-handler、virt-operator虚拟机管理(KubeVirt)
kubernetes-dashboardkubernetes-dashboard、dashboard-metrics-scraper可视化监控面板

若发现 Pod 处于CrashLoopBackOffPending状态,可通过以下命令排查:

# 查看 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

排查步骤

  1. 检查节点 kubelet 服务:systemctl status kubelet
  2. 查看节点详细状态:kubectl describe node <node-name>,关注Conditions字段
  3. 检查网络插件 Pod:kubectl get pods -n kube-system | grep flannel
  4. 检查节点磁盘空间: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 及其生态组件的部署复杂度,使得在内网或隔离环境中快速构建云原生平台成为可能。

关键要点回顾

  1. 基础环境务必规范:主机名、hosts、防火墙、SELinux、时间同步缺一不可
  2. 离线资源包需完整上传并正确挂载提取
  3. 依赖安装和集群部署两条命令顺序执行,耐心等待
  4. 部署完成后必须重启所有节点,再访问 Web 控制台
  5. 善用kubectl命令排查集群和 Pod 状态

这套平台不仅适用于技能竞赛和教学实训,其架构设计(Harbor + Istio + 监控 + KubeVirt)也具备向生产环境演进的能力。后续可根据业务需求扩展 Worker 节点、配置持久化存储(Ceph/Rook)及完善多租户网络隔离策略。