Kubernetes部署OpenStack的实践与优化
1. 为什么要在Kubernetes上部署OpenStack?
这个问题困扰了我整整三个月。作为某金融云平台的架构师,当我第一次提出要把OpenStack迁移到Kubernetes时,团队里几位资深工程师直接摔了键盘——"你疯了吗?OpenStack本来就是IaaS,现在要跑在容器编排系统上?"
但当我们完成POC验证后,这些反对者都成了最积极的推动者。Kubernetes提供的声明式API、自动化运维能力和弹性扩缩特性,恰好解决了传统OpenStack部署中最棘手的几个问题:
- 部署效率提升80%:传统Fuel部署需要2天,K8s Operator只需2小时
- 故障恢复时间从小时级降到分钟级:Pod崩溃后K8s自动重建
- 资源利用率提高3倍:通过K8s的bin packing算法优化VM调度
重要提示:生产环境部署必须使用经过验证的OpenStack Helm Charts或Airship项目,不要尝试从零开始编写CRD。
1.1 架构设计的核心挑战
将OpenStack控制平面容器化不是简单的"搬上K8s",需要解决几个关键问题:
有状态服务处理:
- 数据库(MySQL/Galera)必须使用StatefulSet
- RabbitMQ集群需要headless service配合
- 消息队列持久化卷要配置StorageClass
网络性能瓶颈:
- Neutron的OVS组件需要hostNetwork模式
- Calico与Neutron的集成方案选择
- DPDK加速在容器环境下的实现
认证体系整合:
- Keystone与K8s RBAC的权限映射
- 服务账户的跨系统认证流程
我们在测试集群中曾因忽略OVS的网卡直通配置,导致网络吞吐量暴跌70%。后来通过给kubelet配置--allowed-unsafe-sysctls=net.*参数才解决。
2. 生产级部署方案选型
经过对比主流方案,我们的技术选型路径如下:
| 方案 | 优势 | 缺陷 | 适用场景 |
|---|---|---|---|
| OpenStack Helm | 官方维护,组件齐全 | 部署复杂,调试困难 | 大型生产环境 |
| Airship 2.0 | 声明式管理,集成MetalLB | 学习曲线陡峭 | 电信级部署 |
| Kolla-Kubernetes | 容器镜像经过优化 | 文档较少 | 已有Kolla经验团队 |
| 自研Operator | 完全定制化 | 开发成本高 | 特殊架构需求 |
最终选择OpenStack Helm方案,主要基于:
- 金融行业对官方组件的合规要求
- 需要同时支持Train和Wallaby版本
- 已有专业的K8s运维团队
2.1 硬件资源配置基准
根据我们的压力测试数据,建议的最低配置:
control_plane: nodes: 3 vCPU: 16 Memory: 64GB Storage: - 200GB (系统盘) - 500GB (Ceph OSD) compute_nodes: nodes: 3+ vCPU: 32 Memory: 128GB SR-IOV网卡: 2端口10Gbps特别注意:必须为每个控制平面节点配置Bonding网卡,我们曾因单网卡故障导致整个AZ瘫痪。
3. 关键组件部署实战
3.1 Ceph存储集群部署
这是最易出错的环节,分享我们的避坑清单:
OSD准备:
# 必须预先创建LVM卷 pvcreate /dev/nvme0n1 vgcreate ceph-vg /dev/nvme0n1 lvcreate -L 500G -n osd1 ceph-vgHelm values配置:
ceph: config: osd_pool_default_size: 3 osd_crush_update_on_start: false dashboard: enabled: false # 生产环境必须关闭性能调优:
- 设置
bluestore_block_db_size: "4GB" - 启用
osd_op_num_threads_per_shard: 2
- 设置
血泪教训:永远不要在Ceph集群未完成peering时强制重启Pod,这会导致PG处于inconsistent状态。我们因此丢失过一个测试环境的Glance镜像池。
3.2 Neutron网络方案对比
测试三种网络方案后的性能数据:
| 方案 | 网络延迟(μs) | 吞吐量(Gbps) | 适用场景 |
|---|---|---|---|
| Calico + VXLAN | 180 | 8 | 开发测试环境 |
| OVN-Kubernetes | 150 | 12 | 中等规模生产 |
| SR-IOV Passthrough | 28 | 25 | 高性能计算 |
选择OVN方案时需要特别注意:
# 必须设置巨帧 ansible -i inventory k8s-node -m shell -a \ "ip link set eth0 mtu 9000"4. 高可用设计要点
4.1 多AZ部署策略
我们的部署架构:
Region: RegionOne AZ: - az1 (k8s-node01-03) - az2 (k8s-node04-06) - az3 (k8s-node07-09)关键配置:
nova: scheduler: default_availability_zone: az1 default_schedule_zone: az1 cells: enable: true4.2 故障转移测试方案
建议定期执行以下测试:
- 随机删除control plane Pod验证重建
- 断掉一个AZ的网络连接
- 模拟Ceph OSD故障
- 强制重启所有etcd节点
我们设计的自动化测试脚本:
def test_pod_recovery(deployment): original_pods = get_pod_count(deployment) delete_random_pod(deployment) assert wait_for( lambda: get_pod_count(deployment) == original_pods, timeout=300 )5. 监控与日志方案
5.1 Prometheus监控指标
必须监控的核心指标:
openstack_api_request_duration_secondsrabbitmq_queue_messages_readyceph_osd_upneutron_agent_state
我们的Grafana看板配置示例:
sum(rate(openstack_api_request_duration_seconds_count[5m])) by (service)5.2 日志收集优化
使用Loki收集日志时的关键过滤规则:
pipeline_stages: - regex: expression: '^(?P<timestamp>\S+) (?P<level>\w+) (?P<component>\S+) (?P<message>.*)' - labels: level: component:曾因日志量过大导致ES集群崩溃,后来通过以下措施解决:
- 为Nova API设置
debug=False - 使用Fluentd的
buffer_chunk_limit限制 - 对Neutron日志单独配置采样率
6. 升级与维护实战
6.1 原地升级方案
从Train升级到Wallaby的步骤:
- 先升级Helm chart版本
- 按顺序滚动更新:
helm upgrade openstack/keystone --version 3.0.0 helm upgrade openstack/glance --version 2.0.0 - 最后执行数据库迁移:
ALTER TABLE nova.instances ADD COLUMN new_feature TEXT;
6.2 日常维护命令
常用诊断命令合集:
# 查看Pod资源使用 kubectl top pod -n openstack # 检查Neutron agent状态 openstack network agent list # 强制GC Ceph存储 kubectl exec -it ceph-osd-0 -- radosgw-admin gc process记住:任何维护操作前必须先执行kubectl cordon node!我们曾因忘记此步骤导致计算节点同时重启,触发VM大规模迁移。