能力说明:
了解变量作用域、Java类的结构,能够创建带main方法可执行的java应用,从命令行运行java程序;能够使用Java基本数据类型、运算符和控制结构、数组、循环结构书写和运行简单的Java程序。
能力说明:
熟练掌握Docker各类高级特性,包括容器数据卷、DockerFile构建等;熟练使用Docker封装MySQL、Redis、Tomcat、Apache等镜像,并可在公有云或私有云部署并保持稳定运行。
能力说明:
熟练掌握Linux常用命令、文件及用户管理、文本处理、Vim工具使用等,熟练掌握企业IP规划、子网划分、Linux的路由、网卡、以及其他企业级网络配置技术,可进行Web服务器(Nginx),以及数据库(My SQL)的搭建、配置、应用,可根据需求编写Shell脚本,通过常用工具进行linux服务器自动化运维。
能力说明:
掌握Java开发环境下所需的MySQL高级技巧,包括索引策略、innodb和myisam存储引擎,熟悉MySQL锁机制,能熟练配置MySQL主从复制,熟练掌握日常SQL诊断和性能分析工具和策略。可对云数据库进行备份恢复与监控、安全策略的设置,并可对云数据库进行性能优化。掌握主要NOSQL数据库的应用技术。
不知不觉,距离上一次参加云栖大会已经过去一年了。昨日的自研磐久,开源玄铁还历历在目,这么快又迎来了2022云栖大会。从信息化跨越到数字化,云计算的下一个风向标在何处?阿里云在本届云栖大会主论坛中给出了答案:重构整个IT硬件体系、软件研发范式深刻变革、云端加速融合。 未到云栖现场的各位,可以跟随我在本文中一起“云浏览”。 计算之力&进化之势——科幻在B馆,阿里云第一次把自己的数据机房“搬”到展台里来:磐久系列基础设施(液冷、运维、网络、边缘计算),从服务器到交换机路由器,从含光800到倚天710,再到CIPU,业内最先进的设备与超低PUE液冷融合技术,全部自研的技术让作为开发者的我感动。这样看,我的ECS云服务跑在这些高端设备上,其提供的计算价值就远远超过了其所须支付的价值。 达摩院一直是阿里队列前的尖端技术,AI领域突破、芯片研发、数据库创新突破。“算力将带领我们走向怎样的未来?”今年的云栖展出,我个人印象最深,触动最大的就是无影云电脑。我就是无影云电脑的使用者,并且拥有一台无影卡片终端,无影也成为我电子设备的一部分。在现场看到了非常多的无影新产品与应用,更加多样的终端硬件与开放生态,高性能图形计算的模拟飞行、云上游戏,无影云应用,无影个人版等等。让我对无影的未来更有信心,我想未来也会继续使用无影系列的产品。云栖大会除了尖端科技的发布,各类厂商的展示,最关键的另一个部分就是“体验” C馆,阿里云给出了在各个行业落地的数字化方案:汽车制造、工业制造、数字电力、东数西算。不少方案之前就在新闻、网络上有所听闻,在云计算数字化时代,对于技术人开发者,算力和想象力,同样重要。 开发者基地——好玩进入D2馆,就感受到开发者的活力氛围,整个开发者基地大致分为3个展区,左侧是天池的竞技区,右侧的环型台阶是开发者舞台,中间环绕一圈的是云起实验室。进入正门是集章兑奖区,右侧是合影处,我们完成集卡集章就可以在兑奖区兑换小礼品。哦,说起小礼品,先放一张我在云栖的战利品图吧,大部分来自D2馆,感谢D2馆的每一个工作人员为整个活动的精心策划和筹备。在云起实验室区,这里有九个产品技术的展台,完成两个展台的实验体验就可以兑换一个杯子,当然部分展台也有自己的小礼物送给体验的玩家们。我在九个场景里体验了云原生Serverless,钉钉开放平台动手互动实验等几个活动,我经常在云起实验室体验项目,对展区的产品体验也有很多熟悉感,在体验中也得心应手。很感谢钉钉开放平台和IoT的哥哥们,聊了不少技术相关的话题,包括钉钉全新的应用模式,快速搭建服务,深入了解了服务数据传输的流程;也和Iot的哥哥了解了工业边缘设备平台这款设备,以及数据融合平台的几个经典的业务应用场景。作为一名阿里云社区开发者,开发者舞台的“技术创作者OpenTalk”是我必参加的创作者大会之一。极客邦科技创始人兼 CEO,InfoQ 中国创始人霍太稳老师,分享了由国外InfoQ带入了国内的发展历程,Qcon的技术分享带给国内外开发者关键性的技术进步;云和恩墨创始人盖国强老师,坚持多年的技术写作,从BBS论坛到专注数据库技术平台,也完成了年轻时作家的梦想;语雀创始人玉伯老师,从周报月报中总结分享个人思考,通过平时的积累一步步构建自己的知识世界。阿里云开发者社区XInfoQ签约博主颁奖仪式,由霍太稳老师和阿里云孟晋宇老师共同启动,一名名的乘风者照片被点亮,展现了开发者们“因热爱而分享”的创作精神! 来到天池竞技区,各类体验赛事可谓是热闹非凡。也许技术不是人人都会,但是在天池通过体验魔方,解锁鲁班锁、平衡球迷宫(这个好难),就可以得到天池准备的小礼品,体验、探索也是成为技术人的必经之路,天池也通过一些简单的活动吸引着更多的参与者感受技术探索的魅力。小车AI竞速赛、AIS云性能优化知识竞答、无影挑战赛、RISC-V应用体验赛,每个竞技比赛大家都积极的参加,在这里技术和赛事也和我们拉近了距离。观展下午,我参加了点亮RISC-V应用的小挑战。由于我之前具有树莓派开发板的操作经验,RISC-V应用体验赛对于我而言并不困难,使用CDK编译烧录也简单易上手,在整个实验的过程中非常顺利,成为前三名完成者,拿到了天池RISC-V应用体验赛的技术之星奖杯和奖状。感谢平头哥! 最后我想提个建议,NFC打卡活动可以帮助参会人更充分地了解云栖的各个场馆和内容,但是需要将所有点位打卡完毕才具有抽奖机会,打卡与体验参展就成了一个较为矛盾的选择,云栖的展馆很大,跑完整个场馆,我感觉自己腿都断了~即使那个巨大的扭蛋机非常炫酷,我希望可以多开几个扭蛋机,这样我们就可以有更充分的时间区观看论坛和会议啦,而且部分打卡机的稳定性不够好,碰到了几次打卡程序闪退的情况,希望可以加强系统的稳定性,带给用户更好的体验,哈哈哈,扭蛋的人太多了。 作为一个普普通通的开发者,我对云计算的未来充满了期待,阿里云的技术往往能引领推动产业发展,改变我们的生活。期待在未来的某一天,自己手里的项目可以全面跑在倚天710和龙蜥Anolis之上;数据库、中间件、业务前后端全面Serverless化;桌上的台式机里跳动着完全自主国产化RISC-V架构的处理器芯片;而打开任何显示屏幕,就可以连接到无影,感受更丰富多彩的云能力,享有更多的算力。
今天在机架后面拔一根网线的时候,不小心把ESXi这台的电源线松开了,插回去机子重启了,我以为没啥大事儿的时候,虚拟化里面的几台虚拟机大半天没反应,集群里的状态也是一直掉线的,事情不对起来了。问题报错:当我把显示器接通,报错一片红,系统都还没进去,我下意识的硬重启了,没用报错内容如下,显示加载数据时数据md5值对不上了,解压出错Error 33 (Inconsistent data) while decompressing data Input(xxxx), output(xxxx) Gzip_extract failed for /vmx.v00 (size xxxxx): Inconsistent data Error 33 (Inconsistent data) while loading module: /vmx.v00 Compressed MD5: xxxxxxxxxxxxxxxxxxxxxxxx Decompressed MD5: 0000000000000000000000 Fatal error: 33 (Inconsistent data) 好家伙,重启了之后报错数据不一致的包还不一样,图上报错/vmx.v00这个包,重启了几次发现vsan、scsi、vim这些个.v00文件都爆红 我下意识的科学上网找了谷哥哥,基本所有解决方法都是重新安装esxi系统,或者更新安装,重装的时候选择保留虚拟机数据 vmware社区里也有这个问题的solution,仿佛所有人都是重装的 Wtf,我不小心断了个电就要我重装系统了?这断电的代价也太大了吧,我心态崩了 解决方法:我觉得系统断电的解决方法不一定只有重启能解决,既然这几个.v00文件的数据出现误差了,那我自己把这些v00文件还原回去不就行了。于是我抱着试试看大不了就重装的心态,找回了我当时装机的esxi镜像文件,当时我自己是重新封装过网卡驱动的,因此我还保留着文件 万能的windows,把镜像右键装载 找到这几个报错的.V00文件 由于操作的时候是连着物理机的,没法截图,忘记拍照,关键步骤描述一下1.利用一个带PE系统的U盘(某某白菜、某某毛桃),引导启动进PE 2.EXSI的系统盘虽然是linux的系统,但是在PE系统可以被读取成C盘 3.将报错的.V00文件,从镜像文件里面替换到系统C盘 4.重启OK,顺利进入esxi系统,成功开机,不需要重新装系统~~! 随意写了个解决方法,希望能帮助到同样遇到这个问题的兄弟
ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!(来自官方文档)ModelScope提供了模型库,数据集与文档,在拥有ModelScope Library环境的情况下,我们可以使用开放的模型,将模型应用到实际中;也可以对预训练模型进行调优测试;同样也能借助文档了解学习模型的实现方式。当然,我肯定是不会人工智能开发的,纯纯新手,但是也要借着写测评文章的机会好好玩一下ModelScope模型库 前言:在这个信息量爆炸的互联网时代,各类视频平台成了我们娱乐消遣的方式之一,当然,我本人每天也喜欢拿着手机刷视频。同样,偶尔也会创作一些视频作品传到平台上。在平台的创作中心里,当我们将自己的视频上传到平台时,往往会对视频进行一个分类分区,这个视频分类在不同的平台有不同的方式。有些平台是需要自己手动去选择视频所属的分类,而有些平台会自动帮我们选择好分类,但是自动分类的结果往往不如我们心意。 在国内某个头部弹幕视频网站中,上传视频时选择的分区是平台自动选择的,很多视频的基本系统平台会帮我一键填写,这里我们上传测试的视频是动漫的番剧,平台自动选择了动画的分区,没有毛病 可是当我们把相同的视频文件,重命名为其他名字,如图中的test,再进行上传时 平台自动分区就不再准确了,而是变为了科技区的计算机技术虽然咱也不是搞开发的,确实不明白它对上传视频的自动分区是利用哪种技术进行实现的,可能与文件名解析有关。不过可以肯定的是,视频上传时的自动分区,存在很大的误差 回到我们模型测评的话题,在modelscope模型库中提供了这样一个模型:达摩视频分类模型-cv_resnet50_video-category 模型描述:模型采用resnet50网络结构提取视觉特征,采用NextVLAD网络对连续视频帧进行特征聚合。使用方式:直接推理,对输入的视频片段,输入视频url直接进行推理。使用场景: 适合主题明确的短视频,视频不超过30秒。如何使用:提供输入视频,即可以通过简单的Pipeline调用来识别结果。(模型链接:https://modelscope.cn/models/damo/cv_resnet50_video-category/summary) 使用模型时,我们需要ModelScope环境,平台为我们提供了安装好的在线环境供我们测试,当然我们也可以自己在本地搭建ModelScope library。官方提供了详细的使用文档,不过我这里再简单整理一下在线环境与本地环境的使用。一、在线测试使用视频分类模型1.1 在线Notebook实验环境进入到我们所需要实验的模块页面,在页面的右上角点击【在Notebook中打开】 选择启动实例,可以是CPU或GPU,CPU环境完全免费一次启动可以使用4个小时,自然得白嫖免费的选择【方式一】,点击【启动】,等待几分钟后即可【查看notebook】,跳转到在线测试平台不过这里免费的环境有8核32G,比我自己的ECS配置高多了,真是舒舒服服的测试哇 在启动页面,点击【Python3】进入代码调试环境,点击【Terminal】进入linux终端,可以使用pip安装一些其他所需要的库,当然notebook在线环境预装了ModelScope Library,测试使用完全没有问题 1.2 在线环境测试模型我们在调试框中输入代码范例来进行测试,点击运行即可from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks category_pipeline = pipeline( Tasks.video_category, model='damo/cv_resnet50_video-category') result = category_pipeline('1.mp4') print(result) 当然我们需要上传测试视频分类的样本,我这里传了一段国产动漫的视频,直接拖到notebook就行 模型精准的推理出我所传视频的分类,返回了测试结果,分类到【游戏>>短片动画】{ 'scores': [0.38548532128334045], 'labels': ['游戏>>短片动画']} 二、搭建简易本地短视频分类应用2.1 本地Notebook实验环境参考了官方提供的环境配置文档(https://www.modelscope.cn/docs/%E7%8E%AF%E5%A2%83%E5%AE%89%E8%A3%85)在本地龙蜥系统(推荐使用Anolis接替CentOS)下利用anaconda环境创建python37环境 //Anaconda创建python37环境,名为modelscope[root@k8s ~]# conda create -n modelscope python=3.7//进入创建好的modelscope,安装深度学习框架,安装ModelScope library所有领域功能(也可以单独安装)[root@k8s bin]# source activate modelscope (modelscope) [root@k8s bin]# pip install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple (modelscope) [root@k8s bin]# pip install --upgrade tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple (modelscope) [root@k8s bin]# pip install "modelscope[audio,cv,nlp,multi-modal]" -fhttps://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html //漫长的下载安装编译后,进入python交互,输入命令测试环境是否正常>>> from modelscope.pipelines import pipeline >>> p = pipeline('video-category', model='damo/cv_resnet50_video-category') //本地测试模型,同样样本执行成功,返回正确分类的结果>>> result = category_pipeline('/root/1.mp4') >>> print(result) 2.2 安装报错解决我本地搭建时还是遇到不少缺包少包的报错,我这里再多嘴分享一下叭! pip安装modelscope时报没gcc//安装系统开发环境软件,这个少GCC是我自己没注意的问题(modelscope) [root@k8s bin]# yum -y install gcc (modelscope) [root@k8s bin]# yum -y groupinstall "Development Tools" 导入库 from modelscope.pipelines import pipeline时numpy报错初始化失败//安装numpy,这里我numpy版本用的是1.21(modelscope) [root@k8s bin]# pip install numpy==1.21 -i https://pypi.tuna.tsinghua.edu.cn/simple 导入damo时报少decord//少了pip装上就行哈(modelscope) [root@k8s bin]# pip install decord -i https://pypi.tuna.tsinghua.edu.cn/simple 2.3 ***搭建简易视频上传页面***我这里利用flask框架,简单写了一张文件上传的页面(modelscope) [root@k8s app]# cat index.py # coding=utf-8 from flask import Flask,request from werkzeug.utils import secure_filename from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks app = Flask(__name__) app.config['JSON_AS_ASCII'] = False @app.route('/') #首页 def index(): return '''<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>短视频上传-视频分类测试</title> <link href="https://example-static.oss-cn-beijing.aliyuncs.com/web-framework/style.css" rel="stylesheet" type="text/css"/> </head> <br> <div class="website"> <div class="ri-t"> <h2>短视频上传-视频分类测试</h2> </div> <form action = "http://model-test.tao.com/uploadtest" method = "POST" enctype = "multipart/form-data"> <input type = "file" name = "file" /> <input type = "submit" value="上传"/> </form> </div> </body> </html> ''' @app.route('/uploadtest', methods=['GET', 'POST']) #上传 def upload_file(): if request.method == 'POST': f = request.files['file'] f.save(secure_filename(f.filename)) category_pipeline = pipeline(Tasks.video_category, model='damo/cv_resnet50_video-category') result = category_pipeline(f.filename) checkres = '/'.join(result.get('labels','暂无法自动找到分类~')) fname ='【' + f.filename + '】视频上传成功,视频所对应分类为:' + checkres return fname else: return '文件上传失败' if __name__ == "__main__": app.run(host="0.0.0.0", port=80) 2.4 体验短视频上传后自动分类的效果运行我们的python代码,页面访问测试都ok 这里我从网络上找了六个测试文件,分别是不同类别不同分区的视频片段,视频大小也有不同,横板竖版都有本人比较喜欢云撸猫,一天不看个几十只猫猫浑身难受。先测试宠物类视频 上传视频后,自动分类结果显示【生活>>萌宠】,准的! 刷到的彩妆试装推广视频,小姐姐试口红上传测试 上传视频后,自动分类结果显示【生活>>好物推荐】,牛逼,我以为会是美妆类视频,没想到模型它直接看穿了这是个赤裸裸的带货广告 周董前段日子的新专辑MV视频上传最伟大的作品 上传视频后,自动分类结果显示【音乐>>MV】,准啊 前几天五菱宏光MINIev发布了敞篷款,不少UP出了测评上传测试一下 上传视频后,自动分类结果显示【交通>>玩车】,准的可以啊 当然少不了科技区的上传一个手机测评的视频 上传视频后,自动分类结果显示【数码科技>>手机平板】,精准! 测试电影片段,拿了头文字D的一截排水渠过弯,上传! 上传视频后,自动分类结果显示【影视>>短片】,可以的,还是很牛逼的这样的应用方式比文章前面所使用的上传视频自动分类的精准度要高很多,真的很厉害了。我现在贼羡慕会人工智能开发的大佬们5555 其他:第一希望平台可以开放更多的模型(白嫖脸),我在学习模型使用准备找模型做测试时一开始选择的是:达摩日常行为检测-cv_ResNetC3D_action-detection_detection2d,想借这个测试模块实现【监控家中老人跌倒并自动告警】的应用准备测试之前还简单想了应用测试场景,但是使用模型时报错,自己这也排不出错,壮壮胆子去群里问了才发现这个模型没有正式发布其他就是模型库里的模型,文档可以再完善一下,部分模块的应用说明太简略了哈哈 总结:本次测评对ModelScope的cv_resnet50_video-category达摩视频分类模型做了一个简单的使用测试,测试结果相当精准,平台开放模型库与数据集对开发者学习应用人工智能技术有很大的帮助,像我这样的开发零基础小白也可以简单使用。看到大家对模型有各种各样的骚操作学习到了,有美化人像的还有游戏锁头的,希望模型库和数据集生活中的各个方面有所应用,提升人们的智能生活~
从高中到大学,从ET到云小宝,从黑灰配色到如今的橙白配色,阿里云已经陪伴了我6年时光。还记得高中时的我第一次购买ECS云服务器,对linux还是个小白的我无从下手,到如今已经扎扎实实的学习了云计算的各种知识,遨游在云上的海洋,甚至考取了ACE(旧版)的认证证书。对于一个还是在校生的我来说,阿里云就像是一个老友,一直陪伴在我学习的路上,云起实验室让我有机会对各种云产品进行实验,开发者社区也像一所学校,在这里可以学到各种开发者的文章,解决我专业学习上各种的疑难杂症。 21年的云栖大会,我有幸被社区的小伙伴邀请并成为了一名乘风者,在社区一直保持着活跃,参与了不少活动,获得了不少周边奖品。当然也很荣幸几次在测评大赛中获得一、二名,奖励的猫超卡现在还没有花完hhhhhh 这里是我参加各种活动以来部分的周边奖品,一部分以云小宝为主,另一部分以背包、杯子、音响、鼠标这样实用性的为主。当看到积分商城和等级制度更新之后,我有种说不出的兴奋。要说建议的话,我还是希望可以多推出一些带有阿里云logo标志的一些实用周边,或者是其他阿里项目的周边也是很不错的,就好比图里的Filnk的杯子,做工也很不错很有纪念意义;还是以实用为主吧,刚刚我看到有个小米有品的腰垫,这个就很哇塞,像我们这种电脑前久坐的人可太需要了,我打算过两天开学了换一个放宿舍里
在监控系统体系里,grafana相信大家都是听说过的,grafana将我们的监控数据以大屏的形式直观的展示出来,作为一个喜欢折腾linux的我来说,自从grafana开源套件的出现,他的展示直观、配置轻便、功能强大、界面科幻一直是吸引我的地方。当grafana服务运行之后,只需要在web界面中进行配置即可。阿里云发布的grafana托管服务,更是为云上的资产提供了高效的监控数据可观测能力。阿里云grafana弹性、免运维,可以方便的对接云上云下的各种数据源。 一、启用创建Grafana服务在grafana服务进行下单,需要填入【工作区名称】与【Admin密码】阿里云grafana托管服务,可使用的用户可以通过阿里云账户进行单点登录转跳,也可以通过管理员账户admin完成登陆 完成grafana专家版服务的创建 点击ID,进入工作区管理界面,此处可以看到grafana的连接信息,这个url就是我们访问grafana的地址,下方提供了云服务集成。 访问连接信息,即可访问grafana的主页 二、手动添加数据源,对ECS云服务器进行监控可观测性的实现我手上刚好有四台ECS资源,这里就对ECS云服务进行一个监控数据展示的配置。对ECS的监控数据源配置有几种,包括【企业云监控】、【Prome云监控探针到ECS】等,这里针对我个人没有那么多云资产的情况,就使用【aliyun-cms数据源插件】完成grafana到云监控数据源的配置。 1.手动配置云监控数据源插件在【Configuraion】下,点击【Data sources】,此处可以手动添加数据源点击【Add data source】 阿里grafana提供了多种数据源接入,此处我们选择【CMS Grafana Service】,点击【Select】 配置【Aliyun UserId】输入用户ID、【AccessKeyId】、【AccessKey】,点击【Save&test】进行保存与测试连接 OK,我们的信息么问题,提示数据源工作了 完成了对云监控数据的手动添加,此时cms显示default默认数据源 2.完成Dashboard展示面板的创建 先看一下我的四台ECS在云监控下的情况,所有主机监控正常,插件运行中 在grafana上选择【+】,create创建【Dashboard】 在dashboard页面点击【Add panel】新建面板 这里测试举例几种面板的形式,可能观测的内容和展示的方式不太合适,这个见仁见智咯【Time series时序图】ECS的CPU使用率展示进入面板的新建,这里我们的data source数据源是默认的cms,即为云监控的数据。【Namespace】选择acs_ecs_dashboard,为ECS的相关监控【Metric】选择cpuutilzation,为CPU使用率【Dimensions】选择需要展示的ECS云服务器实例【Y-column】选择Average平均值,当然也有最大值max与最小值min【X-column】默认timestamp 右侧为面板的相关配置,这里我修改了【Title】标题,完成配置点击右上角【Apply】所有需要配置的几项参数,都会自动展开或补全【Namesapce】:监控的云服务【Metric】:监控指标【Period】:同步周期【Group】:云监控分组【Dimensions】:展示实例 这里的【Metric】监控指标,可以在云监控的文档中找到参照监控项说明-指路:https://help.aliyun.com/document_detail/43505.html 面板完成创建可执行修改编辑,导出删除等 【Gauge仪表盘】ECS的磁盘写入IOPS展示【Metric】选择DiskWriteIOPS,为所有磁盘写IOPS其他配置参照之前 【Stat状态阈值图】ECS的TCP连接数展示【Metric】选择net_tcpconnection,为TCP连接数其他配置参照之前这里我对面板属性【thresholds】进行了配置,对各个阶段的数值区分颜色,可设定固定值也可百分比 【Bar gauge】ECS的内存用率展示【Metric】选择memory_usedutilization,为内存使用率其他配置参照之前这里我对面板属性【orientation】进行了配置,调整了水平条的方向为纵向 完成了需要展示的面板配置,这就是整个dashboard的展示效果当然可以折腾更多监控类型,这里就简单展示几项。 与云监控里的主机监控提供了监控相比,是不是更好看了,更高大上了,更直观了,也可以我们自己定义更多的监控项目了!好东西哇 二、其他数据源的接入(举例)阿里云的接入不仅仅是云监控,更多应用层面的监控,集群层面的监控。。。grafana支持更多的数据源进行接入。我这里再举例两种不同类型接入方式1.通过ARMS下的Prometheus实例Prometheus是一种多维度的系统监控与报警系统,同时阿里云的ARMS提供了各种颗粒更加细化的应用级别监控。这里我们继续将prome实例接入ECS集群,将prome监控系统作为数据源集成到grafana 在ARMS的控制台,新建Prometheus实例,选择【for VPC】接入ECS集群 选择VPC并配置安装信息 完成VPC接入,就可以对不少应用与服务环境进行监控,这里我就不多配置了。 回到grafana的控制台,就可在下方【云服务集成】中的【Prometheus服务】找到接入的VPC,点击同步确认即可 完成同步后,grafana界面中数据源出现prome的对接信息 同时系统自动创建一个prome的文件夹,可以在这个文件夹下创建相关dashboard,分门别类管理 2.打通VPC对接自建的数据源数据源除了对接云服务,也可对接企业自建的监控系统,获取数据源。通过VPC内网获取数据源,可灵活利用原有的监控系统,降低成本,也可以减少来自公网的攻击。这里我假设我的监控系统数据在内网ECS的Mysql数据库中,对接一下内网的数据库服务。 在grafana控制台里,选择【VPC数据通道管理】,点击【安装数据源通道】选择好【区域】,【VPC】,【交换机】,我这里就选择了与ECS云服务器同一VSW。完成点击【安装】 此时回到grafana,点击【DataSource】,选择【MySQL】 这里就可以选择刚刚添加的VPC通道,手动配置数据库用户连接信息即可 点击下方【Save & test】保存配置并且测试,这里回显已经完成数据库的连接测试,ok 完成数据源的添加,创建面板时就可以选择相对应的数据源 阿里云作为国内可观测的引领者,没有采用完全保姆式闭源的产品去实现,而是采用了对接多种云上\云下,自研\开源的各种方式实现云上的可观测服务落地,对待用户原有的监控方案有不错的兼容。
一个正常的k8s集群,由至少一个控制节点与多个工作节点组成,我们的容器pod运行在各个节点之中。情况就是这个情况,处于某种不可抗的情况下,我们需要将k8s集群中的控制平面节点组件,从v1.23.1版本升级到v1.23.2,更新一个小版本。主要是更新kubeadm、kubelet、kubectl。 需要先将控制节点腾空,设置停止调度并且驱逐节点上的pod;其次按顺序更新kubeadm\kubelet\kubectl。并且控制节点的所有升级,都是在联通外网的条件下进行,避免很多不必要的麻烦。 1.将所需要升级的控制节点腾空// 多个集群情况下,我们需要手动切换到所需要更新的集群中student@node01:~$ kubectl config use-context k8s-dep // cordon 停止调度,将node调为SchedulingDisabled。新pod不会被调度到该node,但在该node的旧pod不受影响。student@node01:~$ kubectl cordon master01 node/master01 cordoned // drain 驱逐节点。首先,驱逐该node上的pod,并在其他节点重新创建。student@node01:~$ kubectl drain master01 --ignore-daemonsets node/master01 already cordoned WARNING: ignoring DaemonSet-managed Pods: kube-system/kube-flannel-ds-vmd6h, kube-system/kube-proxy-wgj54 evicting pod kube-system/coredns-6d8c4cb4d-t5n94 evicting pod kube-system/coredns-6d8c4cb4d-p68v8 pod/coredns-6d8c4cb4d-p68v8 evicted pod/coredns-6d8c4cb4d-t5n94 evicted node/master01 drained //接着,将节点调为 SchedulingDisabled。现在检查节点是schedulingdisabled状态student@node01:~$ kubectl get nodes NAME STATUS ROLES AGE VERSION master01 Ready,SchedulingDisabled control-plane,master 127d v1.23.1 2.更新控制平面节点中的kubeadm //检查kubeadm 版本root@master01:~# apt-cache show kubeadm | grep 1.23.2 Version: 1.23.2-00//更新kubeadm版本root@master01:~# apt-get update root@master01:~# apt-get install kubeadm=1.23.2-00//检查版本root@master01:~# kubeadm version kubeadm version: &version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.2", GitCommit:"9d142434e3af351a628bffee3939e64c681afa4d", GitTreeState:"clean", BuildDate:"2022-01-19T17:34:34Z", GoVersion:"go1.17.5", Compiler:"gc", Platform:"linux/amd64"}//更新节点版本,指定版本号root@master01:~# kubeadm upgrade apply v1.23.2 --etcd-upgrade=true 当我们执行更新kubeadm upgrade apply 这条命令时,upgrade会检查集群是否可升级;检查API Server是否可访问;集群下的所有节点是否正常;我们指定的更新版本是否有偏差;更新所需要拉的镜像是否可用;更新集群内的证书时间,执行续约。 3.更新控制平面节点中的kubelet与kubectl//更新kubelet版本root@master01:~# apt-get install kubelet=1.23.2-00 root@master01:~# kubelet --version Kubernetes v1.23.2//更新kubectl版本root@master01:~# apt-get install kubectl=1.23.2-00 root@master01:~# kubectl version 4.修改恢复节点状态//退回到node操作节点root@master01:~# exit logout student@master01:~$ exit logout Connection to master01 closed.//将master节点状态改回student@node01:~$ kubectl uncordon master01 node/master01 uncordoned student@node01:~$ kubectl get nodes NAME STATUS ROLES AGE VERSION master01 Ready control-plane,master 127d v1.23.2 最后验证效果如图,VERSION显示v1.23.2,小版本升级完成
k8s在1.20版本中提出,将废弃Docker作为runtime,在后续版本也会被删除。在之前的k8s中是使用dockershim的模块适配docker,但出于维护困难的缘由将其弃用。其实k8s在运行底层时,真正的底层并不是docker,而是docker底层的containerd,containerd本身就支持CRI,那么为了支持Docker去维护Dockershim这个垫片的意义也就无可厚非了。因此,我们将基于Container作为容器运行时,管理负责镜像和容器的生命周期,抛开Docker和Podman,使用kubeadm去完成k8s集群的部署。 本次部署实验将全部采用离线rpm包、离线容器镜像、flannel组件1.基础环境配置我们利用主机名映射完成网络通信//修改主机名master,node[root@localhost ~]# hostnamectl set-hostname master [root@localhost ~]# bash//hosts映射[root@master ~]# cat /etc/hosts 192.168.200.18 master 192.168.200.20 node1k8s部署需要关闭swap内存交换//关闭swap,修改fstab文件挂载[root@master ~]# swapoff -a [root@master ~]# vim /etc/fstab #/dev/mapper/rl-swap none swap defaults 0 0//关闭selinux[root@master ~]# setenforce 0 [root@master ~]# vim /etc/selinux/config SELINUX=disabled//关闭防火墙[root@master ~]# systemctl stop firewalld&&systemctl disable firewalld//配置内核模块加载[root@master ~]#vim /etc/modules-load.d/containerd.conf overlay br_netfilter//配置路由转发[root@master ~]#vim /etc/sysctl.d/99-kubernetes-cri.conf net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables= 1//应用[root@master ~]# modprobe overlay [root@master ~]# modprobe br_netfilter [root@master ~]# sysctl --system其他,时钟同步,可以使用ntp服务器、chrony同步服务器2.container安装//rpm包安装,在container目录下[root@master container]# rpm -Uvh --force --nodeps * //生成初始化配置,修改完的配置可以拷贝到其余节点[root@master container]# containerd config default > /etc/containerd/config.toml//修改配置,sandbox_image确保和提供的pause镜像名称版本一致,找到SystemCgroup选项开启[root@master containerd]# vim config.toml sandbox_image = "k8s.gcr.io/pause:3.6" SystemdCgroup = true //启动服务[root@master kubernetes]# systemctl enable containerd&&systemctl start containerd3.安装k8s基础组件//rpm安装kube组件,此处全部使用离线rpm软件包[root@master kubernetes]# rpm -Uvh --force --nodeps * //启动kubelet服务[root@master ~]# systemctl enable kubelet&&systemctl start kubelet//导入提供的容器镜像,至少需要以下组件的容器镜像,请按照现场具体给出的版本号及名称载入 ctr -n k8s.io image import busbox.tar ctr -n k8s.io image import coredns.tar ctr -n k8s.io image import etcd.tar ctr -n k8s.io image import flannel.tar ctr -n k8s.io image import jessie-dnsutils.tar ctr -n k8s.io image import kube-apiserver.tar ctr -n k8s.io image import kube-controller-manager.tar ctr -n k8s.io image import kube-proxy.tar ctr -n k8s.io image import kube-scheduler.tar ctr -n k8s.io image import nginx.tar ctr -n k8s.io image import pause.tar步骤1-3.所有节点都需要完成4.初始化主节点//生成配置文件[root@master ~]# kubeadm config print init-defaults > kubeinit.yaml修改以下参数配置 [root@master ~]# vim kubeinit.yaml advertiseAddress: 192.168.200.18 criSocket: /run/containerd/containerd.sock imagePullPolicy: Never name: master kubernetesVersion: 1.23.5 podSubnet: 10.244.0.0/16//初始化主节点,注意留存安装完成的回显[root@master ~]# kubeadm init --config kubeinit.yaml //执行图上命令[root@master ~]# mkdir -p $HOME/.kube [root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config [root@master ~]# export KUBECONFIG=/etc/kubernetes/admin.conf//安装flannel网络组件[root@master kubernetes]# kubectl apply -f kube-flannel.yml 5.工作节点配置//直接执行主节点安装回显时的命令kubeadm join 192.168.200.18:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:9abc3e785c57ebb34cec42ef79f79612104a847d45433cdcfcfbd40dba893470 6.验证[root@master etc]# kubectl get cs [root@master etc]# kubectl get nodes
什么是函数?刚刚考完数学没多久的我,脑力里立马想到的是自变量、因变量、函数值,也就是y=f(x)。当然,在计算机里,函数function往往指的是一段被定义好的代码程序,我们可以通过传参调用这个定义好的函数,实现我们所需要的功能。那么,今天的函数计算FC又是什么? 云计算时代的当下,容器化技术与各种工具发展的DevOps,已经把开发与运维的工作进行了新的统筹,开发人员在完成代码的编写后,无需考虑环境,直接提交到各种流水线就可以完成测试、开发、部署,项目构建微服务,由容器完成环境的封装。但是往往我们最终还是需要投入精力到业务上线的集群,是私有云环境还是公有云?是裸金属服务器还是云实例ECS?是自购还是租用? 当然,DevOps的落地,服务器\集群的运维,这些都是需要投入大量的资源与精力,DevOps是一条捷径,但不是唯一的出路。因此函数计算FC的出现,带来了无服务Serverless的架构,让开发者在开发和部署的时候,不在有部署服务复杂的感觉,对服务器的无感化,可以使开发者真正的关注在自己的代码上。阿里云Serverless函数式极简编程可专注于业务创新,无采购和部署成本、提供监控报警等完备的可观测能力。函数计算是事件驱动的全托管计算服务,真正的无需去考虑服务器的运维管理,只需要完成开发的代码进行上传,函数计算会通过角色策略去规划计算资源,弹性的方式执行函数,最后高效的执行部署。优雅! Serverless 将会有那些适用场景?是个人?还是生产?那么这次我将部署两种不同方向的应用对Serverless进行测评 一、通知系统与Webhook,Trigger触发与Chat机器人。许多系统中涉及到的push类功能,例如邮件、短信、Webhook。当然Webhook的能力不只是信息通知,不过这里所指的通知功能必然是需要基础设施也就是服务器来支撑运行,如果将这些功能直接由Serverless来操作,我们便无需支付运维一台服务器,节省了大量的工作与费用。同样,我们可以利用Serverless事件驱动模型实现定时自动触发任务,自动签到自动发送。 二、其次当然是Web类的应用。基于各类Web框架的应用部署,构建基于Java、Python、PHP等语言的站点,Serverless很容易实现如wordpress这样的博客应用的上线。配合其他云产品,Codeup、OSS、RDS等,更能实现高可用高性能的Web应用,如官方提供的Kod云盘系统。 一、使用Serverless实现B站每日登陆签到 作为一个老b站用户,b站等级无疑是妥妥的"名片",当然我早已是六级大佬的一员了。b站升级所需的经验值是关键,登陆、投币、观看都会积累经验。为了可以快速升级,这次我将使用阿里云Serverless,实现每日b站的登陆经验Get,观看视频经验Get,观看直播银瓜子Get(白嫖的直播送礼道具),并且配合钉钉机器人,实现Webhook的消息推送。1.创建Serverless服务及函数 进入函数计算FC控制台,选择【服务及函数】,点击【创建服务】 在【创建服务】的页面中,输入服务名称,并选择启用日志功能,日志更能可以帮助我们更好的排查错误这里我当然需要标注服务的功能,即实现bilibili的日常登陆签到。 进入【创建函数】页面,选择【使用标准Runtime从零创建】配置函数名称,选择运行环境为Python3,并且选择从文件夹上传代码。注意,这里如果有依赖包需要提前下载到代码包下,我这里需要用到requests包 ,在本地需要执行 pip install -t . <模块名称>。不过后续也可以在控制台处执行下载命令这里的Python功能实现的脚本是定时触发类的,因此我们选择请求处理程序类型为【处理事件请求】 下方配置触发器,选择定时触发器,输入名称,选择【指定时间】,我这里选择的是每日的23点进行脚本的运行 Python脚本内容# -*- coding: utf8 -*- import requests import json import time import re import sys import codecs from bs4 import BeautifulSoup from json.decoder import JSONDecodeError # B站登陆Cookie cookie = "" # Webhook地址 webhook = "https://oapi.dingtalk.com/robot/send?access_token=xxxx" # 自动观看的BV号,杰伦新专-最伟大的作品 bid = 'BV1ua411p7iA' uid=re.match('(?<=DedeUserID=).*?(?=;)',cookie) sid=re.match('(?<=sid=).*?(?=;)',cookie) csrf=re.match('(?<=bili_jct=).*',cookie) # 部分编码问题 sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) # bv转为av def bv_to_av(bv): headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36', } r = requests.get('https://api.bilibili.com/x/web-interface/view', {'bvid': bv}, headers=headers) response = decode_json(r) try: return str(response['data']['aid']) except (KeyError, TypeError): return '883409884' # json解析 def decode_json(r): try: response = r.json() except JSONDecodeError: return -1 else: return response # 自定义钉钉机器人推送 def pushinfo(info,specific): # 定义推送内容,格式参考https://open.dingtalk.com/document/group/message-types-and-data-format # 注意机器人的关键词 data = { "msgtype": "text", "text": { "title":"Taoreset", "content": "【Taoreset-Serverless推送】\n"+info+specific } } headers = {'content-type': 'application/json'} # 请求头 r = requests.post(webhook, headers=headers, data=json.dumps(data)) r.encoding = 'utf-8' print (r.text) # 阿b登录,得登陆经验 def login(): headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36', 'Cookie':cookie } response = requests.session().get('http://api.bilibili.com/x/space/myinfo',headers=headers) rejson = json.loads(response.text) code = rejson['code'] msg = rejson['message'] if code == 0: print('登录成功') return True else: print('登录失败:'+msg) return False # 获取用户信息 def get_user_info(): headers = { 'Cookie':cookie } response = requests.session().get('http://api.bilibili.com/x/space/myinfo?jsonp=jsonp',headers=headers) rejson = json.loads(response.text) code = rejson['code'] msg = rejson['message'] if code == 0: userInfo=['账号:'+str(rejson['data']['silence']), '硬币:'+str(rejson['data']['coins']), '经验:'+str(rejson['data']['level_exp']['current_exp'])+"/"+str(rejson['data']['level_exp']['next_exp']), '等级:'+str(rejson['data']['level']), '昵称:'+str(rejson['data']['name']) ] print(userInfo[0]) print (userInfo[1]) print(userInfo[2]) print(userInfo[3]) print(userInfo[4]) return userInfo else: print("用户信息获取失败:"+msg) return "用户信息获取失败:"+msg # 直播签到,赚银瓜子儿 def do_sign(): headers = { 'Cookie':cookie } response = requests.session().get('https://api.live.bilibili.com/sign/doSign',headers=headers) rejson = json.loads(response.text) code = rejson['code'] msg = rejson['message'] if code == 0: print('直播签到成功!') return True else: print("直播签到失败:"+msg) return False # 看BV号视频,得观看经验 def watch(): aid=bv_to_av(bid) headers = { 'Cookie':cookie } response = requests.session().get('http://api.bilibili.com/x/web-interface/view?aid='+str(aid),headers=headers) rejson = json.loads(response.text) code = rejson['code'] #print(response.text) if code == 0: cid = rejson['data']['cid'] duration = rejson['data']['duration'] else: print('视频信息解析失败') return False payload = { 'aid': aid, 'cid': cid, 'jsonp': "jsonp", 'mid': uid, 'csrf': csrf, 'played_time': 0, 'pause': False, 'realtime': duration, 'dt': 7, 'play_type': 1, 'start_ts': int(time.time()), } response = requests.session().post('http://api.bilibili.com/x/report/web/heartbeat',data=payload,headers=headers) rejson = json.loads(response.text) code = rejson['code'] if code == 0: time.sleep(5) payload['played_time'] = duration - 1 payload['play_type'] = 0 payload['start_ts'] = int(time.time()) response = requests.session().post('http://api.bilibili.com/x/report/web/heartbeat',data=payload,headers=headers) rejson = json.loads(response.text) code = rejson['code'] if code == 0: print(f"av{aid}观看成功") return True print(f"av{aid}观看失败 {response}") return False def main(*args): if login(): ui = get_user_info() desp='直播签到:'+str(do_sign())+'\n\n'+'观看视频:'+str(watch())+'\n\n'+ui[0]+'\n\n'+ui[1]+'\n\n'+ui[2]+'\n\n'+ui[3]+'\n\n'+ui[4]+'\n\n' pushinfo('哔哩哔哩签到成功',desp) else: pushinfo('哔哩哔哩签到失败','') if __name__ == '__main__': main()2.修改函数配置完成函数的创建后就进入了函数管理的界面。函数代码这里就显示了我们上传的代码文件,所有代码执行的本地路径都在/code目录下。如果有依赖模块提示没有,在下方的控制台终端输入命令也可以完成模块安装下载,所有工作目录下的代码修改,完成后都需要点击部署代码进行部署上传。pip install -t . requests bs4 其余需要修改一下函数的配置,点击【函数配置】,找到【环境信息】编辑,修改【请求处理程序】,修改函数入口为<要执行的代码文件名.执行的函数名>,我这里脚本的文件名为bilibiliSignin.py,代码里的主函数为main,因此函数入口就为<bilibiliSignin.main> 3.完成函数功能测试选择【测试函数】,即可立即对函数进行触发,点击测试函数进行测试完成测试后下方就会显示日志输出内容,方便查看结果和排错 完成效果,定时触发23点准时完成签到,并由钉钉的机器人推送消息 欸嘿,大伙一起吧Serverless脚本跑起来,早日迎接B站六级会员!!! 脚本参考Github ,by sanshuifeibing 二、Serverless农产品电商网站上云改造 这里我拿隔壁软件专业(俺是网络技术的)的一个大作业项目作为部署的案例。项目是非常简单并且功能单一的,但是也是非常经典的前后端分离项目,由于我开发不太会,项目具体技术就不献丑了。之前据说是有什么版权的,我就不放源代码了hhhh 在改造之前,我相信是很多中小型公司业务的经典AllinOne结构,把业务涉及到的所有服务中间件运行在一台服务器/虚拟机上,虽然现在看可能完完全全是实验室环境,但是实际看到的依然有很多项目是这么做的。坏处也不用多提,部署运维难、难以进行资源的扩容、后续改造复杂、性能差没有应用高可用技术等等。。。 Serverless的农产品电商平台上云,项目比较简单,规划就在同一地域了。主要是将前端HTML页面与后端Jar包运行分别由两个单独的Serverless函数完成运行计算。其余支撑服务上云,分别用对应的云产品实现,这里Redis服务由于我自己ECS上有运行redis服务,就不再单独购买云数据库Redis版了,当然推荐使用阿里云的Redis云数据库产品。 1.Serverless服务创建进入函数计算控制台,选择【服务及函数】,点击【创建服务】输入创建服务的名称与描述,开启日志功能,点击确定,完成服务的创建 服务创建完成后,进入【服务详情】,找到【网络配置】,点击【编辑】选择允许访问VPC,选择自定义配置,选择VPC、vSwitch、安全组,这里需要和后续其他支撑的云产品(数据库等)保持在同一VPC下。因此需要做好云上网络的规划,也要看一下产品是否在地域下有没有库存。 2.前端页面Serverless函数创建完成服务创建后,点击【创建函数】,进入函数的创建页面选择【使用自定义运行时平滑迁移WebServer】,输入函数名称,选择运行环境为【Nginx】,上传前端html代码与nginx的配置文件,选择监听端口为80,即为原nginx中间件的服务端口。 完成函数创建后,进入到函数详情界面,可以在函数代码中对代码进行编辑修改,代码改动后需要点击部署代码重新上传。上述也提到了,这里需要将Nginx服务配置一同上传,其中需要拷贝一份/etc/nginx/mime.types文件到当下目录,避免mime文件类型映射错误。 这里放nginx关键配置,根据自己的业务情况修改,注意配置中端口监听需要与函数创建监听端口保持一致,同时网页代码的路径设置为/codehttp { include mime.types; #注意引入此文件 keepalive_timeout 900; server { listen 80; server_name localhost; location / { root /code; index index.html index.htm; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /users { proxy_pass http://serverless.后端函数访问地址.run; #Nginx反代传给后端的函数,地址在后续后端函数创建完可以拷贝 } location /items { proxy_pass http://serverless.后端函数访问地址.run; #Nginx反代传给后端的函数,地址在后续后端函数创建完可以拷贝 } 可以在调用日志查询相关日志 当函数触发运行,Serverless将会根据访问请求自动起实例,在这里可以手动登陆实例,去进行中间件服务的日志、运行环境的一些查看与排错。3.后端Serverless函数创建 回到函数服务界面,再次点击【创建函数】,进入函数的创建页面选择【使用自定义运行时平滑迁移WebServer】,输入函数名称,选择运行环境为【Java】,上传打包好的Jar包文件。 根据具体业务修改【启动命令】与【监听端口】。我这里需要监听业务端口为8080,并且需要在运行时传入数据库连接的参数,这里所配置的数据库源用户名密码连接地址,在后续的云数据库RDS中会进行相关设置。 后端函数创建完成后进入函数详情界面,其余功能与上述前端函数相同,不再复述 点击【触发器管理】,此处HTTP触发器提供了公网与内网访问地址,我们拷贝内网地址在前端中间件反代配置处填入此域名,实现访问前端触发后端函数 4.云数据库RDS MySQL Serverless创建与迁移导入 原有Allinone架构中没有做到数据库服务的独立与高可用,在此次云化部署,我们将选用阿里云公测中的云数据库Serverless版本。RDS MySQL Serverless提供了CPU、内存的实时弹性能力,具有资源用量低、简单易用、弹性灵活和价格低廉等优点,合理优化使用成本,进一步降本增效。RDS MySQL Serverless实例创建 进入云数据库RDS控制台,点击【创建实例】,开始创建实例的流程,在【基础资源】设置界面,选择Serverless版,其余根据实际进行选择 Serverless RDS创建时【实例配置】需要注意网络VPC的设置,要与Serverless服务所设定的VPC一致,实现内网数据互通。确定订单后,等待实例创建完成即可RDS数据库用户设置完成实例创建,选择管理实例。在左侧任务栏选择【账号管理】,点击【创建账号】创建数据库账户供电商平台后端进行连接。输入账户名、密码,选择为普通账户,点击确定完成用户创建 RDS 业务数据库创建选择左侧栏中【数据库管理】,选择【创建数据库】输入农产品电商业务所需的库名,并且授权账户给前一步设置的用户,点击创建完成库的设置。 RDS 服务连接地址我们的Serverless函数中所需要连接库的地址,在rds实例中【数据库】连接处可以查到,不过需要提前设定白名单。 我们将内网地址进行拷贝,并且也完成了连接用户、密码、库的配置,就可以配置到Serverless函数或者是后端代码中了 RDS 业务数据库的导入恢复 数据库的上云关键是数据内容的迁移,这次部署的业务数据库很少又很小,因此使用简单的备份SQL脚本文件作为迁移的方式。MySQL/Mariadb的数据导出有多种方式,可以根据实际需求进行备份导出,当然大型业务库有专用的备份迁移工具,这里不细说了。进入DMS数据管理服务,选择【数据库开发】,在【数据变更】下点击【数据导入】。根据具体备份方式导入数据库,我这里选择上传备份的sql脚本,提交申请开始导入数据 数据导入完成,数据迁移完成 5.Redis服务上云与静态资源CDN Redis服务上云,前文也提到了,这里Redis服务由于我自己ECS上有运行redis服务,就不再单独购买云数据库Redis版了,ECS也处于同一VPC之下,可以实现内网互通。当然推荐使用阿里云的Redis云数据库产品。 静态资源的CDN,包括css\js\图片的加速,原有架构中已经存放在阿里的CDN服务上了,我这里就不多做改动了。 6.公网业务访问域名配置 最后一步,用户最终访问的是前端Serverless函数,如同阿里云给出的提示,访问默认的公网地址不会做任何中间件解析,而是直接下载首页html静态文件,因此我们需要自己配置访问域名。 回到函数计算控制台,选择【域名管理】,点击【添加自定义域名】输入自定的域名,配置路由,选择对应函数的服务名称、函数名称、版本号LATEST(最新)将需要解析的CNAME值,拷贝拷贝CNAME记录值,点击【云解析DNS控制台】,进入解析设置,点击【添加记录】选择记录类型【CNAME】,输入主机头,填入拷贝的记录值,确认完成添加 7.农产品电商项目Serverless上云效果首页,访问效果,前端函数无误 农产品详情页访问 用户注册功能测试,数据库连接与写入无误 RDS中数据已成功写入 用户登陆测试 订单提交测试,后端函数无误 三、使用Serverless应用模板快速构建litemall电商应用系统1.基于官方模板创建应用Serverless应用提供了大量的官方应用模板,我们可以根据给出的模板来修改自己的业务,因此熟悉模板的部署也很重要。进入到函数计算FC的控制台页面,点击【应用】,选择【通过模板创建应用】,选择【商城案例】 通过详情查看部署模板的信息,以及查询源代码,点击立即创建可以快速体验Serverless应用的创建,本地部署可以通过ServerlessDev工具进行部署 2.对创建应用进行配置点击立即创建后,我们进行应用的初始化配置。部署类型有两种:1.通过第三方代码仓库部署,2.直接部署两者区别就是使用自己的仓库代码后续可以通过push更新项目发布,而直接部署需要手动配置。这里就可以看到,我们的交付触发也是以Git仓库push提交为主,每次提交会自动触发部署。如是自己配置应用,需要根据业务配置s.yaml文件,参考:https://www.serverless-devs.com/fc/yaml/readme 这里我选择Gitee仓库进行部署,但是需要进行仓库第三方应用的授权 点击前往授权,跳转到gitee的站点进行OAuth授权请求,点击同意授权 阿里用户在第一次使用FC函数计算时,需要对角色策略进行添加的,我这里已经使用过FC了,若提示需要添加策略,按照提示点击添加即可。 其他高级配置,需要根据业务进行修改,这里注意地域的选定,后续的其他弹性资源都会在此地域下,我这里选择本地杭州。 完成配置后点击创建,代码已经新建上传到我的Gitee仓库了。这里提供的s.yaml可以作为配置的参考,后续根据所部署的业务去修改yaml 3.应用部署上线应用创建完成,首次自动进行部署,这里部署状态可以看到正在部署 查看部署日志,如果部署出现错误也可以从日志信息中查询报错。部署经历了前置环境、资源同步、资源检查、执行部署这四个步骤后,我们的电商应用就完成了部署 首次部署完成,也是最新latest的一次部署版本,可以通过部署历史自由的进行回滚 4.访问部署上线的电商应用访问测试的域名,就可以看到我们上线的litemall电商系统,进入电商应用的后台管理 litemall电商系统是一个开源的前后端分离带微信小程序的电商系统,具有电商平台基础的会员管理、商城管理、商品管理、推广管理、系统管理、配置管理、统计报表。 litemall电商系统,需要配置最小开发环境有以下:MySQLJDK1.8或以上MavenNodejs 5.更换业务域名访问同样,当我们正常上线了FC的业务时,Serverless用的是默认访问地址函数计算上线提供的域名是以..fc.aliyuncs.com//proxy///[action?queries]为默认的,若是正常业务访问我们必然要修改访问的域名。 进入到函数计算FC的首页,点击高级功能下的域名管理,这里可以看到我们上线电商应用时的默认域名已经路由信息我们选择添加自定义域名 输入域名的名称,也就是购买备案的域名下的自定义二级域名点击路由配置,选择服务名称,这里是我们部署的电商系统litemall,选择函数名称与版本拷贝公网CNAME地址,后续在DNS域名管理处添加解析 进入到域名管理下,添加一条记录,记录类型选择CNAME,输入主机记录,将刚刚拷贝的公网CNAME地址粘到记录值,点击添加即可 回到函数计算FC,在最后点击创建即可,回到主页看到我们新绑定的域名 最后,拿手机访问我自定义配置的公网地址电商服务正常上线,公网地址正常访问主页 商品的详情购买页面 最后Serverless相对其他方案来说,也是非常容易上手并高效的技术方案。上面的部署测试,其实还有很多需要改进的地方,例如第二个农产品电商上云项目,真正可靠的云上业务还需要负载均衡、高可用多地容灾、安全等其他云产品的引入,我想把案例的重点放在Serverless服务器无感化上,本人也使用过不少阿里云的技术产品,深知对底层基础设施运维难度。虽然这几个月学习生活比较繁忙,但是还是对社区的各种活动非常感兴趣,也想做一些更好的测试。这次的Serverless无论是对个人用户,还是企业用户。都是一种非常不错的选择,弹性资源与按需付费,更加节省资源与Money,更加优雅!
开发能力我还是太弱了,但是平常接触python会多一点,包括一些自动化运维之类的开发。我这里就编写一个简单的python后端脚本,通过paramiko模块ssh功能,实现天猫精灵通过语音召唤“还有内存吗”,自动化去查询我在阿里云上的ECS服务器内存剩余。后续有时间,我可能会丰富一下功能,加入一些常用的运维查询功能。天猫精灵技能应用平台提供了从语音交互模型定义、语义解析理解能力,到技能开发、测试、部署的一整套开发工具和便捷的可视化操作工作台,帮助开发者高效地将各类技能应用快速接入到天猫精灵音箱以及精灵生态硬件终端。目前平台支持以下几种应用类型的接入:语音技能灵活定义语音交互方式,开发业务逻辑代码、创建屏显页面来响应任意的用户语音请求。小程序支持将支付宝小程序快速迁移到天猫精灵设备,同时也可利用内容模板小程序快速完成内容变现。安卓Android APP应用支持快速接入安卓生态应用,与天猫精灵带屏端设备无缝打通,同时支持语音交互能力。H5网页小游戏无需开发,支持现成H5网页小游戏的快速接入,同时支持语音唤起。一、创建语言技能选择自定义技能 填写基本的信息,输入调用词,通过喊这个调用词实现唤出选择FAAS 进入技能后,选择后端服务,选择服务部署,选择阿里云云原生开发 选择关联阿里云账户 授权访问 完成后选择Python开发语言,选择空白模板 完成后端的服务部署 二、配置语音交互模型我这里实现比较简单,后端没有从前端json获取参数,交互就随意配置了配置意图,简单写个名称可以配置一些固定问答 三、后端代码开发进入代码编辑,前往webide进入给的默认模板index 大概看一下给的模板代码 import logging import json import base64 #导入模块 def handler(event, context): request = json.loads(event) logger = logging.getLogger() body = base64.b64decode(request['body']).decode() data = json.loads(body) logger.info(data) #定义了获取json数据,存放在body #响应数据库,回复内容在reply里面 response = { "isBase64Encoded": "false", "statusCode": "200", "headers": {"content-type": "application/json"}, "body": { "returnCode": "0", "returnErrorSolution": "", "returnMessage": "", "returnValue": { "reply": "欢迎使用", "resultType": "RESULT", "executeCode": "SUCCESS", "msgInfo": "" } } } 我们可以做个简单测试,看一下前端传参数json大概有什么,在reply这里将数据包的内容body显示。这样后续可以针对json包提取数据做其他功能 测试一下,可以看到json结构 PS:我后来发现原来在fc的日志里也可以看到,当然可以在日志里看了,为什么我一开始没想到呜呜QAQ 修改我们代码,我们通过paramiko模块实现SSH功能,在收到唤醒的请求后,直接运行ssh登录到服务器并执行查询内存的shell命令# @by : Taoreset import logging import json import base64 import paramiko #导入paramiko模块 def handler(event, context): request = json.loads(event) logger = logging.getLogger() body = base64.b64decode(request['body']).decode() data = json.loads(body) logger.info(data) #在收到唤醒的请求后,直接进入ecs_mem_free()函数 replydata = ecs_mem_free() response = { "isBase64Encoded": "false", "statusCode": "200", "headers": {"content-type": "application/json"}, "body": { "returnCode": "0", "returnErrorSolution": "", "returnMessage": "", "returnValue": { "reply": replydata, #返回结果 "resultType": "RESULT", "executeCode": "SUCCESS", "msgInfo": "" } } } return response #定义一个执行SSH查询内存命令的函数 def ecs_mem_free(): cmd = 'cat /proc/meminfo |grep -w "MemFree" | tr -cd "[0-9]"' ##执行的shell命令 user = '用户名' passwd = '密码' host = '服务器地址' ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(host,'22',user,passwd) stdin, stdout, stderr = ssh.exec_command(cmd) res,err = stdout.read(),stderr.read() result = res if res else err ans = "您的ECS内存还有: "+result.decode()+' KB' ssh.close() return ans 由于paramiko不在平台的内置模块里,我们需要手动在终端执行打包下载paramiko模块依赖python -m pip install --upgrade pip pip install -t . paramiko 所有修改完成了,需要在git里提交一下,修改保存到codeup代码仓库 最后部署,部署到预发环境进行测试 四、测试最后效果,当然,剩余内存在动态变更直接输入唤醒词,返回ECS上的查询结果。也可以定义一些固定的数据,进行预设的问答 后续可以将开发完成的技能进行发布,我这里功能太简单了,纯属体验,就不发布啦 就玩玩儿,图一乐
unixbench测评方法unixbench用来测试服务器跑分也算比较常见,但是受影响的因素较多,也没时间测单核多核其他因素仅供参考、仅供参考、仅供参考,图一乐!1.阿里云的ECS c5型配置2核4Ggit到unixbench代码[root@iZbp14j2amyqheetigvagtZ ~]# git clone https://github.com/kdlucas/byte-unixbench.git Cloning into 'byte-unixbench'... remote: Enumerating objects: 222, done. remote: Counting objects: 100% (17/17), done. remote: Compressing objects: 100% (12/12), done. remote: Total 222 (delta 7), reused 12 (delta 5), pack-reused 205 Receiving objects: 100% (222/222), 225.58 KiB | 632.00 KiB/s, done. Resolving deltas: 100% (113/113), done.对unixbench进行make[root@iZbp14j2amyqheetigvagtZ byte-unixbench]# cd UnixBench/ [root@iZbp14j2amyqheetigvagtZ UnixBench]# makeECS服务器需要安装perl-time-hies组件[root@iZbp14j2amyqheetigvagtZ UnixBench]# yum -y install perl-Time-HiRes运行Run[root@iZbp14j2amyqheetigvagtZ UnixBench]# ./Run测试结果可以参考最后的System Benchmarks Index Score 数值======================================================================== BYTE UNIX Benchmarks (Version 5.1.3) System: iZbp14j2amyqheetigvagtZ: GNU/Linux OS: GNU/Linux -- 5.10.84-10.2.al8.x86_64 -- #1 SMP Thu Feb 10 15:03:09 CST 2022 Machine: x86_64 (x86_64) Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8") CPU 0: Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz (5000.0 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET CPU 1: Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz (5000.0 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET 23:11:07 up 1 day, 7:08, 4 users, load average: 0.10, 0.09, 0.05; runlevel 2022-03-31 ------------------------------------------------------------------------ Benchmark Run: Fri Apr 01 2022 23:11:07 - 23:39:12 2 CPUs in system; running 1 parallel copy of tests Dhrystone 2 using register variables 34381345.8 lps (10.0 s, 7 samples) Double-Precision Whetstone 5587.9 MWIPS (9.9 s, 7 samples) Execl Throughput 3572.5 lps (30.0 s, 2 samples) File Copy 1024 bufsize 2000 maxblocks 627665.4 KBps (30.0 s, 2 samples) File Copy 256 bufsize 500 maxblocks 166712.0 KBps (30.0 s, 2 samples) File Copy 4096 bufsize 8000 maxblocks 1735567.3 KBps (30.0 s, 2 samples) Pipe Throughput 771403.2 lps (10.0 s, 7 samples) Pipe-based Context Switching 217316.8 lps (10.0 s, 7 samples) Process Creation 9249.5 lps (30.0 s, 2 samples) Shell Scripts (1 concurrent) 5575.2 lpm (60.0 s, 2 samples) Shell Scripts (8 concurrent) 928.2 lpm (60.0 s, 2 samples) System Call Overhead 415531.6 lps (10.0 s, 7 samples) System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 34381345.8 2946.1 Double-Precision Whetstone 55.0 5587.9 1016.0 Execl Throughput 43.0 3572.5 830.8 File Copy 1024 bufsize 2000 maxblocks 3960.0 627665.4 1585.0 File Copy 256 bufsize 500 maxblocks 1655.0 166712.0 1007.3 File Copy 4096 bufsize 8000 maxblocks 5800.0 1735567.3 2992.4 Pipe Throughput 12440.0 771403.2 620.1 Pipe-based Context Switching 4000.0 217316.8 543.3 Process Creation 126.0 9249.5 734.1 Shell Scripts (1 concurrent) 42.4 5575.2 1314.9 Shell Scripts (8 concurrent) 6.0 928.2 1547.0 System Call Overhead 15000.0 415531.6 277.0 ======== System Benchmarks Index Score 1042.9 ------------------------------------------------------------------------ Benchmark Run: Fri Apr 01 2022 23:39:12 - 00:07:18 2 CPUs in system; running 2 parallel copies of tests Dhrystone 2 using register variables 50495548.8 lps (10.0 s, 7 samples) Double-Precision Whetstone 9919.2 MWIPS (9.9 s, 7 samples) Execl Throughput 5222.0 lps (29.7 s, 2 samples) File Copy 1024 bufsize 2000 maxblocks 821152.3 KBps (30.0 s, 2 samples) File Copy 256 bufsize 500 maxblocks 216521.0 KBps (30.0 s, 2 samples) File Copy 4096 bufsize 8000 maxblocks 2339138.3 KBps (30.0 s, 2 samples) Pipe Throughput 1034483.9 lps (10.0 s, 7 samples) Pipe-based Context Switching 241128.0 lps (10.0 s, 7 samples) Process Creation 15576.3 lps (30.0 s, 2 samples) Shell Scripts (1 concurrent) 6683.2 lpm (60.0 s, 2 samples) Shell Scripts (8 concurrent) 949.2 lpm (60.1 s, 2 samples) System Call Overhead 530123.4 lps (10.0 s, 7 samples) System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 50495548.8 4327.0 Double-Precision Whetstone 55.0 9919.2 1803.5 Execl Throughput 43.0 5222.0 1214.4 File Copy 1024 bufsize 2000 maxblocks 3960.0 821152.3 2073.6 File Copy 256 bufsize 500 maxblocks 1655.0 216521.0 1308.3 File Copy 4096 bufsize 8000 maxblocks 5800.0 2339138.3 4033.0 Pipe Throughput 12440.0 1034483.9 831.6 Pipe-based Context Switching 4000.0 241128.0 602.8 Process Creation 126.0 15576.3 1236.2 Shell Scripts (1 concurrent) 42.4 6683.2 1576.2 Shell Scripts (8 concurrent) 6.0 949.2 1582.0 System Call Overhead 15000.0 530123.4 353.4 ======== System Benchmarks Index Score 1399.9 2.芯花叄的CAS虚拟化平台PS:好玩而已,手上刚好有这台集群的使用权限,私有云没有可比性使用同等规格的配置,2核4G,构建虚拟机,使用Rocky系统刀片式集群服务器H3C UIS B390 G3,硬盘是机械非SSD 虚拟化底座KVM[root@localhost ~]# hostnamectl Static hostname: localhost.localdomain Icon name: computer-vm Chassis: vm Machine ID: dc7cd03c1bd44c7a85aacf1d61414db0 Boot ID: 91a8905e0b2b4570ad21fa9d91e1909e Virtualization: kvm Operating System: Rocky Linux 8.5 (Green Obsidian) CPE OS Name: cpe:/o:rocky:rocky:8.5:GA Kernel: Linux 4.18.0-348.el8.0.2.x86_64 Architecture: x86-64 看一下CPU[root@localhost ~]# cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 15 model : 6 model name : Intel(R) Xeon(R) Silver 4110 CPU @ 2.10GHz stepping : 3 microcode : 0x1 cpu MHz : 2095.074 cache size : 16384 KB physical id : 0 siblings : 2 core id : 0 cpu cores : 2 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 13 wp : yes flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc nopl xtopology cpuid tsc_known_freq pni cx16 x2apic hypervisor lahf_lm cpuid_fault pti bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit bogomips : 4190.14 clflush size : 64 cache_alignment : 128 address sizes : 46 bits physical, 48 bits virtual power management: processor : 1 vendor_id : GenuineIntel cpu family : 15 model : 6 model name : Intel(R) Xeon(R) Silver 4110 CPU @ 2.10GHz stepping : 3 microcode : 0x1 cpu MHz : 2095.074 cache size : 16384 KB physical id : 0 siblings : 2 core id : 1 cpu cores : 2 apicid : 1 initial apicid : 1 fpu : yes fpu_exception : yes cpuid level : 13 wp : yes flags : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc nopl xtopology cpuid tsc_known_freq pni cx16 x2apic hypervisor lahf_lm cpuid_fault pti bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit bogomips : 4190.14 clflush size : 64 cache_alignment : 128 address sizes : 46 bits physical, 48 bits virtual power management: 测试结果不言而喻了啊======================================================================== BYTE UNIX Benchmarks (Version 5.1.3) System: localhost.localdomain: GNU/Linux OS: GNU/Linux -- 4.18.0-348.el8.0.2.x86_64 -- #1 SMP Sun Nov 14 00:51:12 UTC 2021 Machine: x86_64 (x86_64) Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8") CPU 0: Intel(R) Xeon(R) Silver 4110 CPU @ 2.10GHz (4190.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET CPU 1: Intel(R) Xeon(R) Silver 4110 CPU @ 2.10GHz (4190.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET 22:24:48 up 18 min, 1 user, load average: 0.14, 0.63, 0.60; runlevel 2022-04-02 ------------------------------------------------------------------------ Benchmark Run: Sat Apr 02 2022 22:24:48 - 22:52:51 2 CPUs in system; running 1 parallel copy of tests Dhrystone 2 using register variables 36507208.1 lps (10.0 s, 7 samples) Double-Precision Whetstone 5156.9 MWIPS (9.3 s, 7 samples) Execl Throughput 3344.5 lps (29.9 s, 2 samples) File Copy 1024 bufsize 2000 maxblocks 353344.0 KBps (30.0 s, 2 samples) File Copy 256 bufsize 500 maxblocks 88893.9 KBps (30.0 s, 2 samples) File Copy 4096 bufsize 8000 maxblocks 1097282.0 KBps (30.0 s, 2 samples) Pipe Throughput 482971.4 lps (10.0 s, 7 samples) Pipe-based Context Switching 49232.5 lps (10.0 s, 7 samples) Process Creation 9286.3 lps (30.0 s, 2 samples) Shell Scripts (1 concurrent) 4518.6 lpm (60.0 s, 2 samples) Shell Scripts (8 concurrent) 880.4 lpm (60.0 s, 2 samples) System Call Overhead 289751.1 lps (10.0 s, 7 samples) System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 36507208.1 3128.3 Double-Precision Whetstone 55.0 5156.9 937.6 Execl Throughput 43.0 3344.5 777.8 File Copy 1024 bufsize 2000 maxblocks 3960.0 353344.0 892.3 File Copy 256 bufsize 500 maxblocks 1655.0 88893.9 537.1 File Copy 4096 bufsize 8000 maxblocks 5800.0 1097282.0 1891.9 Pipe Throughput 12440.0 482971.4 388.2 Pipe-based Context Switching 4000.0 49232.5 123.1 Process Creation 126.0 9286.3 737.0 Shell Scripts (1 concurrent) 42.4 4518.6 1065.7 Shell Scripts (8 concurrent) 6.0 880.4 1467.3 System Call Overhead 15000.0 289751.1 193.2 ======== System Benchmarks Index Score 727.6 ------------------------------------------------------------------------ Benchmark Run: Sat Apr 02 2022 22:52:51 - 23:20:57 2 CPUs in system; running 2 parallel copies of tests Dhrystone 2 using register variables 68622501.4 lps (10.0 s, 7 samples) Double-Precision Whetstone 9653.6 MWIPS (9.4 s, 7 samples) Execl Throughput 4093.6 lps (30.0 s, 2 samples) File Copy 1024 bufsize 2000 maxblocks 512635.8 KBps (30.0 s, 2 samples) File Copy 256 bufsize 500 maxblocks 132983.5 KBps (30.0 s, 2 samples) File Copy 4096 bufsize 8000 maxblocks 1593856.2 KBps (30.0 s, 2 samples) Pipe Throughput 981623.3 lps (10.0 s, 7 samples) Pipe-based Context Switching 239091.2 lps (10.0 s, 7 samples) Process Creation 12172.7 lps (30.0 s, 2 samples) Shell Scripts (1 concurrent) 6087.4 lpm (60.0 s, 2 samples) Shell Scripts (8 concurrent) 901.7 lpm (60.1 s, 2 samples) System Call Overhead 555546.5 lps (10.0 s, 7 samples) System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 68622501.4 5880.2 Double-Precision Whetstone 55.0 9653.6 1755.2 Execl Throughput 43.0 4093.6 952.0 File Copy 1024 bufsize 2000 maxblocks 3960.0 512635.8 1294.5 File Copy 256 bufsize 500 maxblocks 1655.0 132983.5 803.5 File Copy 4096 bufsize 8000 maxblocks 5800.0 1593856.2 2748.0 Pipe Throughput 12440.0 981623.3 789.1 Pipe-based Context Switching 4000.0 239091.2 597.7 Process Creation 126.0 12172.7 966.1 Shell Scripts (1 concurrent) 42.4 6087.4 1435.7 Shell Scripts (8 concurrent) 6.0 901.7 1502.8 System Call Overhead 15000.0 555546.5 370.4 ======== System Benchmarks Index Score 1213.8 3.猾蔚芸的鲲鹏ECS kc1型 相同配置,2核4G,使用CentOS7 ARM [root@ecs-kc1-large-2-linux-20211012164825 ~]# hostnamectl Static hostname: ecs-kc1-large-2-linux-20211012164825 Icon name: computer Machine ID: 9be71ad18fa04211933d37d9f75b05e8 Boot ID: 3383ad9765f0446998a4b1db87178135 Operating System: CentOS Linux 7 (AltArch) CPE OS Name: cpe:/o:centos:centos:7 Kernel: Linux 4.18.0-80.7.2.el7.aarch64 Architecture: arm64[root@ecs-kc1-large-2-linux-20211012164825 ~]# cat /proc/cpuinfo processor : 0 BogoMIPS : 200.00 Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma dcpop asimddp asimdfhm CPU implementer : 0x48 CPU architecture: 8 CPU variant : 0x1 CPU part : 0xd01 CPU revision : 0 processor : 1 BogoMIPS : 200.00 Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma dcpop asimddp asimdfhm CPU implementer : 0x48 CPU architecture: 8 CPU variant : 0x1 CPU part : 0xd01 CPU revision : 0 测试结果 这个嘛......狗头保命了======================================================================== BYTE UNIX Benchmarks (Version 5.1.3) System: ecs-kc1-large-2-linux-20211012164825: GNU/Linux OS: GNU/Linux -- 4.18.0-80.7.2.el7.aarch64 -- #1 SMP Thu Sep 12 16:13:20 UTC 2019 Machine: aarch64 (aarch64) Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8") CPU 0: (200.0 bogomips) CPU 1: (200.0 bogomips) 23:34:11 up 31 min, 3 users, load average: 0.08, 0.47, 0.47; runlevel 2022-04-02 ------------------------------------------------------------------------ Benchmark Run: Sat Apr 02 2022 23:34:11 - 00:02:20 2 CPUs in system; running 1 parallel copy of tests Dhrystone 2 using register variables 25784740.7 lps (10.0 s, 7 samples) Double-Precision Whetstone 3545.8 MWIPS (10.0 s, 7 samples) Execl Throughput 4839.3 lps (29.9 s, 2 samples) File Copy 1024 bufsize 2000 maxblocks 514079.8 KBps (30.0 s, 2 samples) File Copy 256 bufsize 500 maxblocks 140389.0 KBps (30.0 s, 2 samples) File Copy 4096 bufsize 8000 maxblocks 1559502.4 KBps (30.0 s, 2 samples) Pipe Throughput 1171578.3 lps (10.0 s, 7 samples) Pipe-based Context Switching 118797.1 lps (10.0 s, 7 samples) Process Creation 9589.2 lps (30.0 s, 2 samples) Shell Scripts (1 concurrent) 7641.9 lpm (60.0 s, 2 samples) Shell Scripts (8 concurrent) 1506.2 lpm (60.0 s, 2 samples) System Call Overhead 858605.9 lps (10.0 s, 7 samples) System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 25784740.7 2209.5 Double-Precision Whetstone 55.0 3545.8 644.7 Execl Throughput 43.0 4839.3 1125.4 File Copy 1024 bufsize 2000 maxblocks 3960.0 514079.8 1298.2 File Copy 256 bufsize 500 maxblocks 1655.0 140389.0 848.3 File Copy 4096 bufsize 8000 maxblocks 5800.0 1559502.4 2688.8 Pipe Throughput 12440.0 1171578.3 941.8 Pipe-based Context Switching 4000.0 118797.1 297.0 Process Creation 126.0 9589.2 761.0 Shell Scripts (1 concurrent) 42.4 7641.9 1802.3 Shell Scripts (8 concurrent) 6.0 1506.2 2510.4 System Call Overhead 15000.0 858605.9 572.4 ======== System Benchmarks Index Score 1083.5 ------------------------------------------------------------------------ Benchmark Run: Sun Apr 03 2022 00:02:20 - 00:30:28 2 CPUs in system; running 2 parallel copies of tests Dhrystone 2 using register variables 51494422.1 lps (10.0 s, 7 samples) Double-Precision Whetstone 7085.7 MWIPS (10.0 s, 7 samples) Execl Throughput 7237.2 lps (30.0 s, 2 samples) File Copy 1024 bufsize 2000 maxblocks 680235.2 KBps (30.0 s, 2 samples) File Copy 256 bufsize 500 maxblocks 185055.1 KBps (30.0 s, 2 samples) File Copy 4096 bufsize 8000 maxblocks 2245821.9 KBps (30.0 s, 2 samples) Pipe Throughput 2331956.5 lps (10.0 s, 7 samples) Pipe-based Context Switching 434571.5 lps (10.0 s, 7 samples) Process Creation 16695.0 lps (30.0 s, 2 samples) Shell Scripts (1 concurrent) 11076.0 lpm (60.0 s, 2 samples) Shell Scripts (8 concurrent) 1563.8 lpm (60.0 s, 2 samples) System Call Overhead 1607332.0 lps (10.0 s, 7 samples) System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 51494422.1 4412.5 Double-Precision Whetstone 55.0 7085.7 1288.3 Execl Throughput 43.0 7237.2 1683.1 File Copy 1024 bufsize 2000 maxblocks 3960.0 680235.2 1717.8 File Copy 256 bufsize 500 maxblocks 1655.0 185055.1 1118.2 File Copy 4096 bufsize 8000 maxblocks 5800.0 2245821.9 3872.1 Pipe Throughput 12440.0 2331956.5 1874.6 Pipe-based Context Switching 4000.0 434571.5 1086.4 Process Creation 126.0 16695.0 1325.0 Shell Scripts (1 concurrent) 42.4 11076.0 2612.3 Shell Scripts (8 concurrent) 6.0 1563.8 2606.4 System Call Overhead 15000.0 1607332.0 1071.6 ======== System Benchmarks Index Score 1828.9 咱就图一乐,也没测试多次,也没停服务器上的一些业务,哎!就是玩儿
云服务器ECS(Elastic Compute Service)是阿里云提供的性能卓越、稳定可靠、弹性扩展的IaaS(Infrastructure as a Service)级别云计算服务。云计算最基础的概念便是云服务器,对Openstack概念有了解的,对接触ECS就不会有隔阂。 云服务器ECS主要包含以下功能组件:实例、块存储、快照、网络,这些对应了Openstack中的flavor、Cinder、Snapshot、Neutron等经典服务功能组件。对待传统IDC机房,阿里云让我们的业务不用买厚厚的服务器、构建复杂的网络、管理空调水电,在阿里云氪金下单就行了,一台崭新的高性能云服务器ECS就到你手中了。在选择部署什么项目的时候,我还是想了好久:1.部署一个LNMP架构的wordpress?太普通了,云起有大把的wordpress案例了。2.部署一个网盘系统?不够实用,ECS的带宽受限,不适合在单ECS上做一个云盘存储数据,更何况我手抖了选配置的时候就选了40G云硬盘。存储还是得搭配OSS存储桶。3.部署一个宝塔控制面板再部一个别的web项目?手头也没啥有意思的项目拿得出手的。说实话我个人真不是很喜欢宝塔,毕竟几年来宝塔出的严重漏洞也不在少数,功能越多安全风险面就越大。 网络安全一直都是最受瞩目的话题之一,我们所有公开在互联网的资产每分每秒都在受到有意或无意的扫描攻击。前段时间国家公布的最劲爆的消息莫过于,中国互联网持续遭受境外组织的网络攻击。境外组织通过攻击、控制中国境内的计算机,进而对俄罗斯、乌克兰、白俄罗斯的目标进行网络攻击。不少防御能力弱的计算机、服务器沦为肉鸡。 作为网络安全从业者,对蜜罐一定不陌生。蜜罐最大的价值是诱使攻击者展示其能力和资产,蜜罐技术本质上是一种对攻击方进行欺骗的技术,通过布置一些作为诱饵的主机、网络服务或者信息,诱使攻击方对它们实施攻击,从而可以对攻击行为进行捕获 和分析,了解攻击方所使用的工具与方法,推测攻击意图和动机,能够让防御方清晰地了解他们所面对的安全威胁,并通过技术和管理手段来增强实际系统的安全防护能力。 那么今天,我们借着社区ECS计算型 C5测评活动,首先简单看一下阿里云ECS C5的2核4G本版服务器;部署一套开源蜜罐欺骗系统Hfish,来测试捕捉和分析在互联网上泛滥成灾的网络扫描攻击行为;最后对阿里ECS周边的技术功能做个简单举例。 一、ECS服务器上手我选择的是ECS计算型c5,2核4G 带宽5M的配置1.修改SSH远程登录的端口 抛开常规的设置密码操作之外,我个人认为修改SSH远程连接端口是非常重要也是非常基础的操作,就恶意扫描来说,会针对服务的默认端口进行扫描爆破攻击,我们将默认的TCP22端口改成不常用的高端口,可以简单的避免大规模的SSH扫描爆破(除堡垒机跳板机来进行运维,有这些来集中管控更好) 进入ssh配置目录 [root@iZbp14j2amyqheetigvagtZ ~]# cd /etc/ssh 编辑ssh_config配置文件,修改Port字段 [root@iZbp14j2amyqheetigvagtZ ssh]# vim sshd_config [root@iZbp14j2amyqheetigvagtZ ssh]# cat sshd_config |grep Port Port3xxxxxx 重启服务生效,后续在控制台白名单放行即可 [root@iZbp14j2amyqheetigvagtZ ssh]# systemctl restart sshd 既然是测评,我们还是简单看一下2.unixbench测评方法unixbench用来测试服务器跑分也算比较常见,但是受影响的因素较多,仅供参考git到unixbench代码[root@iZbp14j2amyqheetigvagtZ ~]# git clone https://github.com/kdlucas/byte-unixbench.git Cloning into 'byte-unixbench'... remote: Enumerating objects: 222, done. remote: Counting objects: 100% (17/17), done. remote: Compressing objects: 100% (12/12), done. remote: Total 222 (delta 7), reused 12 (delta 5), pack-reused 205 Receiving objects: 100% (222/222), 225.58 KiB | 632.00 KiB/s, done. Resolving deltas: 100% (113/113), done.对unixbench进行make[root@iZbp14j2amyqheetigvagtZ byte-unixbench]# cd UnixBench/ [root@iZbp14j2amyqheetigvagtZ UnixBench]# makeECS服务器需要安装perl-time-hies组件[root@iZbp14j2amyqheetigvagtZ UnixBench]# yum -y install perl-Time-HiRes运行Run[root@iZbp14j2amyqheetigvagtZ UnixBench]# ./Run 测试结果======================================================================== BYTE UNIX Benchmarks (Version 5.1.3) System: iZbp14j2amyqheetigvagtZ: GNU/Linux OS: GNU/Linux -- 5.10.84-10.2.al8.x86_64 -- #1 SMP Thu Feb 10 15:03:09 CST 2022 Machine: x86_64 (x86_64) Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8") CPU 0: Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz (5000.0 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET CPU 1: Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz (5000.0 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET 23:11:07 up 1 day, 7:08, 4 users, load average: 0.10, 0.09, 0.05; runlevel 2022-03-31 ------------------------------------------------------------------------ Benchmark Run: Fri Apr 01 2022 23:11:07 - 23:39:12 2 CPUs in system; running 1 parallel copy of tests Dhrystone 2 using register variables 34381345.8 lps (10.0 s, 7 samples) Double-Precision Whetstone 5587.9 MWIPS (9.9 s, 7 samples) Execl Throughput 3572.5 lps (30.0 s, 2 samples) File Copy 1024 bufsize 2000 maxblocks 627665.4 KBps (30.0 s, 2 samples) File Copy 256 bufsize 500 maxblocks 166712.0 KBps (30.0 s, 2 samples) File Copy 4096 bufsize 8000 maxblocks 1735567.3 KBps (30.0 s, 2 samples) Pipe Throughput 771403.2 lps (10.0 s, 7 samples) Pipe-based Context Switching 217316.8 lps (10.0 s, 7 samples) Process Creation 9249.5 lps (30.0 s, 2 samples) Shell Scripts (1 concurrent) 5575.2 lpm (60.0 s, 2 samples) Shell Scripts (8 concurrent) 928.2 lpm (60.0 s, 2 samples) System Call Overhead 415531.6 lps (10.0 s, 7 samples) System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 34381345.8 2946.1 Double-Precision Whetstone 55.0 5587.9 1016.0 Execl Throughput 43.0 3572.5 830.8 File Copy 1024 bufsize 2000 maxblocks 3960.0 627665.4 1585.0 File Copy 256 bufsize 500 maxblocks 1655.0 166712.0 1007.3 File Copy 4096 bufsize 8000 maxblocks 5800.0 1735567.3 2992.4 Pipe Throughput 12440.0 771403.2 620.1 Pipe-based Context Switching 4000.0 217316.8 543.3 Process Creation 126.0 9249.5 734.1 Shell Scripts (1 concurrent) 42.4 5575.2 1314.9 Shell Scripts (8 concurrent) 6.0 928.2 1547.0 System Call Overhead 15000.0 415531.6 277.0 ======== System Benchmarks Index Score 1042.9 ------------------------------------------------------------------------ Benchmark Run: Fri Apr 01 2022 23:39:12 - 00:07:18 2 CPUs in system; running 2 parallel copies of tests Dhrystone 2 using register variables 50495548.8 lps (10.0 s, 7 samples) Double-Precision Whetstone 9919.2 MWIPS (9.9 s, 7 samples) Execl Throughput 5222.0 lps (29.7 s, 2 samples) File Copy 1024 bufsize 2000 maxblocks 821152.3 KBps (30.0 s, 2 samples) File Copy 256 bufsize 500 maxblocks 216521.0 KBps (30.0 s, 2 samples) File Copy 4096 bufsize 8000 maxblocks 2339138.3 KBps (30.0 s, 2 samples) Pipe Throughput 1034483.9 lps (10.0 s, 7 samples) Pipe-based Context Switching 241128.0 lps (10.0 s, 7 samples) Process Creation 15576.3 lps (30.0 s, 2 samples) Shell Scripts (1 concurrent) 6683.2 lpm (60.0 s, 2 samples) Shell Scripts (8 concurrent) 949.2 lpm (60.1 s, 2 samples) System Call Overhead 530123.4 lps (10.0 s, 7 samples) System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 50495548.8 4327.0 Double-Precision Whetstone 55.0 9919.2 1803.5 Execl Throughput 43.0 5222.0 1214.4 File Copy 1024 bufsize 2000 maxblocks 3960.0 821152.3 2073.6 File Copy 256 bufsize 500 maxblocks 1655.0 216521.0 1308.3 File Copy 4096 bufsize 8000 maxblocks 5800.0 2339138.3 4033.0 Pipe Throughput 12440.0 1034483.9 831.6 Pipe-based Context Switching 4000.0 241128.0 602.8 Process Creation 126.0 15576.3 1236.2 Shell Scripts (1 concurrent) 42.4 6683.2 1576.2 Shell Scripts (8 concurrent) 6.0 949.2 1582.0 System Call Overhead 15000.0 530123.4 353.4 ======== System Benchmarks Index Score 1399.9 基准翻译参考来自:https://blog.csdn.net/gatieme/article/details/50912910 2.ECS的CPU信息处理器为Intel(R) Xeon(R) Platinum 8163 CPU[root@iZbp14j2amyqheetigvagtZ ~]# cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 85 model name : Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz stepping : 4 microcode : 0x1 cpu MHz : 2499.998 cache size : 33792 KB physical id : 0 siblings : 2 core id : 0 cpu cores : 1 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 22 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti ibrs ibpb stibp fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx avx512f avx512dq rdseed adx smap avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 arat bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs taa itlb_multihit bogomips : 4999.99 clflush size : 64 cache_alignment : 64 address sizes : 46 bits physical, 48 bits virtual power management: processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 85 model name : Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz stepping : 4 microcode : 0x1 cpu MHz : 2499.998 cache size : 33792 KB physical id : 0 siblings : 2 core id : 0 cpu cores : 1 apicid : 1 initial apicid : 1 fpu : yes fpu_exception : yes cpuid level : 22 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti ibrs ibpb stibp fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx avx512f avx512dq rdseed adx smap avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 arat bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs taa itlb_multihit bogomips : 4999.99 clflush size : 64 cache_alignment : 64 address sizes : 46 bits physical, 48 bits virtual power management: 3.读写IO的测试[root@iZbp14j2amyqheetigvagtZ ~]# dd if=/dev/zero of=IO-test bs=64k count=4k oflag=dsync 4096+0 records in 4096+0 records out 268435456 bytes (268 MB, 256 MiB) copied, 6.82777 s, 39.3 MB/s [root@iZbp14j2amyqheetigvagtZ ~]# dd if=/dev/zero of=IO-test bs=8k count=256k conv=fdatasync 262144+0 records in 262144+0 records out 2147483648 bytes (2.1 GB, 2.0 GiB) copied, 20.0371 s, 107 MB/s 4.站长之家的ping检测我服务器选择可用区在杭州本地,这个最快4ms就有点离谱 二、部署Hfish开源蜜罐系统1.ECS部署容器安装podman[root@iZbp14j2amyqheetigvagtZ ssh]# dnf install -y podman 拉取hfish容器镜像[root@iZbp14j2amyqheetigvagtZ ~]# podman pull threatbook/hfish-server:latest ✔ docker.io/threatbook/hfish-server:latest Trying to pull docker.io/threatbook/hfish-server:latest... Getting image source signatures Copying blob ab8e6b0f1fc6 skipped: already exists Copying blob 4b755810d514 skipped: already exists Copying blob 3bc29d5c7e7b skipped: already exists Copying blob 9f0220d857d3 skipped: already exists Copying blob a0d0a0d46f8b skipped: already exists Copying blob 349cd78be449 done Copying blob 15e4c67086cd done Copying blob ec5ac59a23da done Copying blob 6b049e805320 done Copying config 0c91d36b5a done Writing manifest to image destination Storing signatures 0c91d36b5a67f3489fa813a8809c73c1482499b8eaa5643f4e46990a9c4d623e 运行hfish容器,挂载目录,设置容器主机网络[root@iZbp14j2amyqheetigvagtZ ~]# mkdir /usr/share/hfish [root@iZbp14j2amyqheetigvagtZ ~]# podman run -itd --name hfish -v /usr/share/hfish:/usr/share/hfish --network host --privileged=true threatbook/hfish-server:latest 1de8da4ddf70e0668529beee7787a0009f563b496ffa6bca1f542556d0f98272 hfish容器运行后,可以在ECS看到蜜罐部署的诱饵服务端口,都是常见的服务端口。此前我们修改了默认的SSH服务22端口,也是将蜜罐部署到正常的22端口上去 2.云主机的防火墙设置云主机的特点之一,就是默认情况下防火墙不再受系统上的iptables或firewall控制,而是由云主机所接入的安全组配置所控制,所有访问流量受安全组的黑白名单控制。回到阿里云ECS控制台,修改安全组,将这些蜜罐端口放行 成功从公网访问hfish的管理页面 进入管理页面,需要配置数据库,稍后,我们使用RDS云数据库配合部署 3.使用云数据库RDS配合部署Hfish考虑到在公网部署蜜罐,还是决定使用云数据库。我们进入到阿里云RDS控制台,这里我们有一台RDS云数据库与ECS处于同一可用区,我们部署hfish数据库在RDS中我们先将ECS内网地址加入RDS的白名单中,允许ECS进行访问 数据库管理中,选择创建数据库,输入数据库名称 选择账号管理,创建数据库账号,选择创建的数据库进行授权 完成RDS数据库配置后,我们在Hfish中进行配置连接,填入信息 完成数据库连接,蜜罐系统成功上线。4.直观体验互联网中的腥风血雨在没有WAF、FW、IDSIPS这些网络安全设备时,搭建一个简单的蜜罐,是为服务器提供最方便最简易的主动防御能力。到这里我们的Hfish蜜罐系统已经成功上线,我们可以看到Hfish现在为单节点部署,在线部署了9个蜜罐服务 Hfish通过攻击者地址提供了炫酷的态势展示大屏,这也是我非常喜欢这个开源项目的原因 扫描测试先对服务器进行简单的存活性\端口开放性进行一个扫描,这里扫描结果也是蜜罐部署的服务 先查一下我的攻击地址 在扫描感知中,立马就可以看到我进行了扫描行为 服务爆破攻击测试我使用经典的hydra进行用户名密码爆破,编写一个简单的字典大概十个字段 在蜜罐中立马采集到攻击行为,针对SSH蜜罐的攻击。采集信息包括攻击者IP、IP所述物理地、爆破的详细信息、日期时间等 蜜罐其他功能Hfish还有其他功能,比如说配合jsonp进行攻击溯源;经常被爆破的账号密码收集、采集系统服务弱口令、与社区联动的样本检测等等功能。。。 也可以自己针对不同的业务,去仿真构造许多不同的蜜罐服务。我自己其他服务器上就仿造了一个深X服SSLVPN登录页面的蜜罐,在红蓝对抗期间效果颇丰。 ECS C5云服务器的性能肯定是毋庸置疑的,搭配RDS高性能云数据库。在正常部署业务的同时也可以考虑部署一些简单的蜜罐在服务器上,可以为服务器提供简单的主动防御能力,比如抗一抗坏人的暴力破解。但是真正需要使用蜜罐来直面攻击者进行可溯源的行为诱捕,我们的架构运维人员还是需要好好考虑服务运行的架构,避免出现反向效果,反而成为安全漏洞三、云效流水线构建部署到ECS主机拿实验室的2048小游戏流水线做案例,所有部署到ECS主机上的设置类似。选择流水线配置,选择部署配置,主机配置 添加主机,选择新建服务连接 创建服务连接完成后,选择服务连接之后选择地域,我们的ECS在杭州。这里云网络的架构一样,不能跨地域部署 选择ECS 设置主机组环境,包括日常、预发、正式环境 当然部署脚本还是需要的,因为2048这个测试项目是需要运行deploy.sh脚本运行jar包,deploy.sh的脚本也包含了一个web存活性的检测。自己在部署项目到ecs的时候可以设置启动服务的命令yum -y install java mkdir -p /home/admin/application/ tar zxvf /home/admin/app/package.tgz -C /home/admin/application sh /home/admin/application/deploy.sh restart 流水线运行ok,一路绿灯,好看 先玩会2048,休息一下子四、ECS控制台周边实用功能 1.ECS云助手实现自动化运维云助手是专为云服务器ECS打造的原生自动化运维工具,典型的使用场景包括:安装卸载软件、启动或停止服务、分发配置文件和执行一般的命令(或脚本) (1)自定义命令执行可以通过ECS云助手发送外面自定义的脚本命令首先在ECS控制台中选择云助手,点击创建/执行命令 这里我们做一个云盘性能的随机读写的测试,脚本内容如下:#安装libaio和FIO yum install libaio -y yum install libaio-devel -y yum install fio -y #测试随机写IOPS fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/vda -name=Rand_Write_Testing #测试随机读IOPS fio -direct=1 -iodepth=128 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/vda -name=Rand_Read_Testing 创建命令,输入名称、选择类型、输入脚本内容 选择需要运行脚本的实例,最后可以选择执行并保存,这样下次也可以再使用这条自定义的命令可以再命令执行结果中看到正在进行的命令 执行成功,实时返回执行结果 随机读写测试结果如下Rand_Write_Testing: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=128 fio-3.22 Starting 1 process Rand_Write_Testing: (groupid=0, jobs=1): err= 0: pid=3091249: Thu May 5 19:09:05 2022 write: IOPS=1979, BW=7919KiB/s (8109kB/s)(1024MiB/132414msec); 0 zone resets slat (usec): min=2, max=128, avg= 5.39, stdev= 3.33 clat (usec): min=302, max=129358, avg=64648.10, stdev=46156.20 lat (usec): min=307, max=129362, avg=64653.59, stdev=46155.69 clat percentiles (usec): | 1.00th=[ 1172], 5.00th=[ 1598], 10.00th=[ 1844], 20.00th=[ 2278], | 30.00th=[ 2900], 40.00th=[ 96994], 50.00th=[ 98042], 60.00th=[ 99091], | 70.00th=[ 99091], 80.00th=[ 99091], 90.00th=[100140], 95.00th=[100140], | 99.00th=[101188], 99.50th=[102237], 99.90th=[106431], 99.95th=[111674], | 99.99th=[128451] bw ( KiB/s): min= 7776, max= 9728, per=100.00%, avg=7926.03, stdev=123.22, samples=264 iops : min= 1944, max= 2432, avg=1981.51, stdev=30.80, samples=264 lat (usec) : 500=0.02%, 750=0.09%, 1000=0.30% lat (msec) : 2=13.26%, 4=21.15%, 10=0.49%, 20=0.04%, 100=57.46% lat (msec) : 250=7.19% cpu : usr=0.45%, sys=0.97%, ctx=46888, majf=0, minf=11 IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.1% issued rwts: total=0,262144,0,0 short=0,0,0,0 dropped=0,0,0,0 latency : target=0, window=0, percentile=100.00%, depth=128 Run status group 0 (all jobs): WRITE: bw=7919KiB/s (8109kB/s), 7919KiB/s-7919KiB/s (8109kB/s-8109kB/s), io=1024MiB (1074MB), run=132414-132414msec Disk stats (read/write): vda: ios=2/262168, merge=0/191, ticks=0/16947224, in_queue=16952277, util=98.95% Rand_Read_Testing: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=128 fio-3.22 Starting 1 process Rand_Read_Testing: (groupid=0, jobs=1): err= 0: pid=3091256: Thu May 5 19:11:19 2022 read: IOPS=1977, BW=7912KiB/s (8102kB/s)(1024MiB/132531msec) slat (usec): min=2, max=134, avg= 5.55, stdev= 3.41 clat (usec): min=246, max=196931, avg=64705.33, stdev=46058.91 lat (usec): min=250, max=196953, avg=64710.99, stdev=46058.56 clat percentiles (usec): | 1.00th=[ 857], 5.00th=[ 1418], 10.00th=[ 1827], 20.00th=[ 2376], | 30.00th=[ 3228], 40.00th=[ 96994], 50.00th=[ 98042], 60.00th=[ 98042], | 70.00th=[ 99091], 80.00th=[ 99091], 90.00th=[100140], 95.00th=[101188], | 99.00th=[102237], 99.50th=[103285], 99.90th=[109577], 99.95th=[113771], | 99.99th=[122160] bw ( KiB/s): min= 7096, max= 9552, per=100.00%, avg=7918.28, stdev=145.27, samples=264 iops : min= 1774, max= 2388, avg=1979.58, stdev=36.33, samples=264 lat (usec) : 250=0.01%, 500=0.09%, 750=0.52%, 1000=1.19% lat (msec) : 2=11.59%, 4=19.74%, 10=2.07%, 20=0.06%, 50=0.05% lat (msec) : 100=53.47%, 250=11.22% cpu : usr=0.38%, sys=1.10%, ctx=101253, majf=0, minf=139 IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.1% issued rwts: total=262144,0,0,0 short=0,0,0,0 dropped=0,0,0,0 latency : target=0, window=0, percentile=100.00%, depth=128 Run status group 0 (all jobs): READ: bw=7912KiB/s (8102kB/s), 7912KiB/s-7912KiB/s (8102kB/s-8102kB/s), io=1024MiB (1074MB), run=132531-132531msec Disk stats (read/write): vda: ios=261800/516, merge=63/327, ticks=16940339/49204, in_queue=16989663, util=98.73%(2)提供现有命令模板(公共命令)当然,阿里云官方提供了不少命令模板,有很多对系统进行各种测试诊断的脚本,其实是非常方便的。 这里再试用一下Linux性能诊断命令 完成Linux性能诊断命令的执行 (3)批量发送远程文件ECS云助手还可以实现批量发送远程文件选择目标系统,选择上传的文件,输入文件名称,上传路径 选择需要上传的ECS服务器,执行上传文件上传成功 查看,文件已经批量上传成功(4)混合云架构-ECS云助手托管任意服务器ECS云助手还可以对其他私有服务器、其他公有云厂商的服务器,实现托管,进行统一的自动化运维管理,只需要被托管的服务器能够上网。我们只需要创建激活码,输入名称、来源IP限制(默认为空不做限制)、额度、有效期时间,生成激活码生成激活码后,弹出三个不同系统的安装agent的命令,我们直接粘贴到被托管的服务器就可以了将命令全部粘贴到我们本地的服务器,这是一台运行在内网ESXI服务器上的虚拟机脚本内容如下:下载云助手客户端安装包安装云助手客户端注册为云助手托管实例完成托管服务器上线成功托管的服务器就可以在ECS云助手批量执行命令、批量上传文件时进行选择2.ECS服务器告警联动至钉钉机器人阿里云ECS有着强大的监控系统,支持一键报警和自定义报警规则。云监控的报警通知方式多样,支持电话+短信+邮件+钉钉机器人。我个人毕竟喜欢使用钉钉的机器人,而不是电话或者短信,无故的短信总会让我血压升高。这里我们就配置钉钉机器人webhook并开启ECS服务器的一键告警。 (1)配置钉钉机器人webhook在一个专用的告警群里设置钉钉机器人,进入群设置,点击智能群助手 单击添加机器人 钉钉的机器人非常多种多样,这里单击自定义 输入机器人名字,选中自定义关键词复选框,逐个添加关键词,包括:云监控、ECS、报警,完成创建 完成创建后出现的webhook地址,这个很关键,不可外泄(2)设置报警联系人进入阿里云云监控https://cloudmonitornext.console.aliyun.com/alert-contactGroup点击报警服务,选择报警联系人,新建联系人输入姓名,输入webhook地址,验证联系人,通过后确认新建联系组,输入组名,将刚刚创建的联系人添加进来 (3)启用ECS一键报警点击一键报警列表,可以看到云服务器ECS一键报警,一键报警功能,会创建CPU使用率、磁盘使用率、内存使用率、网络带宽使用率相关报警规则,对所有ECS实例生效启用一键报警,修改修改报警联系组,选择我们创建的钉钉机器人联系组修改完成(4)测试告警进入ECS跑一个for循环四个进程烤CPU此时ECS的CPU使用率在100%云监控的CPU使用率也在100%,此时必然已经触发了告警规则我们的钉钉机器人来消息了,测试成功掐掉测试进程,服务器恢复正常,钉钉机器人再次告知3.ECS操作系统重装 ECS的特点之一,就是可以灵活的更换操作系统。在关机状态下,选择云盘和镜像,更换操作系统 在更换镜像页面中,我们可以选择阿里公有的镜像,CentOS官方已经停止维护,推荐大家使用AlibabaCloudLinux,完美兼容CentOS系 镜像市场包含了大量的预安装软件的镜像系统,使用这些镜像直接部署ECS服务器,非常便捷得到我们所需的服务器环境 4.ECS快照云计算时代,快照技术简直是所有人的福音。快照允许服务器系统回到任何一个做了快照的时候。在物理裸金属服务器上,我们的错误操作会使业务或系统崩溃,排错需要大量的人力物力。但是有了快照,我们在正常运行的时候设定自动快照策略,当系统出现问题难以排错时,我们就可以直接使用快照将服务器回滚到正常运行的状态。快照是某一时间点云盘数据状态的备份文件。云盘第一份快照是实际使用量的全量快照,不备份空数据块,后续创建的快照均是增量快照,只存储变化的数据块 (1)测试快照恢复能力这里我们使用快照能力做一个简单的测试,在opt下面创建test文件 进入ECS控制台,选择云盘,在对应的服务器云盘处点击创建快照 创建快照,输入快照名称等参数,确定创建 在控制台完成快照的创建后,我们进入服务器,手动删除我们的测试文件 在ECS控制台快照处,选择我们创建好的快照,我们可以通过这个创建好的快照进行回滚,复制快照,已经创建自定义镜像。 选择回滚云盘,阿里云建议在回滚前对当前状态也进行创建快照处理,这里我没有什么关键改动,就直接选择确定即可。 重新登录服务器后,服务器中opt下面的测试文件又回到创建快照之前的状态 (2)配置自动快照策略自动快照策略可以在预设的时间点周期性地创建快照,保护云盘数据。当在ECS实例上部署的个人网站或者数据库等应用出现系统安全攻击或者触发系统漏洞时,可能来不及手动创建快照时就可以使用最临近的自动快照回滚云盘,降低损失。 创建策略,设定每周日的凌晨两点创建快照,并保存快照30天 完成策略创建,提示设置云盘 将策略应用到云盘即可 5.ECS密钥对将登录权限收入堡垒机ECS中的密钥对功能也是服务器常规的安全操作,我们可以通过配置密钥对实现免密登录服务器,密钥对安全强度远远高于普通SSH用户密码,前提私钥没有被泄露。这里我们通过配置阿里云ECS控制台中的密钥对,将服务器收入堡垒机的管控,只允许通过堡垒机登录服务器,不允许普通密码的登录(1)创建密钥对进入ECS控制台,选择密钥对,选择创建密钥对输入名称,创建类型 创建完成,选择绑定密钥对到ECS服务器上,这里密钥对和ECS只能一对一的配置,但是可以修改服务器的authorized_keys文件设置多密钥 选择需要绑定的ECS实例,完成确定 重启ECS实例,使密钥对生效 电脑里已经下载好了从控制台创建的私钥 (2)导入私钥至堡垒机登录到堡垒机(所有SSH客户端、堡垒机系统操作类似)在系统用户中,创建登录ECS服务器的用户,配置认证处不选择密码,选择SSH密钥文件 选择控制台导出的私钥文件,完成用户的创建 在资产信息中,确认认证的管理用户为刚刚创建的ECS系统用户,我们这里就完成了堡垒机对ECS服务器的免密登录配置,成功导入用户密钥 (3)测试登录效果成功在Web控制台登录到ECS服务器 此时使用普通的SSH用户密码登录已经不行了,ECS验证客户端私钥的时候已经被ECS服务器拒绝了 查看此时的SSHD服务配置,密码认证的方式已经被阿里给关闭了 此时就完成了ECS管控收纳至堡垒机,并禁止了普通密码登录结尾虽然我算是开发者社区的一员,但是我真正意义上不算是个开发者,很多技术层面我只能从运维的角度去思考问题。从读高中的时候就使用了第一台ECS云服务器,自己通过课堂上学习的HTML基础手撸静态页面代码,那个时候也就会配一个Apache,把自己写的html页面替换到默认目录下,这么多年过去了,使用过的云厂商的云服务器也不在少数。ECS也算是陪伴了自己这么多年的学习生活,现在的我,自建lamp\lnmp架构的站点可以说是手到擒来了,无非就是安装三大服务,配置php环境,对接业务数据库,这些代码,手敲可能得几分钟,但是基于容器构建情况下,几个docker run或者docker-compose up就可以实现直接部署。因此我认为云计算的未来不再仅仅是基于基础设施层面了,云原生技术将会全面铺开,底层的虚拟机,应该跑个部署脚本就可以完成基础设施建设了,我们需要把运维的重心转移到云原生层面,围绕着云原生去做更好的技术维护。这些年阿里围绕ECS推出的新功能新产品越来越多,使用上确实也方便了很多,希望平台能够越做越好叭~
Kubernetes集群中节点调度,污点配置默认配置下Kubernetes不会将Pod调度Master节点,策略设置为资源尽量不调度到污点节点中去kubectl describe node master查看master节点Taints配置[root@master modules]# kubectl describe node master|grep TaintsTaints: node-role.kubernetes.io/master:NoSchedule将master运行pod调度,也作为工作节点使用[root@master modules]# kubectl taint node master node-role.kubernetes.io/master-[root@master modules]# kubectl describe node master|grep TaintsTaints: <none>
环境:已安装完成Kubernetesmaster节点192.168.1.10/centos7node节点 192.168.1.11/centos7 配置IPVS[root@master ~]# touch /etc/sysconfig/modules/ipvs.modules [root@master ~]# vim /etc/sysconfig/modules/ipvs.modules #写入以下内容 #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 [root@master ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules [root@master ~]# bash /etc/sysconfig/modules/ipvs.modules#验证[root@master ~]# lsmod|grep -e ip_vs -e nf_conntrack_ipv4 nf_conntrack_ipv4 15053 0 nf_defrag_ipv4 12729 1 nf_conntrack_ipv4 ip_vs_sh 12688 0 ip_vs_wrr 12697 0 ip_vs_rr 12600 0 ip_vs 145497 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr nf_conntrack 139224 2 ip_vs,nf_conntrack_ipv4 libcrc32c 12644 3 xfs,ip_vs,nf_conntrack [root@master ~]# yum -y install ipset ipvsadmnode节点相同操作 开启IPVS修改ConfigMap的kube-system/kube-proxy中的config.conf文件,修改为 mode: "ipvs"[root@master .kube]# kubectl edit cm kube-proxy -n kube-system configmap/kube-proxy edited#进入后编辑方法同vim 重启kube-proxy此处执行删除会自动创建[root@master .kube]# kubectl get pod -n kube-system | grep kube-proxy kube-proxy-8ndgz 1/1 Running 0 92m kube-proxy-lxdbj 1/1 Running 0 96m [root@master .kube]# kubectl delete pod kube-proxy-8ndgz -n kube-system pod "kube-proxy-8ndgz" deleted [root@master .kube]# kubectl delete pod kube-proxy-lxdbj -n kube-system pod "kube-proxy-lxdbj" deleted或者执行[root@master .kube]# kubectl get pod -n kube-system | grep kube-proxy kube-proxy-8ndgz 1/1 Running 0 92m kube-proxy-lxdbj 1/1 Running 0 96m [root@master .kube]# kubectl delete pod kube-proxy-8ndgz -n kube-system pod "kube-proxy-8ndgz" deleted [root@master .kube]# kubectl delete pod kube-proxy-lxdbj -n kube-system pod "kube-proxy-lxdbj" deleted 测试IPVS使用命令ipvsadm –Ln查看创建的服务是否使用ipvs创建集群 查询kube-proxy日志如图已经显示使用ipvs
静态迁移::也叫做常规迁移、离线迁移(Offline Migration)。就是在虚拟机关机或暂停的情况下从一台物理机迁移到另一台物理机。因为虚拟机的文件系统建立在虚拟机镜像上面,所以在虚拟机关机的情况下,只需要简单的迁移虚拟机镜像和相应的配置文件到另外一台物理主机上;如果需要保存虚拟机迁移之前的状态,在迁移之前将虚拟机暂停,然后拷贝状态至目的主机,最后在目的主机重建虚拟机状态,恢复执行。这种方式的迁移过程需要显式的停止虚拟机的运行。动态迁移:(Live Migration):也叫在线迁移(Online Migration)。就是在保证虚拟机上服务正常运行的同时,将一个虚拟机系统从一个物理主机移动到另一个物理主机的过程。该过程不会对最终用户造成明显的影响,从而使得管理员能够在不影响用户正常使用的情况下,对物理服务器进行离线维修或者升级。与静态迁移不同的是,为了保证迁移过程中虚拟机服务的可用,迁移过程仅有非常短暂的停机时间。静态迁移:关闭虚拟机--->导出迁移XML配置-->迁移虚拟磁盘文件-->导入注册虚拟机-->启动虚拟机 动态迁移:NFS Server:CentOS7-192.168.1.20KVM 01 :CentOS7-192.168.1.80KVM 02 :CentOS7-192.168.1.82 1.配置NFS服务器,手动挂载NFS目录到两台KVM[root@nfs share]# cat /etc/exports /opt/share *(rw,sync,no_root_squash) [root@nfs share]# exportfs -r [root@nfs share]# systemctl restart rpcbind [root@nfs share]# systemctl restart nfs [root@nfs share]# showmount -e 192.168.1.20 Export list for 192.168.1.20: /opt/share * [root@kvm01 kvm]# mount -t nfs 192.168.1.20:/opt/share nfs/ [root@kvm01 kvm]# df -h 文件系统 容量 已用 可用 已用% 挂载点 192.168.1.20:/opt/share 36G 15G 21G 42% /kvm/nfs [root@kvm02 kvm]# mount -t nfs 192.168.1.20:/opt/share nfs/ [root@kvm02 kvm]# df -h 文件系统 容量 已用 可用 已用% 挂载点 192.168.1.20:/opt/share 36G 15G 21G 42% /kvm/nfs 2.virsh migrate热迁移虚拟机KVM01上的测试虚拟机,虚拟磁盘位置在NFS挂载目录上 测试虚拟机为运行状态 使用migrate命令,--live在线热迁移,--unsafe关闭安全警告,--verbose显示迁移过程输入KVM02的root密码,完成后KVM01上的虚拟机状态关闭virsh # migrate test-centos --live qemu+ssh://192.168.1.82/system --unsafe --verbose root@192.168.1.82's password: 迁移: [100 %] 到KVM02上,测试虚拟机已经处于运行状态 成功登录到虚拟机,热迁移完成 3.virt-manager图形化迁移虚拟机KVM01在manager上选择add connection,连接至KVM01 添加连接,输入KVM01迁移目标的IP 用户名 在弹出的OPENSSH框中输入root的密码 连接成功后KVM01会出现在manager界面中 进入测试迁移的虚拟机,选择Migrate 选择迁移目标,点击Migrate开始迁移 热迁移中,会将当前运行的虚拟机调整为暂停状态,之后迁移到目标机后开始恢复运行虚拟机,在原主机上关闭虚拟机 迁移完成,在目标机KVM01上测试机已经处于运行状态 运行状态就是迁移之前的虚拟机, 还 行
virsh分别有两种模式,命令模式和交互模式,输入virsh进入交互模式,在virsh后跟命令参数即命令模式一、虚拟机管理1.list 列出虚拟机--all列出所有状态虚拟机 2.start启动虚拟机start启动虚拟机--console进入控制台 3.shutdown/destroy 关闭虚拟机shutdown向虚拟机发送关机指令 --mode指定关机模式: acpi|agent|initctl|signal|paravirt destroy强制关闭虚拟机 4.reboot/reset 重启虚拟机reboot 向虚拟机发送重启命令 reset 重置虚拟机电源强制重启 5.suspend/resume 挂起/恢复虚拟机suspend暂停虚拟机 resume恢复挂起状态 6.save/restore 保存还原虚拟机状态save将虚拟机暂停,保存内存数据到文件 restore将文件内容还原载入到虚拟机 7.undefine删除虚拟机先destroy关闭虚拟机状态,再undefine取消虚拟机定义使用 --remove-all-storage参数删除虚拟机存储卷 8.domblklist 虚拟机块设备列出 9.domblkinfo 块设备容量信息 二、快照管理snapshot-create创建快照snapshot-list列出快照snapshot-info查看快照信息snapshot-current查看系统快照信息 == snapshot-dumpxml编辑快照的xml文件,编辑器用法同vi将快照还原快照删除 测试:在虚拟机上创建一百个文件 创建快照 删除创建的所有文件 执行快照还原操作 恢复到了做快照的那个界面 三、接口网络管理1.VM接口管理domiflist 列出VM接口domifstat统计接口信息 2.网络接口管理iface-list 列出物理机上网卡列表iface-mac查询接口MAC的地址iface-name查询MAC对应的接口iface-dumpxml 显示接口状态XML信息iface-edit 编辑接口XML配置用法等同vi iface-destroy/iface-start 关闭/启用物理网卡iface-bridge 接口添加到桥 3.虚拟网络管理net-list 列出网络net-info查看网络基本信息 net-dumpxml/net-edit 显示/编辑 XML格式的网络配置net-create/net-destroy 创建/删除 网络 四、存储管理1.存储池管理pool-list列出存储池 pool-info 查看存储池信息 pool-dumpxml/pool-edit 查看/编辑 存储池的xml配置 pool-create/pool-destroy/pool-delete 创建/停止/删除 2.存储卷配置vol-list 查询存储池中的存储卷列表 其他# vCPU相关virsh vcpinfo <ID>virsh vcppin <ID> <vCPU> <pCPU> #将一个VM的vCPU绑定到指定的物理核心上virsh setvcpus <ID> <vCPU-Num> #设置一个VM的最多vCPU个数。virsh nodecpustats <CPU-Num> #显示VM(某个)CPU使用情况的统计 #内存相关virsh dommemstat <ID> #获取一个VM内存使用情况统计信息。virsh setmem <ID> <MemSize> #设置一个VM的内存大小(默认单位:KB)virsh freecell #显示当前MUMA单元的可用空闲内存virsh nodememstats <cell> #显示VM的(某个)内存单元使用情况的统计 virsh dumpxml <ID> #显示一个运行中的VM的xml格式的配置信息.virsh version #显示libvirt 和 Hypervisor的版本信息virsh sysinfo #以xml格式打印宿主机的系统信息virsh capabilities #显示当前连接节点所在的宿主机和其自身的架构和特性virsh nodeinfo #显示当前连接节点的基本信息virsh uri #显示当前连接节点的URIvirsh hostnamevirsh connect <URI> #连接到URI指定的Hypervisorvirsh qemu-attach <PID> #根据PID添加一个Qemu进程到libvirt中 #直接向Qemu monitor中发送命令; --hmp:直接传入monitor中无需转换.virsh qemu-monitor-command domain [--hmp] CMD
virt-install命令既可以交互运行,也可以以自动的方式创建与部署虚拟机系统 使用virt-install --help或者man virt-install查找参数帮助文档 运行命令最少需要指定名称、内存、磁盘、安装方法 重要参数有以下:1、通用参数-n NAME, --name=NAME :虚拟机名称,需全局惟一-r MEMORY, --ram=MEMORY :虚拟机内在大小,单位为MB--vcpus=VCPUS[,maxvcpus=MAX][,sockets=#][,cores=#][,threads=#]:VCPU个数及相关配置--cpu=CPU :CPU模式及特性,如coreduo等;可以使用qemu-kvm -cpu ?来获取支持的CPU模式 2、安装方法-c CDROM, --cdrom=CDROM :光盘安装介质; -l LOCATION, --location=LOCATION :安装源URL,支持FTP、HTTP及NFS等--pxe :基于PXE完成安装--os-type=DISTRO_TYPE :操作系统类型,如linux、unix或windows等; --os-variant=DISTRO_VARIANT :某类型操作系统的变体,如rhel5等;--boot=BOOTOPTS:指定安装过程完成后的配置选项,如指定引导设备次序、 例如: --boot cdrom,hd,network:指定引导次序; --boot kernel=KERNEL,initrd=INITRD,kernel_args="console=/dev/ttyS0":指定启动系统的内核及initrd文件; 3、存储参数--disk后支持的常用选项有:path:磁盘文件路径pool:指定存储池位置device:设备类型,如cdrom、disk或floppy等,默认为diskbus:磁盘类型,其可以为ide、scsi、usb、virtio或xensize:设置新磁盘文件大小format:磁盘镜像格式,如raw、qcow2、vmdk 4、网络配置--network后支持的常用选项有:bridge=BRIDGE:连接至名为“BRIDEG”的桥network=NAME:连接至名为“NAME”的网络model:选择网卡类型如e1000、rtl8139、virtiomac:设置固定MAC地址,默认随机给。对于KVM来说,其前三段必须为52:54:00 5、图形化连接配置图形化类型支持三种type:vnc、spice、none port:TYPE为vnc或spice时其监听的端口 listen:TYPE为vnc或spice时所监听的IP地址,默认为127.0.0.1,可以通过修改/etc/libvirt/qemu.conf定义默认值 password:TYPE为vnc或spice时,为远程访问监听的服务进指定认证密码 启动安装虚拟机1.启动安装系统#创建test-centos虚拟机,设置cpu为1内存为512,创建大小8G磁盘文件test-centos.img加载安装镜像ISO,设置启动顺序为光驱-磁盘,设置网络桥接到br1,开启图形化VNCvirt-install \ --name test-centos \ --vcpu 1 \ --ram 512 \ --disk path=disk/test-centos.img,size=8 \ --graphics vnc \ --cdrom isos/CentOS-6.8-x86_64-bin-DVD1.iso \ --boot cdrom,hd \ --network bridge=br1 2.创建虚拟机从镜像文件启动#创建虚拟机centos7fromdisk,设置cpu为1内存为1024,设置磁盘为qcow2系统镜像文件,启动方式为导入,网络桥接到br1,开启图形化VNC[root@localhost kvm]# virt-install \ --name centos7fromdisk \ --vcpus 1 \ --ram 1024 \ --disk disk/CentOS-7-x86_64-GenericCloud-1511.qcow2 \ --network bridge=br1 \ --import\ --graphics vnc 创建虚拟机运行状态 vnc连接虚拟机
KVM虚拟机默认使用RAW格式的img镜像文件,性能最好速度最快。但是不支持新的磁盘功能使用QCOW2格式,支持镜像,zlib磁盘压缩,AES加密等功能 命令qemu-img info 查看镜像格式 qemu-img create 创建镜像文件 #创建格式为qcow2的10G镜像文件test[root@localhost isos]# qemu-img create -f qcow2 test.qcow2 10G Formatting 'test.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off qemu-img convert 转换镜像格式 #将qcow2格式的test镜像转换为格式raw的镜像文件[root@localhost isos]# qemu-img convert -f qcow2 test.qcow2 -O raw test.img qemu-img snapshot 镜像快照配置 “-a snapshot”是让镜像文件使用某个快照“-c snapshot”是创建一个快照“-d”是删除一个快照“-l” 选项是查询并列出镜像文件中的所有快照 #-c <tagname>创建一个快照[root@localhost isos]# qemu-img snapshot -c Test-Snapshot test.qcow2 #-d <tag/id>删除快照[root@localhost isos]# qemu-img snapshot -d Test-Snapshot1 test.qcow2 [root@localhost isos]# qemu-img snapshot -d 3 test.qcow2 qemu-img resize 镜像大小调整 #+2G将镜像增加2G代销,-4G将镜像减少4G大小[root@localhost isos]# qemu-img resize test.img +2G Image resized. [root@localhost isos]# qemu-img resize test.img -4G Image resized. #对qcow2格式镜像,只支持添加不支持减少
qemu-kvm和virt命令相比,qemu-kvm更加接近底层系统。安装qemu-kvm,因为红帽希望大家使用他们推崇的libvirt。基于libvirt的工具如virt-manager和virt-install 提供了非常便捷的虚拟机管理接口,但他们事实上经二次开发后又封装了qemu-kvm的工具,因此,直接使用qemu-kvm命令也能够完成此前的任务。所以将qemu-kvm放到了/usr/libexec/ 下,不在PATH下,需要自己创建软连接CentOS安装了两个重要的命令:qemu-kvm:管理kvmqemu-img:管理磁盘 #安装qemu-kvm组件,添加软连接[root@localhost ~]# yum -y install qemu-kvm [root@localhost ~]# ln -s /usr/libexec/qemu-kvm /usr/local/bin 一、CPU模拟 -cpu 指定模拟的CPU#查看可选CPU型号[root@localhost ~]# qemu-kvm -cpu ? -smp 指定CPU个数maxcpus=最大cpu数]cores=核心数threads=线程数 二、内存定义 -m megs: 设定虚拟机的RAM大小 三、磁盘镜像文件模拟 磁盘文件定义 file=:硬盘映像文件路径media=:指定介质设备类型,有disk,和cdromif= :指定硬盘设备所连接的接口类型,如ide,sd,virtio等file=/path :硬盘映像文件路径index=index:设定同一种控制器类型中不通设备的索引号,即标识号snapshot=snapshot:指定当前硬盘设备是否支持快照功能:on或offcache=cache:定义如何使用物理机缓存来访问块数据,其可用值有none,writeback,unsafe和writethrough(通写)format=format:指定映像文件的格式,具体格式可参见qemu-img命令 镜像文件定义 需要注意的是-cdrom和-hdc不能同时使用:将file指定为/dev/cdrom可以直接使用物理光驱 四、网络配置参数 网卡配置(前端)查看支持模拟网卡型号 tap设备配置(后端) Tap/Tun工作原理 TUN/TAP虚拟网络设备的原理比较简单,他在Linux内核中添加了一个TUN/TAP虚拟网络设备的驱动程序和一个与之相关连的字符设备/dev/net/tun,字符设备tun作为用户空间和内核空间交换数据的接口。用户空间的应用程序可以通过这个设备文件来和内核中的驱动程序进行交互,其操作方式和普通的文件操作无异。当内核将数据包发送到虚拟网络设备时,数据包被保存在设备相关的一个队列中,直到用户空间程序通过打开的字符设备tun的描述符读取时,它才会被拷贝到用户空间的缓冲区中,其效果就相当于,数据包直接发送到了用户空间。通过系统调用write发送数据包时其原理与此类似。 原文链接:https://blog.csdn.net/xiakewudi/java/article/details/76851076 帮助文档:使用网络脚本文件配置(配置tap接口与桥接接口创建网桥),默认使用位置为/etc/qemu-ifup的配置脚本或指定脚本使用script=no或downscript=no禁止脚本配置tap接口名称不指定则默认给一个tapXX 五、其他选项 -name name:指定虚拟机的名称 -boot 定义设备的引导次序每种设备使用一个字符表示。a,b 表示软驱,c表示第一块硬盘,d表示第一个光驱,n-p 表示网络适配器。例如: -boot order=dc,once=d -nographic 禁止图形化输出,直接在终端上打印 -daemonize 虚拟机启动在后台 -vnc :n or x.x.x.x:x 开启vnc 创建测试虚拟机 #编写配置默认网桥脚本,添加执行权限#$1为qemu创建的tap设备号作为参数传给脚本,bridge为在系统上创建好的网桥[root@localhost ~]# vim /etc/qemu-ifup #!/bin/bash bridge=virbr0 if [ -n "$1" ];then ip link set $1 up sleep 1 brctl addif $bridge $1 exit 0 else echo "Error: no interface specified" exit 1 fi [root@localhost ~]# chmod +x /etc/qemu-ifup #启动cirros测试机[root@localhost isos]# qemu-kvm -name test-cirros -m 512 -drive file=cirros-0.3.4-x86_64-disk.img -net nic -net tap -nographic -vnc :1 启动成功,虚拟机输出在前台,也可使用VNC连接5901端口登录 启动时输出的系统信息 brctl show查看网桥连接,此时tap0接口已经连接在virbr0上 虚拟机通过tap0连接到网桥与物理机virbr0-nic接口进行桥接获取了DHCP的地址,可以在物理机上进行ssh连接
JDK基础配置配置IP地址,关闭网络防火墙selinux,配置主机地址#将jdk包解压到文件夹下,在profie后新添两行配置环境变量[root@server1 ~]# tar -zxvf jdk-8u161-linux-x64.tar.gz -C /opt/java/ [root@server1 jdk1.8.0_161]# vim /etc/profile export JAVA_HOME='/opt/java/jdk1.8.0_161' export PATH=$JAVA_HOME/bin:$PATH [root@server1 jdk1.8.0_161]# source /etc/profile #输入java -version测试环境变量是否生效 本地模式部署Hadoop本地模式只是用于本地开发调试,或者快速安装体验Hadoop#为hadoop创建存放文件夹,将hadoop解压,单机本地模式即可使用[root@server1 ~]# mkdir /opt/hadoopstandalone [root@server1 ~]# tar -zxf hadoop-2.7.3.tar.gz -C /opt/hadoopstandalone/#用hadoop自带的wordcount例子来在本地模式下测试跑mapreduce#准备mapreduce输入文件wc.input[root@server1 test]# cat wc.input hadoop mapreduce hive hbase spark storm sqoop hadoop hive spark hadoop #运行,输出结果中Running job后有local字样的,说明运行在本地模式下[root@server1 hadoop-2.7.3]# bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar wordcount test/wc.input output2#本地模式下,mapreduce的输出是输出到本地,查看输出文件有SUCCESS说明JOB运行成功
实验环境:三台CentOS7,jdk1.8,hadoop2.7.3Server1: 192.168.200.10Server2: 192.168.200.11Server3: 192.168.200.12 三个节点安装好java包,配置jdk环境变量 #配置JAVA路径环境变量[root@server1 hadoop]# vim hadoop-env.sh export JAVA_HOME=/opt/jdk1.8.0_161/ 将hadoop包放到主节点上,解压到/opt修改配置四个文件######################################[root@server1 hadoop]# vim core-site.xml <configuration> <property> <name>fs.default.name</name> #配置文件系统hdfs <value>hdfs://server1:9000</value> </property> <property> <name>hadoop.tmp.dir</name> #namenode地址 <value>/opt/hadoop-2.7.3/hdfs/tmp</value> #临时文件的存放目录 </property> </configuration> ######################################[root@server1 hadoop]# vim hdfs-site.xml <configuration> <property> <name>dfs.replication</name> #hdfs副本数量 <value>3</value> </property> <property> <name>dfs.name.dir</name> #存储namenode的路径 <value>/opt/hadoop-2.7.3/hdfs/name</value> </property> <property> <name>dfs.data.dir</name> #存储上传数据的路径 <value>/opt/hadoop-2.7.3/hdfs/data</value> </property> <property> <name>dfs.permission</name> #设置false不检查权限 <value>false</value> </property> </configuration> ######################################[root@server1 hadoop]# cp mapred-site.xml.template mapred-site.xml [root@server1 hadoop]# vim mapred-site.xml <configuration> <property> <name>mapreduce.framework.name</name> #配置mapreduce运行框架,由yarn平台运行负责分配内存 <value>yarn</value> </property> </configuration> ######################################[root@server1 hadoop]# vim yarn-site.xml <?xml version="1.0"?> <configuration> <property> <name>yarn.resourcemanager.hostname</name> #指定yarn的resourcemanager地址 <value>server1</value> </property> <property> <name>yarn.nodemanager.aux-services</name> #reducer获取数据方式 <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.vmem-check-enabled</name> #忽略虚拟内存检查,若物理机内存足够可不加 <value>false</value> </property> </configuration> 编辑slaves,删除localhost,加入从节点主机名[root@server1 hadoop]# vim slaves server2 server3 hdfs格式化 格式化成功 检查配置的hdfs目录中有没有出现文件 启动所有节点,在主节点中输入jps检查,启动了三个进程[root@server1 sbin]# ./start-all.sh 在第二个的从节点,启动了两个进程 在第三个的从节点,启动了两个进程 浏览器访问主节点的http://ip:50070端口
创建普通用户名为hadoop修改sudo权限,将sudoers配置文件添加写入权限[root@server1 ~]# chmod 740 /etc/sudoers [root@server1 ~]# vim /etc/sudoers hadoop ALL=(root) NOPASSWD:ALL 解压后的hadoop文件夹全部修改所属用户为hadoop用户[hadoop@server1 opt]$ sudo chown -R hadoop:hadoop hadoopstandalone/ [hadoop@server1 opt]$ ll drwxr-xr-x. 3 hadoop hadoop 26 9月 12 04:15 hadoopstandalone编辑profile添加环境变量,并执行source启用[hadoop@server1 hadoop-2.7.3]$ sudo vim /etc/profile [hadoop@server1 hadoop-2.7.3]$ source /etc/profile export HADOOP_HOME='/opt/hadoopstandalone/hadoop-2.7.3' export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH 验证环境变量是否配置完成 配置 hadoop-env.sh、mapred-env.sh、yarn-env.sh文件的JAVA_HOME参数[hadoop@server1 hadoop-2.7.3]$ sudo vim ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh 配置core-site.xml[hadoop@server1 hadoop]$ vim ${HADOOP_HOME}/etc/hadoop/core-site.xml <configuration> <property> <name>fs.defaultFS</name> #配置HDFS地址 <value>hdfs://server1:9000</value> </property> <property> <name>hadoop.tmp.dir</name> #配置hadoop临时目录 <value>/opt/data/tmp</value> </property> </configuration> #创建在core-site.xml中配置的历史目录,并修改所有人为hadoop[hadoop@server1 hadoop]$ sudo mkdir -p /opt/data/tmp [hadoop@server1 hadoop]$ sudo chown -R hadoop:hadoop /opt/data/tmp/ 配置hdfs-site.xml[hadoop@server1 hadoop]$ vim ${HADOOP_HOME}/etc/hadoop/hdfs-site.xml <configuration> <property> <name>dfs.replication</name> <value>1</value> #dfs.replication配置的是HDFS存储时的备份数量,因为这里是伪分布式环境只有一个节点,所以这里设置为1</property> </configuration> 格式化hdfs格式化是对HDFS这个分布式文件系统中的DataNode进行分块,统计所有分块后的初始元数据的存储在NameNode中。格式化后,查看core-site.xml里hadoop.tmp.dir(本例是/opt/data目录)指定的目录下是否有了dfs目录,如果有,说明格式化成功 [hadoop@server1 bin]$ hdfs namenode -format [hadoop@server1 current]$ ${HADOOP_HOME}/sbin/start-dfs.sh 验证配置的data/tmp目录下出现了dfs 在dfs文件夹下有hdfs生产的文件 fsimage是NameNode元数据在内存满了后,持久化保存到的文件。fsimage*.md5 是校验文件,用于校验fsimage的完整性。seen_txid 是hadoop的版本vession文件里保存:namespaceID:NameNode的唯一ID。clusterID:集群ID,NameNode和DataNode的集群ID应该一致,表明是一个集群。 namespaceID:NameNode的唯一ID。 clusterID:集群ID,NameNode和DataNode的集群ID应该一致,表明是一个集群。 #启动namenode[hadoop@server1 current]$ ${HADOOP_HOME}/sbin/hadoop-daemon.sh start namenode starting namenode, logging to /opt/hadoopstandalone/hadoop-2.7.3/logs/hadoop-hadoop-namenode-server1.out#启动datanode[hadoop@server1 current]$ ${HADOOP_HOME}/sbin/hadoop-daemon.sh start datanode starting datanode, logging to /opt/hadoopstandalone/hadoop-2.7.3/logs/hadoop-hadoop-datanode-server1.out#启动secondarynode[hadoop@server1 current]$ ${HADOOP_HOME}/sbin/hadoop-daemon.sh start secondarynamenode starting secondarynamenode, logging to /opt/hadoopstandalone/hadoop-2.7.3/logs/hadoop-hadoop-secondarynamenode-server1.out检查是否启动成功 测试HDFS在hdfs上创建文件夹[hadoop@server1 bin]$ hdfs dfs -mkdir /test1#创建测试文件,上传文件到hdfs新建的文件夹[hadoop@server1 bin]$ hdfs dfs -put test.txt /test1 #读取测试上传的test.txt文件内容[hadoop@server1 bin]$ hdfs dfs -cat /test1/test.txt this is test file #下载hdfs中的test.txt至本地[hadoop@server1 bin]$ hdfs dfs -get /test1/test.txt 配置、启动YARN配置yarn-site.xml[hadoop@server1 hadoop]$ cp mapred-site.xml.template mapred-site.xml [hadoop@server1 hadoop]$ vim mapred-site.xml <configuration> <property> <name>mapreduce.framework.name</name> #指定mapreduce运行在yarn框架 <value>yarn</value> </property> </configuration> [hadoop@server1 hadoop]$ vim yarn-site.xml <?xml version="1.0"?> <configuration> <property> <name>yarn.nodemanager.aux-services</name>#配置了yarn的默认混洗方式选择为mapreduce的默认混洗算法 <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.hostname</name>#指定了Resourcemanager运行在哪个节点上 <value>server1</value> </property> </configuration> #启动Resourcemanager[hadoop@server1 sbin]$ ./yarn-daemon.sh start resourcemanager starting resourcemanager, logging to /opt/hadoopstandalone/hadoop-2.7.3/logs/yarn-hadoop-resourcemanager-server1.out #启动nodemanager[hadoop@server1 sbin]$ ./yarn-daemon.sh start nodemanager starting nodemanager, logging to /opt/hadoopstandalone/hadoop-2.7.3/logs/yarn-hadoop-nodemanager-server1.out 测试输入jps查看nodemanager和resourcemanager是否启动成功 YARN的Web客户端端口号是8088,通过 http://192.168.100.10:8088/可以查看。
环境:已安装完成Kubernetesmaster节点192.168.1.10/centos7node节点 192.168.1.11/centos71.创建部署deployment--image镜像来自docker[root@master ~]# kubectl create deployment test-nginx --image=nginx deployment.apps/test-nginx created 2.查询验证deployment查看deployment列表[root@master ~]# kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE test-nginx 0/1 1 0 31s 查看pod运行列表[root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE test-nginx-64759dd789-vw48m 1/1 Running 0 119s 3.发布服务暴露80端口方式发布服务[root@master ~]# kubectl expose deployment test-nginx --port=80 --type=NodePort service/test-nginx exposed 或者 [root@master ~]# kubectl create service nodeport test-nginx --tcp 80 service/test-nginx created 查询端口,此处test-nginx服务暴露为30627 4.访问测试通过master节点访问 通过node节点访问 5.pod容器伸缩通过kubectl scale调整容器副本数量,--replicas参数实现增加或减少集群副本数量[root@master ~]# kubectl scale deployment test-nginx --replicas=5 deployment.extensions/test-nginx scaled 再次查询pod时test-nginx副本已经增加到5个 6.删除部署和服务[root@master ~]# kubectl delete services test-nginx service "test-nginx" deleted [root@master ~]# kubectl delete deployment test-nginx deployment.extensions "test-nginx" deleted 或者 [root@master ~]# kubectl delete deployments/test-nginx services/test-nginx deployment.extensions "test-nginx" deleted service "test-nginx" deleted
环境:已安装完成Kubernetes+Dashboardmaster节点192.168.1.10/centos7node节点 192.168.1.11/centos7 登陆到dashboard控制台 右上角创建图形化提供了三种创建方式,此处点击创建应用 填入名称、镜像、容器个数、端口 点击部署后,转跳至概况页面,等待片刻pod就转为运行状态 进入副本集即可查看服务运行信息,看到此处nginx的80端口暴露为32160 访问测试成功 点击右上角伸缩,输入数字即可完成修改集群中服务副本数 副本成功扩展到6个,其中运行13分钟的最原始创建的容器
Gogs 项目旨在打造一个以最简便的方式搭建简单、稳定和可扩展的自助 Git 服务。使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发,并且支持 Go 语言支持的 所有平台,包括 Linux、macOS、Windows 以及 ARM 平台。 来自 <https://github.com/gogs/gogs/blob/master/README_ZH.md> 官方网站:<https://gogs.io/>文档:<https://gogs.io/docs> 测试环境为ECS CentOS7+Docker一、安装部署服务#拉取gogs镜像[root@xserver1 ~]# docker pull gogs/gogs确保当前存在gogs和mysql镜像 #docker run启动容器,gogs镜像映射3000和22端口,挂载数据目录;配置mysql数据库密码映射端口[root@xserver1 ~]# docker run -d --name=gogs -p 80:3000 -p 222:22 -v /var/gogs:/data gogs/gogs 07bef3a210be5718a6faa84869a889e053df10293c0d49869a07391a30c621ed [root@xserver1 ~]# docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=000000 --name gogs-mysql mysql:5.6 0384efb22d9b95050a7d4560062cca20cab45136084f572fdacb1b1ed05d8e76 进入数据库mysql容器,创建数据库库名为gogs浏览器访问gogs容器映射的端口号,进入安装页面 设置数据库,选择数据库类型为mysql,配置IP,用户名密码,库名 配置名称,目录配置域名为访问的IP为外部IP,SSH端口号为容器映射端口号HTTP端口号为外部端口号,URL为固定地址使用外部IP 创建管理员用户 配置安装完成进入首页 二、新建仓库仓库,点击+,新建仓库创建新仓库 也可导入其他平台的代码仓库,加号处选择迁移外部仓库 配置外部仓库地址,输入仓库名称 稍等片刻即可导入成功 三、仓库测试#安装git工具,git仓库到本地[root@xserver1 ~]# yum -y install git [root@xserver1 ~]# git clone http://192.168.1.20:80/tao/hcltest.git 提交文件到仓库#克隆仓库到本地,进入文件夹[root@xserver1 ~]# git clone http://192.168.1.20/tao/demo.git 正克隆到 'demo'... remote: Enumerating objects: 3, done. remote: Counting objects: 100% (3/3), done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. [root@xserver1 ~]# cd demo/ #创建测试代码文件,推送,输入用户名密码,提交完成[root@xserver1 demo]# echo "print('Hello Word')" > test.py [root@xserver1 demo]# git add . [root@xserver1 demo]# git commit -m "test put" [master 6eed402] test put 1 file changed, 1 insertion(+) create mode 100644 test.py [root@xserver1 demo]# git push Counting objects: 4, done. Delta compression using up to 2 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 278 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) Username for 'http://192.168.1.20': tao Password for 'http://tao@192.168.1.20': To http://192.168.1.20/tao/demo.git 54f3759..6eed402 master -> master 在网页上可以看见提交的代码
一、本地镜像管理docker load加载本地tar镜像--input , -i : 指定导入的文件,代替 STDIN。--quiet , -q : 精简输出信息。两种常用的加载命令[root@master images]# docker load -i httpd_2.2.31.tar b6ca02dfe5e6: Loading layer [==================================================>] 128.9MB/128.9MB 3c83ee2bca50: Loading layer [==================================================>] 2.56kB/2.56kB 557b74aa3e87: Loading layer [==================================================>] 43.54MB/43.54MB 65c42200fe66: Loading layer [==================================================>] 6.129MB/6.129MB e6ab5c565ca5: Loading layer [==================================================>] 3.584kB/3.584kB Loaded image: httpd:2.2.31 [root@master images]# docker load < httpd_2.2.32.tar 0d960f1d4fba: Loading layer [==================================================>] 129.3MB/129.3MB 765c3a355e02: Loading layer [==================================================>] 2.56kB/2.56kB e448038fb71a: Loading layer [==================================================>] 43.84MB/43.84MB daed15381ba8: Loading layer [==================================================>] 6.897MB/6.897MB 05cb14f2b844: Loading layer [==================================================>] 3.584kB/3.584kB Loaded image: httpd:2.2.32 docker rmi 删除镜像-f :强制删除;--no-prune :不移除该镜像的过程镜像,默认移除;[root@master images]# docker rmi httpd:2.2.31 Untagged: httpd:2.2.31 Deleted: sha256:c8a7fb36e3abfc42f15f2a2a9293f1768a5b568fd7ac51546f0055e399c29aef Deleted: sha256:143756fb097f1123c96140b6e48e8ae1062ad4493c1cd6874d430118089517a5 Deleted: sha256:53e8f80ab9b50b00e27dd9376818098feccd7bfdd7f084ff10aca478c90e14ea Deleted: sha256:ac93bbe4ce702e11125f10d20d764b02ed95e4f6521e4a2073ad908069ce21c4 Deleted: sha256:15bee5ebaa7ede5c10e9c1bd24388c2b6b2e50f9006f39ad88a84de554ec58e4 Deleted: sha256:b6ca02dfe5e62c58dacb1dec16eb42ed35761c15562485f9da9364bb7c90b9b3docker images 列出本地镜像-a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);--digests :显示镜像的摘要信息;-f :显示满足条件的镜像;--format :指定返回值的模板文件;--no-trunc :显示完整的镜像信息;-q :只显示镜像ID。 [root@master images]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest 020584afccce 2 months ago 1.22MB nginx latest 540a289bab6c 2 months ago 126MB docker tag标记镜像 [root@master images]# docker tag nginx:latest master/nginx:test [root@master images]# docker images master/nginx REPOSITORY TAG IMAGE ID CREATED SIZE master/nginx test 540a289bab6c 2 months ago 126MB 二、镜像仓库操作docker pull 拉取镜像 [root@slave ~]# docker pull mysql Using default tag: latest latest: Pulling from library/mysql 804555ee0376: Pull complete c53bab458734: Pull complete 7def2a4ede73: Pull complete Digest: sha256:f1df505c4c6e8eae599a0482e3bde3e761cd700c00cbc371a8161648a26817c0 Status: Downloaded newer image for mysql:latest docker search在线搜索镜像 [root@slave ~]# docker search httpd-cgi NAME DESCRIPTION STARS OFFICIAL AUTOMATED hypoport/httpd-cgi httpd-cgi 0 [OK] actilis/httpd-cgi HTTPD server with CGI support, based on Alpi… 0 [OK] nasoym/httpd-cgi httpd-cgi 0 [OK] docker push 推送镜像到仓库 [root@master images]# docker tag httpd:2.2.32 192.168.1.10:5000/httpd:test #标记httpd镜像并push推送 [root@master images]# docker push 192.168.1.10:5000/httpd:test The push refers to repository [192.168.1.10:5000/httpd] 05cb14f2b844: Pushed daed15381ba8: Pushed 0d960f1d4fba: Pushed test: digest: sha256:ccc05ac5eee03d1a95d249b7c4a3366f68c38fdf9f877a53abcb9bd25e441496 size: 1366 三、容器使用管理docker run运行容器-d: 后台运行容器,并返回容器ID;-i: 以交互模式运行容器,通常与 -t 同时使用;-P: 随机端口映射,容器内部端口随机映射到主机的高端口-p: 指定端口映射,格式为:主机(宿主)端口:容器端口-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;-rm:容器退出后随之将其删除,可以避免浪费空间。--name="nginx": 为容器指定一个名称;--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;-h "hostname": 指定容器的hostname;-e username="admin": 设置环境变量;--env-file=[]: 从指定文件读入环境变量;--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;-m :设置容器使用内存最大值;--net="bridge": 指定容器的网络连接类型,支持bridge/host/none/container: 四种类型;--link=[]: 添加链接到另一个容器;--expose=[]: 开放一个端口或一组端口;--volume , -v: 绑定一个卷,挂载本地文件到容器目录 [root@master images]# docker run -it -d -p 800:80 --name tyh-nginx nginx:latest fac10822e29f05d9a92f038d1057229003d85459108856bfc9e4d9f524e24dcb测试访问 docker exec 进入容器-d :分离模式: 在后台运行-i :即使没有附加也保持STDIN 打开-t :分配一个终端 [root@master /]# docker run -it -d -p 888:80 -v /html:/usr/share/nginx/html --name tyh2-nginx nginx:latest b1bd7b4523214bee72de5aa003c06a064fa0f8053999fa7c49a3e2dc62baefef#开启一个容器nginx,端口映射外部888,将外部的网页目录挂到容器的目录[root@master images]# docker exec -it tyh2-nginx bash#进入容器,查看nginx网页目录root@ b1bd7b452321:/# id uid=0(root) gid=0(root) groups=0(root) root@b1bd7b452321:/# ls -l /usr/share/nginx/html/ total 456 drwxr-xr-x 20 root root 4096 Jan 17 20:37 alipay drwxr-xr-x 5 root root 100 Jan 17 20:37 alipay2 drwxr-xr-x 2 root root 6 Jan 17 20:37 alipayobject -rw-r--r-- 1 root root 689 Jan 17 20:37 iisstart.htm -rw-r--r-- 1 root root 255252 Jan 17 20:37 index.html -rw-r--r-- 1 root root 184946 Jan 17 20:37 welcome.png 访问效果 docker ps 查看容器进程-a :显示所有的容器,包括未运行的。-f :根据条件过滤显示的内容。--format :指定返回值的模板文件。-l :显示最近创建的容器。-n :列出最近创建的n个容器。--no-trunc :不截断输出。-q :静默模式,只显示容器编号。-s :显示总的文件大小。 [root@master images]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6adf06865702 nginx:latest "nginx -g 'daemon of…" 5 minutes ago Up 2 minutes 0.0.0.0:800->80/tcp tyh-nginx 66df904e9c22 registry:latest "/entrypoint.sh /etc…" 4 hours ago Up 4 hours 0.0.0.0:5000->5000/tcp registry docker start/stop/restart 容器启动/停止/重启 docker stats/inspect 查看容器资源情况/容器信息 docker rm 删除容器需先停止容器运行再执行删除-f 可强制删除 docker export/inport 导出导入容器#导出容器快照[root@master /]# docker export tyh3-nginx > tyh-nginx.tar#导入容器镜像[root@slave ~]# docker import tyh-nginx.tar tyh3-nginx sha256:c04782dfa85e8a08fe88e258f6419a0aa87469e73f0adc8d73c62a72fd07b183 [root@slave ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tyh3-nginx latest c04782dfa85e 7 seconds ago 125MB docker commit 容器构建为镜像[root@master /]# docker commit -a "tao" -m "for the test" tyh3-nginx test:1 sha256:4404059a3d6ded6f62b1532e0278a938a7998ac7dc8c36e6bd7d27f49d1e13b1 [root@master /]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE test 1 4404059a3d6d 7 seconds ago 126MB
已安装好两台docker主192.168.1.10/centos7从192.168.1.11/centos7 主docker服务器master启动docker服务 加载本地镜像registry到dockerdocker load -i images/registry_latest.tar Docker run命令运行本地registry[root@master opt]# docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest 66df904e9c221ca8e412a32e479d9f8331a7d9b5dc401554141a5b74e0b6e8e9-d 容器运行于后台-v 挂载文件目录,主机:容器-p 容器端口映射外部--restart=always 容器退出时总是重启--name 容器名字 Docker ps查询容器进程查看registry端口映射监听 测试使用curl命令访问网页地址,返回结果为{}表示registry正常运行[root@master opt]# curl http://192.168.1.10:5000/v2/-v * About to connect() to 192.168.1.10 port 5000 (#0) * Trying 192.168.1.10... * Connected to 192.168.1.10 (192.168.1.10) port 5000 (#0) > GET /v2/ HTTP/1.1 > User-Agent: curl/7.29.0 > Host: 192.168.1.10:5000 > Accept: */* > < HTTP/1.1 200 OK < Content-Length: 2 < Content-Type: application/json; charset=utf-8 < Docker-Distribution-Api-Version: registry/2.0 < X-Content-Type-Options: nosniff < Date: Fri, 17 Jan 2020 16:10:07 GMT < * Connection #0 to host 192.168.1.10 left intact {}新建/etc/docker/daemon.json配置文件,写入以下内容,设置私有仓库地址,并重启服务[root@master docker]# vim /etc/docker/daemon.json[root@master docker]# systemctl restart docker Docker images命令查询当前docker中的镜像 #docker tag给centos镜像设置标记[root@master docker]# docker tag centos:latest 192.168.1.10:5000/centos:latest#docker push将镜像推送到私有仓库[root@master docker]# docker push 192.168.1.10:5000/centos:latest The push refers to repository [192.168.1.10:5000/centos] 9e607bb861a7: Pushed latest: digest: sha256:6ab380c5a5acf71c1b6660d645d2cd79cc8ce91b38e0352cbf9561e050427baf size: 529 测试推送是否成功使用curl命令访问[root@master docker]# curl http://192.168.1.10:5000/v2/_catalog {"repositories":["centos"]} 其他docker服务器测试Docker服务正常运行 新建/etc/docker/daemon.json配置文件,写入以下内容,设置私有仓库地址,并重启服务[root@slave ~]# cd /etc/docker/ [root@slave docker]# touch daemon.json [root@slave docker]# vim daemon.json[root@slave docker]# systemctl restart docker #使用docker pull拉取刚刚仓库中标记推送的镜像[root@slave docker]# docker pull 192.168.1.10:5000/centos:latest latest: Pulling from centos 729ec3a6ada3: Pull complete Digest: sha256:6ab380c5a5acf71c1b6660d645d2cd79cc8ce91b38e0352cbf9561e050427baf Status: Downloaded newer image for 192.168.1.10:5000/centos:latest Docker images查询镜像,镜像已经存在本地docker服务器中
使用别名all,配置群发用户列表实现效果编辑配置文件root@ecs1:~# vim /etc/aliases all: :include:/etc/postfix/userlist//用法:邮箱用户名(别名):真实用户广播用户名::include:群发用户列表文件(自定) root@ecs1:~# vim /etc/postfix/userlist IT-user1 IT-user2 root@ecs1:~# postalias /etc/aliases
安装启动802.1Q协议模块root@route:~# apt-get install vlan root@route:~# modprobe 8021q root@route:~# lsmod |grep -i 8021q 8021q 40960 0 garp 16384 1 8021q mrp 20480 1 8021q添加网卡子接口绑定vlan,设置子接口地址root@route:/etc/network# vconfig add ens224 0 用法: add <网卡号> <VLANID> root@route:/etc/network# ifconfig eth224.1 192.168.0.254/24 up
环境准备:1.使用三台ECS云服务器,内存建议最小2G2.获取kafka软件包,解压[root@kafka-1 ~]# tar -zxf kafka_2.11-1.1.1.tgz [root@kafka-1 ~]# ls kafka_2.11-1.1.1 kafka_2.11-1.1.1.tgz 3.安装jdk1.8.0[root@kafka-1 bin]# yum -y install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64 4.配置主机名映射 5.其余selinux,防火墙配置略kafka包里的文件夹结构,bin目录下为启动管理服务的脚本,config目录下为服务配置 一、配置kafka内置zookeeper集群kafka集群依赖于zk集群,这里就用kafka包内置的zk服务配置集群//编辑zookeeper.properties配置文件,添加以下配置[root@kafka-1 config]# vim zookeeper.properties initLimit=10 syncLimit=5 server.1=kafka1:2888:3888 server.2=kafka2:2888:3888 server.3=kafka3:2888:3888 quorumListenOnAllIPs=true //创建myid表示zk服务节点,写入id号(对应配置文件中的server.x中的x)到myid文件中[root@kafka-1 ~]# mkdir -p /tmp/zookeeper [root@kafka-1 ~]# echo 1 > /tmp/zookeeper/myid //启动zk[root@kafka-1 bin]# ./zookeeper-server-start.sh -daemon ../config/zookeeper.properties //启动完成后的端口监听,在其中一台leader有监听2888端口[root@kafka-2 zookeeper]# ss -ntlp State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 50 :::2181 :::* users:(("java",pid=30223,fd=96)) LISTEN 0 50 :::2888 :::* users:(("java",pid=30223,fd=99)) LISTEN 0 50 :::3888 :::* users:(("java",pid=30223,fd=97)) LISTEN 0 1282181:对cline端提供服务3888:选举leader使用2888:集群内机器通讯使用(Leader监听此端口) 二、创建kafka集群 //修改kafka的配置文件server.properties。[root@kafka-1 config]# vim server.properties broker.id=1 //id对应节点号,有所区分 port=9092 advertised.host.name=kafka1 //端口监听的IP或主机名 zookeeper.connect=kafka1:2181,kafka2:2181,kafka3:2181 //连接各节点的IP或主机名:端口 //启动kafka[root@kafka-1 bin]# ./kafka-server-start.sh -daemon ../config/server.properties //启动完成后的端口监听[root@kafka-1 ~]# ss -ntlp State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 50 :::9092 :::* users:(("java",pid=27495,fd=101)) LISTEN 0 50 :::2181 :::* users:(("java",pid=521,fd=96)) //查看java进程,显示kafka[root@kafka-1 ~]# jps 2049 Jps 27495 Kafka 521 QuorumPeerMain 三、测试kafka服务//在节点1上创建topic[root@kafka-1 bin]# ./kafka-topics.sh --create --zookeeper kafka1:2181 --replication-factor 1 --partitions 1 --topic taoresetTEST Created topic "taoresetTEST". //在节点2上查看topic[root@kafka-2 bin]# ./kafka-topics.sh --list --zookeeper kafka2:2181 taoresetTEST //在节点2上查看topic[root@kafka-3 bin]# ./kafka-topics.sh --list --zookeeper kafka3:2181 taoresetTEST
实验环境使用三台 CentOS7系统的ECS,分别为 node1、node2、node3,这三个节点配置为数据库高可用集群MariaDB_Galera_Cluster,使用一台CentOS7系统的ECS,作为haproxy 负载均衡服务。1.配置 node1 节点为负载均衡的窗口,配置负载均衡为轮询算法;2.HA 服务监听的端口为 node1 节 点的 3307 端口;3.配置访问三个节点的权重依次为 1,2,4。haproxy balance可配置参数 安装配置HA//yum安装[root@haproxy ~]# yum -y install haproxy//添加配置listen mariadb_galera_cluster 0.0.0.0:3307 mode tcp balance static-rr server node1 172.129.1.56:3306 check weight 1 server node2 172.129.1.57:3306 check weight 2 server node3 172.129.1.58:3306 check weight 4 //启动服务,查看监听端口[root@haproxy haproxy]# systemctl restart haproxy [root@haproxy haproxy]# ss -ntlp|grep 3307 LISTEN 0 128 *:3307 *:* users:(("haproxy",pid=17837,fd=7)) 验证配置//验证轮询,查询节点名称,重复执行查询七次,成功显示node1执行1次、node2执行2次、node3执行4次[root@haproxy haproxy]# for i in `seq 7 `;do mysql -uroot -p000000 -P3307 -h172.129.1.80 -e "select @@wsrep_node_name"|grep 'mariadb'; done
Kubernetes 默认每个节点只能启动 110 个 Pod,由于业务需要,将每个节点默认限制的Pod 数量改为 200。 编辑kubelet环境配置文件,添加参数[root@node sysconfig]# vim /etc/sysconfig/kubelet KUBELET_EXTRA_ARGS="--max-pods=200"编辑kubelet服务文件,写入环境文件路径[root@node sysconfig]# vim /usr/lib/systemd/system/kubelet.service [Service] Environment=-/etc/sysconfig/kubelet重启kubelet[root@node sysconfig]# systemctl daemon-reload [root@node sysconfig]# systemctl restart kubelet
将 Kubernetes 集群证书的有效期延长至 10 年 安装golangyum install -y epel-release yum -y install golang 编辑修改k8s软件包中的源码[root@master pkiutil]# vim /root/k8s/certs_update/kubernetes-1.18.1/cmd/kubeadm/app/util/pkiutil/pki_helpers.go 48 const ( ………. //找到或者添加 duration365d = time.Hour * 24 * 365 ………. 59 ) //找到NotAfter,修改()里的内容 579 NotAfter: time.Now().Add(duration365d * 10).UTC(), 编译kube[root@master kubernetes-1.18.1]# make WHAT=cmd/kube GOFLAGS=-v在output文件夹下找到新的kubeadm[root@master kubernetes-1.18.1]# cd _output/local/bin/linux/amd64/ [root@master amd64]# ls conversion-gen defaulter-gen go2make openapi-gen deepcopy-gen go-bindata kubeadm将旧kubeadm进行备份,将新kubeadm移到环境变量下[root@master amd64]# mv /usr/bin/kubeadm /usr/bin/kubeadm-bak [root@master amd64]# cp kubeadm /usr/bin/kubeadm [root@master ~]# cp -rf /etc/kubernetes /etc/kubernetes-bak/更新证书[root@master ~]# kubeadm alpha certs renew all [root@master ~]# kubeadm alpha certs check-expiration
实验拓扑: 1.配置Openstack为Ceph客户端1、客户端安装#将openstack节点添加hosts,install安装ceph客户端软件,admin将配置拷贝到节点[root@ceph-node1 ~]# echo '192.168.1.110 controller' >> /etc/hosts [root@ceph-node1 ceph]# ceph-deploy install controller [root@ceph-node1 ceph]# ceph-deploy admin controller 2.配置后端存储池 #分别创建存储池对应glance\nova\cinder服务[root@ceph-node1 ceph]# ceph osd pool create images 128 pool 'images' created [root@ceph-node1 ceph]# ceph osd pool create vms 128 pool 'vms' created [root@ceph-node1 ceph]# ceph osd pool create volumes 128 pool 'volumes' created 查看当前存储池 #创建存储用户认证,PS:更新认证使用caps[root@ceph-node1 ceph]# ceph auth get-or-create client.glance mon 'allow r' osd 'allow class-read object_prefix rbd_children,allow rwx pool=images' [client.glance.mon] key = AQAwxx1frBmLLBAAmcelOkoq55BQgb0u34gJfw== #拷贝密钥到openstack[root@ceph-node1 ceph]# ceph auth get-or-create client.glance|ssh controller tee /etc/ceph/ceph.client.glance.keyring root@controller's password: [client.glance] key = AQBgxx1fMX9gGRAANQb0KICq1bExhGVQ6qYhkg== #修改节点的keyring权限[root@ceph-node1 ceph]# ssh controller chown glance:glance /etc/ceph/ceph.client.glance.keyring root@controller's password: 2.配置Glance服务 #修改glance-api.conf配置,如下[root@controller glance]# vim /etc/glance/glance-api.conf [DEFAULT] rpc_backend = rabbit show_image_direct_url = True [glance_store] stores = rbd default_store = rbd rbd_store_pool = images rbd_store_user = glance rbd_store_ceph_conf = /etc/ceph/ceph.conf rbd_store_chunk_size = 8 #修改完成后重启glance-api服务[root@controller glance]# openstack-service restart glance-api 测试:在ceph中启动虚拟机,只支持镜像格式为raw,因此先转换镜像格式为raw[root@controller images]# qemu-img convert -p -f qcow2 -O raw cirros-0.3.4-x86_64-disk.img cirros.raw (100.00/100%)使用glance image-create命令上传镜像 成功上传后,rbd ls images查看镜像池 可以看到存储池中的文件与镜像的ID相同,glance后端存储配置完成 3.配置NOVA服务建议先配置Cinder服务的对接 Nova compute使用RBD有两种方式:一种是将cinder volume挂载给虚拟机;另一种是从Cinder volume 上启动虚拟机,此时Nova需要创建一个RBDimage,把glance image的内容导入,再交给libvirt。这边验证第一种Nova使用Ceph的情况:[root@controller ~]# vim /etc/nova/nova.conf [libvirt] virt_type = qemu inject_key = True rbd_user = cinder rbd_secret_uuid = 674fea11-e69e-4c95-b378-2baa19cd6b4e [root@controller ~]# systemctl restart openstack-nova-compute 测试:查询网络id,nova boot启动一台cirros镜像的实例,名称为ceph-VM-test 查询之前创建在ceph的云硬盘ID,nova volume-attach挂载云硬盘到ceph-VM-test实例 再次列出cinder硬盘,可以看到卷成功挂载 Dashboard上云主机界面,云主机正常运行Dashboard上卷界面,云硬盘挂载正常 网络配置正常,ssh连接实例成功 4.配置Cinder服务 #创建cinder认证[root@ceph-node1 ceph]# ceph auth get-or-create client.cinder mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=volumes,allow rwx pool=vms, allow rx pool=images' [client.cinder] key = AQBl0R1fa0KcFBAA3GDkcSyiC+A50ufHyqc6qQ== #拷贝keyring文件到openstack[root@ceph-node1 ceph]# ceph auth get-or-create client.cinder|ssh controller tee /etc/ceph/ceph.client.cinder.keyring root@controller's password: [client.cinder] key = AQBl0R1fa0KcFBAA3GDkcSyiC+A50ufHyqc6qQ==#修改keyring文件权限[root@ceph-node1 ceph]# ssh controller chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring root@controller's password: 在Openstack节点上生成UUID,编写定义secret.xml文件,设置密钥给libvirt#openstack创建uuid[root@controller ~]# uuidgen 674fea11-e69e-4c95-b378-2baa19cd6b4e #编写定义secret.xml文件,拷贝UUID[root@controller ~]# vim secret.xml <secret ephemeral='no' private='no'> <uuid>674fea11-e69e-4c95-b378-2baa19cd6b4e</uuid> <usage type='ceph'> <name>client.cinder secret</name> </usage> </secret> #define定义密钥文件[root@controller ~]# virsh secret-define --file secret.xml 生成 secret 674fea11-e69e-4c95-b378-2baa19cd6b4e #生成保密字符串文件[root@controller ~]# virsh secret-set-value --secret 674fea11-e69e-4c95-b378-2baa19cd6b4e --base64 $(cat ./client.cinder.key)secret值设定 查看系统密钥文件 [root@controller ceph]# vim /etc/cinder/cinder.conf [DEFAULT] rpc_backend = rabbit auth_strategy = keystone my_ip = 192.168.1.110 enabled_backends = ceph glance_api_servers =http://controller:9292 [ceph] volume_driver = cinder.volume.drivers.rbd.RBDDriver rbd_pool = volumes rbd_ceph_conf = /etc/ceph/ceph.conf rbd_flatten_volume_from_snapshot = false rbd_max_clone_depth = 5 rbd_store_chunk_size = 4 rados_connect_timeout = -1 glance_api_version = 2 rbd_user = cinder rbd_secret_uuid = 674fea11-e69e-4c95-b378-2baa19cd6b4e [root@controller ceph]# systemctl restart openstack-cinder-volume.service 测试:cinder创建磁盘ceph-disk 列出cinder磁盘,新建的磁盘状态为available dashboard界面显示可用最后到存储池中查看,已经有ID和ceph-disk卷相同的文件。cinder对接ceph完成
PB级容量、高可用、读写性能、基于文件系统级别共享、分布式、无metadata(元数据)的存储方式。PB级容量、高可用、读写性能、基于文件系统级别共享、分布式、无metadata(元数据)的存储方式。 GlusterFS(GNU ClusterFile System)是一种全对称的开源分布式文件系统,所谓全对称是指GlusterFS采用弹性哈希算法,没有中心节点,所有节点全部平等。GlusterFS配置方便,稳定性好,可轻松达到PB级容量,数千个节点。 birck:GlusterFS的基本元素,以节点服务器目录形式展现;volume:多个brick的逻辑集合; metadata:元数据,用于描述文件、目录等的信息;self-heal:用于后台运行检测副本卷中文件和目录的不一致性并解决这些不一致;FUSE:Filesystem Userspace是一个可加载的内核模块,其支持非特权用户创建自己的文件系统而不需要修改内核代码通过在用户空间运行文件系统的代码通过FUSE代码与内核进行桥接;Gluster Server:数据存储服务器,即组成GlusterFS存储集群的节点; Gluster Client:使用GlusterFS存储服务的服务器,如KVM、OpenStack、LB RealServer、HA node。 GlusterFS外部架构GlusterFS内部架构一、配置安装服务1.使用阿里的yum源安装gluster4.1版本[root@glusterfs1 yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repoGlusterfs1节点和glusterfs2节点安装服务,配置服务启动 [root@glusterfs1 ~]# yum -y install centos-release-gluster41 [root@glusterfs1 ~]# yum -y install glusterfs-server [root@glusterfs1 ~]# systemctl restart glusterd [root@glusterfs1 ~]# systemctl enable glusterd [root@glusterfs2 ~]# yum -y install centos-release-gluster41 [root@glusterfs2 ~]# yum -y install glusterfs-server [root@glusterfs2 ~]# systemctl restart glusterd [root@glusterfs2 ~]# systemctl enable glusterd 二、配置GlusterFS1.配置挂载磁盘每个节点添加三块磁盘,大小5G #对三块磁盘各创建1个分区[root@glusterfs1 ~]# fdisk /dev/sdb [root@glusterfs1 ~]# fdisk /dev/sdc [root@glusterfs1 ~]# fdisk /dev/sdd #将分区进行格式化,创建分步存储数据源挂载点文件夹,将分区分别挂载[root@glusterfs1 ~]# mkfs.xfs /dev/sdb1 [root@glusterfs1 ~]# mkfs.xfs /dev/sdc1 [root@glusterfs1 ~]# mkfs.xfs /dev/sdd1 [root@glusterfs1 ~]# mkdir -p /data/brick{1..3} [root@glusterfs1 ~]# mount /dev/sdb1 /data/brick1 [root@glusterfs1 ~]# mount /dev/sdc1 /data/brick2 [root@glusterfs1 ~]# mount /dev/sdd1 /data/brick3 [root@glusterfs1 ~]# df -h|grep brick /dev/sdb1 5.0G 33M 5.0G 1% /data/brick1 /dev/sdc1 5.0G 33M 5.0G 1% /data/brick2 /dev/sdd1 5.0G 33M 5.0G 1% /data/brick3 2.创建主机信任对等体任意一台节点上配置[root@glusterfs1 ~]# gluster peer probe glusterfs1 peer probe: success. Probe on localhost not needed [root@glusterfs1 ~]# gluster peer probe glusterfs2 peer probe: success. [root@glusterfs1 ~]# gluster peer status Number of Peers: 1 Hostname: glusterfs2 Uuid: 36515c7d-2b84-4f37-9ecf-d738887929aa State: Peer in Cluster (Connected) 配置分布卷Distributed:分布式卷,文件通过哈希随机算法分步到由bricks组成的卷上3.创建配置glusterfs分布卷#创建存储目录[root@glusterfs1 ~]#mkdir -p /data/brick1/gv1#创建分布卷[root@glusterfs1 ~]# gluster volume create gv1 glusterfs1:/data/brick1/gv1/ glusterfs2:/data/brick1/gv1/ volume create: gv1: success: please start the volume to access data#启动分布卷[root@glusterfs1 ~]# gluster volume start gv1 volume start: gv1: success #查看gv1状态[root@glusterfs1 ~]#gluster volume status gv1 Status of volume: gv1 Gluster process TCP Port RDMA Port Online Pid ------------------------------------------------------------------------------ Brick glusterfs1:/data/brick1/gv1 49152 0 Y 25156 Brick glusterfs2:/data/brick1/gv1 49152 0 Y 24611 Task Status of Volume gv1 ------------------------------------------------------------------------------ There are no active volume tasks #查看vg1信息[root@glusterfs1 ~]#gluster volume info gv1 Volume Name: gv1 Type: Distribute Volume ID: 6cee1268-6401-4f0b-9dde-8e3f0e45cb74 Status: Started Snapshot Count: 0 Number of Bricks: 2 Transport-type: tcp Bricks: Brick1: glusterfs1:/data/brick1/gv1 Brick2: glusterfs2:/data/brick1/gv1 Options Reconfigured: transport.address-family: inet nfs.disable: on 测试#挂载gv1到目录[root@glusterfs1 ~]# mkdir /opt/gv1 [root@glusterfs1 ~]# mount -t glusterfs glusterfs1:/gv1 /opt/gv1 [root@glusterfs1 ~]# df -h |grep gv1 glusterfs1:/gv1 10G 167M 9.9G 2% /opt/gv1 #卷大小为两个节点容量和5G+5G #测试文件分布存储在挂载了gv1卷的目录下,创建10个测试文件 进入glusterfs1节点的数据存储目录查看文件存储情况 进入glusterfs2节点的数据存储目录查看文件存储情况 将gv1分布卷再挂载到glusterfs2节点,可以看到同一分布卷的文件共享存储 三、配置复制卷Replicated:复制式卷,类似RAID1,replica数等于卷中brick存储服务器数量 #创建存储目录[root@glusterfs1 ~]# mkdir -p /data/brick1/gv2#创建分布式卷,副本数为2,会提示出发生脑裂警告,输入Y继续即可[root@glusterfs1 ~]#gluster volume create gv2 replica 2 glusterfs1:/data/brick1/gv2 glusterfs2:/data/brick1/gv2 Replica 2 volumes are prone to split-brain. Use Arbiter or Replica 3 to avoid this. See: http://docs.gluster.org/en/latest/Administrator%20Guide/Split%20brain%20and%20ways%20to%20deal%20with%20it/. Do you still want to continue? (y/n) y volume create: gv2: success: please start the volume to access data#启动卷[root@glusterfs1 ~]#gluster volume start gv2 volume start: gv2: success #查看gv2状态[root@glusterfs1 ~]# gluster volume status gv2 Status of volume: gv2 Gluster process TCP Port RDMA Port Online Pid ------------------------------------------------------------------------------ Brick glusterfs1:/data/brick1/gv2 49153 0 Y 100756 Brick glusterfs2:/data/brick1/gv2 49153 0 Y 62646 Self-heal Daemon on localhost N/A N/A Y 100805 Self-heal Daemon on glusterfs2 N/A N/A Y 62669 Task Status of Volume gv2 ------------------------------------------------------------------------------ There are no active volume tasks#查看gv2信息[root@glusterfs1 ~]#gluster volume info gv2 Volume Name: gv2 Type: Replicate Volume ID: 5c8ccf1a-8808-49de-b36f-74e4a2a7f215 Status: Started Snapshot Count: 0 Number of Bricks: 1 x 2 = 2 Transport-type: tcp Bricks: Brick1: glusterfs1:/data/brick1/gv2 Brick2: glusterfs2:/data/brick1/gv2 Options Reconfigured: transport.address-family: inet nfs.disable: on performance.client-io-threads: off 测试#创建挂载点目录,挂载gv2,可见容量大小为一半(5G+5G)/2[root@glusterfs1 ~]# mkdir -p /opt/gv2 [root@glusterfs1 ~]#mount -t glusterfs glusterfs1:/gv2 /opt/gv2 [root@glusterfs1 ~]#df -h|grep gv2 glusterfs1:/gv2 5.0G 84M 5.0G 2% /opt/gv2 创建10个测试文件,查看brick下gv目录,文件数量为完整的10个 在glusterfs2节点查看文件数量,也是完整的10个,可见两个节点存储的文件为相同的 四、配置条带卷Striped:条带式卷,类似RAID0,文件被分为数据块,并发粒度为数据块,大文件性能好 [root@glusterfs1 ~]# gluster volume create gv3 stripe 2 glusterfs1:/data/brick3/gv3 glusterfs2:/data/brick3/gv3 volume create: gv3: success: please start the volume to access data [root@glusterfs1 ~]# gluster volume start gv3 volume start: gv3: success [root@glusterfs1 ~]# gluster volume status gv3 Status of volume: gv3 Gluster process TCP Port RDMA Port Online Pid ------------------------------------------------------------------------------ Brick glusterfs1:/data/brick3/gv3 49154 0 Y 129779 Brick glusterfs2:/data/brick3/gv3 49154 0 Y 77272 Task Status of Volume gv3 ------------------------------------------------------------------------------ There are no active volume tasks [root@glusterfs1 ~]# gluster volume info gv3 Volume Name: gv3 Type: Stripe Volume ID: cdee0ae8-e821-44a3-8bb7-71671e3f108a Status: Started Snapshot Count: 0 Number of Bricks: 1 x 2 = 2 Transport-type: tcp Bricks: Brick1: glusterfs1:/data/brick3/gv3 Brick2: glusterfs2:/data/brick3/gv3 Options Reconfigured: transport.address-family: inet nfs.disable: on 测试#创建挂载点文件夹,挂载gv3,可用容量为5G+5G[root@glusterfs1 ~]# mkdir /opt/gv3 [root@glusterfs1 ~]# mount -t glusterfs glusterfs1:/gv3 /opt/gv3 [root@glusterfs1 ~]# df -h|grep gv3 glusterfs1:/gv3 10G 167M 9.9G 2% /opt/gv3 #在挂载文件夹里创建一个大小为10M一个20M的测试文件[root@glusterfs1 ~]# dd if=/dev/zero bs=1024 count=10000 of=/opt/gv3/10M.file 记录了10000+0 的读入 记录了10000+0 的写出 10240000字节(10 MB)已复制,0.883662 秒,11.6 MB/秒 [root@glusterfs1 ~]# dd if=/dev/zero bs=1024 count=20000 of=/opt/gv3/20M.file 记录了20000+0 的读入 记录了20000+0 的写出 20480000字节(20 MB)已复制,1.5851 秒,12.9 MB/秒 #分别查看glusterfs1节点和glusterfs2节点,10M的文件以5M大小文件块分别存储在两个节点上,20M文件同理[root@glusterfs1 ~]# ll -h /data/brick3/gv3/ 总用量 15M -rw-r--r-- 2 root root 4.9M 7月 25 04:51 10M.file -rw-r--r-- 2 root root 9.8M 7月 25 04:51 20M.file [root@glusterfs2 ~]# ll -h /data/brick3/gv3/ 总用量 15M -rw-r--r-- 2 root root 4.9M 7月 25 04:51 10M.file -rw-r--r-- 2 root root 9.8M 7月 25 04:51 20M.file 五、参考命令集群节点操作#添加节点gluster peer probe <主机名或IP>#删除节点gluster peer detach <主机名或IP>#查看节点连接状态gluster peer status#列出所有节点gluster pool list 卷操作#查看卷信息gluster volume info <卷名或all>#列出所有卷gluster volume list #查看卷状态gluster volume stat<卷名>#启动/停止/删除卷gluster volume start/stop/delete <卷名>#修复卷gluster volume heal <卷名> //只修复有问题文件gluster volume heal <卷名> full //修复所有文件gluster volume heal <卷名> info //查看修复自愈详情#创建卷gluster volume create <新卷名> [stripe 条带卷数] [replica 副本卷数] <brick卷1(格式-IP或主机名:/存储目录)> <brick卷2>#添加brick到卷,条带卷和副本卷添加brick需要添加的数量是之前的整数倍gluster volume add-brick <卷名> <brick卷(格式-IP或主机名:/存储目录)>#移除brick到卷,条带卷和副本卷添加brick需要移除的数量是之前的整数倍gluster volume remove-brick <卷名> <brick卷(格式-IP或主机名:/存储目录)>
新添加一块磁盘为sdb大小40G 对sdb进行分区操作 #分区4个,大小都为10G[root@localhost ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdb 8:16 0 41G 0 disk ├─sdb1 8:17 0 10G 0 part ├─sdb2 8:18 0 10G 0 part ├─sdb3 8:19 0 10G 0 part └─sdb4 8:20 0 10G 0 part#创建raid5,添加sdb1-3,将sdb4作为热备盘[root@localhost ~]# mdadm -C -v /dev/md0 -l5 -n3 /dev/sdb[1-3] --spare-devices=1 /dev/sdb4 #查看md添加状态[root@localhost ~]# cat /proc/mdstat #显示raid详细信息,如下sdb1-3为激活同步状态,sdb4为备份状态[root@localhost ~]# mdadm -D /dev/md0 。。。。。。。 Number Major Minor RaidDevice State 0 8 17 0 active sync /dev/sdb1 1 8 18 1 active sync /dev/sdb2 4 8 19 2 active sync /dev/sdb3 3 8 20 - spare /dev/sdb4 #执行-f强制标记分区为faulty状态,人为模拟硬盘故障[root@localhost ~]# mdadm -f /dev/md0 /dev/sdb2 mdadm: set /dev/sdb2 faulty in /dev/md0 #查看md0状态,已经显示sdb2为错误状态,而之前的热备盘sdb4已经参与重建[root@localhost ~]# mdadm -D /dev/md0 。。。。。。。 State : clean, degraded, recovering 。。。。。。。 Number Major Minor RaidDevice State 0 8 17 0 active sync /dev/sdb1 3 8 20 1 spare rebuilding /dev/sdb4 4 8 19 2 active sync /dev/sdb3 1 8 18 - faulty /dev/sdb2 #稍等片刻后再次查看md0信息,热备盘已经处于正常同步状态[root@localhost ~]# mdadm -D /dev/md0 。。。。。。。 Number Major Minor RaidDevice State 0 8 17 0 active sync /dev/sdb1 3 8 20 1 active sync /dev/sdb4 4 8 19 2 active sync /dev/sdb3 1 8 18 - faulty /dev/sdb2#移除错误盘sdb2[root@localhost ~]# mdadm -r /dev/md0 /dev/sdb2 mdadm: hot removed /dev/sdb2 from /dev/md0 [root@localhost ~]# mdadm -D /dev/md0 。。。。。。。 Number Major Minor RaidDevice State 0 8 17 0 active sync /dev/sdb1 3 8 20 1 active sync /dev/sdb4 4 8 19 2 active sync /dev/sdb3 #格式化md0,成功挂载到目录,raid正常工作[root@localhost ~]# mkfs.xfs /dev/md0 [root@localhost ~]# mount /dev/md0 /mnt/ [root@localhost ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/md0 20G 33M 20G 1% /mnt #重新添加sdb2到raid中,正常状态为spare[root@localhost ~]# mdadm -a /dev/md0 /dev/sdb2 mdadm: added /dev/sdb2 [root@localhost ~]# mdadm -D /dev/md0 。。。。。。 Number Major Minor RaidDevice State 0 8 17 0 active sync /dev/sdb1 3 8 20 1 active sync /dev/sdb4 4 8 19 2 active sync /dev/sdb3 5 8 18 - spare /dev/sdb2
OVS三大部分 ovsdb-sever: OVS的数据库服务器,用来存储虚拟交换机的配置信息。它与manager和ovs-vswitchd交换信息使用了OVSDB(JSON-RPC)的方式。ovs-vswitchd: OVS的核心部件,它和上层controller通信遵从openflow协议,它与ovsdb-server通信使用OVSDB协议,它和内核模块通过netlink通信,它支持多个独立的datapath(网桥),它通过更改flow table实现了绑定,和VLAN等功能。ovs kernel module: OVS的内核模块,处理包交换和隧道,缓存flow,如果在内核的缓存中找到转发规则则转发,否则发向用户空间去处理。 来自 <https://blog.csdn.net/weixin_41738417/article/details/85226302> 当前最新代码包主要包括以下模块和特性:ovs-vswitchd: 主要模块,实现switch的daemon,包括一个支持流交换的Linux内核模块;ovsdb-server: 轻量级数据库服务器,提供ovs-vswitchd获取配置信息,例如vlan、port等信息;ovs-brcompatd: 让ovs-vswitch替换linux bridge,包括获取bridge ioctls的Linux内核模块;ovs-dpctl:用来配置switch内核模块;ovs-vsctl: 查询和更新ovs-vswitchd的配置;ovs-appctl: 发送命令消息,运行相关daemon;ovs-ofctl: 查询和控制OpenFlow交换机和控制器;ovs-openflowd:一个简单的OpenFlow交换机;ovs-controller:一个简单的OpenFlow控制器;ovs-pki:OpenFlow交换机创建和管理公钥框架;ovs-tcpundump:tcpdump的补丁,解析OpenFlow的消息;ovs-bugtool:管理openvswitch的bug信息。 来自 <https://blog.csdn.net/weixin_41738417/article/details/85226302> 1.安装openvswitch使用yum安装openvswitch服务启动服务查看安装的版本[root@controller ~]# ovs-ofctl --version 2.ovs-vsctl命令add-br 创建网桥#创建网桥br0[root@controller ~]# ovs-vsctl add-br br0 list-br 列出网桥#列出所有网桥[root@controller ~]# ovs-vsctl list-brbr0 add-port 网桥添加端口#将网卡eno33554960添加到网桥br0[root@controller ~]# ovs-vsctl add-port br0 eno33554960 list-ports 列出网桥的所有端口#列出网桥br0上的所有端口[root@controller ~]# ovs-vsctl list-ports br0eno33554960 port-to-br查看端口连接网桥#列出ens33端口连接着哪个网桥[root@controller ~]# ovs-vsctl port-to-br eno33554960br0 show 查看openvswitch状态[root@controller ~]# ovs-vsctl show36e452be-7323-4c2f-9caa-4eb9a58c608e Bridge "br0" Port "eno33554960" Interface "eno33554960" Port "br0" Interface "br0" type: internal ovs_version: "2.5.0" del-port 删除端口可带参数<网桥名>,则删除指定网桥的端口若无参数<网桥名>,则默认删除所有连接着该端口的网桥端口 del-br 删除网桥#删除网桥br1[root@controller ~]# ovs-vsctl del-br br1 list interface 列出端口信息 3.其他配置#将br1桥中的ens33接口配置为VLAN100的access接口[root@controller ~]# ovs-vsctl set port eno33554960 tag=100[root@controller ~]# ovs-vsctl show36e452be-7323-4c2f-9caa-4eb9a58c608e Bridge "br0" Port "eno33554960" tag: 100 Interface "eno33554960" Port "br0" Interface "br0" type: internal ovs_version: "2.5.0" #配置br1桥的ens33接口为vlan100,120的trunk[root@controller ~]# ovs-vsctl set port eno33554960 trunk=100,120[root@controller ~]# ovs-vsctl show36e452be-7323-4c2f-9caa-4eb9a58c608e Bridge "br0" Port "eno33554960" trunks: [100, 120] Interface "eno33554960" Port "br0" Interface "br0" type: internal ovs_version: "2.5.0"
不论在ECS还是在自家的服务器上,系统多多少少会出意外。在windows下备份的方法要么是使用自带工具Buckup,要么就是使用ghost打包系统创建镜像。其实在linux下备份系统更加简单。1.tar备份系统tar cvpzf backup.tar.gz --exclude=/proc --exclude=/lost+found --exclude=/backup.tar.gz --exclude=/mnt --exclude=/sys --exclude=/media / linux系统下一切皆文件,直接tar压缩 / 目录下文件,即可达到备份效果,But压缩排除以下文件,backup自身文件,/proc,/lost_found,/mnt,/sys,/media参数使用cvpfz,“创建档案文件”、“保持权限”(保留所有东西原来的权限)、“使用gzip来减小文件尺寸” 备份后文件导出系统备份文件2.系统还原将备份文件放在/ 确保系统空间足够 tar命令覆盖解压tar xvpfz backup.tgz -C /重新创建文件夹mkdir proc mkdir lost+found mkdir mnt mkdir sys记得修改网卡文件,mac地址发生变化 以上系统可以正常恢复了
1.安装环境准备1.将软件包上传到服务器,FTP共享软件上传都可以 1.yum安装编译所需组件,解压缩所需要的命令yum -y install gcc*yum -y install tar unzip 2.分别解压四个包[root@lnmp-server share]# tar -zxvf libmcrypt-2.5.8.tar.gz [root@lnmp-server share]# tar -zxvf nginx-1.12.2.tar.gz [root@lnmp-server share]# tar -zxvf php-5.6.27.tar.gz [root@lnmp-server share]# unzip wordpress-4.7.3-zh_CN.zip 2.安装libmcrypt组件进入解压后的libmcrypt-2.5.8目录,./configure执行配置 [root@lnmp-server share]# cd libmcrypt-2.5.8 [root@lnmp-server libmcrypt-2.5.8]# ./configure Make&&make install 执行安装 3.安装PHP进入解压后的php目录,./configure执行配置 Tip1:./configure若提示报错error缺少libxml2组件请再yum安装libxml2 ./configure配置成功如下 Make && make install 编译安装 编译成功如下 执行php –v 检查是否安装成功,成功输出版本号Tip2:(mlgb后续nginx添加PHP解析支持需要安装php-fpm,wordpress需要安装php-mysql组件,此处源码包内没有提供,使用yum安装上这两个php组件,不然后续没法继续)[root@lnmp-server yum.repos.d]# yum -y install php-mysql php-fpm4.安装nginx进入解压后的nginx目录,./configure执行配置 Tip1:配置报错,缺少pcre-devel组件Yum安装pcre-devel组件[root@lnmp-server nginx-1.12.2]# yum -y install pcre-devel 编译安装make && make install 测试运行/usr/local/nginx/sbin/nginxSs –tnlp查看服务运行端口80浏览器访问IP,成功访问nginx默认首页服务安装成功 5.yum安装mariadb[root@lnmp-server ~]# yum -y install mariadb mariadb-server 启动mariadb服务执行数据库初始化,输入root密码和其他配置[root@lnmp-server ~]# systemctl restart mariadb [root@lnmp-server ~]# mysql_secure_installation 登陆数据库,创建wordpress所需的数据库,并给ROOT用户授权[root@lnmp-server ~]# mysql -uroot -p000000 MariaDB [(none)]> create database wordpress; MariaDB [(none)]> grant all privileges on *.* to root@localhost identified by '000000' with grant option; MariaDB [(none)]> grant all privileges on *.* to root@'%' identified by '000000' with grant option; 6.nginx添加php解析支持编辑nginx配置文件vim /usr/local/nginx/conf/nginx.conf 在serever块下location /块中添加index.php 取消注释,从location ~ \.php$ {…….}到块结束 编辑vim /usr/local/nginx/conf/fastcgi_params在任意一行添加如下fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 保存后重启php-fpm服务,nginx服务[root@lnmp-server conf]# systemctl restart php-fpm [root@lnmp-server conf]# /usr/local/nginx/sbin/nginx -s stop [root@lnmp-server conf]# /usr/local/nginx/sbin/nginx 7.部署Wordpress网页进入nginx默认网页目录,删除原有网页,[root@lnmp-server html]# cd /usr/local/nginx/html/ [root@lnmp-server html]# rm -rf *将解压出来的wordpress网页全部复制到默认网页目录(注意-r参数以及文件夹位置嵌套)[root@lnmp-server html]# cp -r /opt/share/wordpress/* . 进入网页目录,复制wp-config-sample.php配置样板文件为wp-config.php[root@lnmp-server html]# cd /usr/local/nginx/html/ [root@lnmp-server html]# cp wp-config-sample.php wp-config.php编辑wp-config.php[root@lnmp-server html]# vim wp-config.php 修改wp-config-sample.php中数据库名称,用户名,密码如图 浏览器访问IP,跳出初始化配置信息,填入站点标题,后台管理用户密码,点击安装完成 后台管理首页 首页
环境:Master Centos7/Mariadb 192.168.215.5 Slave Centos7/Mariadb 192.168.215.6 设置主机名为db1,db2,编辑hosts文件为自己的ip Yum 安装mariadb(主从两台相同做法) 开启mariadb服务及设置开机自启(主从两台相同做法) 初始化数据库(主从两台相同做法)第一步回车 第二步设置密码000000 其余步骤如图 主节点服务器配置:Vim编辑数据库配置文件my.cnf在[mysqld]处添加以下内容log_bin=mysql-binbinlog_ignore_db=mysqlserver-id=5 #节点id自定,主从需不同 其余配置不变,重启服务 通过账户root密码000000进入mysql授权root在任意地方登录权限grant all privileges on *.* to root@'%' identified by "123456"; 创建用户user,从db2连接,并授权grant replication slave on *.* to 'user'@'db2' identified by '123456'; 子节点配置Vim编辑数据库配置文件my.cnf在[mysqld]处添加以下内容log_bin=mysql-binbinlog_ignore_db=mysqlserver-id=6 #节点id自定,主从需不同 通过账户root密码000000进入mysql更改连接主节点配置,主节点名称为’db1’,用户密码为’user’,‘123456’change master to master_host='db1',master_user='user',master_password='123456'; 开启从模式Slave start;查询状态show slave status\G; 从节点服务状态为YES
排错:Openstack-icehouse配置yum源ssl证书报错环境:CentOS6.6 Yum文件如下 报错:https://repos.fedorapeople.org/repos/openstack/EOL/openstack-icehouse/epel-6/repodata/repomd.xml: [Errno 14] problem making ssl connection尝试其他镜像。错误:Cannot retrieve repository metadata (repomd.xml) for repository: rdo. Please verify its path and try again 使用curl测试地址,同时报错ssl连接错误[root@controller yum.repos.d]# curl https://repos.fedorapeople.org/repos/openstack/EOL/openstack-icehouse/epel-6/repodata/repomd.xml curl: (35) SSL connect error 解决:先将repo文件移动改名,确保CentOS的安装源可以使用 //更新curl(可不做) [root@controller yum.repos.d]# yum -y update curl //安装nss (Network Security Service, 网络安全服务) [root@controller yum.repos.d]# yum -y install nss //安装更新证书 [root@controller yum.repos.d]# yum -y install ca-certificates 将改名后的repo文件改回来,报错解决Curl测试正常
centos8系统的本地yum源配置稍稍有些不同 首先创建光盘挂载点文件夹,挂载光盘[root@CentOS8 ~]# mkdir /mnt/cdrom[root@CentOS8 ~]# mount /dev/sr0 /mnt/cdrom/mount: /mnt/cdrom: WARNING: device write-protected, mounted read-only. 此时来查看一下系统镜像里的文件结构这张近8个G的系统镜像多了,有两个repo仓库文件夹 进入到系统yum文件的配置路径,可以看到系统默认的repo文件也比7多了不少负责本地光盘镜像源的repo文件,依旧是CentOS-Media.repo 编辑配置文件,可以看到系统默认的配置位置就有两个一个BaseOS,一个AppStream 将两个文件路径分别修改为现在sr0挂载点的路径再将enabled改为1启用 或者按照习惯做法,将系统默认配置进行移动备份自己新创建repo文件 写入以下配置即可 [root@CentOS8 yum.repos.d]# cat local.repo [Centos8-baseos] name=centos-baseos enabled=1 gpgcheck=0 baseurl=file:///mnt/cdrom/BaseOS [Centos8-appstream] name=centos-appstream enabled=1 gpgcheck=0 baseurl=file:///mnt/cdrom/AppStream yum更新列表,出现配置好的baseos和appstream位置就OK
在Centos7中已经出现该命令,在Centos8中,官方放弃了network服务,主推Nmcli服务 配置参数的简写connection == c如图 查看网卡设备信息[root@CentOS8 ~]# nmcli device status 查看网卡具体信息[root@CentOS8 ~]# nmcli device show eth0 修改网卡配置文件使其生效CentOS8的网卡配置文件路径依旧,/etc/sysconfig/network-scripts/,需重新执行加载配置文件来生效[root@CentOS8 ~]# nmcli connection reload [root@CentOS8 ~]# nmcli connection up eth0 通过命令修改网卡配置用法:nmcli connection modify <网卡号> <设置。参数> <配置内容>修改添加属性值,如删除一个DNS地址,添加一个IPV4地址在 <设置。参数> 前跟 +/- 即可设置如下[connection, 802-3-ethernet (ethernet), 802-1x, dcb, sriov, ethtool, match, ipv4, ipv6, tc, proxy]参数如下[method, dns, dns-search, dns-options, dns-priority, addresses, gateway, routes, route-metric, route-table, routing-rules, ignore-auto-routes, ignore-auto-dns, dhcp-client-id, dhcp-timeout, dhcp-send-hostname, dhcp-hostname, dhcp-fqdn, never-default, may-fail, dad-timeout] #如,修改ipv4网关与DNS[root@CentOS8 ~]# nmcli connection modify eth0 ipv4.gateway '192.168.1.254' [root@CentOS8 ~]# nmcli connection modify eth0 ipv4.dns '192.168.1.100,8.8.8.8'#要是配置生效需要重启服务[root@CentOS8 ~]# systemctl restart NetworkManager#或者关闭激活网卡,当然打了第一条命令网络就会掉[root@CentOS8 ~]# nmcli connection down eth0 [root@CentOS8 ~]# nmcli connection up eth0
DevOps意为“Development”和“Operations”,即为开发人员和运维人员之间沟通合作的开发模式,通过自动化“软件交付”和“架构更变”的流程,实现开发运维一体化,使得开发构建、测试、发布能够更加快捷、频繁和高效稳定。DevOps是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保证部门之间的沟通、协作与整合。它的出现时由于软件行业日益清晰地认识到:为了按时交付软件产品和服务,开发和运营工作必须紧密合作。其最大的特点就是极速的迭代和快速的用户反馈。 云效,云原生时代一站式BizDevOps平台,支持公共云、专有云和混合云多种部署形态,通过云原生新技术和研发新模式,助力创新创业和数字化转型企业快速实现研发敏捷和组织敏捷,打造“双敏”组织,实现 10 倍效能提升。 如今,业务追求上云,业务流程也可以上云。阿里的云效DevOps全家桶,真正的为人们带来便利,今天,我就以jenkins+gitlab基于k8s集群实现自建DevOps系统的方式部署开源微服务PiggyMetrics,与云效DevOps对比,告诉大家真正的免运维,实现高效的业务开发流程。自建DevOps实现CI/CD-部署微服务PiggyMetrics这里,我先从自建devops系统并部署微服务应用开始测试的devops系统架构流程如下: 基于现有的kubernetes集群和harbor镜像仓库,搭建以docker运行的gitlab代码仓库和CI工具jenkins,并编写自动化流水线脚本。 1.部署jenkinsJenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。我们通过容器部署jenkins服务容器名称:jenkins;端口映射:8080:8080;使用root身份生成容器;[root@master opt]# docker run -itd --name jenkins -p 8881:8080 -u root -v /home/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -v /usr/bin/kubectl:/usr/local/bin/kubectl -v /root/.kube:/root/.kube jenkins/jenkins:2.262-centos设置jenkins在web端通过http://IP:8080访问Jenkins 查看默认密码:[root@master ~]# docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword 54670064056e42a2a47485a5e3356e57输入密码并点击“继续” 选择“安装推荐的插件”,如图所示:插件安装完成后自动转入管理员用户创建界面 输入用户信息,点击“保存并完成” 配置完URL后使用新建的用户登录Jenkins,如图 2.部署GitlabGitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务,可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。我们这里也是通过容器部署gitlab服务容器名称:gitlab;端口映射:1022:22、81:80、443:443;容器重启策略:always;[root@master opt]# docker run -itd --name gitlab -p 81:80 -p 443:443 -v /root/gitlab/config:/etc/gitlab -v /root/gitlab/logs:/var/log/gitlab -v /root/gitlab/data:/var/opt/gitlab --restart always gitlab/gitlab-ce:12.9.2-ce.0设置root用户信息并使用root用户登录Gitlab,如图所示: 创建项目“Create a project” 我们就可以在本地通过git上传代码到仓库git init git remote add origin http://ip/xxxx.git git add . git commit -m 'upload' git push -u origin master3.配置Jenkins对接Gitlabgitlab设置Outbound requests 生成“Access Tokens”并命名为jenkins 设置Jenkins取消对’/project’ end-point进行身份验证; jenkins添加gitlab api token 4.配置Jenkins连接maven采用docker in docker的方式在Jenkins内安装maven[root@master ~]# cp apache-maven-3.6.3-bin.tar.gz /root/jenkins/ [root@master ~]# docker exec -it jenkins bash [root@b957b62337cc /]# cd /var/jenkins_home/ [root@b957b62337cc jenkins_home]# tar -zxvf apache-maven-3.6.3-bin.tar.gz -C . [root@2927036f2450 jenkins_home]# mv apache-maven-3.6.3 /usr/local/maven //配置maven环境变量 [root@b957b62337cc jenkins_home]# vi /etc/profile export M2_HOME=/usr/local/maven export PATH=$PATH:$M2_HOME/bin [root@2927036f2450 /]# vim /root/.bashrc if [ -f /etc/bashrc ]; then . /etc/bashrc source /etc/profile fi在Jenkins中配置maven信息Dashboard-全局工具配置 5.配置CI/CD新建流水线任务配置触发器 编写流水线脚本构建微服务项目中的gateway和config服务,将构建后的镜像自动上传到Harbor仓库,并自动发布gateway和config服务到Kubernetes集群的springcloud命名空间下node{ stage('git clone'){ //check CODE 从代码仓库克隆 git credentialsId: 'ad561b3b-5252-43d5-b9c4-ec9bece0134c', url: 'http://IP/xxx.git' } stage('maven build'){ //maven编译 sh '''/usr/local/maven/bin/mvn package -DskipTests -f /var/jenkins_home/workspace/xxx''' } stage('image build'){ //构建镜像,并将镜像ID变量作为tag sh ''' echo $BUILD_ID docker build -t 10.24.2.10/xxx/gateway:$BUILD_ID -f /var/jenkins_home/workspace/xxx/gateway/Dockerfile /var/jenkins_home/workspace/xxx/gateway docker build -t 10.24.2.10/xxx/config:$BUILD_ID -f /var/jenkins_home/workspace/xxx/config/Dockerfile /var/jenkins_home/workspace/xxx/config''' } stage('test'){ //测试镜像 sh '''docker run -itd --name gateway 10.24.2.10/xxx/gateway:$BUILD_ID docker ps -a|grep chinaskillproject|grep Up if [ $? -eq 0 ];then echo "Success!" docker rm -f gateway else docker rm -f gateway exit 1 fi ''' } stage('upload registry'){ //上传构建完成的镜像到harbor镜像仓库 sh '''docker login 10.24.2.10 -u=admin -p=xxxxxxxxxxxxxx docker push 10.24.2.10/chinaskillproject/gateway:$BUILD_ID docker push 10.24.2.10/chinaskillproject/config:$BUILD_ID''' } stage('deploy k8s'){ //创建命名空间,部署yaml脚本到k8s集群 sh 'kubectl create ns springcloud' sh 'kubectl apply -f /var/jenkins_home/workspace/xxx/yaml/deployment/gateway-deployment.yaml --kubeconfig=/root/.kube/config' sh 'kubectl apply -f /var/jenkins_home/workspace/xxx/yaml/deployment/config-deployment.yaml --kubeconfig=/root/.kube/config' sh 'kubectl apply -f /var/jenkins_home/workspace/xxx/yaml/svc/gateway-svc.yaml --kubeconfig=/root/.kube/config' sh 'kubectl apply -f /var/jenkins_home/workspace/xxx/yaml/svc/config-svc.yaml --kubeconfig=/root/.kube/config' } } 配置gitlab的webhookGitlab,进入项目,点击左侧导航栏“Settings”→“Webhooks”,将GitLab webhook URL地址填入URL处,禁用SSL认证,如图所示。点击“Add webhook”添加webhook点击“Push events”进行测试结果返回HTTP 200则表明Webhook配置成功。 6.触发流水线git重新提交代码,触发流水线[root@master ]# git commit -m "Initial commit" # On branch master nothing to commit, working directory clean [root@master ]# git push -u origin master触发后开始运行流水线一路绿灯,构建部署成功 微服务成功部署在k8s集群,CI/CD部署完成 接下来就是本次的正文了-云效为什么要花这么多功夫写自建devops系统呢?因为这些部署在云效之中,都!不!需!要! 当自建系统时,基础设施需要确保Kubernetes集群、部署镜像仓库、部署代码仓库、部署CI/CD工具,还需要针对业务编写设置不同的流水线,并考虑服务的高可用性 一切复杂冗余的部署运维,有了云效,都可以省去!就好比官方文档中所述:为什么选择云效公共云,而不是自建或开源?免搭建、免维护,注册即用一站式DevOps,账号、数据打通钉钉集成,成员、消息及时同步无缝对接阿里云ECS、ACK等丰富的研发效能数据洞察精细化企业级安全防控能力云效DevOps-部署微服务PiggyMetrics一、云效代码管理 Codeup云效代码管理 Codeup 是阿里云出品的一款企业级代码管理平台,提供代码托管、代码评审、代码扫描、质量检测等功能,全方位保护企业代码资产,帮助企业实现安全、稳定、高效的研发管理。代码仓库相信是个搞计算机的都不陌生,最热门的github/gitee等在线代码仓库,或gitlab等等。我们对代码仓库最基本的需求便是代码托管与版本管理。云效提供了代码托管,同时也可以连接其他git仓库。 这里,我们从代码管理开始创建新代码库 通过git上传本地代码文件Tips:git连接时的账号需要在个人设置里https密码中重新设置,与阿里的登录账号无关上传我们的测试代码后,仓库显示 云效的代码管理功能类似与常见代码仓库,包括项目分支、请求提交记录、安全管理在代码安全中,云效提供了依赖包漏洞检测与源码漏洞检测 二、云效流水线Flow 云效流水线完美的替代jenkins的CI功能,相比较自建的持续交付工具,使用 Flow 仅仅需要几步,就可以快速搭建 CICD 流程。Flow 提供了开箱即用的构建环境,提供了数十种通用的流水线模版帮助你快速创建流水线,可以根据开发业务选择不同的模板,这个对于自己编写pipeline脚本真的方便了很多,当我在自己编写流水线脚本时,需要进行大量的测试调试,还需要根据不同的业务需求而进行调整。Flow提供的不同功能的模板,大量减少了运维工作在这里,我们新建流水线,选择 根据我们发布流程,我们分别需要设置四个流程第一阶段。选择流水线来源,选择上面我们完成代码上传的云效codeup,选择好仓库和分支 第二阶段。我们需要对仓库内代码进行maven build,流水线运行时会将打包完的jar包暂存在工作空间中 第三阶段。我们配置镜像构建,这里需要构建微服务中的gateway和config镜像,选择镜像构建推送到阿里云配置阿里镜像仓库,设置Dockerfile的文件路径,可以设置构建镜像的tag 第四阶段。我们将构建完成的镜像部署到k8s集群中,我们可以直接部署到阿里的ACK集群中选择好kubectl的选项,以及yaml部署脚本文件 微服务PiggyMetrics的流水线Flow到这里就完成设置了,非常简单便捷的部署了四个流程 Tips:每个阶段还可以配置通知功能完成配置后,点击运行配置流水线运行成功,一路绿灯PS:图中构建出现的告警是因为dockerfile中编写容器源镜像选择的是dockerhub官方的,阿里建议使用国内镜像站此时我们进ACK集群,查看创建的deployment,如图config和gateway以及正常上线 通过ACK服务,使用负载均衡就可以暴露服务端口在公网上 PiggyMetrics微服务部署完成,公网访问成功其他云效全家桶工具体验云效知识库 Thoughts 文档管理是最为重要的功能,文档是最基础的技术载体,对新人进入时可以通过学习文档快速进入工作,也可以避免开发中解决重复性的问题解决。 多人协作的文档管理产品有很多,常见的以Wiki为主,企业常用的文档及项目管理为Confluence+jira,也有公有云SaaS产品语雀,这些产品我或多或少接触过。但是对于一些小型团队,这些产品偏重。 这是我个人在使用的wiki知识平台wiki.js,搭建较轻,但是还是有运维的要求(数据库、存储备份等) 云效中集成了知识库模块,我第一使用感受就是简约、轻 可以有几大经典的模板供创建,非常方便 我选择了创建IT运营模板,可以配置文档库公开性 模板库有大量现成文档模板,包含了标题,可以促进编写文档的标准化 文档编辑是markdown格式的,熟悉markdown的非常好上手 同时也可以导入现有的文档内容,包括了markdown\云效文档导出\Confluence\Word文件测试了导入word文档文件,对word导入效果还不错测试管理Testhub云效提供了测试管理,针对研发中测试人员直接在云效中跟进项目测试与反馈创建测试用例库,填写名称、设置安全性、填写编号 新建用例,填入标题、测试条件、测试过程和期望 新建测试计划,选择人员设置日期当测试人员完成测试后,就可以将测试结果反馈到平台 应用交付AppStack中最为核心的三概念为发布应用、部署环境、应用编排1.发布一个可独立交付的对外提供服务的单元,在研发态,通常对应一个到多个功能模块,关联一个或多个代码库;在运行态,通常对应一组Kubernetes资源。2.环境环境是应用运行态的载体,是应用维度做部署和运维的操作界面。在AppStack中,一个应用可以创建多套环境,用于开发、测试、生产等不同场景,用户可以分别对这些环境进行更新、管理和运行状态监控。3.编排是对应用部署架构的描述,通常包含工作负载、配置项、网络、存储声明等,是一组Kubernetes资源组合。 我们可以选择发布应用的流水线,如上文发布微服务PiggyMetrics时配置的流水线 部署环境,appstack提供了三大预设环境,如开发环境、测试环境、生产环境,贴合实际的开发环境 应用编排使用了原生 YAML 的形式来描述应用部署架构,将预设的YAML脚本设置完成后即可完成应用的编排项目管理 云效Projex是新一代企业级研发协作平台,集成了敏捷研发项目管理的最佳实践,提供了针对项目、迭代、需求、缺陷等多个维度的协同管理以及相关的统计报告,让研发团队高效协作、践行敏捷并持续交付产品价值。 通过与云效「代码管理」和「流水线」的结合,可打造一站式、端到端、全栈敏捷的软件研发DevOps项目。项目,是围绕某一特定目标(如产品交付或服务),组织相应人力、物力资源进行的临时性工作。项目具有非常强的计划性,有确定的开始日期和结束日期,项目的周期时长有短期或长期两种形态。在现代软件交付项目中,也有未设置项目结束日期,以迭代的方式来持续演进交付产品。项目是Projex的核心对象,汇集了同类工作内容以及投入的资源。选择项目模板,填写基本信息,即可开始项目管理云端开发DevStudio 云效云端开发 DevStudio 是一款阿里云云效推出的面向云原生的 WebIDE 产品。只需一个浏览器即可获得与本地 IDE 一致的开发体验。通过预置开发环境,使用智能编码能力,即可快速地编辑、调试、运行、部署云端代码。 DevStudio 以 WebIDE 为基础,提供函数计算、IoT应用和小程序等应用的开发和调试,串联起整个 DevOps 流程,无需用户配置环境,更不受操作系统限制,通过浏览器,即可使用完整 IDE 功能。DevStudio 支持在线安装插件来拓展原有功能,兼容所有常用 VSCode 插件 企业管理云效全家桶,提供了高效的企业管理,分为三大为:企业和组织、企业成员管理、企业角色与权限云效和钉钉集成使能组织架构和成员同步;钉钉消息通知,沟通协作更便捷同时精细化企业级安全防控能力,提供精细化企业权限管控,提供事前、事中、事后多种安全防控机制 微服务开源地址:https://github.com/sqshq/PiggyMetrics云效官方文档:https://help.aliyun.com/product/150040.html
一、基于EMR离线数据分析1. 登录EMR集群终端阿里云控制台点击 E-MapReduce 进入管理页面。集群基础信息找到MASTER节点的公网ip使用ssh连接集群 2. 上传数据到HDFS创建HDFS目录。hdfs dfs -mkdir -p /data/student 创建u.txt文件vim u.txt #第一列表示userid,第二列表示movieid,第三列表示rating,第四列表示unixtime。 196 242 3 881250949 186 302 3 891717742 22 377 1 878887116 244 51 2 880606923 166 346 1 886397596 298 474 4 884182806 115 265 2 881171488 253 465 5 891628467 305 451 3 886324817 6 86 3 883603013 62 257 2 879372434 286 1014 5 879781125 200 222 5 876042340 210 40 3 891035994 224 29 3 888104457 303 785 3 879485318 122 387 5 879270459 194 274 2 879539794 291 1042 4 874834944 234 1184 2 892079237 119 392 4 886176814 167 486 4 892738452 299 144 4 877881320 291 118 2 874833878 308 1 4 887736532 95 546 2 879196566 38 95 5 892430094 102 768 2 883748450 63 277 4 875747401 160 234 5 876861185 50 246 3 877052329 301 98 4 882075827 225 193 4 879539727 290 88 4 880731963 97 194 3 884238860 157 274 4 886890835 181 1081 1 878962623 278 603 5 891295330 276 796 1 874791932 7 32 4 891350932 10 16 4 877888877 284 304 4 885329322 201 979 2 884114233 276 564 3 874791805 287 327 5 875333916 246 201 5 884921594 242 1137 5 879741196 249 241 5 879641194 99 4 5 886519097 178 332 3 882823437 251 100 4 886271884 81 432 2 876535131 260 322 4 890618898 25 181 5 885853415 59 196 5 888205088 72 679 2 880037164 87 384 4 879877127 290 143 5 880474293 42 423 5 881107687 292 515 4 881103977 115 20 3 881171009 20 288 1 879667584 201 219 4 884112673 13 526 3 882141053 246 919 4 884920949 138 26 5 879024232 167 232 1 892738341 60 427 5 883326620 57 304 5 883698581 223 274 4 891550094 189 512 4 893277702 243 15 3 879987440 92 1049 1 890251826 246 416 3 884923047 194 165 4 879546723 241 690 2 887249482 178 248 4 882823954 254 1444 3 886475558 293 5 3 888906576 127 229 5 884364867 225 237 5 879539643 299 229 3 878192429 225 480 5 879540748 276 54 3 874791025 291 144 5 874835091 222 366 4 878183381 267 518 5 878971773 42 403 3 881108684 11 111 4 891903862 95 625 4 888954412 8 338 4 879361873 162 25 4 877635573 87 1016 4 879876194 279 154 5 875296291 145 275 2 885557505 119 1153 5 874781198 62 498 4 879373848 62 382 3 879375537 28 209 4 881961214 135 23 4 879857765 32 294 3 883709863 90 382 5 891383835 286 208 4 877531942 293 685 3 888905170 216 144 4 880234639 166 328 5 886397722 上传文件u.txt到hadoop文件系统。 hdfs dfs -put u.txt /data/student 查看文件。 hdfs dfs -ls /data/student 3.使用hive创建表登录hive数据库。hive 创建user表。 CREATE TABLE emrusers ( userid INT, movieid INT, rating INT, unixtime STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ; 从hadoop文件系统加载数据到hive数据表。LOAD DATA INPATH '/data/student/u.txt' INTO TABLE emrusers;4. 对表进行操作查看5行表数据。select * from emrusers limit 5; 查询数据表中有多少条数据。select count(*) from emrusers;查询数据表中评级最高的三个电影。select movieid,sum(rating) as rat from emrusers group by movieid order by rat desc limit 3; 二、使用阿里云Elasticsearch快速搭建智能运维系统 1.登录Kibana,开启自动创建索引在右侧概览页面Elasticsearch区域中,单击集群管理。在Elasticsearch实例列表中,单击实例ID。左侧导航栏,选择配置与管理 > 可视化控制。在Kibana区域中,单击修改配置。开启Kibana私网访问,返回上级页面,在Kibana区域中,单击公网入口。复制左侧云产品资源列表下的Elasticsearch登录名和Elasticsearch登录密码,至Kibana登录页面的账号和密码,单击登录。在登录成功页面,单击Explore on my own。 在左侧导航栏,单击Dev Tools(开发工具),再单击Go to work。在Console页签下,执行如下命令,开启阿里云ES实例的自动创建索引功能。PUT _cluster/settings { "persistent": { "action.auto_create_index": "true" } }开启成功后,结果如下。{ "acknowledged" : true, "persistent" : { "action" : { "auto_create_index" : "true" } }, "transient" : { } } 2. 使用Metricbeat采集ECS上的系统数据Elasticsearch管理控制台,Beats数据采集> 创建采集器。 创建采集器窗口中,单击Metricbeat。 系统弹出的确定服务授权对话框 在采集器配置向导中,输入或选择采集器信息,输入Elasticsearch登录名和Elasticsearch登录密码。 在metricbeat.yml中末尾添加如下脚本。 metricbeat.modules: - module: system metricsets: - cpu - load - memory - network - process - process_summary - uptime - socket_summary - core - diskio - filesystem - fsstat enabled: true period: 10s processes: ['.*'] cpu.metrics: ["percentages"] core.metrics: ["percentages"] 选择采集器安装的ECS实例。 启动采集器并查看采集器安装情况,此生效过程需等待3~5分钟。单击启动。启动成功后,系统弹出启动成功对话框。前往采集中心查看,在采集器管理区域中,查看启动成功的Metricbeat采集器,等待采集器状态变为已生效1/1。返回Kibana页面,在左侧导航栏,单击Dev Tools(开发工具)。在Console页签下,执行如下命令,查看索引。GET _cat/indices?v 左侧导航栏,单击Dashboard,搜索[Metricbeat System] Overview。 进入[Metricbeat System] Overview页面,再单击Host Overview,可查看监控仪表板。 3. 使用Filebeat采集ECS上的Nginx服务数据阿里云Elasticsearch管理控制台 > Beats数据采集中心。在创建采集器区域,单击ECS日志 在采集器配置向导中,输入或选择采集器信息。在填写Filebeat文件目录处,填写如下路径:/var/log/nginx/ 在filebeat.yml中更改如下脚本:在第24行enabled更改为true 在第28行更改paths - /var/log/nginx/*.log 下一步,选择采集器安装的ECS实例。 启动采集器并查看采集器安装情况,单击启动。启动成功后,系统弹出启动成功对话框。单击前往采集中心查看,在采集器管理区域中,查看启动成功的Filebeat采集器,等待采集器状态变为已生效1/1。返回Kibana页面,在左侧导航栏,单击Dev Tools(开发工具)。在Console页签下,执行如下命令,查看索引。GET _cat/indices?v 左侧导航栏,Discover选择filebeat,可查看采集的数据详情。 三、推荐系统入门之使用协同过滤实现商品推荐1.开通机器学习PAI服务机器学习平台PAI。在机器学习PAI控制台首页,单击立即开通。在服务开通页面,选择要开通的机器学习PAI服务所在的区域。 确认开通。 2.创建PAI Studio项目单击可视化建模(Studio)。在PAI Studio页面单击创建项目。创建项目页面,MaxCompute选择按量付费,填入项目名称。开通的机器学习PAI服务所在区域。勾选我已阅读并同意,立即开通。开通成功后返回PAI Studio控制台页面,再次单击创建项目,在创建项目页面选择MaxCompute付费方式为按量付费,然后填入项目名称,最后单击确认。等待项目操作列出现进入机器学习,表示项目创建完成。 创建实验左侧导航栏的首页。在模板列表找到【推荐算法】商品推荐,然后单击从模板创建。新建实验框,单击确定。 查看实验数据右键单击cf_训练_data节点,然后单击查看数据。源数据的字段解释如下:字段名含义类型描述user_id用户编号STRING购物的用户ID。item_id物品编号STRING被购买物品的编号。active_type购物行为STRING0:表示点击。1:表示购买。2:表示收藏。3:表示加入购物车。active_date购物时间STRING购物发生的时间。可以看到训练数据为7月份以前的用户购买行为数据。右键单击cf_结果_data,然后单击查看数据。可以看到结果数据为7月份以后的用户购买行为数据。 运行实验左上角运行。实验运行完成 查看实验结果右键单击join-1节点,然后单击查看数据。表中similar_item字段为经过协同过滤算法计算得出的该用户购买可能性最大的商品。单击全表统计-1节点,然后单击查看数据。表1统计了根据协同过滤算法推荐的商品数量,共有18065个商品可推荐。单击全表统计-2节点,然后单击查看数据。表2统计了7月份真实购买行为数据中与经过协同过滤算法所推荐的商品的命中数量,可以看到有60个推荐的商品被购买。
一、在阿里云容器服务Kubernetes部署并公开应用部署应用使用镜像创建设置应用名称在容器配置页签参数说明:镜像名称:输入registry.cn-hangzhou.aliyuncs.com/acr-toolkit/ack-cube。镜像Tag:单击选择镜像Tag选择镜像的版本。若不指定,默认为最新版。示例:1.0。资源限制:设置CPU为1 Core,内存为1024 MiB。所需资源:设置CPU为0.25 Core,内存为512 MiB。端口:设置容器的端口,输入名称ack-cube,容器端口80。创建。创建服务类型:选择负载均衡>公网访问>新建SLB。服务端口:设置服务端口为80。容器端口:设置服务端口为80。创建。查看应用详情。可以查看应用的容器组、访问方式、事件、容器伸缩、历史版本、日志和触发器等信息。测试应用选择网络>服务。外部端点列的IP地址。打开浏览器可体验魔方游戏。监控应用运维管理>Prometheus监控。在Prometheus监控页面,无状态应用监控。 在无状态应用监控页签,选择namespace为default,选择deployment为ack-cube。可以查看应用的资源使用情况无状态应用监控页签在集群Pod监控页签,可以查看单个Pod的资源使用情况。 二、Docker镜像管理与阿里云镜像仓库使用搭建Docker服务安装Docker的依赖库,添加Docker CE的软件源信息yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装Docker CEyum makecache fast && yum -y install docker-ce启动Docker服务。systemctl start docker配置DockerHub镜像加速器。tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://registry.docker-cn.com"] } EOF systemctl restart docker Dockerfile编排应用创建一个基于Golang的HelloWorld代码文件和一个用来构建运行Hello代码所需环境镜像的Dockerfile文件。mkdir -p /tmp/demo && cd /tmp/demo创建HelloWorld文件,在容器环境中监听HTTP服务输出HelloWorld字符串。cat > /tmp/demo/main.go << EOF package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello! World\n") }) fmt.Println("start to serve...") http.ListenAndServe(":80", nil) } EOF创建Dockerfile文件。cat > /tmp/demo/Dockerfile << EOF FROM golang:1.12-alpine # change current working dir WORKDIR /go/src/app # copy main.go into /go/src/app COPY . . # go build and install the app RUN go install -v ./... # run the app by default CMD ["app"] EOF 本地构建镜像并运行镜像docker build构建镜像。docker build . -t demo:v1 docker run命令运行镜像。docker run -d -p 8000:80 demo:v1 curl访问容器中的HelloWorld服务。curl localhost:8000 docker rm命令删除容器。docker rm -f $(docker ps -a | grep "demo:v1" | awk '{print $1}') 创建阿里镜像仓库需要开通镜像仓库服务 设置Registry登录密码 设置阿里云Docker Registry密码 创建命名空间 填写 仓库名称 和 摘要 本地仓库 镜像仓库列表 推送镜像到阿里私有仓库并测试登录到阿里云Docker Registry。 docker login --username="用户名" registry.cn-hangzhou.aliyuncs.com 标记本地镜像,将其归入远程仓库。 docker tag demo:v1 registry.cn-hangzhou.aliyuncs.com/space_test/demo:v1 将本地镜像推送到远程仓库。 docker push registry.cn-hangzhou.aliyuncs.com/space_test/demo:v1 拉取指定版本的远程镜像。 docker pull registry.cn-hangzhou.aliyuncs.com/space_test/demo:v1 运行拉取的远程镜像。 docker run -d -p 8000:80 registry.cn-hangzhou.aliyuncs.com/space_test/demo:v1 访问HelloWorld服务。 curl localhost:8000
MySQL安装及常用SQL1.安装并启用MYSQLrpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm yum -y install mysql-community-server systemctl start mysqld systemctl enable mysqld 2.获取并修改MYSQL的root密码grep 'temporary password' /var/log/mysqld.log mysql -uroot -p 修改MySQL的root用户的初始密码。 set global validate_password_policy=0; 修改安全策略 ALTER USER 'root'@'localhost' IDENTIFIED BY '12345678'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '12345678';3.常用 SQL查看数据库show database;创建数据库create database database_name;切换数据库use database_name;查看某数据库中所有的数据表show table;创建数据表 View Code查看数据表结构describe table_name; --缩写: desc查看数据表中的记录select * from table_name;-- 去重复select distinct name from table_name往数据表中添加数据记录INSERT INTO table_nameVALUES('puffball','Diane','hanst','f','1999-03-23',NULL);指定属性insert into user3 (name) value('asfjl');删除数据delete from table_name where name='puffball';修改数据update table_name set name='wang' where owner='haha' 使用RDS MySQL和ECS搭建个人博客场景将提供一台基础环境为CentOS的ECS(云服务器)和一台RDS MySQL版数据库实例。我们将会在这台服务器安装Apache+PHP+WordPress网站环境,结合RDS MySQL版数据库实例帮助您快速搭建自己的云上博客。我们的wordpress博客系统基于lnmp或lamp环境,即linux、网页服务、数据库服务、php服务组成。使用ECS和RDS我们将业务完成云上的部署,将原本all in one的架构,将数据库服务独立,部署在云数据库RDS上,其余的服务,部署在ECS云服务器上。部署配置RDS云数据库1.创建数据库连接账号 2.创建博客业务所使用的数据库 部署ECS环境安装apache环境yum -y install httpd httpd-manual mod_ssl mod_perl mod_auth_mysql systemctl start httpd.service安装php环境yum -y install php php-mysql gd php-gd gd-devel php-xml php-common php-mbstring php-ldap php-pear php-xmlrpc php-imap echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php systemctl restart httpd测试访问:phpinfo.php页面,成功显示 安装和配置WordPress安装WordPressyum -y install wordpress cd /usr/share/wordpress ln -snf /etc/wordpress/wp-config.php wp-config.php mkdir /var/www/html/wp-blog mv * /var/www/html/wp-blog/修改wp-config.php配置文件sed -i 's/database_name_here/wordpress/' /var/www/html/wp-blog/wp-config.php sed -i 's/username_here/test_user/' /var/www/html/wp-blog/wp-config.php sed -i 's/password_here/Password1213/' /var/www/html/wp-blog/wp-config.php sed -i 's/localhost/data/' /var/www/html/wp-blog/wp-config.php systemctl restart httpd初始化WordPress 安装部署成功,访问后台
使用PolarDB和ECS搭建门户网站访问MySQL数据库您可以使用数据库客户端或阿里云提供的数据管理服务DMS(Data Management Service)来远程访问MySQL数据库。本步骤指导您创建新的MySQL用户,通过DMS远程访问MySQL数据库。1、在ECS实例上,创建远程登录MySQL的账号。执行如下命令,使用root用户登录数据库。mysql -uroot -p create user 'dms'@'%' identified by 'PASSword123!'; grant all privileges on *.* to 'dms'@'%'with grant option; flush privileges;输入eit退出数据库。 2、在实验室页面右侧,单击 图标,切换至远程桌面。 3、复制数据管理DMS控制台地址,在FireFox浏览器打开新页签,粘贴并访问数据管理DMS控制台。https://dms.aliyun.com/new4、在左侧导航栏中,单击 5、在新增实例对话框中,单击ECS自建数据库。 6、在新增实例对话框的ECS自建数据库页签中,单击MySQL。 7、在新增实例对话框的基本信息区域中,配置自建数据库信息,单击测试连接。参数说明:实例区域:选择ECS实例所在地域,可在云产品资源列表中查看ECS实例所在地域。本示例为华东2(上海)。ECS实例ID:选择ECS实例ID,可在云产品资源列表中查看ECS实例ID所在地域。端口:3306数据库用户名:输入步骤四-1中创建的数据库用户。本示例为dms。密码:输入步骤四-1中创建的数据库用户的密码。本示例为PASSword123!。 8、在成功对话框中,单击确认。 9、在新增实例对话框中,单击提交。 10、在登录确认对话框中,单击确认。 返回如下页面,表示您已成功通过DMS远程访问MySQL数据库。 PolarDB数据库创建PolarDB数据库账号1. 双击打开桌面 FireFox ESR浏览器,在RAM用户登录框中点击 下一步,复制 云产品资源 列表中 子用户密码 粘贴(lx shell粘贴快捷键ctrl+shift+v,其他地方粘贴是ctrl+v)到浏览器 RAM用户登录界面,即可登录当前子账号。2. 在 阿里云控制台首页 左侧导航栏,依次单击 产品与服务 > 云数据库PolarDB ,进入 云数据库PolarDB管理控制台 。3. 单击左侧 集群列表 ,然后选择云产品资源提供的地域。例如:华东2(上海)。4. 创建数据库账号。在 集群列表 页面,单击 集群ID ,进入 集群详情界面 。单击左侧导航栏 配置与管理 > 账号管理 。单击左上方 创建账号 。参考说明配置账号信息,然后单击 确定 。数据库账号:输入数据库账号名称,例如:test_user 。账号类型:此处选择普通账号。密码:设置账号密码,例如:Password1213。确认密码:再次输入密码。5. 创建数据库。在实例详情页,单击左侧导航栏的 数据库管理 ,然后单击 创建数据库 。参考说明配置数据库信息,然后单击 创建 。数据库(DB)名称:输入数据库名称,例如:pbootcms 。支持字符集:默认设为utf8mb4。授权账号:选择上一步创建的数据库账号test_user。账号类型:默认设置为读写。备注说明:非必填。用于备注该数据库的相关信息,便于后续数据库管理,最多支持256个字符。6. 设置数据库白名单。连接数据库需要设置数据库白名单,点击 [集群白名单],然后点击 [设置] 设置数据库集群白名单。在白名单界面将默认的白名单地址127.0.0.1更改为 0.0.0.0/0,然后点击 [确定] 使白名单地址生效。ECS安装LAMP环境LAMP是指运行在Linux下的Apache、MySQL和PHP的环境。参考以下操作在云服务器上安装开发环境。1. 在ECS服务器上,执行以下命令安装Apache服务及其扩展包。yum -y install httpd httpd-manual mod_ssl mod_perl mod_auth_mysql返回类似如下图结果则表示安装成功。 2. PbootCMS是使用PHP语言开发的CMS系统。参考以下操作安装PHP环境。执行以下命令,安装PHP。yum -y install php php-mysql gd php-gd gd-devel php-xml php-common php-mbstring php-ldap php-pear php-xmlrpc php-imap3. 执行以下命令下载并安装MySQL。wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm yum -y install mysql57-community-release-el7-10.noarch.rpm yum -y install mysql-community-server4. 执行以下命令启动MySQL数据库。 systemctl start mysqld搭建门户网站在完成环境部署后,参考以下操作搭建门户网站。1. 在ECS服务器上,执行以下命令,安装Git。yum -y install git2. 在ECS服务器上,执行以下命令下载PbootCMS源码文件。cd ~ && git clone https://gitee.com/hnaoyun/PbootCMS.git3. 执行以下命令将安装包拷贝到Apache的wwwroot目录下。cp -r PbootCMS/* /var/www/html/4. 执行以下命令修改站点根目录文件权限。 chmod -R a+w /var/www/html5. 向数据库中导入CMS的初始数据。执行以下命令初始化数据库pbootcms的表结构和数据。说明: 在执行命令前,请修改一下三个参数。数据库连接地址参见集群详情页面下方链接地址板块。test_user为步骤二中创建的数据库账号。Password1213步骤二中创建的数据库密码。sql_file="/var/www/html/static/backup/sql/"$(ls /var/www/html/static/backup/sql/) && mysql -h数据库连接地址 -utest_user -pPassword1213 -Dpbootcms < $sql_file6. 执行以下命令,修改CMS系统数据库配置。说明: 在执行命令前,请根据参数说明替换您的数据库配置。cat > /var/www/html/config/database.php << EOF <?php return array( 'database' => array( 'type' => 'mysqli', // 数据库连接驱动类型: mysqli,sqlite,pdo_mysql,pdo_sqlite 'host' => '数据库连接地址', // PolarDB数据库链接地址 'user' => 'test_user', // PolarDB数据库的用户名 'passwd' => 'Password1213', // PolarDB数据库的密码 'port' => '3306', // 数据库端口 'dbname' => 'pbootcms' //数据库名称 ) ); EOF7. 返回ECS控制台,在ECS实例列表页面,单击已创建的ECS实例ID链接进入ECS详情页。8. 在左侧导航栏,单击 本实例安全组 ,然后单击安全组的ID链接查看安全组配置。确保安全组开放了80端口访问,否则无法访问已搭建的门户网站。安全组是一种虚拟防火墙,具备状态检测和数据包过滤能力,用于在云端划分安全域。通过配置安全组规则,您可以控制安全组内一台或多台ECS实例的入流量和出流量。 9. 访问程序。执行以下命令重启 Apache服务。systemctl restart httpd在浏览器地址栏输入云服务器的公网IP地址,进入门户网站首页。系统后台默认访问路径为http://<ECS公网IP地址>/admin.php。默认账号为admin,密码为123456。至此您已完成门户网站的搭建,您可以根据公司的需求自定义门户网站的内容。 感谢云起实验室提供环境~
序:从云桌面技术到无影 最早接触到云桌面这玩意,还是得从高中说起。学校里有一套机房采用的就是云桌面,那个时候对云桌面真是又爱又恨。云桌面技术当时看来确实先进,机房桌面上干干净净,只有一台显示器鼠标键盘和一个小小的黑色终端盒子,看不到任何臃肿的电脑主机。但是我一个学网络技术的,上课做都是什么虚拟机、模拟器的实验,这VDI架构分配的内存不到4G,怎么跑的起上课的实训实验呢…..唉。 在我的理解下,虚拟化技术带来了云计算,虚拟机又成就了云桌面技术。虚拟机往往面向的是服务器端,完成了基础设施架构及为用户提供服务,但是云桌面真正的是面向了个人用户。云计算往往为服务提供者提供服务环境,像在linux环境中,使用者只需要SSH远程终端就可以使用虚拟服务器,但是云桌面可以完美的提供完整的桌面环境,让用户使用云桌面真真正正的像在使用一台个人PC。所以,云桌面是让你用桌面的,不是给你一个公网IP,让你提供服务的,我个人觉得,再整个内网穿透,没必要。 这几年来,接触了不少云桌面相关的技术产品,包括锐J,深x服等等,甚至部署过WinServ的RDS。有上文提到的经典的VDI架构,即所有的计算资源如图云计算虚拟化一样在一套服务器集群之中,用户通过客户终端去连接即可,VDI可以统一升级资源,统一管理桌面,统一分配使用用户,可以通过虚拟机模板为用户提供不同的操作系统和软件,简单又高效。其次便是IDV,将虚拟化操作系统的模板存放在服务器上,而虚拟化还是使用本地的电脑主机PC,不过由于本地虚拟化和数据存放在本地的关系,若处于离线状态,IDV架构的云桌面还是可以正常使用的。最后就是RDS共享云桌面了,基于多用户操作系统,这个就没什么可说的了,由服务器端共享一套系统和应用。云桌面应用场景有很多,例如学校,我认为云桌面可以免去机房管理员繁杂的管理维护任务,其次学校的机房终端数量大。医院,云桌面就可以对医院门诊、护士站、医生站所使用的终端满足稳定高效安全的需求。还有企业办公等等场景。 云桌面技术的问题之一,我认为就是网络。云桌面是云计算的产物,非常依赖网络,当网络联通性出现问题时,私有化部署的云桌面有极大的可能性失效。且当服务器出现不可抗因素的影响,容易造成数据的严重丢失。影响办公生产效率。而无影云桌面,我认为就是将VDI架构的云桌面部署在了阿里云上,好处之一便是避免了由网络环境造成的云桌面失效问题。依托阿里云强大的底层基础设施建设及高速的网络数据通道,公有云下的云桌面技术才真正的把云桌面的优势显现出来。以最便捷的方式提供高数据安全管控,随时随地的接入安全的云桌面,不再需要用户连接VPN到内网再接入云桌面,无需再购买服务器,弹性提升云桌面性能不必再买硬盘买内存条,只需要在阿里云上下单,大量节约成本。数据存放在阿里云端,不用考虑本地部署数据丢失的风险。 无影云桌面使用体验1)购买无影云桌面在创建云桌面处,进行基本配置。包括选择付费类型、云桌面名称、工作区(需要自行创建) 安全策略的配置、及使用桌面模板flavor即云桌面配置大小CPU及内存、操作系统的选择 确认创建的配置清单 付钱 稍后,我们的云桌面就成功运行状态了 2)无影云桌面互联网访问新创建完成的无影需要开通互联网访问功能,需要在<安全办公网络>-<互联网访问>处,进行开通互联网访问选择区域及工作区,选择公网访问的计费类型,以及选择使用公网访问的时长,选择带宽的大小 3)无影云桌面的用户授权访问云桌面需要对使用者进行用户的创建及授权,在<用户管理>处用户量少时选择手动录入,输入用户及邮箱手机号,阿里云会自动将开通账号信息的邮件发送到使用者的邮箱中 用户录入完成后,选择分配桌面选择区域、工作区,选择创建完成的云桌面 用户在邮箱就可以收到开通云桌面的邮件,包括公网接入的工作区ID,用户名及密码。下方也提供了客户端的下载链接。 4)无影云桌面的使用我们在windows客户端环境下进行测试使用安装无影云电脑的客户端,常规的软件安装操作 完成软件安装后,进行系统证书的信任 打开客户端,输入邮件中的工作区ID信息 输入用户及密码 成功连接至无影,显示用户相关的云桌面资源 点击连接即可 右上角的温馨提示,其实也很好理解针对前两点。首先云桌面基于虚拟机,同时公网云桌面基于阿里云强大的基础设施建设,有完整且强大的网络基础架构,用户所使用的一台云桌面仅仅时一台虚拟机,对云桌面的连接完全依靠阿里云的网络设施。若是我们自行对云桌面的网络环境进行修改的话,网络数据无法通过管理员所设定的网络范围,就会失去公网与云桌面的连接。至于后面两点。省电没什么好说的,及时存数据也是工作常识。 电脑的右下角可以看到客户端Elastic Desktop Service,即阿里云的EDS服务不过以及很清楚的表明Citrix System,看来用的底层还是思杰的云桌面 4)无影云桌面应用市场在无影的桌面上有应用中心,提供了一些常用软件与和无影适配的软件,用户可以通过应用中心安装工具软件,也可以像正常windows系统一样安装exe安装包 在阿里云控制台管理界面也可以通过<企业应用管理>,来工作区下的所有云桌面批量安装软件 批量安装可以指定批量软件,和指定安装软件的用户 可指定自定义应用上传,批量安装 5)无影云桌面性能测试由于开放测试选购的配置为4 vCPU/8 GiB 系统WindowsServer2019 DataCenter版本任务管理器:底层KVM没啥好说的 服务运行中,可见阿里云注入的后台服务进程还有思杰的…..懂得都懂 使用CPU-Z软件查看处理器信息 “主板”信息 最后使用CPU-Z测试,但是测试结果貌似…..只能参考一下A10 测试磁盘读写性能,如图 对无影云桌面的网络测速 无影和本地电脑的文件传输实际速率,在选配带宽的正常范围之内 末:总结云桌面上云是技术所驱使,无影的诞生是云计算发展必然的结果。但是无论是采用哪种技术的应用,还是需要仔细的考虑分析自己所在的实际场景是否适合无影的应用。 吐槽这个手机移动端的APP做的适配真是差啊,各种毛病。阿里的哥哥们,你们要是搞定了移动端,我拿个什么手机PAD用PC,难道不是云桌面真正爽的体验吗!!! 我建议好好参考一下微软的RD Client的软件,咱起码做的不比人家差吧!什么分辨率自适应,鼠标交互都安排上啊!
1.zabbix服务搭建准备zabbix安装的本地yum源文件,百度可自行下载此处我yum配置为ftp上 安装启动mariadb数据库[root@zabbix yum.repos.d]# yum -y install mariadb mariadb-server [root@zabbix yum.repos.d]# systemctl start mariadb [root@zabbix yum.repos.d]# systemctl enable mariadb [root@zabbix yum.repos.d]# mysql_secure_installation#初始化数据库配置,设置密码为123456[root@zabbix yum.repos.d]# mysql -uroot -p123456 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 9 Server version: 5.5.56-MariaDB MariaDB Server Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> create database zabbix character set utf8 collate utf8_bin; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> grant all privileges on zabbix.* to zabbix@localhost identified by '123456'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> quit Bye#登录数据库,创建库,创建并授权用户 yum安装zabbix服务[root@zabbix yum.repos.d]# yum -y install zabbix-server-mysql zabbix-web-mysql zabbix-agent [root@zabbix yum.repos.d]# zcat /usr/share/doc/zabbix-server-mysql-3.4.1/create.sql.gz |mysql -uzabbix -p123456 –Dzabbix#执行数据库导入脚本,-u用户名,-p密码,-D选择数据库名 修改server配置[root@zabbix ~]# vim /etc/zabbix/zabbix_server.conf #找到开启以下注释配置,修改为自己的配置 DBHost=localhost DBName=zabbix DBUser=zabbix DBPassword=123456 修改server上的agent配置[root@zabbix ~]# vim /etc/zabbix/zabbix_agentd.conf Server=127.0.0.1 #客户端被动等待指定服务器来查询数据 ServerActive=127.0.0.1 #客户端主动提交数据到指定的服务器 Hostname=linux-server001 #配置主机名 修改zabbix的网页配置,将时区改为亚洲、上海[root@zabbix ~]# vim /etc/httpd/conf.d/zabbix.conf 启动并设置开机自启[root@zabbix ~]# systemctl start httpd zabbix-server zabbix-agent [root@zabbix ~]# systemctl enable httpd zabbix-server zabbix-agent Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service. Created symlink from /etc/systemd/system/multi-user.target.wants/zabbix-server.service to /usr/lib/systemd/system/zabbix-server.service. Created symlink from /etc/systemd/system/multi-user.target.wants/zabbix-agent.service to /usr/lib/systemd/system/zabbix-agent.service. 访问http://ip/zabbix/ 下一步检查环境依赖 下一步配置数据库,按实际情况填入 下一步填入服务器名字即可 最后一步确认install 安装完成 登录页面,默认账号Admin,密码zabbix,Admin的A大写 登录后进入Administration -> User -> Admin,点开后可以修改登录账户名,密码,语言设置为中文。 点击update后刷新页面就OK.2.zabbix客户端agent下载https://www.zabbix.com/download_agentshttps://repo.zabbix.com/zabbix/ 3.linux客户端agent部署确保客户端与zabbix服务器的连通性根据自己的系统版本下载rpm包安装[root@localhost opt]# ls zabbix-agent-3.2.6-1.el6.x86_64.rpm [root@localhost opt]# rpm -ivh zabbix-agent-3.2.6-1.el6.x86_64.rpm warning: zabbix-agent-3.2.6-1.el6.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID a14fe591: NOKEY Preparing... ########################################### [100%] 1:zabbix-agent ########################################### [100%] 修改agentd配置[root@localhost opt]# vim /etc/zabbix/zabbix_agentd.conf Server=192.168.1.2 # zabbix服务端IP ServerActive=192.168.1.2 #同上 Hostname=hostname #服务器所展示主机名 启动配置开机自启[root@localhost opt]# service zabbix-agent start Starting Zabbix agent: [ OK ] [root@localhost opt]# chkconfig zabbix-agent on netstat 检测端口开放 server上dashboard添加主机此处的主机名称必须和配置文档处名称相同群组,可以选择现有的或者新建将客户端IP填入接口 点击模板点击选择中的 ,OS Linux文本框下点击小字添加,最后点击添加 若正常步骤,等几分钟后可用性就会变为绿色,客户机正常上线 4.Windows客户端agent部署下载好agent包,根据架构选择x86,x64在客户机上新建一个文件夹,存放对应x64文件,以及conf文件夹中的zabbix_agentd,win.conf修改zabbix_agentd.win.conf配置文件找到修改以下配置Server=192.168.1.2 # zabbix服务端IP ServerActive=192.168.1.2 #同上 Hostname=hostname #服务器所展示主机名. cmd输入以下命令,安装启动agentC:\zabbix>zabbix_agentd.exe -c zabbix_agentd.win.conf –I #安装agent C:\zabbix>zabbix_agentd.exe -c zabbix_agentd.win.conf –s #运行启动 我这里写进bat中,方便点击 server上dashboard添加主机此处的主机名称必须和配置文档处名称相同群组,可以选择现有的或者新建将客户端IP填入接口 点击模板点击选择中的 ,OS Windows文本框下点击小字添加,最后点击添加 若正常步骤,等几分钟后可用性就会变为绿色,客户机正常上线 4.网络设备客户端agent部署测试中还有一台交换机可以作为客户端部署进zabbix交换机开启snmp服务,设置团体字符串,设置ro只读,host指向zabbix服务器ip发送字符串Switch-C3560G(config)#snmp-server community cisco-switch ro Switch-C3560G(config)#snmp-server enable traps Switch-C3560G(config)#snmp-server host 192.168.1.x cisco-switchserver上dashboard添加主机此处的主机名称可以自定群组,可以选择现有的或者新建将默认的agent代理程序的接口移除,添加SNMP接口,配置一个与交换机连通的IP 点击模板点击选择中的相关思科SNMP模板,或者SNMP通用模板文本框下点击小字添加,最后点击添加 点击宏点击继承以及主机宏找到SNMP_COMMUNITY的public字符串修改为交换机上配置的共同体名最后点击应用 若正常步骤,等几分钟后可用性就会变为绿色,客户机正常上线此处绿色在SNMP处亮起
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。官方文档教程https://docs.ansible.com/ 测试网络拓扑ansible安装配置所需安装yum源,我使用了阿里的centos7源[root@server yum.repos.d]# wget http://mirrors.aliyun.com/repo/Centos-7.repo [root@server yum.repos.d]# yum clean all&&yum makecache [root@server yum.repos.d]# yum -y install ansible ansible 配置公私钥ansible server中创建ssh的密钥对[root@server ansible]# ssh-keygen ssh的公钥下发,实现ansible服务器与其余服务器的ssh免密登陆[root@server ansible]# ssh-copy-id root@192.168.2.131 [root@server ansible]# ssh-copy-id root@192.168.2.132测试ssh免密登陆 配置hosts文件备份默认的hosts文件,新建hosts,写入被操作端的服务器IP地址,主机组名为test[root@server ansible]# mv hosts hosts.bak [root@server ansible]# vim hosts [test] 192.168.2.131 192.168.2.132 测试执行ping模块,成功测试主机连通性[root@server ansible]# ansible test -m ping到此为止已经部署好ansible主控端,被控端无需任何配置 ansible-doc查询命令使用1.查询可执行模块,用法同vim,可直接输入查找[root@server ansible]# ansible-doc -l -s 查看模块的具体参数[root@server ansible]# ansible-doc -s yum#查看yum模块的具体用法 ansible命令使用常用语法ansible <主机组/IP地址/IP地址通配符> -m <模块名> -a <模块参数> -t 日志输出 -u 指定用户名 -k 指定密码 -I 指定ansible的hosts文件位置 -f 连接并发数 ansible常用模块setup检索系统信息#检索系统全部信息,可加参数filter过滤所需要的信息字段[root@server ansible]# ansible test -m setup command&shell 命令执行command和shell模块都可以执行命令区别在于shell支持shell的语法,如|&;><而command不支持user用户管理#新建用户,设置用户名为admin,密码为加密后的123[root@server ansible]# ansible test -m user -a 'name=tao password=mAuu0XQsSEPJg'测试ssh登陆 #删除用户,状态state=absent[root@server ansible]# ansible test -m user -a 'name=admin state=absent' [root@server ansible]# ansible test -m user -a 'name=admin state=absent'测试查询系统用户admin,返回空,用户已经删除 copy文件分发上传#分发文件,文件为本地/opt/test.txt,目标路径为/root/[root@server ansible]# ansible test -m copy -a 'src=/opt/test.txt dest=/root' #强制覆盖上传文件,force=yes[root@server ansible]# ansible test -m copy -a 'src=/opt/test.txt dest=/root force=yes' #创建备份,当同名文件内容发生变化,将之前存在文件备份为时间日期[root@server ansible]# ansible test -m copy -a 'src=/opt/test.txt dest=/root backup=yes' #直接写入创建文件,修改文件权限[root@server ansible]# ansible test -m copy -a 'content="systemctl restart network" dest=/root/excute.sh mode=777' 测试有上传的txt有上传前备份的test有上传写入权限777的sh文件 yum安装管理#将test组中的服务器,yum安装ftp[root@server ansible]# ansible test -m yum -a 'name=ftp' #yum卸载ftp, state=absent[root@server ansible]# ansible test -m yum -a 'name=ftp state=absent' service服务管理#启动服务mariadb,设置开机自启# state有四种状态, started-启动服务,stopped停止服务, restarted重启服务,reloaded重载配置[root@server ansible]# ansible test -m service -a 'name=mariadb state=started enabled=yes'检测检测3306端口开启,服务已经正常启动
2022年11月
2022年09月
2022年08月
2022年07月
2022年06月
2022年04月
2022年03月
Serverless不算是技术创新,但是要实现云计算的未来全面Serverless化,真的是需要一定的格局,要么赢得遍地开花,要么输的一败涂地。云计算的技术规模门槛很高,算力在云栖、在阿里云被重新定义,算力脱离了几核心几线程,而成为了算力的调用次数。算力的重构或许可以降低使用云的成本,写完的代码直接上线,不用惦记服务器数据库。
虽然我来到了云栖的现场,但是丰富的活动与各种各样的会议论坛,没办法每一个都参与。最期待的当然是ModelScope模型社区分论坛,在云栖ModelScope有了中文名字,魔搭。
期待未来我的ECS里跑的是平头哥的倚天;我的代码从云效DevOps直接上线到Serverless&FC;随时随地随意终端都可以打开无影,开始云上学习生活与工作
"未来将融合RISC-V和无影架构,实现全栈自研" 拿到无影的时候,我往弹幕网站投了一个视频,下面有这么一条评论,“项目砍了哭都来不及”
第一此看到这句话的时候,作为UP的我确实无力反驳。是的,隔壁某个云厂商的云电脑项目确实有被砍的。但是今天,我来到云栖。亲眼看到了阿里云构建的无影全系列产品,甚至依旧扩展到Laptop、眼镜等终端产品。无影将会投入到生产力的解决方案,更好的集成安全能力。融合RISC-V意味着什么,意味着更好的软件硬件生态,意味着我们的终端产品,终有一天不在依赖国外,完全自研国产化。 现在,我可以自信的回答他
已经十一月了,过几天就是双十一电商节了。想必最能体现阿里技术突破创新的就是双十一零点下单的那一刻,每一个淘系产品的用户都可以感受到阿里技术的进步。那些年的服务器崩溃、排队抢单、软件崩溃等等问题,随着淘系业务的全面上云而消失,相信今年的双十一大家也都能顺利的丝滑购物下单。当然,今年在北京的冬奥会,阿里也给全世界带来奥运会的数字转型模式,造就独一无二的云上冬奥会。 疫情在全世界依旧横行,别的国家选择摆烂,而我们依旧在和疫情抗争。在这个后疫情时代,云计算依旧能给我们带来创新,云算力可以对医疗体系有更好的结合,现在虽然是可以异地结算医保,但是手续麻烦。期待未来可以真正实现全国医疗一张网,实现端到端的医疗计算能力,在全国任何一家医院直接使用自己的唯一账户。其次云上算力或许会在无人驾驶方向,有更大的颠覆性创新,小鹏已经和阿里云有大合作了,我这里搬个小板凳,静侯成果开花。 十年之后,云栖大会不但是阿里给国内的最好答卷,而是能代表中国带给全世界的最好答卷。云栖大会带来的的创新能力能够引领世界。 感谢这个云的时代,感谢这个有云栖的云时代。
1024可能算是业内人士的自嘲了,作为一个学生党,寝室的配置如图了。随身的装备是华硕的灵耀X2 Duo,它的最大特点就是**有!第!二!个!屏!幕!**我觉得这个小屏幕简直秒杀很多办公本,但是唯一的坏处就是作为办公本的话,它有一点偏重。
其次,我要说的最炫酷的极客装备是这个,无影的卡片机
很多同学到我寝室都会好奇的这个小玩意。作为一个每天早八上课的上课狗,各种机房课上各种实验,各种开发语言的IDE,有时候实验做不完还要想办法把工程拷贝到各种网盘存储器里头。但是自从拥有了无影云电脑,并尝试去把无影融入到学习生活中,我发现这个小玩意还真的是挺方便的。 第一,就上述的问题,我在无影上使用率最高的就是vscode,课程里主学的C、JAVA、python,无影上开个vscode都可以编写,而且不用关机,教室里用web客户端登上云桌面直接开始coding,不用担心电脑存的代码不小心重启被保护卡还原了,也不用切换这个那个的IDE软件,更不用自己再拷贝代码文件到自己的网盘上。即开即学,机房里没做完的到了寝室接着敲,方!便! 第二就是寝室里头当我主用的笔记本拿到实验室或者带回家了,寝室也不会没电脑用,无影卡片终端一插,只要有网络,无处都可以用电脑。说实在的,现在有点依赖无影了,不知道到期之后还是否续费的起了哈哈哈 说完学校,再说家里,家里最极客的无疑是自己的homelab了,主要是我自己组的一台Server,PC上VM的workstation用的比较多,所以虚拟化还是用了ESXi。我的所有系统架构类的实验都放家里这台服务器上,一些比赛的企业环境都搭在这上面练习。再搭个vpn,随时都可以用家里的计算和存储资源,也真的蛮实用的(仅针对本人OvO
无论装备好坏,希望都可以让自己学有所用、学有所得
EDR系统,有几个功能模块单独授权收费的合同里没有,但试用期给开放了所有授权 客户觉得好用,试用授权到期了客户赖账,说现在系统少功能开始吊尾款。。。属于没付钱还想白嫖
云计算这个东西,如果最后还剩下一个属性,那就一定是安全 首先一点吧,我个人是没有云上企业安全的经验,但是我在有些企业网络环境中是接触过网络安全部分的内容。很多人说安全能力,其实很多设备云上和云下的功能都是一样的,防火墙、WAF、IPS这类的安全能力所对应的产品有的,阿里云同样也会有。企业所需要的安全能力虽然价格都是不菲的,但是从云上的角度讲,云化的安全产品更加方便部署和接入。
不过我个人角度觉得阿里云做的安全产品还是非常良心的,云盾这个产品也是陪伴ECS很多年了,DDOS这种最最最传统的网络攻击,阿里云还是免费提供了5个G的防护(虽然很小);我最喜欢的还是云盾里的漏洞管理这个功能,这个功能在安全产品里往往归于HIDS主机安全这一块,不仅有免费的实时漏洞提醒,还可以支持平台来检测漏洞,这样不用我自己去手动找POC或EXP复现我服务器上出现的安全漏洞。
简单说几个我能想到的问题吧 一个就是在很多真实攻击阶段或者红蓝对抗阶段,云厂商的云主机往往被作为攻击者的一个跳板或者直接作为攻击机来使用,咱们阿里云对这种行为是持一种什么态度的。不管是演习阶段还是真实发生攻击事件,如果说能检测明显的主动攻击行为从ECS上发生,平台是否会有介入
还有一个是这个AK的管理,之前在Git公开仓库泄露时,推出了AK泄露检测,能检测github上是否被泄露,这个产品的推出是很及时。不过前几个月圈内流传也挺厉害的,CSDN上也有阿里云的AK密钥泄露导致大量数据泄露的,人的失误真是再高的科技也拦不住,不过我还是想知道这个AK泄露检测面是否可以再扩大到别的互联网平台上
最后传统网络安全方案其实已经差不多定型了,无非就是接入安全产品,做好规划方案,安全能力与产品性能功能挂钩。而云原生的时代下,云原生安全也算是云原生发展的未来挑战之一,当然也想学习一下阿里云在云原生安全的实践方案
可能是运营商线路问题,我自己源一直用的阿里云,家宽1G,源下载差不多10M上下
可以sed -i正则匹配批量替换,不过代码里会有绝对路径嘛
从高中到大学,从ET到云小宝,从黑灰配色到如今的橙白配色,阿里云已经陪伴了我6年时光。还记得高中时的我第一次购买ECS云服务器,对linux还是个小白的我无从下手,到如今已经扎扎实实的学习了云计算的各种知识,遨游在云上的海洋,甚至考取了ACE(旧版)的认证证书。对于一个还是在校生的我来说,阿里云就像是一个老友,一直陪伴在我学习的路上,云起实验室让我有机会对各种云产品进行实验,开发者社区也像一所学校,在这里可以学到各种开发者的文章,解决我专业学习上各种的疑难杂症。
21年的云栖大会,我有幸被社区的小伙伴邀请并成为了一名乘风者,在社区一直保持着活跃,参与了不少活动,获得了不少周边奖品。当然也很荣幸几次在测评大赛中获得一、二名,奖励的猫超卡现在还没有花完hhhhhh
这里是我参加各种活动以来部分的周边奖品,一部分以云小宝为主,另一部分以背包、杯子、音响、鼠标这样实用性的为主。当看到积分商城和等级制度更新之后,我有种说不出的兴奋。要说建议的话,我还是希望可以多推出一些带有阿里云logo标志的一些实用周边,或者是其他阿里项目的周边也是很不错的,就好比图里的Filnk的杯子,做工也很不错很有纪念意义;还是以实用为主吧,刚刚我看到有个小米有品的腰垫,这个就很哇塞,像我们这种电脑前久坐的人可太需要了,我打算过两天开学了换一个放宿舍里
工作量大,效率低,容易误差,无法精准定位问题出现所在。 小规模的可以采用传统,大规模集群?还是借助工具吧...
证书里的主机域名没匹配,需要查看一下证书签发
可能会的,建议还是用自己的,加个CNAME
还是在业务代码或者前端服务上实现吧
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈太搞笑了
害,把其他账号的ECS当自有的普通服务器就行,部署主机组的时候选择自由主机,去ECS上安装个agent就行
优先换源,条件允许,现在CentOS8很多分支发行版的兼容性也非常好,迁移系统吧