鸿鹄协助管理华为云与炎凰Ichiban

炎凰对华为云的需求

在炎凰日常的开发中,对于服务器上的需求,我们基本都是采用云服务。目前我们主要选择的是华为云,华为云的云主机比较稳定,提供的云主机配置也比较多样,非常适合对于不同场景硬件配置的需求,而且在技术支持服务上,响应速度也非常快。

一般来说,我们主要会采购一些包年的云主机,来满足日常的研发和测试。但是同事们也会碰到一些adhoc的需求,比如:对于用户碰到的问题,我们需要在一个实验环境复现它们,我们会临时开几台云主机来模拟客户的环境。

随着炎凰数据的员工越来越多,这样临时创建机器的需求也越来越多。我们发现,华为云的API在功能上非常完整,且华为云的API Explorer是个非常方便的Debug和测试的工具。于是我们通过API快速地开发了Ichiban,这是一个内部创建云主机的工具。

炎凰Ichiban简介

为什么叫Ichiban?因为炎凰有啤酒文化,公司的冰箱中除了饮料,更放满了各种各样的精酿啤酒,我们每周五都会有技术分享会,同时也是一周一度的Happy hour,啤酒+食物无限量供应。所以我觉得Ichiban+烤串是我们炎凰程序员的夏天必备,随时欢迎来炎凰喝啤酒~

首先,Ichiban的登录界面是下图这样。因为我们使用Microsoft Azure AD来管理我们员工的账号,所以我们调用微软的API来进行登录,并记录和管理用户信息。

图片

登录后,就可以看到创建的云主机信息。

图片

从这一层开始,都调用华为云的API来实现,功能上包括了:

创建云主机

云主机开机、关机、重启、远程登录和删除

延长云主机租期

增加硬盘等等

Ichiban 的技术栈

我们使用的是华为云的Python SDK,这里不得不再次称赞华为云的API Explorer,是个能够提供快速开发功能的工具,能够根据你键入的值自动生成代码。

图片

之后也可以使用华为云提供的‘SDK代码示例调试’中调试代码,而且是我们都熟悉的VS Code的风格。截个图,自己体会,常使用VS Code开发的朋友是不是很熟悉?

图片

因为我们使用Python作为开发语言,所以用了 Flask + Gunicorn + Supervisor 来托管Web服务。

Flask 因为本身就是Python编写,所以对Python的契合度就很高,而且是一个轻量级的Web应用框架。

Gunicorn 是作为Flask的WSGI HTTP服务器。它所在的位置通常是在反向代理(如 Nginx)或者负载均衡(如 AWS ELB)和一个web应用(比如 Django 或者 Flask)之间。

这里只要把Flask 的5000端口托管起来即可,配置如下:

图片

Supervisor 的服务进程为supervisord,主要用来在启动自身时启动管理的子进程,响应客户端的命令,重启崩溃或退出的子进程,记录子进程stdout和stderr输出,生成和处理子进程生命周期中的事件。可以在一个配置文件中配置相关参数,包括Supervisord自身的状态。在/etc/supervisord.d/xxxxx.ini 创建子进程,其管理的各个子进程的相关属性。配置文件一般位于/etc/supervisord.conf。

例如:子进程配置/etc/supervisord.d/ichiban.ini

图片

Supervisor 的客户端称为supervisorctl,它提供了一个类shell的接口(即命令行)来使用supervisord服务端提供的功能。通过supervisorctl,用户可以连接到supervisord服务器进程,获得服务器进程控制的子进程的状态,启动和停止子进程,获得正在运行的进程列表。

客户端通过Unix域套接字或者TCP套接字与服务端进行通信,服务器端具有身份凭证认证机制,可以有效提升安全性。当客户端和服务器位于同一台机器上时,客户端与服务器共用同一个配置文件/etc/supervisord.conf,通过不同标签来区分两者的配置。

重启进程时可以运行:

图片

鸿鹄收集来华为云的数据

问题来了。。。

Ichiban的代码我们写好了,功能实现了,解决了开发者使用云主机的问题,但是作为ichiban的管理者,我也碰到了问题,我该如何管理?我如何知道我每月消费了多少费用,以及详细的使用情况?

设想下随着公司同事越来越多,ichiban的使用量必然会增长,费用也会增长。老板问能不能每月或者一个季度对Ichiban做个预算,这时候没有数据的支撑,我们很难拿出数字来做下一次的预算。

这时鸿鹄的价值就凸显出来了,鸿鹄能够帮助我们通过日志文件,非常简单而又清晰地,统计出云主机的开机时间、云主机的数量、进而估算出费用。

Ichiban的日志是调用华为云的API生成的JSON格式的日志文件,然后通过fluentd发送到鸿鹄的平台。(也可以使用Vector作为数据传输工具)。本例中,log的数据类型为JSON,其实,大家可以根据自己的实际情况选择不同的数据类型。鸿鹄不挑数据类型,有什么数据,就接什么类型的数据,就Parse什么类型的数据。

鸿鹄端

加了台便宜的云主机,按照文档(https://yanhuang.yuque.com/books/share/b1b27937-e331-40fd-bce1-bd521af4e662/vvv9si)一顿操作,安装好了鸿鹄。那只蓝色鸿鹄的logo就出现了。

在鸿鹄中创建HEI(通过HTTP采集数据)

图片

颁发Ichiban的API Token

图片

Ichiban端

安装Fluentd

图片

配置fluentd的监控数据

图片

修改以下配置

图片

可能需要配置fluentd service的root权限,视监控的文件权限而定

图片

收到数据了,哟吼。。。

图片

华为云使用状况的dashboard展示

通过简单的SQL query,我们就可以实时的统计出,Ichiban的使用情况。

图片

我这里也节选了一些配置的使用情况

图片

数据展示我看到了什么?

华为云使用情况。作为华为云的管理者,我能清晰地了解一段时间中,华为云Adhoc的需求有多少,比如用了多少台云主机,分别用了多少时间。

使用者。从统计上可以找到谁是重度使用者,从使用者中了解需求,从而优化。

费用统计。如上图,我们可以清楚地知道我们每个月华为云的费用组成。不过实话实说,通过临时创建机器这种策略,我们减少了很多不必要的费用。

写在最后

华为云的API和相关工具做的很好,功能也很快就能够实现。但是对于管理者,费用上的管理和运维工作也存在着挑战。不过有了鸿鹄,这一切就变的简单了很多,只要有足够的日志,加上简单的SQL语句,让管理者头疼的问题就迎刃而解。

另外通过实时数据的分析,也能快速找到一些问题,比如我们可以对云主机的开机时间加上告警,假设:张三的一个云主机开了很长一段时间,有可能项目上的需要,也有可能某某忘记关闭了。那通过策略,发出告警(Email或者Webook),对张三进行通知,减少不必要的费用。

我们还有很多东西要做

展望下,我们Ichiban的后续开发还会继续做,把Ichiban、华为云和我们的CICD串联在了一起,通过华为云的API创建出临时的git runner、test runner 等,再通过鸿鹄监控CI/CD,好处:

1、鸿鹄能够帮助troubleshooting CI/CD的问题。

2、将CI/CD的运行状况放在仪表盘中。

3、减少不必要的费用,比如,我们可能某个测试要跑8个小时,有可能在某一小时是Case就中断了,鸿鹄能够提醒我们,我们可以通过手动或者trigger 脚本,对已经没有工作任务的runner进行删除。

一旦数据接入到鸿鹄,数据可玩性的大门就打开了,只要通过简单SQL,就可以发现很多有趣的东西,甚至是你从来没想到过的东西,可能是一个强大功能的启发,也有可能是发现漏洞的检测器。几行SQL就可以把你的数据弄得明明白白。

enjoy 鸿鹄~

大数至简

参考

华为云API :

https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=ECS&api=NovaCreateServers

Supervisor的文档:

https://zhuanlan.zhihu.com/p/424346764

炎凰数据:

http://www.yanhuangdata.com/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/49605.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

石子合并(区间dp模板)

题目描述&#xff1a; dp分析&#xff1a; 解题代码&#xff1a; #include<iostream> using namespace std;const int N1e36;int f[N][N]; int a[N]; int s[N];int main(){int n;cin>>n;for(int i1;i<n;i){scanf("%d",&s[i]);s[i]s[i-1];//前缀和…

2.1数据结构——线性表

一、定义 线性表是具有相同数据类型的n&#xff08;n>0&#xff09;个数据元素的有限序列&#xff0c;&#xff08;n表示表长&#xff0c;n0为空表&#xff09; 用L表示&#xff1a; 位序&#xff1a;线性表中的“第i个” a1是表头元素&#xff1b;an是表尾元素 除第一个…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(8)-Fiddler如何设置捕获会话

1.简介 前边几篇宏哥介绍了Fiddler界面内容以及作用。今天宏哥就讲解和分享如何设置Fiddler后&#xff0c;我们就可以捕获会话&#xff0c;进行抓包了。 2.捕获会话的设备 常见的捕获会话的设备分为PC&#xff08;电脑&#xff09;端和手机&#xff08;Android和IOS苹果&…

【SpringⅢ】Spring 的生命周期

目录 &#x1f96a;1 Bean 的作用域 &#x1f969;1.1 singleton&#xff1a;单例模式 &#x1f359;1.2 prototype&#xff1a;原型模式 &#x1f371;1.3 Bean 的其他作用域 &#x1f35c;2 Spring 生命周期(执行流程) &#x1f958;2.1 启动容器 &#x1f372; 2.2 读…

Elasticsearch:使用 ELSER 释放语义搜索的力量:Elastic Learned Sparse EncoderR

问题陈述 在信息过载的时代&#xff0c;根据上下文含义和用户意图而不是精确的关键字匹配来查找相关搜索结果已成为一项重大挑战。 传统的搜索引擎通常无法理解用户查询的语义上下文&#xff0c;从而导致相关性较低的结果。 解决方案&#xff1a;ELSER Elastic 通过其检索模型…

vue elementui table去掉滚动条与实现表格自动滚动且无滚动条

当table内容列过多时&#xff0c;可通过height属性设置table高度以固定table高度、固定表头&#xff0c;使table内容可以滚动。 现在需求是右侧滚动条不好看&#xff0c;需要去除滚动条&#xff0c;并隐藏滚动条所占列的位置。让他可以滚动但是不出现滚动条,不然即时隐藏了滚动…

Mybatis学习笔记

Mybatis 文章目录 Mybatis搭建环境创建Maven工程将数据库中的表转换为对应的实体类配置文件核心配置文件mybatis-config.xml创建Mapper接口映射文件xxxMapper.xmllog4j日志功能 Mybatis操纵数据库示例及要点说明获取参数的两种方式${}#{} 各种类型的参数处理单个字面量参数多个…

keil官网下载MDK的STM32芯片pack包

背景 最近重装了电脑系统&#xff0c;重新安装了MDK所以导致MDK芯片包需要重新下载&#xff0c;软件内下载又太慢&#xff0c;所以趁现在找到了官网下载方法把方法分享出来供大家参考。 1、在浏览器中输入网址&#xff1a;www.keil.arm.com进入如下界面&#xff0c;然后点击&am…

Mock-MOCO使用过程

一、jar包下载&#xff1a;https://github.com/dreamhead/moco 二、准备mock的json文件 data.json内容&#xff1a; ####GET请求 [{"description": "response使用Content-Type为charsetGBK编码格式来查看返回信息为中文的内容","request": {&q…

Tensorflow预训练模型ckpt与pb两种文件类型的介绍

我们在 Tensorflow无人车使用移动端的SSD(单发多框检测)来识别物体及Graph的认识 熟悉了Graph计算图以及在 Tensorflow2.0中function(是1.0版本的Graph的推荐替代)的相关知识介绍 这个tf.function的用法&#xff0c;了解到控制流与计算图的各自作用&#xff0c;无论使用哪种方…

Linux基本指令操作

登陆指令&#xff08;云服务器版&#xff09; 当我们获取公网IP地址后&#xff0c;我们就可以打开xshell。 此时会有这样的界面&#xff0c;我们若是想的登陆&#xff0c;则需要输入以下的指令 ssh 用户名公网IP地址 然后会跳出以下的窗口 接着输入密码——密码便是先前定好…

利用小波包对一维信号进行降噪或压缩(MATLAB)

function [ output_args ] example4_12( input_args ) %EXAMPLE4_12 Summary of this function goes here % Detailed explanation goes here clc; clear; % 设置信噪比和随机数的初始值 snr 3; init 2055615866; % 生成一个原始信号xref和含高斯白噪声的信号x [xref,x] …

微服务契约测试框架-Pact

契约测试 契约测试的思想就是将原本的 Consumer 与 Provider 间同步的集成测试&#xff0c;通过契约进行解耦&#xff0c;变成 Consumer 与 Provider 端两个各自独立的、异步的单元测试。 契约测试的优点&#xff1a; 契约测试与单元测试以及其它测试之间没有重复&#xff0c…

零的奇幻漂移:解密数组中的神秘消失与重生

本篇博客会讲解力扣“283. 移动零”的解题思路&#xff0c;这是题目链接。 思路1 这道题目很有意思。虽然是简单题&#xff0c;其蕴含的玄机还是很多的。正常来讲&#xff0c;这种题目一般都会原地操作&#xff08;不开辟额外的数组&#xff0c;空间复杂度是O(1)&#xff09;&…

计算机组成原理(2)- 浮点数的存储

1、浮点数的表示方法 假设有以下小数&#xff0c;它表示的十进制数是多少呢&#xff1f; 00000000 00000000 00000000 1010.10101*2^3 1*2^1 1*2^-1 1*2^-3 10.625 1010.1010可以用科学计数法来表示为1.0101010 * 2^3。关于科学计数法再举个例子0.10101用科学计数法表示…

uni-app:模态框的实现(弹窗实现)

效果图 代码 标签 <template><view><!-- 按钮用于触发模态框的显示 --><button click"showModal true">显示模态框</button><!-- 模态框组件 --><view class"modal" v-if"showModal"><view cla…

网红项目AutoGPT源码内幕及综合案例实战(三)

AutoGPT on LangChain PromptGenerator等源码解析 本节阅读AutoGPT 的prompt_generator.py源代码,其中定义了一个PromptGenerator类和一个get_prompt函数,用于生成一个提示词信息。PromptGenerator类提供了添加约束、命令、资源和性能评估等内容的方法,_generate_numbered_l…

线性表之顺序表

在计算机科学中&#xff0c;数据结构是非常重要的基础知识之一。数据结构为我们提供了组织和管理数据的方法和技巧&#xff0c;使得我们可以高效地存储、检索和操作数据。而顺序表作为数据结构中最基本、最常用的一种存储结构&#xff0c;也是我们学习数据结构的第一步。 本文将…

QT: 完成服务器的实现

1> 思维导图 2> 手动完成服务器的实现&#xff0c;并具体程序要注释清楚 Widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器类 #include <QTcpSocket> //客户端类 #include <QMessageBox> //…

jMeter使用随记

参数化BodyData 先制作参数文件 再设置一个csv data set config 最后在body data里面写上参数${xxxxx}