K8S实践 - Promethues从VM迁移K8S实录

本文涉及的产品
可观测可视化 Grafana 版,10个用户账号 1个月
可观测监控 Prometheus 版,每月50GB免费额度
简介: 公司落地容器化及Kubernetes,既有的监控部署在虚拟机上,需要迁移到K8S集群中来缩减虚拟机的开销,我们基于Prometheus的监控系统搭建近一年,保存数据周期为180填,目前的数据量在800GB左右,下面讲述的是我们的迁移方案及迁移过程。

背景

公司落地容器化及Kubernetes,既有的监控部署在虚拟机上,需要迁移到K8S集群中来缩减虚拟机的开销,我们基于Prometheus的监控系统搭建近一年,保存数据周期为180填,目前的数据量在800GB左右,下面讲述的是我们的迁移方案及迁移过程。

方案

1. Kubernetes集群内

  • 创建好存储,PV,PVC
  • 创建好StatefulSet,Service等
  • 在K8S内拉起Prometheus+Grafana
  • 测试验证,验证通过后kubectl delete删除相关的实例,保留好yaml

2. 旧Prometheus及Grafana实例上

  • 将K8S集群内刚刚验证好的那块盘挂载到待迁移数据机器实例上
  • 迁移数据
  • 修改数据所属组及权限
  • 卸载新盘

3. Kubernetes集群内

  • 再次部署预定义好并经过测试的yaml
  • 观察,测试
  • 切换Grafana数据源,指向K8S中的Prometheus

实施过程

K8S集群内拉起新Prometheus

 kubectl logs prometheus-ecs-0 -n monitoring
...
level=info ts=2019-07-08T04:14:50.715Z caller=main.go:714 msg="Notifier manager stopped"
level=info ts=2019-07-08T04:14:50.715Z caller=main.go:544 msg="Scrape manager stopped"
level=error ts=2019-07-08T04:14:50.715Z caller=main.go:723 err="opening storage failed: mkdir data/: permission denied"

权限问题报错了,增加securityContext相关描述,再试,此处参考Google-Groups或者Github Issue

kind: StatefulSet
metadata:
  name: prometheus-ecs
  namespace: monitoring
spec:
  serviceName: "prometheus-ecs"
  selector:
    matchLabels:
      app: prometheus-ecs
  template:
    metadata:
      labels:
        app: prometheus-ecs
    spec:
      ...
      securityContext:
        runAsUser: 1000
        fsGroup: 2000
        runAsNonRoot: true
      ...

增加描述后重新拉起POD,数据能够正常生成了,看下面的data文件夹

/prometheus $ ls -l
total 5242908
drwxr-sr-x    3 1000     2000          4096 Jul  8 04:26 data
drwxrwsr-x    4 root     2000          4096 Jul  8 04:09 k8s-resource-monitoring
drwxrwS---    2 root     2000         16384 Jul  8 02:37 lost+found

接下来我们kubectl delete删除刚刚创建的所有对象,把yaml准备好,然后把磁盘挂载到计划迁移的机器上,同步数据。

将磁盘挂载到旧Prometheus机器上

挂载创建的目标磁盘到旧Prometheus的虚拟机上,然后用rsync将数据追平,注意用--bwlimit控制速度,不然可能会导致磁盘打满影响线上性能,我们是SSD盘所以指定200M依然剩余100M的速度空间保证线上使用。

rsync -av --bwlimit=200M --delete --progress --log-file=/tmp/rsync.log /data/coohua/prometheus/data /data1/data

确认迁移过程中系统稳定,各项参数正常

# dstat -a
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw 
 28   0  72   0   0   0| 652k  666k|   0     0 |   0     0 |1953  1401 
 37   4  54   5   0   0| 141M  237M| 344k 5408B|   0     0 |6918  5466 
 39   6  47   9   0   0| 205M  293M|  17k 3006B|   0     0 |7477  5874 
 48   6  38   8   0   0| 201M  306M| 959k   10k|   0     0 |8001  5705 
 50   5  45   0   0   0| 187M   12M|  83k 3531B|   0     0 |7589  5135 
 41   6  50   3   0   0| 204M  113M| 360k   11k|   0     0 |9505  8630 
 38   5  47   9   0   1| 177M  204M|  84k 1468B|   0     0 |8268  7147 
 71   5  20   4   0   0| 147M  308M| 131k 4766B|   0     0 |8334  5281 
 94   4   2   0   0   0| 132M  301M| 180k 4392B|   0     0 |9274  5789 
 46   5  48   0   0   0| 210M   42M| 393k 5334B|   0     0 |7928  6030 
 40   5  55   0   0   0| 190M    0 | 361k   16k|   0     0 |6994  5119 
 28   5  58   9   0   0| 156M  228M|  80k 3554B|   0     0 |5414  4121 

# top
top - 14:21:03 up 186 days, 23:07,  2 users,  load average: 6.36, 5.54, 5.07
Tasks: 144 total,   4 running, 140 sleeping,   0 stopped,   0 zombie
%Cpu0  : 85.0 us,  0.0 sy,  0.0 ni, 15.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  : 29.1 us,  1.0 sy,  0.0 ni, 61.6 id,  7.9 wa,  0.0 hi,  0.3 si,  0.0 st
%Cpu2  : 27.1 us,  3.3 sy,  0.0 ni, 69.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  : 66.3 us,  1.7 sy,  0.0 ni, 29.0 id,  3.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu4  : 37.3 us, 11.0 sy,  0.0 ni, 51.0 id,  0.7 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu5  : 31.8 us,  8.4 sy,  0.0 ni, 54.2 id,  5.7 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu6  : 61.8 us,  3.0 sy,  0.0 ni, 34.6 id,  0.7 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu7  : 31.5 us, 12.2 sy,  0.0 ni, 46.1 id, 10.2 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 16267428 total,   160392 free,  7907888 used,  8199148 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  7989000 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                                                   
 4903 coohua    20   0  0.682t 7.784g 817072 S 279.7 50.2  62469:47 prometheus                                                                                                                                                                
20712 root      20   0  129656   1180    332 R  62.1  0.0   2:10.42 rsync                                                                                                                                                                     
20710 root      20   0  129696   2348   1232 R  56.1  0.0   1:53.88 rsync                                                                                                                                                                     
   61 root      20   0       0      0      0 S   6.6  0.0 110:21.78 kswapd0    

# iostat -xdm 1
Linux 3.10.0-514.26.2.el7.x86_64 (monitor-storage001)     2019年07月08日     _x86_64_    (8 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     0.64    0.06    1.33     0.00     0.01    17.52     0.01    7.71   23.99    6.95   0.86   0.12
vdb               0.01     0.36    4.11    1.88     0.67     0.64   446.97     0.04    7.46   10.11    1.67   1.35   0.81
vdc               0.00     0.00    0.00    0.08     0.00     0.04   959.25     0.01  179.72   32.19  179.79   1.54   0.01

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
vdb               0.00     2.00  359.00    2.00   160.00     0.02   907.79     3.16    8.33    8.37    1.00   1.34  48.50
vdc               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
vdb               1.00     0.00  470.00    8.00   208.55     3.44   908.30     4.50    9.82    9.48   30.00   1.31  62.40
vdc               0.00     8.00    0.00  409.00     0.00   190.92   955.99    68.50  154.77    0.00  154.77   1.47  60.30

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     4.00    0.00    2.00     0.00     0.02    24.00     0.00    0.50    0.00    0.50   0.50   0.10
vdb               0.00     0.00  457.00    0.00   202.09     0.00   905.65     4.32    9.48    9.48    0.00   1.33  61.00
vdc               0.00     0.00    0.00  640.00     0.00   300.49   961.58   127.32  194.03    0.00  194.03   1.56 100.10
  

坐等数据同步完毕

磁盘再次挂载到POD中使用迁移过来的数据

数据迁移完成了,查看迁移过程中磁盘的读写情况,由于我们限速为200MiB,所以情况如预期

注意修改数据权限,要不然到时候POD又起不来

# umount -l /data1
# chown -R 1000:2000 /data1/data

PV/PVC没删干净会出现下面的问题,PV处于Released状态不能再次使用

kubectl get pvc -n monitoring pv-metrics-ecs-promethues
NAME                        STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pv-metrics-ecs-promethues   Pending   

kubectl get pv -n monitoring pv-metrics-ecs-promethues 
NAME                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                                  STORAGECLASS   REASON   AGE
pv-metrics-ecs-promethues   1Ti        RWX            Retain           Released   monitoring/pv-metrics-ecs-promethues   disk                    3h32m

简单粗暴的删除PV/PVC重建即可
然后在Kubernetes内启动原来准备好的StatefulSet即可,就会直接用迁移后的数据了,然后创建NodePort类型的Service,用来让还没迁移进K8S的Grafana连接
接下来修改Grafana的数据源,指向迁移后的Prometheus,大功告成,迁移过程中断服务丢失的数据<10分钟

总结 & 思考

不完美的方案,但是简单可行

数据同步完成后然后在K8S中拉起POD,POD初始化后Prometheus需要处理数据,然后开始拉新数据,这个过程中中断的时间可能要10至15分钟,也就是说最少要丢失10至15分钟的监控数据,这个我们从业务上衡量是可以接受的,找一个合适的时间操作即可。
有完美的方案吗?
官方社区Prometheus的Developer提到的方案是,起一个新的实例跑同样的配置,等到足够长的时间,旧的自然就退休了,这个可能是最完美的方案,但是在我们的场景,我们数据保存180天将近1T的数据,而且使用SSD作为存储,这个退休的时间内我们的硬件成本是双倍的,从经济上考虑,我们还是否定了这个方案。

慎用NFS为存储的PV

第一次尝试迁移使用了NFS,因为云提供商的特性,NFS较为经济,而且可以多处挂载,数据的管理也是十分的便利,但是迁移过来后测试发现,一个大的查询就差点把网卡跑满,load瞬间爆炸,赶紧下线。所以在重IO的场景,真的慎重考虑NFS,一定要做好性能评估。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
516 2
|
7月前
|
存储 负载均衡 测试技术
ACK Gateway with Inference Extension:优化多机分布式大模型推理服务实践
本文介绍了如何利用阿里云容器服务ACK推出的ACK Gateway with Inference Extension组件,在Kubernetes环境中为多机分布式部署的LLM推理服务提供智能路由和负载均衡能力。文章以部署和优化QwQ-32B模型为例,详细展示了从环境准备到性能测试的完整实践过程。
|
8月前
|
存储 人工智能 Kubernetes
ACK Gateway with AI Extension:面向Kubernetes大模型推理的智能路由实践
本文介绍了如何利用阿里云容器服务ACK推出的ACK Gateway with AI Extension组件,在Kubernetes环境中为大语言模型(LLM)推理服务提供智能路由和负载均衡能力。文章以部署和优化QwQ-32B模型为例,详细展示了从环境准备到性能测试的完整实践过程。
|
8月前
|
存储 人工智能 物联网
ACK Gateway with AI Extension:大模型推理的模型灰度实践
本文介绍了如何使用 ACK Gateway with AI Extension 组件在云原生环境中实现大语言模型(LLM)推理服务的灰度发布和流量分发。该组件专为 LLM 推理场景设计,支持四层/七层流量路由,并提供基于模型服务器负载感知的智能负载均衡能力。通过自定义资源(CRD),如 InferencePool 和 InferenceModel,可以灵活配置推理服务的流量策略,包括模型灰度发布和流量镜像。
|
12月前
|
Kubernetes 持续交付 开发者
探索并实践Kubernetes集群管理与自动化部署
探索并实践Kubernetes集群管理与自动化部署
436 93
|
9月前
|
Kubernetes 监控 Serverless
基于阿里云Serverless Kubernetes(ASK)的无服务器架构设计与实践
无服务器架构(Serverless Architecture)在云原生技术中备受关注,开发者只需专注于业务逻辑,无需管理服务器。阿里云Serverless Kubernetes(ASK)是基于Kubernetes的托管服务,提供极致弹性和按需付费能力。本文深入探讨如何使用ASK设计和实现无服务器架构,涵盖事件驱动、自动扩展、无状态设计、监控与日志及成本优化等方面,并通过图片处理服务案例展示具体实践,帮助构建高效可靠的无服务器应用。
|
9月前
|
监控 Kubernetes Cloud Native
基于阿里云容器服务Kubernetes版(ACK)的微服务架构设计与实践
本文介绍了如何基于阿里云容器服务Kubernetes版(ACK)设计和实现微服务架构。首先概述了微服务架构的优势与挑战,如模块化、可扩展性及技术多样性。接着详细描述了ACK的核心功能,包括集群管理、应用管理、网络与安全、监控与日志等。在设计基于ACK的微服务架构时,需考虑服务拆分、通信、发现与负载均衡、配置管理、监控与日志以及CI/CD等方面。通过一个电商应用案例,展示了用户服务、商品服务、订单服务和支付服务的具体部署步骤。最后总结了ACK为微服务架构提供的强大支持,帮助应对各种挑战,构建高效可靠的云原生应用。
|
11月前
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
本文整理自2024云栖大会冯诗淳(花名:行疾)的演讲,介绍了阿里云容器服务团队在生产级可观测体系建设方面的实践。冯诗淳详细阐述了容器化架构带来的挑战及解决方案,强调了可观测性对于构建稳健运维体系的重要性。文中提到,阿里云作为亚洲唯一蝉联全球领导者的容器管理平台,其可观测能力在多项关键评测中表现优异,支持AI、容器网络、存储等多个场景的高级容器可观测能力。此外,还介绍了阿里云容器服务在多云管理、成本优化等方面的最新进展,以及即将推出的ACK AI助手2.0,旨在通过智能引擎和专家诊断经验,简化异常数据查找,缩短故障响应时间。
阿里云ACK容器服务生产级可观测体系建设实践
|
9月前
|
监控 Cloud Native Java
基于阿里云容器服务(ACK)的微服务架构设计与实践
本文介绍如何利用阿里云容器服务Kubernetes版(ACK)构建高可用、可扩展的微服务架构。通过电商平台案例,展示基于Java(Spring Boot)、Docker、Nacos等技术的开发、容器化、部署流程,涵盖服务注册、API网关、监控日志及性能优化实践,帮助企业实现云原生转型。
|
9月前
|
运维 分布式计算 Kubernetes
ACK One多集群Service帮助大批量应用跨集群无缝迁移
ACK One多集群Service可以帮助您,在无需关注服务间的依赖,和最小化迁移风险的前提下,完成跨集群无缝迁移大批量应用。

热门文章

最新文章

推荐镜像

更多