尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

云计算项目实战:架构选型、OpenStack部署与Ceph存储调优指南

云计算项目实战:架构选型、OpenStack部署与Ceph存储调优指南 简介《云计算项目技术方案及实施文档.pdf》是一份面向云计算规划与实施人员的技术文档围绕云计算平台建设的意义、需求分析、总体设计与实施方案展开适合需要搭建或评估企业级云平台的架构师、运维及项目管理者参考。资源为pdf格式共1个文件压缩包仅4.54MB目录结构清晰包括建设意义、需求分析、建设目标与要求、总体设计、计算/存储/网络资源池等章节可直接作为项目投标、方案编写或技术评审的参考资料。文档以H3CLOUD解决方案为例介绍了软件定义数据中心SDDC、混合云管理平台、虚拟化、自动化管理及云存储等组件并结合传统IT系统灵活性差、成本高、扩展难等困境阐明了云平台建设的必要性。此外还细化了建设目标、技术性能指标以及资源池布局等实施细节能帮助读者理解从需求梳理到架构落地的完整路径。目前已有35人学习适合正在做云计算项目规划或希望掌握云平台总体设计思路的读者。1. 云计算项目技术方案及实施文档为什么我劝你先想清楚再动手做过几个云计算项目之后你会发现一个规律真正让项目延期的不是技术难点而是方案没定清楚就急着部署。我见过太多团队拿到一个云计算项目上来就开云主机、配负载均衡结果做到一半发现网络规划不合理、存储选型错误只能推倒重来。这份实施文档的标题看起来很普通但它的价值恰恰在于——把「方案」和「实施」分开写先立规矩再干活。这篇文章适合两类人一类是刚接触云计算项目的运维或开发需要一套能直接参考的方案模板和部署步骤另一类是已经做过云迁移但被坑过的工程师想看看别人在参数配置和排障上有什么值得借鉴的地方。我会按实际项目落地的顺序从架构选型、网络规划、存储方案、部署实操到验收排错把一套能复现的技术方案拆开讲清楚。文中的所有命令和配置都来自我经手过的真实项目你可以直接抄作业但参数要按自己的业务体量调整。2. 云架构选型先定技术路线再谈实施细节2.1 私有云、公有云还是混合云用决策树代替拍脑袋很多实施文档上来就画架构图但架构图之前的问题才是关键——你的业务到底适合跑在哪朵云上。我一般会用一个简单的决策树来引导客户做选型避免后面返工。第一条分支是数据合规性。如果业务数据涉及金融、政务、医疗等强监管行业数据不能出域直接排除公有云只在私有云或混合云里选。第二条分支是弹性需求。如果业务有明显的波峰波谷比如电商大促、考试报名季私有云 Alone 扛成本太高必须考虑公有云的弹性扩容能力。第三条分支是现有基础设施。如果机房已有大量物理服务器和网络设备全量迁移到公有云等于浪费资产混合云是更务实的路线。选型结果通常落在三档中小型互联网业务选公有云把运维包袱甩给云厂商传统企业且数据敏感的选私有云用 OpenStack 或 VMware vSphere 搭自建平台既有存量机房又需要弹性能力的选混合云核心数据留在本地突发流量冲到公有云。实施文档里我会再补一张对比表把每个选项的初始成本、运维复杂度、扩容上限列清楚。2.2 控制台选型OpenStack 还是 Kubernetes 原生确定云形态后下一个决策点是控制面和资源调度层用什么。这里容易犯的错是跟风——看到社区里 Kubernetes 火就全盘 K8s看到 OpenStack 成熟就无脑 OpenStack。实际项目里这两个东西解决的是不同维度的问题。如果业务跑的是传统虚拟机形态有完整的操作系统、中间件、数据库需要手动登录服务器做运维选 OpenStack 更合适。它的 Nova 组件管计算、Neutron 管网络、Cinder 管块存储和传统 IDC 的运维习惯几乎一致。如果业务本身是微服务架构应用已经容器化选 Kubernetes 原生方案更直接配合 Rancher 或 KubeSphere 做管理面资源利用率更高。我最近一个项目就是这样客户的核心业务是 SAP 系统必须跑在虚拟机上用 OpenStack 搭私有云另一个业务是内部 OA 和 BI 报表容器化改造后放到 K8s 集群。两个平台并存中间用统一认证和监控打通。实施文档里我会把这两条路线的适用场景、组件清单和部署顺序写清楚避免团队在技术选型上反复摇摆。2.3 高可用设计控制节点、计算节点、存储节点怎么配比方案里最容易虚化的是高可用设计。很多文档只写「采用双机热备保障业务连续性」但落到具体参数上就露馅了。我的做法是把高可用拆成三个层面每个层面都有明确的节点配比和故障切换机制。控制节点至少要三台组成集群模式。OpenStack 的 Keystone、Nova API、Neutron Server 这些无状态服务可以跑在多台机器上做负载均衡数据库和消息队列用 Galera Cluster 和 RabbitMQ 镜像队列保证数据一致。计算节点根据业务负载横向扩展起步建议至少两台避免单点故障。存储节点是另一个关键点如果采用 Ceph存储节点至少要三台副本数设为 2才能容忍单台故障且数据不丢。节点配比我会按 CPU、内存、磁盘三个维度给出基线控制节点 8 核 16G系统盘 200G计算节点 16 核 32G 起数据盘按业务容量规划存储节点每台 4 块 2T 数据盘起步网络要求 10G 内网互联。这套基线不是拍脑袋定的而是经过容量评估——先用业务峰值并发乘单请求资源消耗再乘 1.5 的冗余系数最终倒推出节点规模。实施文档里我会附上一份容量评估表让读者照着填参数就能算出自己需要多少节点。3. 网络与存储规划实施文档里最容易埋雷的两个部分3.1 网络分区设计管理网、业务网、存储网必须物理隔离网络规划是云计算项目里最容易被低估的部分。很多项目为了省交换机端口把管理流量、业务流量、存储流量混跑在同一张物理网络上结果业务高峰期存储同步把网络打满管理面直接失联排查起来焦头烂额。我的方案里强制要求三网隔离管理网承载 OpenStack API、SSH 登录、监控采集带宽要求不高但稳定性要求高业务网承载虚拟机南北向流量和东西向流量按业务规模规划带宽存储网专门跑 Ceph 的数据同步和副本复制必须用 10G 甚至 25G 光口因为存储流量是持续性的很容易成为瓶颈。如果条件受限做不到物理隔离至少要用 VLAN 隔离并在交换机上做流控策略。实施文档里我会画一张网络拓扑表列出每个网段的 IP 规划、VLAN ID、网关位置、连通性要求。比如管理网段 10.10.0.0/24VLAN 100网关在核心交换机业务网段 10.20.0.0/16按业务模块二次划分存储网段 10.30.0.0/24只允许存储节点和计算节点互访。这张表看起来简单但它决定了后续所有节点的网络配置。3.2 存储选型块存储、文件存储、对象存储按数据特征匹配存储方案的选型错误会直接导致性能不达标或成本失控。我的经验是按照数据的使用方式分三类虚拟机系统盘和数据盘需要随机读写、低延迟用 Ceph RBD 块存储企业内部文件共享、OA 附件、备份文件需要共享访问用 NFS 或 CephFS 文件存储海量非结构化数据比如图片、视频、日志归档用对象存储OpenStack 里对应 Swift也可以单独部署 MinIO。这三类存储在实施文档里需要分别给出配置基线。块存储要关注 IOPS 和延迟Ceph 的 pool 设置建议直接使用复制池不要用纠删码池虽然省空间但性能损耗明显。文件存储要关注吞吐量建议单独部署一个轻量级 NFS 网关不要把 CephFS 直接暴露给大量客户端否则元数据服务器会成为瓶颈。对象存储要关注桶策略和生命周期管理冷热数据自动分层能省不少成本。3.3 Ceph 部署参数PG 数量、副本数、OSD 分组这些坑绕不开Ceph 部署是存储部分实施难度最高的环节参数没调好会出现集群状态异常、数据分布不均、性能抖动一堆问题。我梳理几个必调的参数。第一个是 PGPlacement Group数量。PG 太少会导致单个 PG 管理的数据过多、单 OSD 负载不均衡PG 太多会消耗大量内存和 CPU。计算公式是(OSD 总数 × 100) / 副本数然后取最接近的 2 的幂次。比如 9 个 OSD、副本数 2PG 数应为 512。创建 pool 时要显式指定不然默认值可能不合理。第二个是 OSD 的内存和 osd_max_object_name_len。Ceph 的默认参数对物理内存小于 1G 的节点会降级为尽力而为模式导致性能大幅下降。我一般会把osd_memory_target设为 4G 或 8G前提是服务器物理内存足够。另外如果跑 OpenStackGlance 的镜像名称往往很长默认的 object name 长度限制会报错需要同步调大osd_max_object_name_len和osd_max_object_namespace_len。第三个是 OSD 的 CRUSH map 设计。不要把数据盘全部放在一个 host 下面否则一台机器挂掉副本全部丢失直接触发降级。我一般按机架或交换机做 failure domain让 Ceph 自动把副本分布到不同故障域。这个在部署初期就要定好后续改 CRUSH map 非常痛苦可能要重刷整个集群。实施文档里我会给出一段修改 CRUSH map 的示例命令和验证方法方便读者在部署时直接套用。4. 部署实操用脚本和配置文件把云平台搭起来4.1 环境准备操作系统、基础软件、SSH 互信一次配好部署实施的第一步是准备环境。我的经验是不要在裸机上直接开干先把所有节点的操作系统版本、yum 源、Java/Python 环境统一好避免后期因为版本不一致出现玄学问题。以下是一个环境准备脚本的示例# 设置主机名按控制节点、计算节点、存储节点分别执行 hostnamectl set-hostname controller01 # 配置 hosts 映射所有节点都要执行 cat /etc/hosts EOF 10.10.0.11 controller01 10.10.0.12 controller02 10.10.0.13 controller03 10.20.0.21 compute01 10.20.0.22 compute02 10.30.0.31 storage01 10.30.0.32 storage02 10.30.0.33 storage03 EOF # 配置本地 yum 源指向已经同步好的离线源 cat /etc/yum.repos.d/openstack.repo EOF [openstack] nameOpenStack baseurlhttp://10.10.0.100/openstack/rocky enabled1 gpgcheck0 EOF # 安装基础软件包 yum install -y vim net-tools wget lrzsz python3 python3-pip # 配置 SSH 免密登录从控制节点向其他节点同步公钥 ssh-keygen -t rsa -N -f /root/.ssh/id_rsa for host in controller02 controller03 compute01 compute02 storage01 storage02 storage03; do ssh-copy-id root${host} done这段脚本的逻辑是先统一主机名和 hosts 映射确保所有节点能通过主机名互相访问这比用 IP 写配置更可读后续出现问题也好排查。然后配置本地 yum 源强调离线源是因为很多企业内部环境不能访问外网在线安装会卡在依赖下载环节。最后配置 SSH 免密这是后续执行部署脚本和批量下发配置的基础。参数说明主机名建议按controller01、compute01、storage01这种命名规则来不要用node1、node2否则后期人肉排查时根本分不清节点角色。yum 源的 baseurl 要指向内网已经同步好的离线仓库具体地址按你们公司内部软件源服务器的 IP 填。SSH 免密只建议在部署和维护时使用生产环境要关掉 root 远程登录改用密钥认证和普通用户 sudo。4.2 用 Kolla-Ansible 部署 OpenStack一份配置文件管整个集群手动部署 OpenStack 要装几十个组件配置几百个参数容易出错且不可复现。我在正式项目中都改用 Kolla-Ansible用 Docker 容器方式把各服务跑起来配置集中在globals.yml里部署和升级都变成可重复的操作。以下是最小可用的 Kolla-Ansible 配置文件关键段落# /etc/kolla/globals.yml 核心配置片段 kolla_base_distro: centos kolla_install_type: source openstack_release: rocky # 指定控制节点和网络节点这些节点会运行 Controller 容器组 network_interface: eth0 api_interface: eth0 storage_interface: eth1 tunnel_interface: eth1 # 设置管理面虚拟 IP配合 Keepalived 实现多控制节点高可用 kolla_internal_vip_address: 10.10.0.250 kolla_internal_fqdn: openstack.example.com keepalived_virtual_router_id: 51 # 启用 Cinder 块存储服务 enable_cinder: yes enable_cinder_backend_lvm: no # 启用 Neutron 的 Open vSwitch 和 DPDK可选 enable_neutron_ovs: yes enable_neutron_dpdk: no这段配置的逻辑是先定义基础发行版和安装类型source类型会从源码构建镜像binary类型使用预编译二进制生产环境我选source以便打入内部补丁。然后指定各类网络流量走的物理网卡管理 API 和网络平面走 eth0存储流量走 eth1这样让 Kolla 容器内的网络配置与物理网络规划对齐。kolla_internal_vip_address是关键参数它是控制节点的虚拟 IP配合 Keepalived 实现故障自动切换。参数说明network_interface和api_interface设置为eth0表示管理面和 API 面在同一个物理网卡上如果网络规模大可以分开。storage_interface一定要设成存储网卡的设备名否则 Ceph 和 Glance 的流量会挤在管理网卡上。enable_cinder和enable_cinder_backend_lvm这对参数要一起看如果你没有独立的存储阵列可以用 LVM 后端做实验环境生产环境建议接 Ceph 或厂商存储。配置完成后执行部署命令# 生成密码文件 kolla-genpwd # 拉取/构建容器镜像首次执行耗时长建议配合本地 registry kolla-ansible pull # 开始部署-i 指定自定义 inventory 文件 kolla-ansible deploy -i /etc/kolla/multinode # 验证部署结果 kolla-ansible post-deploykolla-genpwd会生成所有服务的随机密码存在/etc/kolla/passwords.yml里生产环境建议手动替换为强密码并纳入密码管理。kolla-ansible pull是拉镜像内网环境记得提前构建好镜像并推送到本地 registry否则会卡很久。部署完成后用post-deploy生成openrc环境变量文件后续可以用 OpenStack 命令操作云平台。4.3 创建第一个云主机验证计算、网络、存储链路是否通云平台部署完不能直接交付要创建一台测试云主机把整个业务链路跑通。以下是用 OpenStack 命令创建云主机的完整流程# 加载环境变量 source /etc/kolla/admin-openrc.sh # 上传 Cirros 测试镜像精简版 Linux仅用于验证 openstack image create --file cirros-0.5.2-x86_64-disk.img --disk-format qcow2 --container-format bare cirros # 创建测试网络和子网 openstack network create test-net openstack subnet create --network test-net --subnet-range 192.168.100.0/24 --dns-nameserver 8.8.8.8 test-subnet # 创建路由连接外部网络否则云主机无法访问外网 openstack router create test-router openstack router add subnet test-router test-subnet openstack router set test-router --external-gateway public # 创建安全组规则放行 ICMP 和 SSH openstack security group rule create --proto icmp --ingress default openstack security group rule create --proto tcp --dst-port 22 --ingress default # 创建密钥对并导入 openstack keypair create --public-key ~/.ssh/id_rsa.pub admin-key # 创建规格2C4G并启动云主机 openstack flavor create --vcpus 2 --ram 4096 --disk 20 m1.small openstack server create --flavor m1.small --image cirros --nic net-idtest-net --security-group default --key-name admin-key test-vm这段命令的排查逻辑是先验证镜像服务Glance能不能正常上传镜像解决镜像格式和 Container format 的匹配问题再验证网络服务Neutron能不能创建网络和子网以及路由能不能打通外部访问最后验证计算服务Nova能不能正确调度资源创建虚拟机以及密钥注入和安全组规则是否生效。如果某一步失败根据报错信息回溯对应组件的日志。参数说明--disk-format qcow2和--container-format bare是镜像上传的通用参数如果镜像本身是 raw 格式disk-format要改为 raw。安全组只放行 ICMP 和 SSH 是为了最小验证生产环境按业务需要再配置。密钥对一定要提前生成并导入否则云主机创建成功后无法登录。测试完成后这条命令序列就是你交付文档里「业务验证」章节的核心内容。5. 云平台运维与避坑从部署到稳定运行的三十天5.1 控制节点 VIP 失联Keepalived 配置冲突导致管理面瘫痪现象部署完成后第二天登录控制节点管理界面发现页面打不开OpenStack 命令执行超时检查后发现10.10.0.250这个 VIP 无法 ping 通。原因多控制节点部署时Kolla-Ansible 生成的 Keepalived 配置文件可能和已有网络的 VRRP 报文产生冲突。排查发现网络里其他设备也在跑 VRRP占用了同一个虚拟路由器 ID导致新集群的 VIP 抢不过来。解决登录任意控制节点的物理 IP检查/etc/kolla/keepalived/keepalived.conf找到virtual_router_id参数把默认的51改成网段里没有使用的 ID例如102。改完后重启 Keepalived 容器docker restart keepalived ip addr show eth0 | grep 10.10.0.250这个坑的教训是如果你想跳过踩坑直接交付在globals.yml里配置keepalived_virtual_router_id时先 ping 一下对端确认这个 ID 在网络里没有冲突再启用。5.2 云主机网络不通安全组和路由表互相打架现象创建完测试云主机后从外部 ping 不通也 SSH 不上去但云主机在控制台看状态是 Active。原因第一反应是安全组没放行检查后发现安全组规则是对的。继续排查发现是路由配置的问题——测试子网关联到了路由器但路由器的外部网关指向的public网络是扁平网络没有配置好外部网关对应的物理网络连通性。解决检查路由器的外部网关是否成功绑定使用openstack router show test-router查看。如果对外网关显示空需要确认public网络是否创建了子网且子网范围覆盖了外部网络实际规划的业务网段。最常见的一个错误是创建外部网络时用了--external参数但没有指定物理网络类型导致 Neutron 不知道把流量从哪个物理网卡发出去。修改外部网络配置后重建测试云主机即可恢复。5.3 Ceph 集群 HEALTH_WARNPG 分布不均和时钟偏移现象部署完 Ceph 后执行ceph -s看到状态不是HEALTH_OK而是PG_AVAILABILITY和CLOCK_SKEW两类告警同时出现。原因PG 分布不均是因为新建 pool 时 PG 数量设置过小比如只有 64导致部分 OSD 负载明显偏高。时钟偏移是因为存储节点的chrony服务没有配置好节点之间时间差超过 0.05 秒触发 Ceph 的时钟同步告警。解决先通过ceph osd pool set poolname pg_num调整 PG 数量但注意只能调大不能调小且要同时调整pgp_num。然后检查chrony配置文件把注释掉的allow和local stratum选项打开重启服务systemctl restart chronyd ceph -c /etc/ceph/ceph.conf health detail这个案例的关键是配置 Ceph 时先关注时钟同步不要急着调性能参数。存储节点的时间漂移是 Ceph 集群最常见的隐性问题初期看不出影响运行一周后会出现大量慢请求。5.4 Kolla 容器频繁重启宿主机内存不足导致 OOM Kill现象部署完成后控制节点的 Nginx 容器频繁重启查看容器日志发现 OOM 错误。原因控制节点只有 16G 内存Kolla 容器组需要的内存超过物理内存限制。Nginx 作为反向代理跑在控制节点默认配置的缓存占用较高加上其他容器的内存开销触发了 Linux 内核的 OOM Killer。解决调整globals.yml中与内存相关的参数主要是限制 Nginx 缓存大小或者在控制节点上增加内存。更实用的做法是减少控制节点的容器数量——把不需要的组件关掉比如如果不上云主机可以不用enable_cinder如果只做 K8s 底层存储可以不启用 Swift。调整配置后重新执行kolla-ansible reconfigure而不是重新 deploy可以保留现有数据。5.5 更换云主机在宿主机上的分布手动迁移还是自动平衡现象云平台运行一个月后发现某个计算节点 CPU 和内存使用率明显高于其他节点云主机负载不均衡。原因Nova 的调度器是创建时的一次性选择后续不会自动迁移云主机。业务增长后新创建的主机可能集中在资源较多的节点上旧业务的主机则留在老节点导致负载不均。解决有两种处理方式。手动迁移适合少数虚拟机通过openstack server migrate命令迁移后需要确认状态是否为VERIFY_RESIZE再执行openstack server confirm resize使迁移生效。自动平衡适合大批量虚拟机在计算节点上配置 Nova 的aggregate_instance_extra_specs把相同规格的主机聚合到同一组或者用placement服务做更细致的资源筛选。不过自动迁移对运行中的业务有中断风险建议在夜间维护窗口执行。6. 验收交付与进阶验证从能用到好用要补的几个细节6.1 用 CloudKitty 和 Grafana 验证成本与性能基线交付时只验证「能不能用」是不够的。我会额外做两个验证成本追踪和性能基线。用 CloudKitty 做云平台成本核算设置不同规格虚拟机的单价生成账单报表用 Ceilometer 采集监控数据推送到 Gnocchi 再展示到 Grafana用来观察宿主机 CPU、内存、磁盘 IO 的实时趋势。这个验证的意义是提前暴露性能瓶颈。比如我遇到过某个项目的计算节点存储网卡带宽只有 1G 而 Ceph 的副本流量超过 1G结果部署后业务高峰期虚拟机磁盘延迟飙升。如果验收阶段就把存储网的吞吐量压测纳入范围这个问题在交付前就能发现。6.2 备份恢复演练没有人想在生产环境测这条命令很多实施文档把备份方案写在附录里一笔带过。我的习惯是把备份恢复演练作为验收的强制项。对控制节点备份/etc/kolla下的所有配置文件和passwords.yml执行恢复时直接用相同版本的 Kolla-Ansible 重新部署然后把配置文件和密码文件放回去。对云主机数据块存储卷的备份用 Cinder 的openstack volume backup create命令生产环境建议把备份数据放到独立的备份存储池不要和运行数据混在一起。6.3 参数调优的底线哪些可以动哪些连碰都不要碰最后聊一个经验性的话题参数调优的边界。我在项目里见过运维同学为了提升性能把 Ceph 的osd_pool_default_size从 2 改成 1结果一块磁盘损坏导致数据全部丢失。也见过把 Nginx 容器内存上限调太高导致控制节点 OOM。我的习惯是存储相关的数据冗余系数、副本数、故障域划分这些是数据安全的底线只能按照官方推荐值配置不要自作聪明。性能调优优先调网络和计算层面的参数比如队列长度、CPU 模式、内存页大小这些对业务影响是软性的极端情况下可以回退。至于那些玄学一样的疑难杂症比如某台宿主机发出缺页中断导致虚拟机卡顿或者 Ceph 深度清理时性能骤降我的经验是不要上来就改数据面参数。先查日志再确认是不是磁盘老化或硬件故障优先通过更换硬件解决。软件层面的参数调优往往治标不治本还容易引入新的问题。这个项目给我最大的教训是云计算实施文档不是写给评审专家看的是写给三个月后的自己以及接手的同事看的。方案里每一个参数、每一个选型理由都要经得起推敲——当生产环境故障灯亮起的时候你唯一能依赖的就是文档里写下来的判断依据。希望这份基于实战的经验梳理能帮你在下一个云计算项目里少走几步冤枉路。本文还有配套的精品资源点击获取
返回列表